@ciri/ngx-popup
Version:
An angular popup component that can customize animation.
423 lines • 31.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/popup/popup.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { animate, style } from '@angular/animations';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { OverlayHelper } from '../overlay/overlay-helper';
import { AnimationService } from '../animation.service';
/** @type {?} */
let zIndex = 9999;
/**
* @record
*/
export function PopupAnimations() { }
if (false) {
/** @type {?|undefined} */
PopupAnimations.prototype.enter;
/** @type {?|undefined} */
PopupAnimations.prototype.leave;
}
/** @enum {string} */
const Position = {
center: "center",
top: "top",
right: "right",
bottom: "bottom",
left: "left",
};
export { Position };
export class PopupComponent {
/**
* @param {?} hostElRef
* @param {?} cdr
* @param {?} renderer
* @param {?} overlayHelper
* @param {?} animation
*/
constructor(hostElRef, cdr, renderer, overlayHelper, animation) {
this.hostElRef = hostElRef;
this.cdr = cdr;
this.renderer = renderer;
this.overlayHelper = overlayHelper;
this.animation = animation;
/* inputs
-------------------------- */
this.position = Position.center; /** 弹窗位置 */
/**
* 弹窗位置
*/
this.animations = {}; /** 自定义动画 */
/**
* 自定义动画
*/
this.overlay = true; /** 是否显示蒙版 */
/**
* 是否显示蒙版
*/
this.overlayOpacity = 0.5; /** 蒙版透明度 0~1 */
/**
* 蒙版透明度 0~1
*/
this.closeOnClickOverlay = true; /** 是否允许点击蒙版时自动关闭弹框 */
/**
* 是否允许点击蒙版时自动关闭弹框
*/
this.zIndex = zIndex++; /** 同 css z-index */
/**
* 同 css z-index
*/
this.externalClass = {}; /** 自定义类名 */
/**
* 自定义类名
*/
/* outputs
-------------------------- */
this.clickOverlay = new EventEmitter(); /** 点击蒙版时触发 */
/**
* 点击蒙版时触发
*/
this.beforeOpen = new EventEmitter(); /** 打开之前触发(还未执行进场动画) */
/**
* 打开之前触发(还未执行进场动画)
*/
this.afterOpen = new EventEmitter(); /** 打开之后触发(进场动画执行完毕) */
/**
* 打开之后触发(进场动画执行完毕)
*/
this.beforeClose = new EventEmitter(); /** 关闭之前触发(还未执行离场动画) */
/**
* 关闭之前触发(还未执行离场动画)
*/
this.afterClose = new EventEmitter(); /** 关闭之后触发(离场动画执行完毕) */
this.destroy$ = new Subject();
this.dirty = false;
this.leaving = false;
}
/**
* @return {?}
*/
get el() {
return this.container.nativeElement;
}
/**
* @return {?}
*/
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value === null) {
return;
}
if (!this.dirty && !value) {
return;
}
if (this.animationSub) {
this.animationSub.unsubscribe();
}
if (value) {
this.open();
}
else {
this.close();
}
this.onChange(value);
this.dirty = true;
}
/**
* @private
* @return {?}
*/
open() {
// 避免闪烁
this.renderer.setStyle(this.el, 'opacity', 0);
this.visible = true;
this.cdr.markForCheck();
this.beforeOpen.emit();
this.leaving = false;
// 优化性能
setTimeout((/**
* @return {?}
*/
() => {
this.renderer.removeStyle(this.el, 'opacity');
this.overlay && this.openOverlay();
this.animationSub = this.makeAnimation('enter')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @return {?}
*/
() => {
this.afterOpen.emit();
}));
}), 0);
}
/**
* @private
* @return {?}
*/
close() {
this.beforeClose.emit();
this.leaving = true;
this.overlay && this.closeOverlay();
this.animationSub = this.makeAnimation('leave')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @return {?}
*/
() => {
this.visible = false;
this.cdr.detectChanges();
this.afterClose.emit();
this.leaving = false;
}));
}
/**
* @private
* @return {?}
*/
openOverlay() {
this.closeOverlay = this.overlayHelper.open({
opacity: this.overlayOpacity,
zIndex: this.zIndex,
getContainer: (/**
* @return {?}
*/
() => this.hostElRef.nativeElement),
onClick: (/**
* @return {?}
*/
() => {
this.clickOverlay.emit();
if (this.closeOnClickOverlay && this.visible && !this.leaving) {
this.writeValue(false);
}
})
});
}
/**
* @private
* @param {?} state
* @return {?}
*/
makeAnimation(state) {
/** @type {?} */
const el = this.container.nativeElement;
/** @type {?} */
const animation = state === 'leave' ? this.getLeaveAnimation() : this.getEnterAnimation();
return this.animation.makeAnimation(el, animation);
}
/**
* @private
* @return {?}
*/
getEnterAnimation() {
return this.animations.enter || {
[Position.center]: [style({ opacity: 0 }), animate('.3s ease', style({ opacity: 1 }))],
[Position.top]: [style({ transform: 'translate3d(0, -100%, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
[Position.right]: [style({ transform: 'translate3d(100%, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
[Position.bottom]: [style({ transform: 'translate3d(0, 100%, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
[Position.left]: [style({ transform: 'translate3d(-100%, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))]
}[this.position];
}
/**
* @private
* @return {?}
*/
getLeaveAnimation() {
return this.animations.leave || {
[Position.center]: [style({ opacity: 1 }), animate('.3s ease', style({ opacity: 0 }))],
[Position.top]: [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, -100%, 0)' }))],
[Position.right]: [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(100%, 0, 0)' }))],
[Position.bottom]: [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 100%, 0)' }))],
[Position.left]: [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(-100%, 0, 0)' }))]
}[this.position];
}
}
PopupComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-popup',
template: "<div class=\"ngx-popup-wrapper is-{{ position }}\" [hidden]=\"!visible\" [style.zIndex]=\"zIndex\">\n <div class=\"ngx-popup\" #container [ngClass]=\"externalClass\">\n <ng-content></ng-content>\n </div>\n</div>\n",
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => PopupComponent)),
multi: true
}
],
styles: [".ngx-popup-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;pointer-events:none}.ngx-popup-wrapper[hidden]{display:none}.ngx-popup-wrapper .ngx-popup{pointer-events:auto}.ngx-popup-wrapper.is-center{align-items:center;justify-content:center}.ngx-popup-wrapper.is-top{align-items:flex-start;justify-content:center}.ngx-popup-wrapper.is-top .ngx-popup{width:100%}.ngx-popup-wrapper.is-right{align-items:center;justify-content:flex-end}.ngx-popup-wrapper.is-right .ngx-popup{height:100%}.ngx-popup-wrapper.is-bottom{align-items:flex-end;justify-content:center}.ngx-popup-wrapper.is-bottom .ngx-popup{width:100%}.ngx-popup-wrapper.is-left{align-items:center;justify-content:flex-start}.ngx-popup-wrapper.is-left .ngx-popup{height:100%}"]
}] }
];
/** @nocollapse */
PopupComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: OverlayHelper },
{ type: AnimationService }
];
PopupComponent.propDecorators = {
position: [{ type: Input }],
animations: [{ type: Input }],
overlay: [{ type: Input }],
overlayOpacity: [{ type: Input }],
closeOnClickOverlay: [{ type: Input }],
zIndex: [{ type: Input }],
externalClass: [{ type: Input }],
clickOverlay: [{ type: Output }],
beforeOpen: [{ type: Output }],
afterOpen: [{ type: Output }],
beforeClose: [{ type: Output }],
afterClose: [{ type: Output }],
container: [{ type: ViewChild, args: ['container', { static: false },] }]
};
if (false) {
/** @type {?} */
PopupComponent.prototype.position;
/**
* 弹窗位置
* @type {?}
*/
PopupComponent.prototype.animations;
/**
* 自定义动画
* @type {?}
*/
PopupComponent.prototype.overlay;
/**
* 是否显示蒙版
* @type {?}
*/
PopupComponent.prototype.overlayOpacity;
/**
* 蒙版透明度 0~1
* @type {?}
*/
PopupComponent.prototype.closeOnClickOverlay;
/**
* 是否允许点击蒙版时自动关闭弹框
* @type {?}
*/
PopupComponent.prototype.zIndex;
/**
* 同 css z-index
* @type {?}
*/
PopupComponent.prototype.externalClass;
/**
* 自定义类名
* @type {?}
*/
PopupComponent.prototype.clickOverlay;
/**
* 点击蒙版时触发
* @type {?}
*/
PopupComponent.prototype.beforeOpen;
/**
* 打开之前触发(还未执行进场动画)
* @type {?}
*/
PopupComponent.prototype.afterOpen;
/**
* 打开之后触发(进场动画执行完毕)
* @type {?}
*/
PopupComponent.prototype.beforeClose;
/**
* 关闭之前触发(还未执行离场动画)
* @type {?}
*/
PopupComponent.prototype.afterClose;
/**
* 关闭之后触发(离场动画执行完毕)
* @type {?}
* @private
*/
PopupComponent.prototype.container;
/** @type {?} */
PopupComponent.prototype.visible;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.destroy$;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.animationSub;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.dirty;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.leaving;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.closeOverlay;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.hostElRef;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.overlayHelper;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.animation;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNpcmkvbmd4LXBvcHVwLyIsInNvdXJjZXMiOlsibGliL3BvcHVwL3BvcHVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBRUwsTUFBTSxFQUFFLFNBQVMsRUFDakIsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxFQUFFLE9BQU8sRUFBcUIsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUE7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7SUFFbkQsTUFBTSxHQUFHLElBQUk7Ozs7QUFFakIscUNBR0M7OztJQUZDLGdDQUErQzs7SUFDL0MsZ0NBQStDOzs7QUFHakQsTUFBWSxRQUFRO0lBQ2xCLE1BQU0sVUFBVztJQUNqQixHQUFHLE9BQVE7SUFDWCxLQUFLLFNBQVU7SUFDZixNQUFNLFVBQVc7SUFDakIsSUFBSSxRQUFTO0VBQ2Q7O0FBZUQsTUFBTSxPQUFPLGNBQWM7Ozs7Ozs7O0lBZ0N6QixZQUNVLFNBQXFCLEVBQ3JCLEdBQXNCLEVBQ3RCLFFBQW1CLEVBQ25CLGFBQTRCLEVBQzVCLFNBQTJCO1FBSjNCLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFDckIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsYUFBUSxHQUFS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OzJCQUdMLE1BQU07eUJBQ04sTUFBTTt3QkFDTixNQUFNOzBCQUNOLE1BQU07eUJBQ04sTUFBTTt3QkFFTixTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7OztJQWZ6QyxrQ0FBNkM7Ozs7O0lBQzdDLG9DQUF5Qzs7Ozs7SUFDekMsaUNBQWdDOzs7OztJQUNoQyx3Q0FBcUM7Ozs7O0lBQ3JDLDZDQUE0Qzs7Ozs7SUFDNUMsZ0NBQWtDOzs7OztJQUNsQyx1Q0FBbUM7Ozs7O0lBR25DLHNDQUFnRDs7Ozs7SUFDaEQsb0NBQThDOzs7OztJQUM5QyxtQ0FBNkM7Ozs7O0lBQzdDLHFDQUErQzs7Ozs7SUFDL0Msb0NBQThDOzs7Ozs7SUFFOUMsbUNBQXdFOztJQUV4RSxpQ0FBZ0I7Ozs7O0lBS2hCLGtDQUFxQzs7Ozs7SUFDckMsc0NBQWtDOzs7OztJQUNsQywrQkFBcUI7Ozs7O0lBQ3JCLGlDQUF1Qjs7Ozs7SUFDdkIsa0NBQXNDOzs7OztJQUN0QyxzQ0FBZ0M7Ozs7O0lBRzlCLG1DQUE2Qjs7Ozs7SUFDN0IsNkJBQThCOzs7OztJQUM5QixrQ0FBMkI7Ozs7O0lBQzNCLHVDQUFvQzs7Ozs7SUFDcEMsbUNBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LCBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IGFuaW1hdGUsIEFuaW1hdGlvbk1ldGFkYXRhLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBPdmVybGF5SGVscGVyIH0gZnJvbSAnLi4vb3ZlcmxheS9vdmVybGF5LWhlbHBlcidcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hbmltYXRpb24uc2VydmljZSdcblxubGV0IHpJbmRleCA9IDk5OTlcblxuZXhwb3J0IGludGVyZmFjZSBQb3B1cEFuaW1hdGlvbnMge1xuICBlbnRlcj86IEFuaW1hdGlvbk1ldGFkYXRhIHwgQW5pbWF0aW9uTWV0YWRhdGFbXVxuICBsZWF2ZT86IEFuaW1hdGlvbk1ldGFkYXRhIHwgQW5pbWF0aW9uTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgZW51bSBQb3NpdGlvbiB7XG4gIGNlbnRlciA9ICdjZW50ZXInLFxuICB0b3AgPSAndG9wJyxcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBib3R0b20gPSAnYm90dG9tJyxcbiAgbGVmdCA9ICdsZWZ0J1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXBvcHVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BvcHVwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcG9wdXAuY29tcG9uZW50Lmxlc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUG9wdXBDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUG9wdXBDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgLyogaW5wdXRzXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiBQb3NpdGlvbiA9IFBvc2l0aW9uLmNlbnRlciAgICAvKiog5by556qX5L2N572uICovXG4gIEBJbnB1dCgpIGFuaW1hdGlvbnM6IFBvcHVwQW5pbWF0aW9ucyA9IHt9ICAgICAgICAvKiog6Ieq5a6a5LmJ5Yqo55S7ICovXG4gIEBJbnB1dCgpIG92ZXJsYXk6IGJvb2xlYW4gPSB0cnVlICAgICAgICAgICAgICAgICAvKiog5piv5ZCm5pi+56S66JKZ54mIICovXG4gIEBJbnB1dCgpIG92ZXJsYXlPcGFjaXR5OiBudW1iZXIgPSAwLjUgICAgICAgICAgICAvKiog6JKZ54mI6YCP5piO5bqmIDB+MSAqL1xuICBASW5wdXQoKSBjbG9zZU9uQ2xpY2tPdmVybGF5OiBib29sZWFuID0gdHJ1ZSAgICAgLyoqIOaYr+WQpuWFgeiuuOeCueWHu+iSmeeJiOaXtuiHquWKqOWFs+mXreW8ueahhiAqL1xuICBASW5wdXQoKSB6SW5kZXg6IG51bWJlciA9IHpJbmRleCsrICAgICAgICAgICAgICAgLyoqIOWQjCBjc3Mgei1pbmRleCAqL1xuICBASW5wdXQoKSBleHRlcm5hbENsYXNzOiBvYmplY3QgPSB7fSAgICAgICAgICAgICAgLyoqIOiHquWumuS5ieexu+WQjSAqL1xuICAvKiBvdXRwdXRzXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gIEBPdXRwdXQoKSBjbGlja092ZXJsYXkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKSAvKiog54K55Ye76JKZ54mI5pe26Kem5Y+RICovXG4gIEBPdXRwdXQoKSBiZWZvcmVPcGVuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCkgICAvKiog5omT5byA5LmL5YmN6Kem5Y+R77yI6L+Y5pyq5omn6KGM6L+b5Zy65Yqo55S777yJICovXG4gIEBPdXRwdXQoKSBhZnRlck9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKSAgICAvKiog5omT5byA5LmL5ZCO6Kem5Y+R77yI6L+b5Zy65Yqo55S75omn6KGM5a6M5q+V77yJICovXG4gIEBPdXRwdXQoKSBiZWZvcmVDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpICAvKiog5YWz6Zet5LmL5YmN6Kem5Y+R77yI6L+Y5pyq5omn6KGM56a75Zy65Yqo55S777yJICovXG4gIEBPdXRwdXQoKSBhZnRlckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCkgICAvKiog5YWz6Zet5LmL5ZCO6Kem5Y+R77yI56a75Zy65Yqo55S75omn6KGM5a6M5q+V77yJICovXG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgY29udGFpbmVyOiBFbGVtZW50UmVmXG5cbiAgdmlzaWJsZTogYm9vbGVhblxuICBnZXQgZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnRcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgcHJpdmF0ZSBhbmltYXRpb25TdWI6IFN1YnNjcmlwdGlvblxuICBwcml2YXRlIGRpcnR5ID0gZmFsc2VcbiAgcHJpdmF0ZSBsZWF2aW5nID0gZmFsc2VcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWRcbiAgcHJpdmF0ZSBjbG9zZU92ZXJsYXk6ICgpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgb3ZlcmxheUhlbHBlcjogT3ZlcmxheUhlbHBlcixcbiAgICBwcml2YXRlIGFuaW1hdGlvbjogQW5pbWF0aW9uU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KClcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKClcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmblxuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7IHJldHVybiB9XG4gICAgaWYgKCF0aGlzLmRpcnR5ICYmICF2YWx1ZSkgeyByZXR1cm4gfVxuICAgIGlmICh0aGlzLmFuaW1hdGlvblN1YikgeyB0aGlzLmFuaW1hdGlvblN1Yi51bnN1YnNjcmliZSgpIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5vcGVuKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbG9zZSgpXG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSlcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuKCkge1xuICAgIC8vIOmBv+WFjemXqueDgVxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ29wYWNpdHknLCAwKVxuICAgIHRoaXMudmlzaWJsZSA9IHRydWVcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKVxuICAgIHRoaXMuYmVmb3JlT3Blbi5lbWl0KClcbiAgICB0aGlzLmxlYXZpbmcgPSBmYWxzZVxuICAgIC8vIOS8mOWMluaAp+iDvVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmVsLCAnb3BhY2l0eScpXG4gICAgICB0aGlzLm92ZXJsYXkgJiYgdGhpcy5vcGVuT3ZlcmxheSgpXG4gICAgICB0aGlzLmFuaW1hdGlvblN1YiA9IHRoaXMubWFrZUFuaW1hdGlvbignZW50ZXInKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWZ0ZXJPcGVuLmVtaXQoKVxuICAgICAgICB9KVxuICAgIH0sIDApXG4gIH1cblxuICBwcml2YXRlIGNsb3NlKCkge1xuICAgIHRoaXMuYmVmb3JlQ2xvc2UuZW1pdCgpXG4gICAgdGhpcy5sZWF2aW5nID0gdHJ1ZVxuICAgIHRoaXMub3ZlcmxheSAmJiB0aGlzLmNsb3NlT3ZlcmxheSgpXG4gICAgdGhpcy5hbmltYXRpb25TdWIgPSB0aGlzLm1ha2VBbmltYXRpb24oJ2xlYXZlJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgdGhpcy5hZnRlckNsb3NlLmVtaXQoKVxuICAgICAgICB0aGlzLmxlYXZpbmcgPSBmYWxzZVxuICAgICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk92ZXJsYXkoKSB7XG4gICAgdGhpcy5jbG9zZU92ZXJsYXkgPSB0aGlzLm92ZXJsYXlIZWxwZXIub3Blbih7XG4gICAgICBvcGFjaXR5OiB0aGlzLm92ZXJsYXlPcGFjaXR5LFxuICAgICAgekluZGV4OiB0aGlzLnpJbmRleCxcbiAgICAgIGdldENvbnRhaW5lcjogKCkgPT4gdGhpcy5ob3N0RWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jbGlja092ZXJsYXkuZW1pdCgpXG4gICAgICAgIGlmICh0aGlzLmNsb3NlT25DbGlja092ZXJsYXkgJiYgdGhpcy52aXNpYmxlICYmICF0aGlzLmxlYXZpbmcpIHtcbiAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlQW5pbWF0aW9uKHN0YXRlOiAnZW50ZXInIHwgJ2xlYXZlJykge1xuICAgIGNvbnN0IGVsID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudFxuICAgIGNvbnN0IGFuaW1hdGlvbiA9IHN0YXRlID09PSAnbGVhdmUnID8gdGhpcy5nZXRMZWF2ZUFuaW1hdGlvbigpIDogdGhpcy5nZXRFbnRlckFuaW1hdGlvbigpXG5cbiAgICByZXR1cm4gdGhpcy5hbmltYXRpb24ubWFrZUFuaW1hdGlvbihlbCwgYW5pbWF0aW9uKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnRlckFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hbmltYXRpb25zLmVudGVyIHx8IHtcbiAgICAgIFtQb3NpdGlvbi5jZW50ZXJdOiBbIHN0eWxlKHsgb3BhY2l0eTogMCB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpIF0sXG4gICAgICBbUG9zaXRpb24udG9wXSAgIDogWyBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKScgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSkpIF0sXG4gICAgICBbUG9zaXRpb24ucmlnaHRdIDogWyBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9KSkgXSxcbiAgICAgIFtQb3NpdGlvbi5ib3R0b21dOiBbIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMTAwJSwgMCknIH0pLCBhbmltYXRlKCcuM3MgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0pKSBdLFxuICAgICAgW1Bvc2l0aW9uLmxlZnRdICA6IFsgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknIH0pLCBhbmltYXRlKCcuM3MgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0pKSBdXG4gICAgfVt0aGlzLnBvc2l0aW9uXVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWF2ZUFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hbmltYXRpb25zLmxlYXZlIHx8IHtcbiAgICAgIFtQb3NpdGlvbi5jZW50ZXJdOiBbIHN0eWxlKHsgb3BhY2l0eTogMSB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpIF0sXG4gICAgICBbUG9zaXRpb24udG9wXSAgIDogWyBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKScgfSkpIF0sXG4gICAgICBbUG9zaXRpb24ucmlnaHRdIDogWyBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyB9KSkgXSxcbiAgICAgIFtQb3NpdGlvbi5ib3R0b21dOiBbIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0pLCBhbmltYXRlKCcuM3MgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMTAwJSwgMCknIH0pKSBdLFxuICAgICAgW1Bvc2l0aW9uLmxlZnRdICA6IFsgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknIH0pKSBdXG4gICAgfVt0aGlzLnBvc2l0aW9uXVxuICB9XG59XG4iXX0=