UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

330 lines (329 loc) 30.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { Option } from '../decorator/Option.decorator'; import { EventUtils } from '../share/utils/EventUtils'; import { FOCUS_EVENT, BEFORE_LOST_FOCUS_EVENT, BEFORE_FOCUS_EVENT } from '../share/CustomEventType'; import { AbstractI18NApplicable } from '../share/AbstractI18NApplicable'; /** * <p style="text-indent: 2em;"> * An abstract base class of clickable component (such as buttons) playing <code>ripple</code> effect when it is clicked. * </p> * * @author shiorin, tee4cute * @abstract */ export class AbstractRippleButton extends AbstractI18NApplicable { /** * @param {?} phloxAppService * @param {?} needFocusService */ constructor(phloxAppService, needFocusService) { super(); if (phloxAppService !== null && typeof phloxAppService !== 'undefined') { this.phloxAppService = phloxAppService; } this.needFocusService = needFocusService; this.beforeLostFocusEvent = new EventEmitter(); this.beforeFocusEvent = new EventEmitter(); this.lostFocusEvent = new EventEmitter(); this.focusEvent = new EventEmitter(); } /** * @return {?} */ get app() { if (this.phloxAppService === null || typeof this.phloxAppService === 'undefined') { return null; } return this.phloxAppService.getInstance(); } /** * @return {?} */ getApplication() { return this.app; } /** * @param {?=} $event * @return {?} */ emitBeforeFocusEvent($event) { // emit event let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_FOCUS_EVENT, this, data, $event); if (this.beforeFocusEvent !== null && this.beforeFocusEvent !== undefined) { this.beforeFocusEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitFocusEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event); if (this.focusEvent !== null && this.focusEvent !== undefined) { this.focusEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitBeforeLostFocusEvent($event) { // emit event let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_LOST_FOCUS_EVENT, this, data, $event); if (this.beforeLostFocusEvent !== null && this.beforeLostFocusEvent !== undefined) { this.beforeLostFocusEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitLostFocusEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event); if (this.lostFocusEvent !== null && this.lostFocusEvent !== undefined) { this.lostFocusEvent.emit(ev); } } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onLostFocus($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeLostFocusEvent', $event, fireEvent, ($event) => { // doEvent this.doLostFocus($event); }, ($event) => { // emitBeforeEvent this.emitBeforeLostFocusEvent($event); }, ($event) => { // emitAfterEvent this.emitLostFocusEvent($event); }, ($event) => { // doPrevented setTimeout(() => { this.doFocus($event); }, 5); }); } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onFocus($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeFocusEvent', $event, fireEvent, ($event) => { // doEvent this.doFocus($event); }, ($event) => { // emitBeforeEvent this.emitBeforeFocusEvent($event); }, ($event) => { // emitAfterEvent this.emitFocusEvent($event); }, ($event) => { // doPrevented setTimeout(() => { this.doLostFocus($event); }, 5); }); } /** * <p style="text-indent: 1em;"> * Play a <code>ripple</code> effect at the position specified in <code><b>event</b></code> object. * </p> * * @param {?} event A mouse event causing the <code>ripple</code> effect to be played. For example, a mouse click event, etc. * @param {?=} target A target DOM element to display the effect. By default, this should be an element causing an event to * occur (<code>event.target</code>). * @return {?} */ playRippleEffect(event, target) { if (target === null || typeof target === 'undefined') { target = event.target; } return new Promise((resolve, reject) => { try { let /** @type {?} */ $div = $('<div/>'); let /** @type {?} */ btnOffset = $(target).offset(); let /** @type {?} */ xPos = event.pageX - btnOffset.left; let /** @type {?} */ yPos = event.pageY - btnOffset.top; let /** @type {?} */ customBG = $(target).data("ripple-color"); $div.addClass('phlox-ripple-effect'); // dynamically set annimation duration from app settings $div.css('animation', 'phlox-ripple-animation ' + this.app.getAppInfo().settings.RIPPLE_EFFECT_DURATION + 's'); $div.css("height", $(target).height() * this.app.getAppInfo().settings.RIPPLE_EFFECT_HEIGHT_RATIO); $div.css("width", $(target).height() * this.app.getAppInfo().settings.RIPPLE_EFFECT_WIDTH_RATIO); $div.css({ top: yPos - ($div.height() / 2), left: xPos - ($div.width() / 2) }); if (customBG !== null && typeof customBG !== 'undefined') { $div.css('background', customBG); } $div.appendTo($(target)); setTimeout(function () { try { $div.remove(); if (typeof resolve === 'function') { resolve(); } } catch (/** @type {?} */ e) { if (typeof reject === 'function') { reject(e); } } }, this.app.getAppInfo().settings.RIPPLE_EFFECT_REMOVE_DURATION * 1000); } catch (/** @type {?} */ e) { if (typeof reject === 'function') { reject(e); } } }); } /** * <p style="text-indent: 1em;"> * A default implementation of <code>click</code> <code>handler</code> method which automatcially plays a <code>ripple</code> effect * ([[playRippleEffect]]) at the position specified in <code><b>event</b></code> object. * </p> * @param {?} event * @return {?} */ onClick(event) { // Prevent event's default event.preventDefault(); this.playRippleEffect(event); } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @return {?} */ getBeforeLostFocusEvent() { return this.beforeLostFocusEvent; } /** * @param {?} event * @return {?} */ setBeforeLostFocusEvent(event) { this.beforeLostFocusEvent = event; } /** * @return {?} */ getLostFocusEvent() { return this.lostFocusEvent; } /** * @param {?} event * @return {?} */ setLostFocusEvent(event) { this.lostFocusEvent = event; } /** * @return {?} */ getBeforeFocusEvent() { return this.beforeFocusEvent; } /** * @param {?} event * @return {?} */ setBeforeFocusEvent(event) { this.beforeFocusEvent = event; } /** * @return {?} */ getFocusEvent() { return this.focusEvent; } /** * @param {?} event * @return {?} */ setFocusEvent(event) { this.focusEvent = event; } } tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "beforeChangeEvent", void 0); function AbstractRippleButton_tsickle_Closure_declarations() { /** @type {?} */ AbstractRippleButton.prototype.beforeFocusEvent; /** @type {?} */ AbstractRippleButton.prototype.focusEvent; /** @type {?} */ AbstractRippleButton.prototype.beforeLostFocusEvent; /** @type {?} */ AbstractRippleButton.prototype.lostFocusEvent; /** @type {?} */ AbstractRippleButton.prototype.beforeChangeEvent; /** @type {?} */ AbstractRippleButton.prototype.phloxAppService; /** @type {?} */ AbstractRippleButton.prototype.needFocusService; /** * @abstract * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.doFocus = function ($event) { }; /** * @abstract * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.doLostFocus = function ($event) { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RSaXBwbGVCdXR0b24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvQWJzdHJhY3RSaXBwbGVCdXR0b24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUNhLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFDM0UsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7O0FBWXpFLE1BQU0sMkJBQXFDLFNBQVEsc0JBQXNCOzs7OztJQXNCdkUsWUFBWSxlQUFnQyxFQUFFLGdCQUFrQztRQUM5RSxLQUFLLEVBQUUsQ0FBQztRQUVSLEVBQUUsQ0FBQyxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksT0FBTyxlQUFlLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUV6QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBQ3RDOzs7O1FBcEJXLEdBQUc7UUFDYixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUks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RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uQXdhcmUgfSBmcm9tICcuL0lBcHBsaWNhdGlvbkF3YXJlJztcbmltcG9ydCB7IFBobG94QXBwIH0gZnJvbSAnLi9QaGxveEFwcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uL2NvbXBvbmVudC9JTmVlZEZvY3VzJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7XG4gIExPU1RfRk9DVVNfRVZFTlQsIEZPQ1VTX0VWRU5ULCBCRUZPUkVfTE9TVF9GT0NVU19FVkVOVCwgQkVGT1JFX0ZPQ1VTX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcblxuLy8gRGVjbGFyZSBqUXVlcnkgdmFyXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBjbGlja2FibGUgY29tcG9uZW50IChzdWNoIGFzIGJ1dHRvbnMpIHBsYXlpbmcgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3Qgd2hlbiBpdCBpcyBjbGlja2VkLlxuICogPC9wPlxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmlwcGxlQnV0dG9uIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbkF3YXJlLCBJTmVlZEZvY3VzIHtcblxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignZm9jdXMnKVxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByb3RlY3RlZCBwaGxveEFwcFNlcnZpY2U6IFBobG94QXBwU2VydmljZTtcbiAgcHJvdGVjdGVkIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2U7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IFBobG94QXBwIHtcbiAgICBpZiAodGhpcy5waGxveEFwcFNlcnZpY2UgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMucGhsb3hBcHBTZXJ2aWNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBobG94QXBwU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcFNlcnZpY2UsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHBobG94QXBwU2VydmljZSAhPT0gbnVsbCAmJiB0eXBlb2YgcGhsb3hBcHBTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5waGxveEFwcFNlcnZpY2UgPSBwaGxveEFwcFNlcnZpY2U7XG4gICAgfVxuXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcblxuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpY2F0aW9uKCk6IFBobG94QXBwIHtcbiAgICByZXR1cm4gdGhpcy5hcHA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUZvY3VzRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0ZPQ1VTX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuYmVmb3JlRm9jdXNFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUZvY3VzRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Rm9jdXNFdmVudCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoRk9DVVNfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICBpZiAodGhpcy5mb2N1c0V2ZW50ICE9PSBudWxsICYmIHRoaXMuZm9jdXNFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVMb3N0Rm9jdXNFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfTE9TVF9GT0NVU19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVMb3N0Rm9jdXNFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdExvc3RGb2N1c0V2ZW50KCRldmVudDogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG5cbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEZPQ1VTX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMubG9zdEZvY3VzRXZlbnQgIT09IG51bGwgJiYgdGhpcy5sb3N0Rm9jdXNFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvc3RGb2N1c0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVtaXQgZW5kIHZhbGlkYXRlXG4gIHB1YmxpYyBvbkxvc3RGb2N1cygkZXZlbnQ6IGFueSwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUxvc3RGb2N1c0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmRvTG9zdEZvY3VzKCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlTG9zdEZvY3VzRXZlbnQoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdExvc3RGb2N1c0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG4gICAgICB9LCA1KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKCRldmVudDogYW55LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlRm9jdXNFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlRm9jdXNFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxuICAgICAgdGhpcy5lbWl0Rm9jdXNFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9Mb3N0Rm9jdXMoJGV2ZW50KTtcbiAgICAgIH0sIDUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogUGxheSBhIDxjb2RlPnJpcHBsZTwvY29kZT4gZWZmZWN0IGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaW4gPGNvZGU+PGI+ZXZlbnQ8L2I+PC9jb2RlPiBvYmplY3QuXG4gICAqIDwvcD5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IEEgbW91c2UgZXZlbnQgY2F1c2luZyB0aGUgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3QgdG8gYmUgcGxheWVkLiBGb3IgZXhhbXBsZSwgYSBtb3VzZSBjbGljayBldmVudCwgZXRjLlxuICAgKiBAcGFyYW0gdGFyZ2V0IEEgdGFyZ2V0IERPTSBlbGVtZW50IHRvIGRpc3BsYXkgdGhlIGVmZmVjdC4gQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgYmUgYW4gZWxlbWVudCBjYXVzaW5nIGFuIGV2ZW50IHRvXG4gICAqIG9jY3VyICg8Y29kZT5ldmVudC50YXJnZXQ8L2NvZGU+KS5cbiAgICovXG4gIHB1YmxpYyBwbGF5UmlwcGxlRWZmZWN0KGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgdHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0ICRkaXY6IGFueSA9ICQoJzxkaXYvPicpO1xuICAgICAgICBsZXQgYnRuT2Zmc2V0OiBhbnkgPSAkKHRhcmdldCkub2Zmc2V0KCk7XG4gICAgICAgIGxldCB4UG9zOiBhbnkgPSBldmVudC5wYWdlWCAtIGJ0bk9mZnNldC5sZWZ0O1xuICAgICAgICBsZXQgeVBvczogYW55ID0gZXZlbnQucGFnZVkgLSBidG5PZmZzZXQudG9wO1xuICAgICAgICBsZXQgY3VzdG9tQkc6IGFueSA9ICQodGFyZ2V0KS5kYXRhKFwicmlwcGxlLWNvbG9yXCIpO1xuXG4gICAgICAgICRkaXYuYWRkQ2xhc3MoJ3BobG94LXJpcHBsZS1lZmZlY3QnKTtcblxuICAgICAgICAvLyBkeW5hbWljYWxseSBzZXQgYW5uaW1hdGlvbiBkdXJhdGlvbiBmcm9tIGFwcCBzZXR0aW5nc1xuICAgICAgICAkZGl2LmNzcygnYW5pbWF0aW9uJywgJ3BobG94LXJpcHBsZS1hbmltYXRpb24gJyArIHRoaXMuYXBwLmdldEFwcEluZm8oKS5zZXR0aW5ncy5SSVBQTEVfRUZGRUNUX0RVUkFUSU9OICsgJ3MnKTtcbiAgICAgICAgJGRpdi5jc3MoXCJoZWlnaHRcIiwgJCh0YXJnZXQpLmhlaWdodCgpICogdGhpcy5hcHAuZ2V0QXBwSW5mbygpLnNldHRpbmdzLlJJUFBMRV9FRkZFQ1RfSEVJR0hUX1JBVElPKTtcbiAgICAgICAgJGRpdi5jc3MoXCJ3aWR0aFwiLCAkKHRhcmdldCkuaGVpZ2h0KCkgKiB0aGlzLmFwcC5nZXRBcHBJbmZvKCkuc2V0dGluZ3MuUklQUExFX0VGRkVDVF9XSURUSF9SQVRJTyk7XG4gICAgICAgICRkaXYuY3NzKHtcbiAgICAgICAgICB0b3A6IHlQb3MgLSAoJGRpdi5oZWlnaHQoKSAvIDIpLFxuICAgICAgICAgIGxlZnQ6IHhQb3MgLSAoJGRpdi53aWR0aCgpIC8gMilcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdXN0b21CRyAhPT0gbnVsbCAmJiB0eXBlb2YgY3VzdG9tQkcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgJGRpdi5jc3MoJ2JhY2tncm91bmQnLCBjdXN0b21CRyk7XG4gICAgICAgIH1cbiAgICAgICAgJGRpdi5hcHBlbmRUbygkKHRhcmdldCkpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICRkaXYucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5hcHAuZ2V0QXBwSW5mbygpLnNldHRpbmdzLlJJUFBMRV9FRkZFQ1RfUkVNT1ZFX0RVUkFUSU9OICogMTAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+Y2xpY2s8L2NvZGU+IDxjb2RlPmhhbmRsZXI8L2NvZGU+IG1ldGhvZCB3aGljaCBhdXRvbWF0Y2lhbGx5IHBsYXlzIGEgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3RcbiAgICogKFtbcGxheVJpcHBsZUVmZmVjdF1dKSBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGluIDxjb2RlPjxiPmV2ZW50PC9iPjwvY29kZT4gb2JqZWN0LlxuICAgKiA8L3A+XG4gICAqL1xuICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgZXZlbnQncyBkZWZhdWx0XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMucGxheVJpcHBsZUVmZmVjdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlTG9zdEZvY3VzRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEJlZm9yZUxvc3RGb2N1c0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pikge1xuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb3N0Rm9jdXNFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubG9zdEZvY3VzRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0TG9zdEZvY3VzRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5sb3N0Rm9jdXNFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUZvY3VzRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUZvY3VzRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlRm9jdXNFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmJlZm9yZUZvY3VzRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGb2N1c0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEZvY3VzRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQ7XG5cbn1cbiJdfQ==