com.phloxui
Version:
PhloxUI Ng2+ Framework
192 lines (191 loc) • 17.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractI18NApplicable } from '../share/AbstractI18NApplicable';
import { EventUtils } from '../share/utils/EventUtils';
import { Option } from '../decorator/Option.decorator';
import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../share/CustomEventType';
export const /** @type {?} */ ACTION_PERFORM = 'actionPerform';
/**
* <p style="text-indent: 2em;">
* An abstract base class for <code>menu item</code> component. This class provides you a default [[onClick]] event handler which
* automatically call the [[MenuItemModel.actionPerformedHandler]] if specified. It also resets the current focusing component if
* [[MenuItemModel.autoResetFocus]] is set to <code>true</code>. A <code>menu item</code> can be, but not necessary, in a parent
* <code>menu</code>. It is up to each component implementation which is a sub class of this class to decide that it is required
* to allow a <code>menu item</code> can be displayed standalone outside the parent <code>menu</code> or not.
* </p>
*
* @author shiorin, tee4cute
* @see [[MenuItemModel]]
* @see [[AbstractMenu]]
* @abstract
*/
export class AbstractMenuItem extends AbstractI18NApplicable {
/**
* @param {?} needFocusService
*/
constructor(needFocusService) {
super();
this.needFocusService = needFocusService;
this.clickEvent = new EventEmitter();
this.beforeClickEvent = new EventEmitter();
}
/**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
onClick($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => {
// doEvent
this.emitActionPerform($event);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeClickEvent($event);
}, ($event) => {
// emitAfterEvent
this.emitClickEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?=} $event
* @return {?}
*/
emitActionPerform($event) {
if (this.model !== null && typeof this.model !== 'undefined') {
if (this.model.actionPerformedHandler !== null && typeof this.model.actionPerformedHandler === 'function') {
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(ACTION_PERFORM, this, data, $event);
this.model.actionPerformedHandler.call(null, ev);
let /** @type {?} */ autoFocus = true;
if (this.model.autoResetFocus !== null && typeof this.model.autoResetFocus !== 'undefined') {
autoFocus = this.model.autoResetFocus;
}
if (autoFocus) {
if (this.needFocusService !== null && typeof this.needFocusService !== 'undefined') {
this.needFocusService.resetFocusingComponent(ev);
}
}
}
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitBeforeClickEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) {
this.beforeClickEvent.emit(ev);
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitClickEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
if (this.clickEvent !== null && this.clickEvent !== undefined) {
this.clickEvent.emit(ev);
}
}
/**
* <p style="text-indent: 1em;">
* Get the parent <code>memu</code> associated with <code>this</code> <code>menu item</code>.
* </p>
* @return {?}
*/
getMenu() {
return this.menu;
}
/**
* <p style="text-indent: 1em;">
* Set a parent <code>menu</code> associated with <code>this</code> <code>menu item</code>.
* </p>
* @param {?} menu
* @return {?}
*/
setMenu(menu) {
this.menu = menu;
}
/**
* <p style="text-indent: 1em;">
* Get the <code>model</code> of <code>this</code> <code>menu item</code>.
* </p>
* @return {?}
*/
getModel() {
return this.model;
}
/**
* <p style="text-indent: 1em;">
* Set a <code>model</code> of <code>this</code> <code>menu item</code>.
* </p>
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
}
/**
* @return {?}
*/
getClickEvent() {
return this.clickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setClickEvent(event) {
this.clickEvent = event;
}
/**
* @return {?}
*/
getBeforeClickEvent() {
return this.beforeClickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeClickEvent(event) {
this.beforeClickEvent = event;
}
}
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMenuItem.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMenuItem.prototype, "beforeClickEvent", void 0);
function AbstractMenuItem_tsickle_Closure_declarations() {
/** @type {?} */
AbstractMenuItem.prototype.model;
/** @type {?} */
AbstractMenuItem.prototype.menu;
/** @type {?} */
AbstractMenuItem.prototype.needFocusService;
/** @type {?} */
AbstractMenuItem.prototype.clickEvent;
/** @type {?} */
AbstractMenuItem.prototype.beforeClickEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNZW51SXRlbS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9BYnN0cmFjdE1lbnVJdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUF3QyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNbkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0UsTUFBTSxDQUFDLHVCQUFNLGNBQWMsR0FBVyxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWV0RCxNQUFNLHVCQUFpQyxTQUFRLHNCQUFzQjs7OztJQWFuRSxZQUFZLGdCQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0FDNUM7Ozs7OztJQUVNLE9BQU8sQ0FBQyxNQUFrQixFQUFFLFNBQW1CO1FBRXBELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztZQUUzRixJQUFJLENBQUMsaUJBQWlCLENB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Ozs7O0lBUVosT0FBTyxDQUFDLElBQWtCO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOzs7Ozs7OztJQVFaLFFBQVE7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Ozs7Ozs7O0lBUWIsUUFBUSxDQUFDLEtBQW9CO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOzs7OztJQUdkLGFBQWE7UUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Ozs7OztJQUdsQixhQUFhLENBQUMsS0FBd0I7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Ozs7O0lBR25CLG1CQUFtQjtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7SUFHeEIsbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFakM7O0lBbElFLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2pDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0TWVudSB9IGZyb20gJy4vQWJzdHJhY3RNZW51JztcblxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQWJzdHJhY3RJMThOQXBwbGljYWJsZSB9IGZyb20gJy4uL3NoYXJlL0Fic3RyYWN0STE4TkFwcGxpY2FibGUnO1xuXG5pbXBvcnQgeyBNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9tb2RlbC9NZW51SXRlbU1vZGVsJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IENMSUNLX0VWRU5ULCBCRUZPUkVfQ0xJQ0tfRVZFTlQgfSBmcm9tICcuLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX1BFUkZPUk06IHN0cmluZyA9ICdhY3Rpb25QZXJmb3JtJztcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciA8Y29kZT5tZW51IGl0ZW08L2NvZGU+IGNvbXBvbmVudC4gVGhpcyBjbGFzcyBwcm92aWRlcyB5b3UgYSBkZWZhdWx0IFtbb25DbGlja11dIGV2ZW50IGhhbmRsZXIgd2hpY2hcbiAqIGF1dG9tYXRpY2FsbHkgY2FsbCB0aGUgW1tNZW51SXRlbU1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXJdXSBpZiBzcGVjaWZpZWQuIEl0IGFsc28gcmVzZXRzIHRoZSBjdXJyZW50IGZvY3VzaW5nIGNvbXBvbmVudCBpZlxuICogW1tNZW51SXRlbU1vZGVsLmF1dG9SZXNldEZvY3VzXV0gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LiBBIDxjb2RlPm1lbnUgaXRlbTwvY29kZT4gY2FuIGJlLCBidXQgbm90IG5lY2Vzc2FyeSwgaW4gYSBwYXJlbnRcbiAqIDxjb2RlPm1lbnU8L2NvZGU+LiBJdCBpcyB1cCB0byBlYWNoIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBhIHN1YiBjbGFzcyBvZiB0aGlzIGNsYXNzIHRvIGRlY2lkZSB0aGF0IGl0IGlzIHJlcXVpcmVkXG4gKiB0byBhbGxvdyBhIDxjb2RlPm1lbnUgaXRlbTwvY29kZT4gY2FuIGJlIGRpc3BsYXllZCBzdGFuZGFsb25lIG91dHNpZGUgdGhlIHBhcmVudCA8Y29kZT5tZW51PC9jb2RlPiBvciBub3QuXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICogQHNlZSBbW01lbnVJdGVtTW9kZWxdXVxuICogQHNlZSBbW0Fic3RyYWN0TWVudV1dXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1lbnVJdGVtIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSB7XG5cbiAgLy8gQE9wdGlvbigpXG4gIC8vIEBJMThOKClcbiAgcHJvdGVjdGVkIG1vZGVsOiBNZW51SXRlbU1vZGVsO1xuICBwcm90ZWN0ZWQgbWVudTogQWJzdHJhY3RNZW51O1xuICBwcm90ZWN0ZWQgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcblxuICBAT3B0aW9uKCdjbGljaycpXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxuICBwcm90ZWN0ZWQgYmVmb3JlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IobmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb25DbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNsaWNrRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIHRoaXMuZW1pdEFjdGlvblBlcmZvcm0oJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICB0aGlzLmVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XG4gICAgICB0aGlzLmVtaXRDbGlja0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdEFjdGlvblBlcmZvcm0oJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcblxuICAgICAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcbiAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChBQ1RJT05fUEVSRk9STSwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgICB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIuY2FsbChudWxsLCBldik7XG5cbiAgICAgICAgbGV0IGF1dG9Gb2N1cyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmF1dG9SZXNldEZvY3VzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmF1dG9SZXNldEZvY3VzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGF1dG9Gb2N1cyA9IHRoaXMubW9kZWwuYXV0b1Jlc2V0Rm9jdXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgICAgIGlmICh0aGlzLm5lZWRGb2N1c1NlcnZpY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUNsaWNrRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0gbnVsbDtcblxuICAgIC8vIGVtaXQgZXZlbnRcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuYmVmb3JlQ2xpY2tFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Q2xpY2tFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsO1xuXG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5jbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBHZXQgdGhlIHBhcmVudCA8Y29kZT5tZW11PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggPGNvZGU+dGhpczwvY29kZT4gPGNvZGU+bWVudSBpdGVtPC9jb2RlPi5cbiAgICogPC9wPlxuICAgKi9cbiAgcHVibGljIGdldE1lbnUoKTogQWJzdHJhY3RNZW51IHtcbiAgICByZXR1cm4gdGhpcy5tZW51O1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogU2V0IGEgcGFyZW50IDxjb2RlPm1lbnU8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCA8Y29kZT50aGlzPC9jb2RlPiA8Y29kZT5tZW51IGl0ZW08L2NvZGU+LlxuICAgKiA8L3A+XG4gICAqL1xuICBwdWJsaWMgc2V0TWVudShtZW51OiBBYnN0cmFjdE1lbnUpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnUgPSBtZW51O1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogR2V0IHRoZSA8Y29kZT5tb2RlbDwvY29kZT4gb2YgPGNvZGU+dGhpczwvY29kZT4gPGNvZGU+bWVudSBpdGVtPC9jb2RlPi5cbiAgICogPC9wPlxuICAgKi9cbiAgcHVibGljIGdldE1vZGVsKCk6IE1lbnVJdGVtTW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogU2V0IGEgPGNvZGU+bW9kZWw8L2NvZGU+IG9mIDxjb2RlPnRoaXM8L2NvZGU+IDxjb2RlPm1lbnUgaXRlbTwvY29kZT4uXG4gICAqIDwvcD5cbiAgICovXG4gIHB1YmxpYyBzZXRNb2RlbChtb2RlbDogTWVudUl0ZW1Nb2RlbCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGlja0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlQ2xpY2tFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlQ2xpY2tFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVDbGlja0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG59XG4iXX0=