ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
391 lines • 35 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: dropdown.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __metadata, __read, __spread } from "tslib";
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
import { Overlay } from '@angular/cdk/overlay';
import { Platform } from '@angular/cdk/platform';
import { TemplatePortal } from '@angular/cdk/portal';
import { Directive, ElementRef, EventEmitter, Input, Output, ViewContainerRef } from '@angular/core';
import { POSITION_MAP } from 'ng-zorro-antd/core/overlay';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { BehaviorSubject, combineLatest, EMPTY, fromEvent, merge, Subject } from 'rxjs';
import { auditTime, distinctUntilChanged, filter, map, mapTo, switchMap, takeUntil } from 'rxjs/operators';
/** @type {?} */
var listOfPositions = [POSITION_MAP.bottomLeft, POSITION_MAP.bottomRight, POSITION_MAP.topRight, POSITION_MAP.topLeft];
var NzDropDownDirective = /** @class */ (function () {
function NzDropDownDirective(elementRef, overlay, viewContainerRef, platform) {
this.elementRef = elementRef;
this.overlay = overlay;
this.viewContainerRef = viewContainerRef;
this.platform = platform;
this.overlayRef = null;
this.destroy$ = new Subject();
this.positionStrategy = this.overlay.position().flexibleConnectedTo(this.elementRef.nativeElement).withLockedPosition();
this.inputVisible$ = new BehaviorSubject(false);
this.nzTrigger$ = new BehaviorSubject('hover');
this.overlayClose$ = new Subject();
this.nzDropdownMenu = null;
this.nzTrigger = 'hover';
this.nzMatchWidthElement = null;
this.nzBackdrop = true;
this.nzClickHide = true;
this.nzDisabled = false;
this.nzVisible = false;
this.nzOverlayClassName = '';
this.nzOverlayStyle = {};
this.nzPlacement = 'bottomLeft';
this.nzVisibleChange = new EventEmitter();
}
/**
* @template T
* @param {?} key
* @param {?} value
* @return {?}
*/
NzDropDownDirective.prototype.setDropdownMenuValue = /**
* @template T
* @param {?} key
* @param {?} value
* @return {?}
*/
function (key, value) {
if (this.nzDropdownMenu) {
this.nzDropdownMenu.setValue(key, value);
}
};
/**
* @return {?}
*/
NzDropDownDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.positionStrategy.positionChanges.pipe(takeUntil(this.destroy$)).subscribe((/**
* @param {?} change
* @return {?}
*/
function (change) {
_this.setDropdownMenuValue('dropDownPosition', change.connectionPair.originY);
}));
};
/**
* @return {?}
*/
NzDropDownDirective.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.nzDropdownMenu) {
/** @type {?} */
var nativeElement_1 = this.elementRef.nativeElement;
/**
* host mouse state *
* @type {?}
*/
var hostMouseState$ = merge(fromEvent(nativeElement_1, 'mouseenter').pipe(mapTo(true)), fromEvent(nativeElement_1, 'mouseleave').pipe(mapTo(false)));
/**
* menu mouse state *
* @type {?}
*/
var menuMouseState$ = this.nzDropdownMenu.mouseState$;
/**
* merged mouse state *
* @type {?}
*/
var mergedMouseState$_1 = merge(menuMouseState$, hostMouseState$);
/**
* host click state *
* @type {?}
*/
var hostClickState$_1 = fromEvent(nativeElement_1, 'click').pipe(mapTo(true));
/**
* visible state switch by nzTrigger *
* @type {?}
*/
var visibleStateByTrigger$ = this.nzTrigger$.pipe(switchMap((/**
* @param {?} trigger
* @return {?}
*/
function (trigger) {
if (trigger === 'hover') {
return mergedMouseState$_1;
}
else if (trigger === 'click') {
return hostClickState$_1;
}
else {
return EMPTY;
}
})));
/** @type {?} */
var descendantMenuItemClick$ = this.nzDropdownMenu.descendantMenuItemClick$.pipe(filter((/**
* @return {?}
*/
function () { return _this.nzClickHide; })), mapTo(false));
/** @type {?} */
var domTriggerVisible$ = merge(visibleStateByTrigger$, descendantMenuItemClick$, this.overlayClose$).pipe(filter((/**
* @return {?}
*/
function () { return !_this.nzDisabled; })));
/** @type {?} */
var visible$ = merge(this.inputVisible$, domTriggerVisible$);
combineLatest([visible$, this.nzDropdownMenu.isChildSubMenuOpen$])
.pipe(map((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 2), visible = _b[0], sub = _b[1];
return visible || sub;
})), auditTime(150), distinctUntilChanged(), filter((/**
* @return {?}
*/
function () { return _this.platform.isBrowser; })), takeUntil(this.destroy$))
.subscribe((/**
* @param {?} visible
* @return {?}
*/
function (visible) {
/** @type {?} */
var element = _this.nzMatchWidthElement ? _this.nzMatchWidthElement.nativeElement : nativeElement_1;
/** @type {?} */
var triggerWidth = element.getBoundingClientRect().width;
if (_this.nzVisible !== visible) {
_this.nzVisibleChange.emit(visible);
}
_this.nzVisible = visible;
if (visible) {
/** set up overlayRef **/
if (!_this.overlayRef) {
/** new overlay **/
_this.overlayRef = _this.overlay.create({
positionStrategy: _this.positionStrategy,
minWidth: triggerWidth,
disposeOnNavigation: true,
hasBackdrop: _this.nzTrigger === 'click',
backdropClass: _this.nzBackdrop ? undefined : 'nz-overlay-transparent-backdrop',
scrollStrategy: _this.overlay.scrollStrategies.reposition()
});
merge(_this.overlayRef.backdropClick(), _this.overlayRef.detachments(), _this.overlayRef.keydownEvents().pipe(filter((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.keyCode === ESCAPE && !hasModifierKey(e); }))))
.pipe(mapTo(false), takeUntil(_this.destroy$))
.subscribe(_this.overlayClose$);
}
else {
/**
* update overlay config *
* @type {?}
*/
var overlayConfig = _this.overlayRef.getConfig();
overlayConfig.minWidth = triggerWidth;
overlayConfig.hasBackdrop = _this.nzTrigger === 'click';
}
/** open dropdown with animation **/
_this.positionStrategy.withPositions(__spread([POSITION_MAP[_this.nzPlacement]], listOfPositions));
/** reset portal if needed **/
if (!_this.portal || _this.portal.templateRef !== (/** @type {?} */ (_this.nzDropdownMenu)).templateRef) {
_this.portal = new TemplatePortal((/** @type {?} */ (_this.nzDropdownMenu)).templateRef, _this.viewContainerRef);
}
_this.overlayRef.attach(_this.portal);
}
else {
/** detach overlayRef if needed **/
if (_this.overlayRef) {
_this.overlayRef.detach();
}
}
}));
}
};
/**
* @return {?}
*/
NzDropDownDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
if (this.overlayRef) {
this.overlayRef.dispose();
this.overlayRef = null;
}
};
/**
* @param {?} changes
* @return {?}
*/
NzDropDownDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var nzVisible = changes.nzVisible, nzPlacement = changes.nzPlacement, nzDisabled = changes.nzDisabled, nzOverlayClassName = changes.nzOverlayClassName, nzOverlayStyle = changes.nzOverlayStyle, nzTrigger = changes.nzTrigger;
if (nzTrigger) {
this.nzTrigger$.next(this.nzTrigger);
}
if (nzVisible) {
this.inputVisible$.next(this.nzVisible);
}
if (nzDisabled && this.nzDisabled) {
this.inputVisible$.next(false);
}
if (nzOverlayClassName) {
this.setDropdownMenuValue('nzOverlayClassName', this.nzOverlayClassName);
}
if (nzOverlayStyle) {
this.setDropdownMenuValue('nzOverlayStyle', this.nzOverlayStyle);
}
if (nzPlacement) {
this.setDropdownMenuValue('dropDownPosition', this.nzPlacement.indexOf('top') !== -1 ? 'top' : 'bottom');
}
};
NzDropDownDirective.decorators = [
{ type: Directive, args: [{
selector: '[nz-dropdown]',
exportAs: 'nzDropdown',
host: {
'[attr.disabled]': "nzDisabled ? '' : null",
'[class.ant-dropdown-trigger]': 'true'
}
},] }
];
/** @nocollapse */
NzDropDownDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Overlay },
{ type: ViewContainerRef },
{ type: Platform }
]; };
NzDropDownDirective.propDecorators = {
nzDropdownMenu: [{ type: Input }],
nzTrigger: [{ type: Input }],
nzMatchWidthElement: [{ type: Input }],
nzBackdrop: [{ type: Input }],
nzClickHide: [{ type: Input }],
nzDisabled: [{ type: Input }],
nzVisible: [{ type: Input }],
nzOverlayClassName: [{ type: Input }],
nzOverlayStyle: [{ type: Input }],
nzPlacement: [{ type: Input }],
nzVisibleChange: [{ type: Output }]
};
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzBackdrop", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzClickHide", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzDisabled", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzVisible", void 0);
return NzDropDownDirective;
}());
export { NzDropDownDirective };
if (false) {
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzBackdrop;
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzClickHide;
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzDisabled;
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzVisible;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.portal;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.overlayRef;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.destroy$;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.positionStrategy;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.inputVisible$;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.nzTrigger$;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.overlayClose$;
/** @type {?} */
NzDropDownDirective.prototype.nzDropdownMenu;
/** @type {?} */
NzDropDownDirective.prototype.nzTrigger;
/** @type {?} */
NzDropDownDirective.prototype.nzMatchWidthElement;
/** @type {?} */
NzDropDownDirective.prototype.nzBackdrop;
/** @type {?} */
NzDropDownDirective.prototype.nzClickHide;
/** @type {?} */
NzDropDownDirective.prototype.nzDisabled;
/** @type {?} */
NzDropDownDirective.prototype.nzVisible;
/** @type {?} */
NzDropDownDirective.prototype.nzOverlayClassName;
/** @type {?} */
NzDropDownDirective.prototype.nzOverlayStyle;
/** @type {?} */
NzDropDownDirective.prototype.nzPlacement;
/** @type {?} */
NzDropDownDirective.prototype.nzVisibleChange;
/** @type {?} */
NzDropDownDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.overlay;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.platform;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9kcm9wZG93bi8iLCJzb3VyY2VzIjpbImRyb3Bkb3duLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0lBR3JHLGVBQWUsR0FBRyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUM7QUFFeEg7SUF1Q0UsNkJBQ1MsVUFBc0IsRUFDckIsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFFBQWtCO1FBSG5CLGVBQVUsR0FBVixVQUFV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WUFBWTtvQkFDdEIsSUFBSSxFQUFFO3dCQUNKLGlCQUFpQixFQUFFLHdCQUF3Qjt3QkFDM0MsOEJBQThCLEVBQUUsTUFBTTtxQkFDdkM7aUJBQ0Y7Ozs7Z0JBMUJDLFVBQVU7Z0JBTkgsT0FBTztnQkFjZCxnQkFBZ0I7Z0JBYlQsUUFBUTs7O2lDQTZDZCxLQUFLOzRCQUNMLEtBQUs7c0NBQ0wsS0FBSzs2QkFDTCxLQUFLOzhCQUNMLEtBQUs7NkJBQ0wsS0FBSzs0QkFDTCxLQUFLO3FDQUNMLEtBQUs7aUNBQ0wsS0FBSzs4QkFDTCxLQUFLO2tDQUNMLE1BQU07O0lBUGtCO1FBQWYsWUFBWSxFQUFFOzsyREFBbUI7SUFDbEI7UUFBZixZQUFZLEVBQUU7OzREQUFvQjtJQUNuQjtRQUFmLFlBQVksRUFBRTs7MkRBQW9CO0lBQ25CO1FBQWYsWUFBWSxFQUFFOzswREFBbUI7SUFrSjdDLDBCQUFDO0NBQUEsQUE3S0QsSUE2S0M7U0FyS1ksbUJBQW1COzs7SUFDOUIsaURBQWtEOztJQUNsRCxrREFBbUQ7O0lBQ25ELGlEQUFrRDs7SUFDbEQsZ0RBQWlEOzs7OztJQUVqRCxxQ0FBZ0M7Ozs7O0lBQ2hDLHlDQUE2Qzs7Ozs7SUFDN0MsdUNBQWlDOzs7OztJQUNqQywrQ0FBMkg7Ozs7O0lBQzNILDRDQUE0RDs7Ozs7SUFDNUQseUNBQXFFOzs7OztJQUNyRSw0Q0FBK0M7O0lBQy9DLDZDQUErRDs7SUFDL0Qsd0NBQWdEOztJQUNoRCxrREFBdUQ7O0lBQ3ZELHlDQUEyQzs7SUFDM0MsMENBQTRDOztJQUM1Qyx5Q0FBNEM7O0lBQzVDLHdDQUEyQzs7SUFDM0MsaURBQXlDOztJQUN6Qyw2Q0FBOEM7O0lBQzlDLDBDQUFxRDs7SUFDckQsOENBQStFOztJQVM3RSx5Q0FBNkI7Ozs7O0lBQzdCLHNDQUF3Qjs7Ozs7SUFDeEIsK0NBQTBDOzs7OztJQUMxQyx1Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRVNDQVBFLCBoYXNNb2RpZmllcktleSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUE9TSVRJT05fTUFQIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL292ZXJsYXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBJbmRleGFibGVPYmplY3QgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBFTVBUWSwgZnJvbUV2ZW50LCBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYXVkaXRUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG1hcFRvLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE56RHJvcGRvd25NZW51Q29tcG9uZW50LCBOelBsYWNlbWVudFR5cGUgfSBmcm9tICcuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50JztcblxuY29uc3QgbGlzdE9mUG9zaXRpb25zID0gW1BPU0lUSU9OX01BUC5ib3R0b21MZWZ0LCBQT1NJVElPTl9NQVAuYm90dG9tUmlnaHQsIFBPU0lUSU9OX01BUC50b3BSaWdodCwgUE9TSVRJT05fTUFQLnRvcExlZnRdO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnotZHJvcGRvd25dJyxcbiAgZXhwb3J0QXM6ICduekRyb3Bkb3duJyxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5kaXNhYmxlZF0nOiBgbnpEaXNhYmxlZCA/ICcnIDogbnVsbGAsXG4gICAgJ1tjbGFzcy5hbnQtZHJvcGRvd24tdHJpZ2dlcl0nOiAndHJ1ZSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOekRyb3BEb3duRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekJhY2tkcm9wOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekNsaWNrSGlkZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpEaXNhYmxlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpWaXNpYmxlOiBCb29sZWFuSW5wdXQ7XG5cbiAgcHJpdmF0ZSBwb3J0YWw/OiBUZW1wbGF0ZVBvcnRhbDtcbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS53aXRoTG9ja2VkUG9zaXRpb24oKTtcbiAgcHJpdmF0ZSBpbnB1dFZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbnpUcmlnZ2VyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2NsaWNrJyB8ICdob3Zlcic+KCdob3ZlcicpO1xuICBwcml2YXRlIG92ZXJsYXlDbG9zZSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBASW5wdXQoKSBuekRyb3Bkb3duTWVudTogTnpEcm9wZG93bk1lbnVDb21wb25lbnQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpUcmlnZ2VyOiAnY2xpY2snIHwgJ2hvdmVyJyA9ICdob3Zlcic7XG4gIEBJbnB1dCgpIG56TWF0Y2hXaWR0aEVsZW1lbnQ6IEVsZW1lbnRSZWYgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56QmFja2Ryb3AgPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDbGlja0hpZGUgPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpWaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56T3ZlcmxheUNsYXNzTmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG56T3ZlcmxheVN0eWxlOiBJbmRleGFibGVPYmplY3QgPSB7fTtcbiAgQElucHV0KCkgbnpQbGFjZW1lbnQ6IE56UGxhY2VtZW50VHlwZSA9ICdib3R0b21MZWZ0JztcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56VmlzaWJsZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNldERyb3Bkb3duTWVudVZhbHVlPFQgZXh0ZW5kcyBrZXlvZiBOekRyb3Bkb3duTWVudUNvbXBvbmVudD4oa2V5OiBULCB2YWx1ZTogTnpEcm9wZG93bk1lbnVDb21wb25lbnRbVF0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uekRyb3Bkb3duTWVudSkge1xuICAgICAgdGhpcy5uekRyb3Bkb3duTWVudS5zZXRWYWx1ZShrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgIHRoaXMuc2V0RHJvcGRvd25NZW51VmFsdWUoJ2Ryb3BEb3duUG9zaXRpb24nLCBjaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpEcm9wZG93bk1lbnUpIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAvKiogaG9zdCBtb3VzZSBzdGF0ZSAqKi9cbiAgICAgIGNvbnN0IGhvc3RNb3VzZVN0YXRlJCA9IG1lcmdlKFxuICAgICAgICBmcm9tRXZlbnQobmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInKS5waXBlKG1hcFRvKHRydWUpKSxcbiAgICAgICAgZnJvbUV2ZW50KG5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJykucGlwZShtYXBUbyhmYWxzZSkpXG4gICAgICApO1xuICAgICAgLyoqIG1lbnUgbW91c2Ugc3RhdGUgKiovXG4gICAgICBjb25zdCBtZW51TW91c2VTdGF0ZSQgPSB0aGlzLm56RHJvcGRvd25NZW51Lm1vdXNlU3RhdGUkO1xuICAgICAgLyoqIG1lcmdlZCBtb3VzZSBzdGF0ZSAqKi9cbiAgICAgIGNvbnN0IG1lcmdlZE1vdXNlU3RhdGUkID0gbWVyZ2UobWVudU1vdXNlU3RhdGUkLCBob3N0TW91c2VTdGF0ZSQpO1xuICAgICAgLyoqIGhvc3QgY2xpY2sgc3RhdGUgKiovXG4gICAgICBjb25zdCBob3N0Q2xpY2tTdGF0ZSQgPSBmcm9tRXZlbnQobmF0aXZlRWxlbWVudCwgJ2NsaWNrJykucGlwZShtYXBUbyh0cnVlKSk7XG4gICAgICAvKiogdmlzaWJsZSBzdGF0ZSBzd2l0Y2ggYnkgbnpUcmlnZ2VyICoqL1xuICAgICAgY29uc3QgdmlzaWJsZVN0YXRlQnlUcmlnZ2VyJCA9IHRoaXMubnpUcmlnZ2VyJC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAodHJpZ2dlciA9PiB7XG4gICAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdob3ZlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZWRNb3VzZVN0YXRlJDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgIHJldHVybiBob3N0Q2xpY2tTdGF0ZSQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29uc3QgZGVzY2VuZGFudE1lbnVJdGVtQ2xpY2skID0gdGhpcy5uekRyb3Bkb3duTWVudS5kZXNjZW5kYW50TWVudUl0ZW1DbGljayQucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMubnpDbGlja0hpZGUpLFxuICAgICAgICBtYXBUbyhmYWxzZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBkb21UcmlnZ2VyVmlzaWJsZSQgPSBtZXJnZSh2aXNpYmxlU3RhdGVCeVRyaWdnZXIkLCBkZXNjZW5kYW50TWVudUl0ZW1DbGljayQsIHRoaXMub3ZlcmxheUNsb3NlJCkucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLm56RGlzYWJsZWQpXG4gICAgICApO1xuICAgICAgY29uc3QgdmlzaWJsZSQgPSBtZXJnZSh0aGlzLmlucHV0VmlzaWJsZSQsIGRvbVRyaWdnZXJWaXNpYmxlJCk7XG4gICAgICBjb21iaW5lTGF0ZXN0KFt2aXNpYmxlJCwgdGhpcy5uekRyb3Bkb3duTWVudS5pc0NoaWxkU3ViTWVudU9wZW4kXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChbdmlzaWJsZSwgc3ViXSkgPT4gdmlzaWJsZSB8fCBzdWIpLFxuICAgICAgICAgIGF1ZGl0VGltZSgxNTApLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2aXNpYmxlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMubnpNYXRjaFdpZHRoRWxlbWVudCA/IHRoaXMubnpNYXRjaFdpZHRoRWxlbWVudC5uYXRpdmVFbGVtZW50IDogbmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgIGlmICh0aGlzLm56VmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5uelZpc2libGVDaGFuZ2UuZW1pdCh2aXNpYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uelZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICAvKiogc2V0IHVwIG92ZXJsYXlSZWYgKiovXG4gICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgICAvKiogbmV3IG92ZXJsYXkgKiovXG4gICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogdHJpZ2dlcldpZHRoLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRoaXMubnpUcmlnZ2VyID09PSAnY2xpY2snLFxuICAgICAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IHRoaXMubnpCYWNrZHJvcCA/IHVuZGVmaW5lZCA6ICduei1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLFxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2htZW50cygpLFxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkucGlwZShmaWx0ZXIoZSA9PiBlLmtleUNvZGUgPT09IEVTQ0FQRSAmJiAhaGFzTW9kaWZpZXJLZXkoZSkpKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwVG8oZmFsc2UpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLm92ZXJsYXlDbG9zZSQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyoqIHVwZGF0ZSBvdmVybGF5IGNvbmZpZyAqKi9cbiAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IHRoaXMub3ZlcmxheVJlZi5nZXRDb25maWcoKTtcbiAgICAgICAgICAgICAgb3ZlcmxheUNvbmZpZy5taW5XaWR0aCA9IHRyaWdnZXJXaWR0aDtcbiAgICAgICAgICAgICAgb3ZlcmxheUNvbmZpZy5oYXNCYWNrZHJvcCA9IHRoaXMubnpUcmlnZ2VyID09PSAnY2xpY2snO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqIG9wZW4gZHJvcGRvd24gd2l0aCBhbmltYXRpb24gKiovXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kud2l0aFBvc2l0aW9ucyhbUE9TSVRJT05fTUFQW3RoaXMubnpQbGFjZW1lbnRdLCAuLi5saXN0T2ZQb3NpdGlvbnNdKTtcbiAgICAgICAgICAgIC8qKiByZXNldCBwb3J0YWwgaWYgbmVlZGVkICoqL1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBvcnRhbCB8fCB0aGlzLnBvcnRhbC50ZW1wbGF0ZVJlZiAhPT0gdGhpcy5uekRyb3Bkb3duTWVudSEudGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgdGhpcy5wb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5uekRyb3Bkb3duTWVudSEudGVtcGxhdGVSZWYsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHRoaXMucG9ydGFsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyoqIGRldGFjaCBvdmVybGF5UmVmIGlmIG5lZWRlZCAqKi9cbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56VmlzaWJsZSwgbnpQbGFjZW1lbnQsIG56RGlzYWJsZWQsIG56T3ZlcmxheUNsYXNzTmFtZSwgbnpPdmVybGF5U3R5bGUsIG56VHJpZ2dlciB9ID0gY2hhbmdlcztcbiAgICBpZiAobnpUcmlnZ2VyKSB7XG4gICAgICB0aGlzLm56VHJpZ2dlciQubmV4dCh0aGlzLm56VHJpZ2dlcik7XG4gICAgfVxuICAgIGlmIChuelZpc2libGUpIHtcbiAgICAgIHRoaXMuaW5wdXRWaXNpYmxlJC5uZXh0KHRoaXMubnpWaXNpYmxlKTtcbiAgICB9XG4gICAgaWYgKG56RGlzYWJsZWQgJiYgdGhpcy5uekRpc2FibGVkKSB7XG4gICAgICB0aGlzLmlucHV0VmlzaWJsZSQubmV4dChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChuek92ZXJsYXlDbGFzc05hbWUpIHtcbiAgICAgIHRoaXMuc2V0RHJvcGRvd25NZW51VmFsdWUoJ256T3ZlcmxheUNsYXNzTmFtZScsIHRoaXMubnpPdmVybGF5Q2xhc3NOYW1lKTtcbiAgICB9XG4gICAgaWYgKG56T3ZlcmxheVN0eWxlKSB7XG4gICAgICB0aGlzLnNldERyb3Bkb3duTWVudVZhbHVlKCduek92ZXJsYXlTdHlsZScsIHRoaXMubnpPdmVybGF5U3R5bGUpO1xuICAgIH1cbiAgICBpZiAobnpQbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0RHJvcGRvd25NZW51VmFsdWUoJ2Ryb3BEb3duUG9zaXRpb24nLCB0aGlzLm56UGxhY2VtZW50LmluZGV4T2YoJ3RvcCcpICE9PSAtMSA/ICd0b3AnIDogJ2JvdHRvbScpO1xuICAgIH1cbiAgfVxufVxuIl19