com.phloxui
Version:
PhloxUI Ng2+ Framework
751 lines (750 loc) • 60.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { ACTIVATE_EVENT, DEACTIVATE_EVENT, ENABLE_EVENT, DISABLE_EVENT, BEFORE_ACTIVATE_EVENT, BEFORE_DEACTIVATE_EVENT, BEFORE_ENABLE_EVENT, BEFORE_DISABLE_EVENT } from '../../share/CustomEventType';
import { AbstractDataView } from './AbstractDataView';
import { Option } from '../../decorator/Option.decorator';
import { EventUtils } from '../../share/utils/EventUtils';
// unsupported: template constraints.
/**
* @abstract
* @template T
*/
export class AbstractAccordion extends AbstractDataView {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
super(elementRef);
this.itemStatus = [];
this.autoInit = false;
this.multipleExpand = true;
this.activateEvent = new EventEmitter();
this.deactivateEvent = new EventEmitter();
this.enableEvent = new EventEmitter();
this.disableEvent = new EventEmitter();
this.beforeActivateEvent = new EventEmitter();
this.beforeDeactivateEvent = new EventEmitter();
this.beforeEnableEvent = new EventEmitter();
this.beforeDisableEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
this.setAccordionItems(this.items);
if (this.autoInit !== null && typeof this.autoInit !== 'undefined') {
if (this.autoInit) {
this.init();
}
}
}
/**
* @param {?} item
* @return {?}
*/
generateItemStatus(item) {
let /** @type {?} */ result = {
active: false,
enable: false
};
if (item !== null && typeof item !== 'undefined') {
result.active = item.active;
result.enable = item.enable;
}
return result;
}
/**
* @param {?} index
* @param {?=} exceptIndex
* @return {?}
*/
collapseItem(index, exceptIndex) {
if (index !== null && typeof index !== 'undefined') {
if (exceptIndex !== null && exceptIndex !== undefined) {
if (index === exceptIndex) {
return;
}
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (item.active) {
item.active = false;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.active = false;
}
this.onAccordionDeactived(index, item);
}
}
}
/**
* @param {?} index
* @return {?}
*/
_activateItem(index) {
if (index === null || index === undefined || index <= -1) {
return null;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (!item.active) {
item.active = true;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.active = true;
if (!this.multipleExpand) {
this.collapseItemAllExceptIndex(index);
}
this.onAccordionActived(index, item);
return item;
}
}
return null;
}
/**
* @param {?} index
* @return {?}
*/
_deactivateItem(index) {
if (index === null || index === undefined || index <= -1) {
return null;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (item.active) {
item.active = false;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.active = false;
this.onAccordionDeactived(index, item);
return item;
}
}
return null;
}
/**
* @param {?} index
* @return {?}
*/
_enableItem(index) {
if (index === null || index === undefined || index <= -1) {
return null;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null && item !== undefined) {
if (!item.enable) {
item.enable = true;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.enable = true;
this.onAccordionEnabled(index, item);
return item;
}
}
return null;
}
/**
* @param {?} index
* @return {?}
*/
_disableItem(index) {
if (index === null || index === undefined || index <= -1) {
return null;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null && item !== undefined) {
if (item.enable) {
this.deactivate(index);
item.enable = false;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.enable = false;
this.onAccordionDisabled(index, item);
return item;
}
}
return null;
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitBeforeActivateEvent(item, index, $event) {
// emit beforeEvent
let /** @type {?} */ bData = {
item: item,
index: index
};
let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_ACTIVATE_EVENT, this, bData, $event);
this.beforeActivateEvent.emit(beforeEV);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitActivateEvent(item, index, $event) {
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(ACTIVATE_EVENT, this, data, $event);
this.activateEvent.emit(ev);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitBeforeDeactivateEvent(item, index, $event) {
// emit beforeEvent
let /** @type {?} */ bData = {
item: item,
index: index
};
let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_DEACTIVATE_EVENT, this, bData, $event);
this.beforeDeactivateEvent.emit(beforeEV);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitDeactivateEvent(item, index, $event) {
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(DEACTIVATE_EVENT, this, data, $event);
this.deactivateEvent.emit(ev);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitBeforeEnableEvent(item, index, $event) {
// emit beforeEvent
let /** @type {?} */ bData = {
item: item,
index: index
};
let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_ENABLE_EVENT, this, bData, null);
this.beforeEnableEvent.emit(beforeEV);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitEnableEvent(item, index, $event) {
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(ENABLE_EVENT, this, data, $event);
this.enableEvent.emit(ev);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitBeforeDisableEvent(item, index, $event) {
// emit beforeEvent
let /** @type {?} */ bData = {
item: item,
index: index
};
let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_DISABLE_EVENT, this, bData, null);
this.beforeDisableEvent.emit(beforeEV);
}
/**
* @param {?} item
* @param {?} index
* @param {?=} $event
* @return {?}
*/
emitDisableEvent(item, index, $event) {
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(DISABLE_EVENT, this, data, $event);
this.disableEvent.emit(ev);
}
/**
* @param {?} index
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
activate(index, $event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (!item.active) {
EventUtils.handleBrowserEvent(this, 'beforeActivateEvent', $event, fireEvent, ($event) => {
// doEvent
this._activateItem(index);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeActivateEvent(item, index, $event);
}, ($event) => {
// emitAfterEvent
this.emitActivateEvent(item, index, $event);
}, ($event) => {
// doPrevented
});
return true;
}
else {
return false;
}
}
/**
* @param {?} index
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
deactivate(index, $event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item.active) {
EventUtils.handleBrowserEvent(this, 'beforeDeactivateEvent', $event, fireEvent, ($event) => {
// doEvent
this._deactivateItem(index);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeDeactivateEvent(item, index, $event);
}, ($event) => {
// emitAfterEvent
this.emitDeactivateEvent(item, index, $event);
}, ($event) => {
// doPrevented
});
return true;
}
else {
return false;
}
}
/**
* @param {?} index
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
enable(index, $event, fireEvent) {
if (index === null || index === undefined || index <= -1) {
return null;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (!item.enable) {
EventUtils.handleBrowserEvent(this, 'beforeEnableEvent', $event, fireEvent, ($event) => {
// doEvent
this._enableItem(index);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeEnableEvent(item, index, $event);
}, ($event) => {
// emitAfterEvent
this.emitEnableEvent(item, index, $event);
}, ($event) => {
// doPrevented
});
return true;
}
else {
return false;
}
}
/**
* @param {?} index
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
disable(index, $event, fireEvent) {
if (index === null || index === undefined || index <= -1) {
return null;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item.enable) {
EventUtils.handleBrowserEvent(this, 'beforeDisableEvent', $event, fireEvent, ($event) => {
// doEvent
this._disableItem(index);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeDisableEvent(item, index, $event);
}, ($event) => {
// emitAfterEvent
this.emitDisableEvent(item, index, $event);
}, ($event) => {
// doPrevented
});
return true;
}
else {
return false;
}
}
/**
* @param {?} items
* @return {?}
*/
setAccordionItems(items) {
this.items = items;
this.itemStatus = [];
if (this.items !== null && typeof this.items !== 'undefined') {
for (let /** @type {?} */ item of this.items) {
// change status
if (!item.enable) {
item.active = false;
}
let /** @type {?} */ wrapItem = this.generateItemStatus(item);
this.itemStatus.push(wrapItem);
}
}
}
/**
* @return {?}
*/
getAccordionItems() {
return this.items;
}
/**
* @param {?} index
* @return {?}
*/
getAccordionItem(index) {
if (this.items !== null && typeof this.items !== 'undefined') {
if (index < this.items.length) {
let /** @type {?} */ item = this.items[index];
return item;
}
}
return null;
}
/**
* @param {?} index
* @return {?}
*/
isActive(index) {
if (index !== null && typeof index !== 'undefined') {
if (index < this.items.length) {
return this.items[index].active;
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
isEnable(index) {
if (index !== null && typeof index !== 'undefined') {
if (index < this.items.length) {
return this.items[index].enable;
}
}
return false;
}
/**
* @param {?} item
* @return {?}
*/
getAccordionIndex(item) {
if (item !== null && item !== undefined) {
let /** @type {?} */ items = this.getAccordionItems();
return items.indexOf(item);
}
return -1;
}
/**
* @param {?=} exceptIndex
* @return {?}
*/
collapseItemAllExceptIndex(exceptIndex) {
let /** @type {?} */ items = this.getAccordionItems();
if (items !== null && items !== undefined) {
for (let /** @type {?} */ item of this.items) {
let /** @type {?} */ index = this.getAccordionIndex(item);
this.collapseItem(index, exceptIndex);
}
}
}
/**
* @return {?}
*/
isFixedHeight() {
if (this.fixedHeight === null || typeof this.fixedHeight === 'undefined' || this.fixedHeight === '') {
return false;
}
return true;
}
/**
* @return {?}
*/
getFixedHeight() {
return this.fixedHeight;
}
/**
* @param {?} fixedHeight
* @return {?}
*/
setFixedHeight(fixedHeight) {
this.fixedHeight = fixedHeight;
}
/**
* @param {?} activateEvent
* @return {?}
*/
setActivateEvent(activateEvent) {
this.activateEvent = activateEvent;
}
/**
* @return {?}
*/
getActivateEvent() {
return this.activateEvent;
}
/**
* @param {?} deactivateEvent
* @return {?}
*/
setDeactivateEvent(deactivateEvent) {
this.deactivateEvent = deactivateEvent;
}
/**
* @return {?}
*/
getDeactivateEvent() {
return this.deactivateEvent;
}
/**
* @param {?} enableEvent
* @return {?}
*/
setEnableEvent(enableEvent) {
this.enableEvent = enableEvent;
}
/**
* @return {?}
*/
getEnableEvent() {
return this.enableEvent;
}
/**
* @param {?} disableEvent
* @return {?}
*/
setDisableEvent(disableEvent) {
this.disableEvent = disableEvent;
}
/**
* @return {?}
*/
getDisableEvent() {
return this.disableEvent;
}
/**
* @param {?} beforeActivateEvent
* @return {?}
*/
setBeforeActivateEvent(beforeActivateEvent) {
this.beforeActivateEvent = beforeActivateEvent;
}
/**
* @return {?}
*/
getBeforeActivateEvent() {
return this.beforeActivateEvent;
}
/**
* @param {?} beforeDeactivateEvent
* @return {?}
*/
setBeforeDeactivateEvent(beforeDeactivateEvent) {
this.beforeDeactivateEvent = beforeDeactivateEvent;
}
/**
* @return {?}
*/
getBeforeDeactivateEvent() {
return this.beforeDeactivateEvent;
}
/**
* @param {?} beforeEnableEvent
* @return {?}
*/
setBeforeEnableEvent(beforeEnableEvent) {
this.beforeEnableEvent = beforeEnableEvent;
}
/**
* @return {?}
*/
getBeforeEnableEvent() {
return this.beforeEnableEvent;
}
/**
* @param {?} beforeDisableEvent
* @return {?}
*/
setBeforeDisableEvent(beforeDisableEvent) {
this.beforeDisableEvent = beforeDisableEvent;
}
/**
* @return {?}
*/
getBeforeDisableEvent() {
return this.beforeDisableEvent;
}
/**
* @param {?} isAutoInit
* @return {?}
*/
setAutoInit(isAutoInit) {
this.autoInit = isAutoInit;
}
/**
* @return {?}
*/
isAutoInit() {
return this.autoInit;
}
}
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], AbstractAccordion.prototype, "fixedHeight", void 0);
tslib_1.__decorate([
Option('beforeActivate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "beforeActivateEvent", void 0);
tslib_1.__decorate([
Option('activate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "activateEvent", void 0);
tslib_1.__decorate([
Option('beforeDeactivate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "beforeDeactivateEvent", void 0);
tslib_1.__decorate([
Option('deactivate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "deactivateEvent", void 0);
tslib_1.__decorate([
Option('beforeEnable'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "beforeEnableEvent", void 0);
tslib_1.__decorate([
Option('enable'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "enableEvent", void 0);
tslib_1.__decorate([
Option('beforeDisable'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "beforeDisableEvent", void 0);
tslib_1.__decorate([
Option('disable'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "disableEvent", void 0);
function AbstractAccordion_tsickle_Closure_declarations() {
/** @type {?} */
AbstractAccordion.prototype.itemStatus;
/** @type {?} */
AbstractAccordion.prototype.items;
/** @type {?} */
AbstractAccordion.prototype.fixedHeight;
/** @type {?} */
AbstractAccordion.prototype.beforeActivateEvent;
/** @type {?} */
AbstractAccordion.prototype.activateEvent;
/** @type {?} */
AbstractAccordion.prototype.beforeDeactivateEvent;
/** @type {?} */
AbstractAccordion.prototype.deactivateEvent;
/** @type {?} */
AbstractAccordion.prototype.beforeEnableEvent;
/** @type {?} */
AbstractAccordion.prototype.enableEvent;
/** @type {?} */
AbstractAccordion.prototype.beforeDisableEvent;
/** @type {?} */
AbstractAccordion.prototype.disableEvent;
/** @type {?} */
AbstractAccordion.prototype.autoInit;
/** @type {?} */
AbstractAccordion.prototype.multipleExpand;
/**
* @abstract
* @return {?}
*/
AbstractAccordion.prototype.init = function () { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionActived = function (index, item) { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionDeactived = function (index, item) { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionEnabled = function (index, item) { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionDisabled = function (index, item) { };
/**
* @abstract
* @return {?}
*/
AbstractAccordion.prototype.reload = function () { };
/**
* @abstract
* @return {?}
*/
AbstractAccordion.prototype.reRender = function () { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RBY2NvcmRpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvQWJzdHJhY3RBY2NvcmRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFDTCxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFDN0QscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzFGLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7O0FBRTFELE1BQU0sd0JBQWdFLFNBQVEsZ0JBQWdCOzs7O0lBeUI1RixZQUFZLFVBQXNCO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFD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c0NBQ00sWUFBWTs7O0lBQ2xDLE1BQU0sQ0FBQyxlQUFlLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25JdGVtTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9BY2NvcmRpb25JdGVtTW9kZWwnO1xuaW1wb3J0IHtcclxuICBBQ1RJVkFURV9FVkVOVCwgREVBQ1RJVkFURV9FVkVOVCwgRU5BQkxFX0VWRU5ULCBESVNBQkxFX0VWRU5ULFxuICBCRUZPUkVfQUNUSVZBVEVfRVZFTlQsIEJFRk9SRV9ERUFDVElWQVRFX0VWRU5ULCBCRUZPUkVfRU5BQkxFX0VWRU5ULCBCRUZPUkVfRElTQUJMRV9FVkVOVFxyXG59IGZyb20gJy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFWaWV3IH0gZnJvbSAnLi9BYnN0cmFjdERhdGFWaWV3JztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWNjb3JkaW9uPFQgZXh0ZW5kcyBBY2NvcmRpb25JdGVtTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3REYXRhVmlldyBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBpdGVtU3RhdHVzOiBhbnlbXTtcbiAgcHJvdGVjdGVkIGl0ZW1zOiBUW107XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZml4ZWRIZWlnaHQ6IHN0cmluZzsgLy8gaGVpZ2h0IGZvciBkZXRlcm1pbmUgaWYgYWNjb3JkaWFuIGluIGZpeEhlaWdodCBvciBub3QuXG4gIEBPcHRpb24oJ2JlZm9yZUFjdGl2YXRlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUFjdGl2YXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdhY3RpdmF0ZScpXG4gIHByb3RlY3RlZCBhY3RpdmF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlRGVhY3RpdmF0ZScpXG4gIHByb3RlY3RlZCBiZWZvcmVEZWFjdGl2YXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdkZWFjdGl2YXRlJylcbiAgcHJvdGVjdGVkIGRlYWN0aXZhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUVuYWJsZScpXG4gIHByb3RlY3RlZCBiZWZvcmVFbmFibGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2VuYWJsZScpXG4gIHByb3RlY3RlZCBlbmFibGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZURpc2FibGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlRGlzYWJsZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignZGlzYWJsZScpXG4gIHByb3RlY3RlZCBkaXNhYmxlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgYXV0b0luaXQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBtdWx0aXBsZUV4cGFuZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZik7XG4gICAgdGhpcy5pdGVtU3RhdHVzID0gW107XG4gICAgdGhpcy5hdXRvSW5pdCA9IGZhbHNlO1xuICAgIHRoaXMubXVsdGlwbGVFeHBhbmQgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmRlYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVuYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZGlzYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlQWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZURlYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUVuYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlRGlzYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0QWNjb3JkaW9uSXRlbXModGhpcy5pdGVtcyk7XG4gICAgaWYgKHRoaXMuYXV0b0luaXQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuYXV0b0luaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5hdXRvSW5pdCkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSXRlbVN0YXR1cyhpdGVtOiBUKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgIGVuYWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgdHlwZW9mIGl0ZW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHQuYWN0aXZlID0gaXRlbS5hY3RpdmU7XG4gICAgICByZXN1bHQuZW5hYmxlID0gaXRlbS5lbmFibGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGFwc2VJdGVtKGluZGV4OiBudW1iZXIsIGV4Y2VwdEluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ICE9PSBudWxsICYmIHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChleGNlcHRJbmRleCAhPT0gbnVsbCAmJiBleGNlcHRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gZXhjZXB0SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW0oaW5kZXgpO1xuXG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXRlbS5hY3RpdmUpIHtcbiAgICAgICAgICBpdGVtLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgICBzdGF0dXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQWNjb3JkaW9uRGVhY3RpdmVkKGluZGV4LCBpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmF0ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4ID09PSBudWxsIHx8IGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPD0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBpdGVtID0gdGhpcy5nZXRBY2NvcmRpb25JdGVtKGluZGV4KTtcbiAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgaWYgKCFpdGVtLmFjdGl2ZSkge1xuICAgICAgICBpdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgbGV0IHN0YXR1cyA9IHRoaXMuaXRlbVN0YXR1c1tpbmRleF07XG4gICAgICAgIHN0YXR1cy5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZUV4cGFuZCkge1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VJdGVtQWxsRXhjZXB0SW5kZXgoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkFjY29yZGlvbkFjdGl2ZWQoaW5kZXgsIGl0ZW0pO1xuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVhY3RpdmF0ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4ID09PSBudWxsIHx8IGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPD0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBpdGVtID0gdGhpcy5nZXRBY2NvcmRpb25JdGVtKGluZGV4KTtcblxuICAgIGlmIChpdGVtICE9PSBudWxsKSB7XG4gICAgICBpZiAoaXRlbS5hY3RpdmUpIHtcbiAgICAgICAgaXRlbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgLy8gdXBkYXRlIHN0YXR1c1xuICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgc3RhdHVzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMub25BY2NvcmRpb25EZWFjdGl2ZWQoaW5kZXgsIGl0ZW0pO1xuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW5hYmxlSXRlbShpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoaW5kZXggPT09IG51bGwgfHwgaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA8PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGl0ZW0gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW0oaW5kZXgpO1xuICAgIGlmIChpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFpdGVtLmVuYWJsZSkge1xuICAgICAgICBpdGVtLmVuYWJsZSA9IHRydWU7XG4gICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgbGV0IHN0YXR1cyA9IHRoaXMuaXRlbVN0YXR1c1tpbmRleF07XG4gICAgICAgIHN0YXR1cy5lbmFibGUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMub25BY2NvcmRpb25FbmFibGVkKGluZGV4LCBpdGVtKTtcblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVJdGVtKGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChpbmRleCA9PT0gbnVsbCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluZGV4IDw9IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0QWNjb3JkaW9uSXRlbShpbmRleCk7XG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaXRlbS5lbmFibGUpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlKGluZGV4KTtcblxuICAgICAgICBpdGVtLmVuYWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyB1cGRhdGUgc3RhdHVzXG4gICAgICAgIGxldCBzdGF0dXMgPSB0aGlzLml0ZW1TdGF0dXNbaW5kZXhdO1xuICAgICAgICBzdGF0dXMuZW5hYmxlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5vbkFjY29yZGlvbkRpc2FibGVkKGluZGV4LCBpdGVtKTtcblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQWN0aXZhdGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0FDVElWQVRFX0VWRU5ULCB0aGlzLCBiRGF0YSwgJGV2ZW50KTtcbiAgICB0aGlzLmJlZm9yZUFjdGl2YXRlRXZlbnQuZW1pdChiZWZvcmVFVik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEFjdGl2YXRlRXZlbnQoaXRlbTogYW55LCBpbmRleDogbnVtYmVyLCAkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQUNUSVZBVEVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmFjdGl2YXRlRXZlbnQuZW1pdChldik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZURlYWN0aXZhdGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0RFQUNUSVZBVEVfRVZFTlQsIHRoaXMsIGJEYXRhLCAkZXZlbnQpO1xuICAgIHRoaXMuYmVmb3JlRGVhY3RpdmF0ZUV2ZW50LmVtaXQoYmVmb3JlRVYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXREZWFjdGl2YXRlRXZlbnQoaXRlbTogYW55LCBpbmRleDogbnVtYmVyLCAkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoREVBQ1RJVkFURV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIHRoaXMuZGVhY3RpdmF0ZUV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVFbmFibGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0VOQUJMRV9FVkVOVCwgdGhpcywgYkRhdGEsIG51bGwpO1xuICAgIHRoaXMuYmVmb3JlRW5hYmxlRXZlbnQuZW1pdChiZWZvcmVFVik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEVuYWJsZUV2ZW50KGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEVOQUJMRV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIHRoaXMuZW5hYmxlRXZlbnQuZW1pdChldik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZURpc2FibGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0RJU0FCTEVfRVZFTlQsIHRoaXMsIGJEYXRhLCBudWxsKTtcbiAgICB0aGlzLmJlZm9yZURpc2FibGVFdmVudC5lbWl0KGJlZm9yZUVWKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0RGlzYWJsZUV2ZW50KGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KERJU0FCTEVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmRpc2FibGVFdmVudC5lbWl0KGV2KTtcbi