com.phloxui
Version:
PhloxUI Ng2+ Framework
330 lines (329 loc) • 30.6 kB
JavaScript
/**
* @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==