@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
365 lines • 29.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: dropdown.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, Output, HostBinding, EventEmitter, ElementRef, Optional, SkipSelf, ContentChildren, QueryList } from '@angular/core';
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { Subject, merge, fromEvent } from 'rxjs';
import { debounceTime, mapTo, filter, tap } from 'rxjs/operators';
import { DropDownService } from './dropdown.service';
var DropDownDirective = /** @class */ (function () {
function DropDownDirective(dropdownService, el, parentDropdown) {
this.dropdownService = dropdownService;
this.el = el;
this.parentDropdown = parentDropdown;
this.addClass = true;
this.disabled = false;
/**
* dropdown触发方式
*/
this.trigger = 'click';
/**
* 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭
*/
this.closeScope = 'all';
this.closeOnMouseLeaveMenu = false;
this.toggleEvent = new EventEmitter();
this.visibleSubject = new Subject();
this._isOpen = false;
}
Object.defineProperty(DropDownDirective.prototype, "isOpen", {
/**
* 控制是否打开dropdown,绑定一个devui-dropdown-open class
*/
get: /**
* 控制是否打开dropdown,绑定一个devui-dropdown-open class
* @return {?}
*/
function () {
return this._isOpen;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._isOpen = !!value;
if (this.disabled) {
return;
}
if (this.isOpen) {
this.visibleSubject.next(true);
this.focusToggleElement();
this.dropdownService.open(this);
}
else {
this.visibleSubject.next(false);
this.dropdownService.close(this);
}
this.toggleEvent.emit(this.isOpen);
},
enumerable: true,
configurable: true
});
Object.defineProperty(DropDownDirective.prototype, "appendToBody", {
get: /**
* @return {?}
*/
function () {
return this._appendToBody;
},
set: /**
* @param {?} bool
* @return {?}
*/
function (bool) {
this._appendToBody = (bool === true);
this.updateCdkConnectedOverlayOrigin();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DropDownDirective.prototype, "dropDownMenu", {
set: /**
* @param {?} dropdownMenu
* @return {?}
*/
function (dropdownMenu) {
// init drop down menu
this.menuEl = dropdownMenu.el;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DropDownDirective.prototype, "dropDownToggle", {
set: /**
* @param {?} dropdownToggle
* @return {?}
*/
function (dropdownToggle) {
// init toggle element
this.toggleEl = dropdownToggle.el;
this.updateCdkConnectedOverlayOrigin();
},
enumerable: true,
configurable: true
});
/**
* @param {?} changes
* @return {?}
*/
DropDownDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.hasOwnProperty('trigger')) {
this.handleHoverSubscriptionIfTriggerIsHover();
}
};
/**
* @return {?}
*/
DropDownDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.dropdownService.close(this);
this.unsubscribeHoverAction();
};
/**
* @return {?}
*/
DropDownDirective.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.handleHoverSubscriptionIfTriggerIsHover();
};
/**
* @return {?}
*/
DropDownDirective.prototype.toggle = /**
* @return {?}
*/
function () {
return this.isOpen = !this.isOpen;
};
/**
* @return {?}
*/
DropDownDirective.prototype.focusToggleElement = /**
* @return {?}
*/
function () {
if (this.toggleEl) {
this.toggleEl.nativeElement.focus();
}
};
/**
* @return {?}
*/
DropDownDirective.prototype.updateCdkConnectedOverlayOrigin = /**
* @return {?}
*/
function () {
if (this.toggleEl && this.appendToBody === true) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(this.toggleEl);
}
else {
this.cdkConnectedOverlayOrigin = undefined;
}
};
/**
* @param {?} observable
* @return {?}
*/
DropDownDirective.prototype.subscribeHoverAction = /**
* @param {?} observable
* @return {?}
*/
function (observable) {
var _this = this;
if (!!!this.hoverSubscription) {
this.hoverSubscription = observable.pipe(debounceTime(50)).subscribe((/**
* @param {?} isOpen
* @return {?}
*/
function (isOpen) {
if (!_this.disabled && _this.isOpen !== isOpen) {
_this.isOpen = isOpen;
}
}));
}
};
/**
* @private
* @return {?}
*/
DropDownDirective.prototype.unsubscribeHoverAction = /**
* @private
* @return {?}
*/
function () {
if (this.hoverSubscription) {
this.hoverSubscription.unsubscribe();
this.hoverSubscription = null;
}
};
/**
* @return {?}
*/
DropDownDirective.prototype.handleHoverSubscriptionIfTriggerIsHover = /**
* @return {?}
*/
function () {
var _this = this;
if (this.trigger === 'hover') {
/** @type {?} */
var states = merge(fromEvent(this.el.nativeElement, 'mouseenter').pipe(mapTo(true)), fromEvent(this.el.nativeElement, 'mouseleave').pipe(filter((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (_this.isOpen && _this.appendToBody === true) {
// 冒泡模拟的relatedTarget, 和作用于dropdown本身event.relatedTarget
// menu(子) -> toggle(父) 冒泡模拟的用于离开菜单的时候判断不判断overlay的div层,即只判断menuEl.nativeElement
// toggle(父) -> menu(子) 离开元素本身的需要判断是否落入了overlay的div层,即只判断menuEl.nativeElement.parentElement
/** @type {?} */
var relatedTarget_1 = event.relatedTarget || (event['originEvent'] && event['originEvent'].relatedTarget);
return !(_this.menuEl.nativeElement && relatedTarget_1 &&
(_this.menuEl.nativeElement.parentElement.contains(event.relatedTarget)
|| _this.menuEl.nativeElement.parentElement.parentElement.contains(event.relatedTarget) // 套了两层div增加判断
|| _this.menuEl.nativeElement.contains(relatedTarget_1)
|| _this.dropdownChildren.some((/**
* @param {?} children
* @return {?}
*/
function (children) {
return children !== _this
// appendToBody的时候可能会没有实例化不在document上需要做判断有没有parentElement
&& (children.menuEl.nativeElement.parentElement
&& children.menuEl.nativeElement.parentElement.contains(event.relatedTarget)
|| children.menuEl.nativeElement.contains(relatedTarget_1));
}))));
}
else {
return true;
}
})), tap((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (_this.parentDropdown) {
_this.simulateEventDispatch(event, _this.parentDropdown.el.nativeElement);
}
})), mapTo(false)));
this.subscribeHoverAction(states);
}
else {
this.unsubscribeHoverAction();
}
};
/**
* @param {?} $event
* @param {?=} target
* @return {?}
*/
DropDownDirective.prototype.simulateEventDispatch = /**
* @param {?} $event
* @param {?=} target
* @return {?}
*/
function ($event, target) {
/** @type {?} */
var event = document.createEvent('MouseEvents');
event.initEvent($event.type, true, true);
event['originEvent'] = $event['originEvent'] || $event;
if (!target) {
target = this.el.nativeElement;
}
target.dispatchEvent(event);
};
DropDownDirective.decorators = [
{ type: Directive, args: [{
selector: '[dDropDown]',
exportAs: 'd-dropdown',
providers: [DropDownService]
},] }
];
/** @nocollapse */
DropDownDirective.ctorParameters = function () { return [
{ type: DropDownService },
{ type: ElementRef },
{ type: DropDownDirective, decorators: [{ type: Optional }, { type: SkipSelf }] }
]; };
DropDownDirective.propDecorators = {
dropdownChildren: [{ type: ContentChildren, args: [DropDownDirective, { descendants: true },] }],
isOpen: [{ type: HostBinding, args: ['class.devui-dropdown-open',] }, { type: Input }],
addClass: [{ type: HostBinding, args: ['class.devui-dropdown',] }],
disabled: [{ type: Input }],
trigger: [{ type: Input }],
closeScope: [{ type: Input }],
closeOnMouseLeaveMenu: [{ type: Input }],
toggleEvent: [{ type: Output }]
};
return DropDownDirective;
}());
export { DropDownDirective };
if (false) {
/** @type {?} */
DropDownDirective.prototype.dropdownChildren;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype.hoverSubscription;
/** @type {?} */
DropDownDirective.prototype.addClass;
/** @type {?} */
DropDownDirective.prototype.disabled;
/**
* dropdown触发方式
* @type {?}
*/
DropDownDirective.prototype.trigger;
/**
* 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭
* @type {?}
*/
DropDownDirective.prototype.closeScope;
/** @type {?} */
DropDownDirective.prototype.closeOnMouseLeaveMenu;
/** @type {?} */
DropDownDirective.prototype.toggleEvent;
/** @type {?} */
DropDownDirective.prototype.visibleSubject;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype._isOpen;
/** @type {?} */
DropDownDirective.prototype.menuEl;
/** @type {?} */
DropDownDirective.prototype.toggleEl;
/** @type {?} */
DropDownDirective.prototype.cdkConnectedOverlayOrigin;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype._appendToBody;
/**
* @type {?}
* @private
*/
DropDownDirective.prototype.dropdownService;
/** @type {?} */
DropDownDirective.prototype.el;
/** @type {?} */
DropDownDirective.prototype.parentDropdown;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZHJvcGRvd24vIiwic291cmNlcyI6WyJkcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFhLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQ3JDLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUMvRSxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJEO0lBNkVFLDJCQUFvQixlQUFnQyxFQUFTLEVBQWMsRUFDMUMsY0FBaUM7UUFEOUMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUMxQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFoRDdCLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDNUMsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUtqQixZQUFPLEdBQXNCLE9BQU8sQ0FBQzs7OztRQUlyQyxlQUFVLEdBQTZCLEtBQUssQ0FBQztRQUM3QywwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFFN0IsZ0JBQVcsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVsRSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFFaEMsWUFBTyxHQUFHLEtBQUssQ0FBQztJQWdDeEIsQ0FBQztJQXBFRCxzQkFDYSxxQ0FBTTtRQUpuQjs7V0FFRzs7Ozs7UUFDSDtZQUVJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QixDQUFDOzs7OztRQUNELFVBQVcsS0FBSztZQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU87YUFDUjtZQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNsQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxDQUFDOzs7T0FmQTtJQTRDRCxzQkFBVywyQ0FBWTs7OztRQUl2QjtZQUNFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM1QixDQUFDOzs7OztRQU5ELFVBQXdCLElBQWE7WUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztRQUN6QyxDQUFDOzs7T0FBQTtJQUtELHNCQUFXLDJDQUFZOzs7OztRQUF2QixVQUF3QixZQUFZO1lBQ2xDLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBVyw2Q0FBYzs7Ozs7UUFBekIsVUFBMEIsY0FBYztZQUN0QyxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7OztPQUFBOzs7OztJQU1ELHVDQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7U0FDaEQ7SUFDSCxDQUFDOzs7O0lBRUQsdUNBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDaEMsQ0FBQzs7OztJQUVELDhDQUFrQjs7O0lBQWxCO1FBQ0UsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7SUFDakQsQ0FBQzs7OztJQUVNLGtDQUFNOzs7SUFBYjtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVNLDhDQUFrQjs7O0lBQXpCO1FBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQzs7OztJQUVELDJEQUErQjs7O0lBQS9CO1FBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFO1lBQy9DLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN0RTthQUFNO1lBQ0wsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFNBQVMsQ0FBQztTQUM1QztJQUNILENBQUM7Ozs7O0lBRUQsZ0RBQW9COzs7O0lBQXBCLFVBQXFCLFVBQStCO1FBQXBELGlCQVVDO1FBVEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQ3RDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FDakIsQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQSxNQUFNO2dCQUNoQixJQUFJLENBQUMsS0FBSSxDQUFDLFFBQVEsSUFBSSxLQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtvQkFDNUMsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7aUJBQ3RCO1lBQ0gsQ0FBQyxFQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Ozs7O0lBRU8sa0RBQXNCOzs7O0lBQTlCO1FBQ0UsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDL0I7SUFDSCxDQUFDOzs7O0lBRUQsbUVBQXVDOzs7SUFBdkM7UUFBQSxpQkF1Q0M7UUF0Q0MsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTs7Z0JBQ3RCLE1BQU0sR0FBd0IsS0FBSyxDQUN2QyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNoRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUNqRCxNQUFNOzs7O1lBQUMsVUFBQyxLQUFpQjtnQkFDdkIsSUFBSSxLQUFJLENBQUMsTUFBTSxJQUFJLEtBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFOzs7Ozt3QkFJdkMsZUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGFBQWEsQ0FBQztvQkFDekcsT0FBUSxDQUFDLENBQUMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksZUFBYTt3QkFDaEQsQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7K0JBQ25FLEtBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxjQUFjOytCQUNsRyxLQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsZUFBYSxDQUFDOytCQUNqRCxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSTs7Ozs0QkFDM0IsVUFBQSxRQUFRO2dDQUNOLE9BQUEsUUFBUSxLQUFLLEtBQUk7b0NBQ2pCLDBEQUEwRDt1Q0FDdkQsQ0FBRSxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhOzJDQUM3QyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7MkNBQ3pFLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFhLENBQUMsQ0FBQzs0QkFKekQsQ0FJeUQsRUFDNUQsQ0FBQyxDQUNMLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLENBQUM7aUJBQ2I7WUFDSCxDQUFDLEVBQUMsRUFDRixHQUFHOzs7O1lBQUMsVUFBQSxLQUFLO2dCQUNQLElBQUksS0FBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsS0FBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxLQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDekU7WUFDSCxDQUFDLEVBQUMsRUFDRixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDaEI7WUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQsaURBQXFCOzs7OztJQUFyQixVQUFzQixNQUFNLEVBQUUsTUFBTzs7WUFDN0IsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ2pELEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxNQUFNLENBQUM7UUFFdkQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUNoQztRQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7Z0JBeExGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQztpQkFDN0I7Ozs7Z0JBTlEsZUFBZTtnQkFQaUQsVUFBVTtnQkF1RmhDLGlCQUFpQix1QkFBL0QsUUFBUSxZQUFJLFFBQVE7OzttQ0F4RXRCLGVBQWUsU0FBQyxpQkFBaUIsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7eUJBS3RELFdBQVcsU0FBQywyQkFBMkIsY0FDdkMsS0FBSzsyQkFrQkwsV0FBVyxTQUFDLHNCQUFzQjsyQkFDbEMsS0FBSzswQkFLTCxLQUFLOzZCQUlMLEtBQUs7d0NBQ0wsS0FBSzs4QkFFTCxNQUFNOztJQStJVCx3QkFBQztDQUFBLEFBMUxELElBMExDO1NBckxZLGlCQUFpQjs7O0lBQzVCLDZDQUF3Rzs7Ozs7SUFDeEcsOENBQXdDOztJQXVCeEMscUNBQXFEOztJQUNyRCxxQ0FBMEI7Ozs7O0lBSzFCLG9DQUE4Qzs7Ozs7SUFJOUMsdUNBQXNEOztJQUN0RCxrREFBdUM7O0lBRXZDLHdDQUFrRTs7SUFFbEUsMkNBQXdDOzs7OztJQUV4QyxvQ0FBd0I7O0lBR3hCLG1DQUEwQjs7SUFFMUIscUNBQTRCOztJQUU1QixzREFBbUQ7Ozs7O0lBRW5ELDBDQUErQjs7Ozs7SUFxQm5CLDRDQUF3Qzs7SUFBRSwrQkFBcUI7O0lBQ3pFLDJDQUFnRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgT25EZXN0cm95LCBJbnB1dCwgT3V0cHV0LCBIb3N0QmluZGluZywgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLFxyXG4gIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT3B0aW9uYWwsIFNraXBTZWxmLCBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka092ZXJsYXlPcmlnaW59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgbWVyZ2UsIGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwVG8sIGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEcm9wRG93blNlcnZpY2UgfSBmcm9tICcuL2Ryb3Bkb3duLnNlcnZpY2UnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZERyb3BEb3duXScsXHJcbiAgZXhwb3J0QXM6ICdkLWRyb3Bkb3duJyxcclxuICBwcm92aWRlcnM6IFtEcm9wRG93blNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcm9wRG93bkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBAQ29udGVudENoaWxkcmVuKERyb3BEb3duRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBkcm9wZG93bkNoaWxkcmVuOiBRdWVyeUxpc3Q8RHJvcERvd25EaXJlY3RpdmU+O1xyXG4gIHByaXZhdGUgaG92ZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAvKipcclxuICAgKiDmjqfliLbmmK/lkKbmiZPlvIBkcm9wZG93bu+8jOe7keWumuS4gOS4qmRldnVpLWRyb3Bkb3duLW9wZW4gY2xhc3NcclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLWRyb3Bkb3duLW9wZW4nKVxyXG4gIEBJbnB1dCgpIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgfVxyXG4gIHNldCBpc09wZW4odmFsdWUpIHtcclxuICAgIHRoaXMuX2lzT3BlbiA9ICEhdmFsdWU7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgdGhpcy52aXNpYmxlU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICB0aGlzLmZvY3VzVG9nZ2xlRWxlbWVudCgpO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duU2VydmljZS5vcGVuKHRoaXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy52aXNpYmxlU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5kcm9wZG93blNlcnZpY2UuY2xvc2UodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRvZ2dsZUV2ZW50LmVtaXQodGhpcy5pc09wZW4pO1xyXG4gIH1cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLWRyb3Bkb3duJykgYWRkQ2xhc3MgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIGRyb3Bkb3du6Kem5Y+R5pa55byPXHJcbiAgICovXHJcbiAgQElucHV0KCkgdHJpZ2dlcjogJ2NsaWNrJyB8ICdob3ZlcicgPSAnY2xpY2snO1xyXG4gIC8qKlxyXG4gICAqIOWFs+mXreWMuuWfn++8jOm7mOiupOeCueWHu+iPnOWNlemTvuaOpeS5n+S8muWFs+mXre+8jGJsYW5r54K55Ye75YW25LuW56m655m95Yy65Z+f5omN5YWz6ZetXHJcbiAgICovXHJcbiAgQElucHV0KCkgY2xvc2VTY29wZTogJ2FsbCcgfCAnYmxhbmsnIHwgJ25vbmUnID0gJ2FsbCc7XHJcbiAgQElucHV0KCkgY2xvc2VPbk1vdXNlTGVhdmVNZW51ID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSB0b2dnbGVFdmVudDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblxyXG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAvLyBkcm9wIG1lbnUgaHRtbFxyXG4gIHB1YmxpYyBtZW51RWw6IEVsZW1lbnRSZWY7XHJcbiAgLy8gZHJvcCBkb3duIHRvZ2dsZSBlbGVtZW50XHJcbiAgcHVibGljIHRvZ2dsZUVsOiBFbGVtZW50UmVmO1xyXG5cclxuICBwdWJsaWMgY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbjogQ2RrT3ZlcmxheU9yaWdpbjtcclxuXHJcbiAgcHJpdmF0ZSBfYXBwZW5kVG9Cb2R5OiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgc2V0IGFwcGVuZFRvQm9keShib29sOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9hcHBlbmRUb0JvZHkgPSAoYm9vbCA9PT0gdHJ1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBhcHBlbmRUb0JvZHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXBwZW5kVG9Cb2R5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkcm9wRG93bk1lbnUoZHJvcGRvd25NZW51KSB7XHJcbiAgICAvLyBpbml0IGRyb3AgZG93biBtZW51XHJcbiAgICB0aGlzLm1lbnVFbCA9IGRyb3Bkb3duTWVudS5lbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZHJvcERvd25Ub2dnbGUoZHJvcGRvd25Ub2dnbGUpIHtcclxuICAgIC8vIGluaXQgdG9nZ2xlIGVsZW1lbnRcclxuICAgIHRoaXMudG9nZ2xlRWwgPSBkcm9wZG93blRvZ2dsZS5lbDtcclxuICAgIHRoaXMudXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbigpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkcm9wZG93blNlcnZpY2U6IERyb3BEb3duU2VydmljZSwgcHVibGljIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIHBhcmVudERyb3Bkb3duOiBEcm9wRG93bkRpcmVjdGl2ZSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3RyaWdnZXInKSkge1xyXG4gICAgICB0aGlzLmhhbmRsZUhvdmVyU3Vic2NyaXB0aW9uSWZUcmlnZ2VySXNIb3ZlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRyb3Bkb3duU2VydmljZS5jbG9zZSh0aGlzKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVIb3ZlckFjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy5oYW5kbGVIb3ZlclN1YnNjcmlwdGlvbklmVHJpZ2dlcklzSG92ZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNUb2dnbGVFbGVtZW50KCkge1xyXG4gICAgaWYgKHRoaXMudG9nZ2xlRWwpIHtcclxuICAgICAgdGhpcy50b2dnbGVFbC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCkge1xyXG4gICAgaWYgKHRoaXMudG9nZ2xlRWwgJiYgdGhpcy5hcHBlbmRUb0JvZHkgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luID0gbmV3IENka092ZXJsYXlPcmlnaW4odGhpcy50b2dnbGVFbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVIb3ZlckFjdGlvbihvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogdm9pZCB7XHJcbiAgICBpZiAoISEhdGhpcy5ob3ZlclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmhvdmVyU3Vic2NyaXB0aW9uID0gb2JzZXJ2YWJsZS5waXBlKFxyXG4gICAgICAgIGRlYm91bmNlVGltZSg1MCksXHJcbiAgICAgICkuc3Vic2NyaWJlKGlzT3BlbiA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMuaXNPcGVuICE9PSBpc09wZW4pIHtcclxuICAgICAgICAgIHRoaXMuaXNPcGVuID0gaXNPcGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuc3Vic2NyaWJlSG92ZXJBY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ob3ZlclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmhvdmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuaG92ZXJTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlSG92ZXJTdWJzY3JpcHRpb25JZlRyaWdnZXJJc0hvdmVyICgpIHtcclxuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgY29uc3Qgc3RhdGVzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gbWVyZ2UoXHJcbiAgICAgICAgZnJvbUV2ZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInKS5waXBlKG1hcFRvKHRydWUpKSxcclxuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpLnBpcGUoXHJcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiB0aGlzLmFwcGVuZFRvQm9keSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgIC8vIOWGkuazoeaooeaLn+eahHJlbGF0ZWRUYXJnZXTvvIwg5ZKM5L2c55So5LqOZHJvcGRvd27mnKzouqtldmVudC5yZWxhdGVkVGFyZ2V0XHJcbiAgICAgICAgICAgICAgLy8gbWVude+8iOWtkO+8iSAtPiB0b2dnbGXvvIjniLbvvIkg5YaS5rOh5qih5ouf55qE55So5LqO56a75byA6I+c5Y2V55qE5pe25YCZ5Yik5pat5LiN5Yik5patb3ZlcmxheeeahGRpduWxgu+8jOWNs+WPquWIpOaWrW1lbnVFbC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICAgLy8gdG9nZ2xl77yI54i277yJIC0+IG1lbnXvvIjlrZDvvIkg56a75byA5YWD57Sg5pys6Lqr55qE6ZyA6KaB5Yik5pat5piv5ZCm6JC95YWl5LqGb3ZlcmxheeeahGRpduWxgu+8jOWNs+WPquWIpOaWrW1lbnVFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnRbJ29yaWdpbkV2ZW50J10gJiYgZXZlbnRbJ29yaWdpbkV2ZW50J10ucmVsYXRlZFRhcmdldCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuICAhKHRoaXMubWVudUVsLm5hdGl2ZUVsZW1lbnQgJiYgcmVsYXRlZFRhcmdldCAmJlxyXG4gICAgICAgICAgICAgICAgICAodGhpcy5tZW51RWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXHJcbiAgICAgICAgICAgICAgICAgIHx8IHRoaXMubWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpIC8vIOWll+S6huS4pOWxgmRpduWinuWKoOWIpOaWrVxyXG4gICAgICAgICAgICAgICAgICB8fCB0aGlzLm1lbnVFbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpXHJcbiAgICAgICAgICAgICAgICAgIHx8IHRoaXMuZHJvcGRvd25DaGlsZHJlbi5zb21lKFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiAhPT0gdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kVG9Cb2R555qE5pe25YCZ5Y+v6IO95Lya5rKh5pyJ5a6e5L6L5YyW5LiN5ZyoZG9jdW1lbnTkuIrpnIDopoHlgZrliKTmlq3mnInmsqHmnIlwYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAmJiAoIGNoaWxkcmVuLm1lbnVFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICYmIGNoaWxkcmVuLm1lbnVFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgICAgICAgICAgIHx8IGNoaWxkcmVuLm1lbnVFbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKVxyXG4gICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGFwKGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50RHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICB0aGlzLnNpbXVsYXRlRXZlbnREaXNwYXRjaChldmVudCwgdGhpcy5wYXJlbnREcm9wZG93bi5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBtYXBUbyhmYWxzZSkpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlSG92ZXJBY3Rpb24oc3RhdGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVIb3ZlckFjdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGVFdmVudERpc3BhdGNoKCRldmVudCwgdGFyZ2V0PyApIHtcclxuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XHJcbiAgICBldmVudC5pbml0RXZlbnQoJGV2ZW50LnR5cGUsIHRydWUsIHRydWUpO1xyXG4gICAgZXZlbnRbJ29yaWdpbkV2ZW50J10gPSAkZXZlbnRbJ29yaWdpbkV2ZW50J10gfHwgJGV2ZW50O1xyXG5cclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHRhcmdldCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=