ng2-right-click-menu
Version:
Right click context menu for Angular
212 lines • 18 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ContentChildren, ElementRef, Input, QueryList, TemplateRef, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { ShContextMenuItemDirective } from './sh-context-menu-item.directive';
import { ShContextMenuService } from './sh-context-menu.service';
var ShContextMenuComponent = /** @class */ (function () {
function ShContextMenuComponent(ctxService) {
this.ctxService = ctxService;
this.contentChildrenItems = new QueryList();
this.viewChildrenItems = new QueryList();
}
Object.defineProperty(ShContextMenuComponent.prototype, "menuItems", {
get: /**
* @return {?}
*/
function () {
// when using the ShContextMenuComponent as menu, the ContentChildren is the source
if (this.contentChildrenItems.length) {
return this.contentChildrenItems;
}
// when using a custom component as menu the ViewChildren is the source
return this.viewChildrenItems;
},
enumerable: true,
configurable: true
});
/**
* @param {?} $event
* @param {?} item
* @param {?} elm
* @return {?}
*/
ShContextMenuComponent.prototype.onEnter = /**
* @param {?} $event
* @param {?} item
* @param {?} elm
* @return {?}
*/
function ($event, item, elm) {
this.ctxService.closeSubMenus(this);
this.setNotActive();
if (!item.subMenu) {
return;
}
this.setActive(item);
this.ctxService.openSubMenu({
data: item.context.$implicit,
targetElement: new ElementRef(elm),
menu: item.subMenu,
mouseEvent: $event,
parentMenu: this
});
};
/**
* @private
* @param {?} item
* @return {?}
*/
ShContextMenuComponent.prototype.setActive = /**
* @private
* @param {?} item
* @return {?}
*/
function (item) {
item.setActive();
this.subActive = true;
};
/**
* @param {?} event
* @param {?} item
* @return {?}
*/
ShContextMenuComponent.prototype.onClick = /**
* @param {?} event
* @param {?} item
* @return {?}
*/
function (event, item) {
// TODO: move click handling to service
if (item.divider) {
return;
}
if (!item.subMenu && item.closeOnClick) {
this.ctxService.destroy();
item.click.emit({
data: item.context.$implicit,
event: event
});
}
};
/**
* @private
* @param {?} fn
* @param {?} fallbackContext
* @param {?} data
* @param {?} event
* @return {?}
*/
ShContextMenuComponent.prototype.callWithContext = /**
* @private
* @param {?} fn
* @param {?} fallbackContext
* @param {?} data
* @param {?} event
* @return {?}
*/
function (fn, fallbackContext, data, event) {
return fn.call(this.thisContext ? this.thisContext : fallbackContext, {
data: data,
event: event
});
};
/**
* @return {?}
*/
ShContextMenuComponent.prototype.close = /**
* @return {?}
*/
function () {
this.setNotActive();
this.menuContainer.detach();
if (this.overlayRef) {
this.overlayRef.detach();
}
};
/**
* @return {?}
*/
ShContextMenuComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.close();
};
/**
* @return {?}
*/
ShContextMenuComponent.prototype.setNotActive = /**
* @return {?}
*/
function () {
this.subActive = false;
this.menuItems.forEach((/**
* @param {?} i
* @return {?}
*/
function (i) { return i.setNotActive(); }));
};
/**
* @param {?} item
* @return {?}
*/
ShContextMenuComponent.prototype.isVisible = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (!item.visible) {
return true;
}
return this.callWithContext(item.visible, this, item.context.$implicit, null);
};
ShContextMenuComponent.decorators = [
{ type: Component, args: [{
selector: 'sh-context-menu',
encapsulation: ViewEncapsulation.None,
template: "\n\t\t<ng-container #menuContainer></ng-container>\n\t\t<ng-template #menuTemplate>\n\t\t\t<div class=\"sh-context-menu\">\n\t\t\t\t<div\n\t\t\t\t\t*ngFor=\"let menuItem of menuItems\"\n\t\t\t\t\t#itemElement\n\t\t\t\t\t[ngClass]=\"{\n\t\t\t\t\t\t'sh-sub-anchor': menuItem.subMenu,\n\t\t\t\t\t\t'sh-context-menu--item__divider': menuItem.divider,\n\t\t\t\t\t\t'sh-context-menu--item__sub-active': subActive && menuItem.active\n\t\t\t\t\t}\"\n\t\t\t\t\tclass=\"sh-context-menu--item\"\n\t\t\t\t\t(mouseenter)=\"onEnter($event, menuItem, itemElement)\"\n\t\t\t\t\t(click)=\"onClick($event, menuItem)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container *ngIf=\"!menuItem.divider || !isVisible(menuItem)\">\n\t\t\t\t\t\t<ng-content\n\t\t\t\t\t\t\t*ngTemplateOutlet=\"menuItem.template; context: menuItem.context\"\n\t\t\t\t\t\t></ng-content>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ng-template>\n\t",
styles: [".sh-backdrop{background-color:transparent}.sh-context-menu{background:#ececec;min-width:150px;border:1px solid rgba(0,0,0,.2);border-radius:3px;box-shadow:0 0 10px 2px rgba(0,0,0,.1);color:#000;padding:5px 0;margin:0}.sh-context-menu--item{padding:5px 10px 5px 15px;-webkit-transition:.15s;transition:.15s}.sh-context-menu--item:hover,.sh-context-menu--item__sub-active{background-color:#4b8bec;color:#fff;cursor:pointer}.sh-context-menu--item.sh-context-menu--item__divider:hover{background-color:#ececec;color:#000;cursor:default}.sh-context-menu--item__divider{height:1px;margin:1px 1px 8px;overflow:hidden;border-bottom:1px solid #d0d0d0}.sh-context-menu--item.sh-sub-anchor{position:relative;min-width:160px}.sh-sub-anchor:after{content:'';top:50%;right:6px;-webkit-transform:translateY(-50%);transform:translateY(-50%);position:absolute;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:8px solid #000}"]
}] }
];
/** @nocollapse */
ShContextMenuComponent.ctorParameters = function () { return [
{ type: ShContextMenuService }
]; };
ShContextMenuComponent.propDecorators = {
thisContext: [{ type: Input, args: ['this',] }],
contentChildrenItems: [{ type: ContentChildren, args: [ShContextMenuItemDirective, {
read: ShContextMenuItemDirective
},] }],
viewChildrenItems: [{ type: ViewChildren, args: [ShContextMenuItemDirective, {
read: ShContextMenuItemDirective
},] }],
menuTemplate: [{ type: ViewChild, args: ['menuTemplate', { read: TemplateRef, static: true },] }],
menuContainer: [{ type: ViewChild, args: ['menuContainer', { read: ViewContainerRef, static: true },] }]
};
return ShContextMenuComponent;
}());
export { ShContextMenuComponent };
if (false) {
/** @type {?} */
ShContextMenuComponent.prototype.thisContext;
/** @type {?} */
ShContextMenuComponent.prototype.contentChildrenItems;
/** @type {?} */
ShContextMenuComponent.prototype.viewChildrenItems;
/** @type {?} */
ShContextMenuComponent.prototype.menuTemplate;
/** @type {?} */
ShContextMenuComponent.prototype.menuContainer;
/** @type {?} */
ShContextMenuComponent.prototype.overlayRef;
/** @type {?} */
ShContextMenuComponent.prototype.subActive;
/**
* @type {?}
* @private
*/
ShContextMenuComponent.prototype.ctxService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2gtY29udGV4dC1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nMi1yaWdodC1jbGljay1tZW51LyIsInNvdXJjZXMiOlsibGliL3NoLWNvbnRleHQtbWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixLQUFLLEVBRUwsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHakU7SUFpREMsZ0NBQW9CLFVBQWdDO1FBQWhDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFNBQVMsRUFBOEIsQ0FBQztRQUN4RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxTQUFTLEVBQThCLENBQUM7SUFDdEUsQ0FBQztJQUVELHNCQUFJLDZDQUFTOzs7O1FBQWI7WUFDQyxtRkFBbUY7WUFDbkYsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzthQUNqQztZQUVELHVFQUF1RTtZQUN2RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUMvQixDQUFDOzs7T0FBQTs7Ozs7OztJQUVELHdDQUFPOzs7Ozs7SUFBUCxVQUNDLE1BQWtCLEVBQ2xCLElBQWdDLEVBQ2hDLEdBQWdCO1FBRWhCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsSUFB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QUFZLFNBQUMsMEJBQTBCLEVBQUU7d0JBQ3pDLElBQUksRUFBRSwwQkFBMEI7cUJBQ2hDOytCQUdBLFNBQVMsU0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0NBQzdELFNBQVMsU0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7SUFxR3JFLDZCQUFDO0NBQUEsQUFoSkQsSUFnSkM7U0FsSFksc0JBQXNCOzs7SUFDbEMsNkNBQWdDOztJQUVoQyxzREFHcUI7O0lBQ3JCLG1EQUdrQjs7SUFFbEIsOENBQTZFOztJQUM3RSwrQ0FDYzs7SUFFZCw0Q0FBOEI7O0lBQzlCLDJDQUFtQjs7Ozs7SUFFUCw0Q0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdENvbnRlbnRDaGlsZHJlbixcblx0RWxlbWVudFJlZixcblx0SW5wdXQsXG5cdE9uRGVzdHJveSxcblx0UXVlcnlMaXN0LFxuXHRUZW1wbGF0ZVJlZixcblx0Vmlld0NoaWxkLFxuXHRWaWV3Q2hpbGRyZW4sXG5cdFZpZXdDb250YWluZXJSZWYsXG5cdFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2hDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL3NoLWNvbnRleHQtbWVudS1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4vc2gtY29udGV4dC1tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnc2gtY29udGV4dC1tZW51Jyxcblx0ZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcblx0c3R5bGVVcmxzOiBbJ3NoLWNvbnRleHQtbWVudS5jc3MnXSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGFpbmVyICNtZW51Q29udGFpbmVyPjwvbmctY29udGFpbmVyPlxuXHRcdDxuZy10ZW1wbGF0ZSAjbWVudVRlbXBsYXRlPlxuXHRcdFx0PGRpdiBjbGFzcz1cInNoLWNvbnRleHQtbWVudVwiPlxuXHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0Km5nRm9yPVwibGV0IG1lbnVJdGVtIG9mIG1lbnVJdGVtc1wiXG5cdFx0XHRcdFx0I2l0ZW1FbGVtZW50XG5cdFx0XHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHRcdFx0J3NoLXN1Yi1hbmNob3InOiBtZW51SXRlbS5zdWJNZW51LFxuXHRcdFx0XHRcdFx0J3NoLWNvbnRleHQtbWVudS0taXRlbV9fZGl2aWRlcic6IG1lbnVJdGVtLmRpdmlkZXIsXG5cdFx0XHRcdFx0XHQnc2gtY29udGV4dC1tZW51LS1pdGVtX19zdWItYWN0aXZlJzogc3ViQWN0aXZlICYmIG1lbnVJdGVtLmFjdGl2ZVxuXHRcdFx0XHRcdH1cIlxuXHRcdFx0XHRcdGNsYXNzPVwic2gtY29udGV4dC1tZW51LS1pdGVtXCJcblx0XHRcdFx0XHQobW91c2VlbnRlcik9XCJvbkVudGVyKCRldmVudCwgbWVudUl0ZW0sIGl0ZW1FbGVtZW50KVwiXG5cdFx0XHRcdFx0KGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50LCBtZW51SXRlbSlcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZW51SXRlbS5kaXZpZGVyIHx8ICFpc1Zpc2libGUobWVudUl0ZW0pXCI+XG5cdFx0XHRcdFx0XHQ8bmctY29udGVudFxuXHRcdFx0XHRcdFx0XHQqbmdUZW1wbGF0ZU91dGxldD1cIm1lbnVJdGVtLnRlbXBsYXRlOyBjb250ZXh0OiBtZW51SXRlbS5jb250ZXh0XCJcblx0XHRcdFx0XHRcdD48L25nLWNvbnRlbnQ+XG5cdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBTaENvbnRleHRNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcblx0QElucHV0KCd0aGlzJykgdGhpc0NvbnRleHQ6IGFueTtcblxuXHRAQ29udGVudENoaWxkcmVuKFNoQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlLCB7XG5cdFx0cmVhZDogU2hDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmVcblx0fSlcblx0Y29udGVudENoaWxkcmVuSXRlbXM7XG5cdEBWaWV3Q2hpbGRyZW4oU2hDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmUsIHtcblx0XHRyZWFkOiBTaENvbnRleHRNZW51SXRlbURpcmVjdGl2ZVxuXHR9KVxuXHR2aWV3Q2hpbGRyZW5JdGVtcztcblxuXHRAVmlld0NoaWxkKCdtZW51VGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSkgbWVudVRlbXBsYXRlO1xuXHRAVmlld0NoaWxkKCdtZW51Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcblx0bWVudUNvbnRhaW5lcjtcblxuXHRwdWJsaWMgb3ZlcmxheVJlZjogT3ZlcmxheVJlZjtcblx0c3ViQWN0aXZlOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgY3R4U2VydmljZTogU2hDb250ZXh0TWVudVNlcnZpY2UpIHtcblx0XHR0aGlzLmNvbnRlbnRDaGlsZHJlbkl0ZW1zID0gbmV3IFF1ZXJ5TGlzdDxTaENvbnRleHRNZW51SXRlbURpcmVjdGl2ZT4oKTtcblx0XHR0aGlzLnZpZXdDaGlsZHJlbkl0ZW1zID0gbmV3IFF1ZXJ5TGlzdDxTaENvbnRleHRNZW51SXRlbURpcmVjdGl2ZT4oKTtcblx0fVxuXG5cdGdldCBtZW51SXRlbXMoKTogUXVlcnlMaXN0PFNoQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlPiB7XG5cdFx0Ly8gd2hlbiB1c2luZyB0aGUgU2hDb250ZXh0TWVudUNvbXBvbmVudCBhcyBtZW51LCB0aGUgQ29udGVudENoaWxkcmVuIGlzIHRoZSBzb3VyY2Vcblx0XHRpZiAodGhpcy5jb250ZW50Q2hpbGRyZW5JdGVtcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnRlbnRDaGlsZHJlbkl0ZW1zO1xuXHRcdH1cblxuXHRcdC8vIHdoZW4gdXNpbmcgYSBjdXN0b20gY29tcG9uZW50IGFzIG1lbnUgdGhlIFZpZXdDaGlsZHJlbiBpcyB0aGUgc291cmNlXG5cdFx0cmV0dXJuIHRoaXMudmlld0NoaWxkcmVuSXRlbXM7XG5cdH1cblxuXHRvbkVudGVyKFxuXHRcdCRldmVudDogTW91c2VFdmVudCxcblx0XHRpdGVtOiBTaENvbnRleHRNZW51SXRlbURpcmVjdGl2ZSxcblx0XHRlbG06IEhUTUxFbGVtZW50XG5cdCkge1xuXHRcdHRoaXMuY3R4U2VydmljZS5jbG9zZVN1Yk1lbnVzKHRoaXMpO1xuXHRcdHRoaXMuc2V0Tm90QWN0aXZlKCk7XG5cblx0XHRpZiAoIWl0ZW0uc3ViTWVudSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0QWN0aXZlKGl0ZW0pO1xuXHRcdHRoaXMuY3R4U2VydmljZS5vcGVuU3ViTWVudSh7XG5cdFx0XHRkYXRhOiBpdGVtLmNvbnRleHQuJGltcGxpY2l0LFxuXHRcdFx0dGFyZ2V0RWxlbWVudDogbmV3IEVsZW1lbnRSZWYoZWxtKSxcblx0XHRcdG1lbnU6IGl0ZW0uc3ViTWVudSxcblx0XHRcdG1vdXNlRXZlbnQ6ICRldmVudCxcblx0XHRcdHBhcmVudE1lbnU6IHRoaXNcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0QWN0aXZlKGl0ZW06IFNoQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlKSB7XG5cdFx0aXRlbS5zZXRBY3RpdmUoKTtcblx0XHR0aGlzLnN1YkFjdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBTaENvbnRleHRNZW51SXRlbURpcmVjdGl2ZSkge1xuXHRcdC8vIFRPRE86IG1vdmUgY2xpY2sgaGFuZGxpbmcgdG8gc2VydmljZVxuXG5cdFx0aWYgKGl0ZW0uZGl2aWRlcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghaXRlbS5zdWJNZW51ICYmIGl0ZW0uY2xvc2VPbkNsaWNrKSB7XG5cdFx0XHR0aGlzLmN0eFNlcnZpY2UuZGVzdHJveSgpO1xuXG5cdFx0XHRpdGVtLmNsaWNrLmVtaXQoe1xuXHRcdFx0XHRkYXRhOiBpdGVtLmNvbnRleHQuJGltcGxpY2l0LFxuXHRcdFx0XHRldmVudFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjYWxsV2l0aENvbnRleHQoZm4sIGZhbGxiYWNrQ29udGV4dCwgZGF0YSwgZXZlbnQpIHtcblx0XHRyZXR1cm4gZm4uY2FsbCh0aGlzLnRoaXNDb250ZXh0ID8gdGhpcy50aGlzQ29udGV4dCA6IGZhbGxiYWNrQ29udGV4dCwge1xuXHRcdFx0ZGF0YSxcblx0XHRcdGV2ZW50XG5cdFx0fSk7XG5cdH1cblxuXHRjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLnNldE5vdEFjdGl2ZSgpO1xuXHRcdHRoaXMubWVudUNvbnRhaW5lci5kZXRhY2goKTtcblx0XHRpZiAodGhpcy5vdmVybGF5UmVmKSB7XG5cdFx0XHR0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG5cdFx0fVxuXHR9XG5cblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9XG5cblx0c2V0Tm90QWN0aXZlKCkge1xuXHRcdHRoaXMuc3ViQWN0aXZlID0gZmFsc2U7XG5cdFx0dGhpcy5tZW51SXRlbXMuZm9yRWFjaChpID0+IGkuc2V0Tm90QWN0aXZlKCkpO1xuXHR9XG5cblx0aXNWaXNpYmxlKGl0ZW06IFNoQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlKSB7XG5cdFx0aWYgKCFpdGVtLnZpc2libGUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNhbGxXaXRoQ29udGV4dChcblx0XHRcdGl0ZW0udmlzaWJsZSxcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtLmNvbnRleHQuJGltcGxpY2l0LFxuXHRcdFx0bnVsbFxuXHRcdCk7XG5cdH1cbn1cbiJdfQ==