ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
495 lines • 46.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Input, Output, Component, forwardRef, ElementRef, TemplateRef, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core';
import { ModalOptions } from './modal-options.provider';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ModalRef } from './modal-ref.class';
/**
* @template T, R
*/
export class ModalComponent extends ModalRef {
/**
* @param {?} option
* @param {?} elementRef
*/
constructor(option, elementRef) {
super();
this.option = option;
this.elementRef = elementRef;
this.autoFocus = { focus: true, date: new Date() };
this.transitionName = '';
this.maskTransitionName = '';
this.wrapCls = {};
this.cls = {};
this.btnGroupClass = {};
this.data = {
text: '',
password: ''
};
this.onClose = new EventEmitter();
this.afterOpenEmitter = new EventEmitter();
this.afterCloseEmitter = new EventEmitter();
}
/**
* @param {?} value
* @return {?}
*/
set title(value) {
this.option.title = value;
}
/**
* @param {?} value
* @return {?}
*/
set closable(value) {
this.option.closable = value;
}
/**
* @param {?} value
* @return {?}
*/
set maskClosable(value) {
this.option.maskClosable = value;
}
/**
* @param {?} value
* @return {?}
*/
set popup(value) {
this.option.popup = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set animationType(value) {
this.option.animationType = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set transparent(value) {
this.option.transparent = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set footer(value) {
this.option.footer = value;
}
/**
* @param {?} value
* @return {?}
*/
set platform(value) {
this.option.platform = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set className(value) {
this.option.className = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set wrapClassName(value) {
this.option.wrapClassName = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set actions(value) {
this.option.footer = value;
this.setClassMap();
}
/**
* @param {?} value
* @return {?}
*/
set defaultValue(value) {
this.option.defaultValue = value !== undefined ? value : ['', ''];
}
/**
* @param {?} value
* @return {?}
*/
set type(value) {
this.option.type = value;
}
/**
* @param {?} value
* @return {?}
*/
set placeholders(value) {
this.option.placeholders = value;
}
/**
* @param {?} value
* @return {?}
*/
set operation(value) {
this.option.operation = value;
this.setClassMap();
}
/**
* @param {?} event
* @return {?}
*/
panend(event) {
if (this.option.closable || this.option.maskClosable || this.option.popup) {
if ((event && event.target && event.target.getAttribute('role') === 'dialog') ||
event.target.getAttribute('role') === 'close') {
event.preventDefault();
event.stopPropagation();
if (this.option.close) {
this.option.close();
}
else {
this.onClose.emit();
this.leaveAnimation();
}
}
}
}
/**
* @param {?} value
* @return {?}
*/
isTemplateRef(value) {
return value instanceof TemplateRef;
}
/**
* @param {?} value
* @return {?}
*/
isNoTitle(value) {
return value === '' || value === null || value === undefined;
}
/**
* @param {?} visible
* @return {?}
*/
setTransitionName(visible) {
if (!visible) {
this.leaveAnimation();
}
else {
if (this.option.animated) {
if (this.option.transparent) {
if (this.setActiveName(this.option.transitionName)) {
this.transitionName = this.setActiveName(this.option.transitionName);
this.maskTransitionName = this.setActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setActiveName('am-fade');
}
}
else {
if (this.setActiveName(this.option.transitionName)) {
this.transitionName = this.setActiveName(this.option.transitionName);
this.maskTransitionName = this.setActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setActiveName('am-slide-up');
}
}
if (this.option.popup) {
this.transitionName =
this.option.animationType === 'slide-up'
? this.setActiveName('am-slide-up')
: this.setActiveName('am-slide-down');
this.maskTransitionName = this.setActiveName('am-fade');
}
}
this.setClassMap();
}
}
/**
* @param {?} name
* @return {?}
*/
setActiveName(name) {
return name.length > 0 ? `${name}-enter ${name}-enter-active` : null;
}
/**
* @param {?} name
* @return {?}
*/
setLeaveActiveName(name) {
return name.length > 0 ? `${name}-leave ${name}-leave-active` : null;
}
/**
* @return {?}
*/
setClassMap() {
this.wrapCls = {
[this.option.wrapClassName]: true,
[`${this.option.prefixCls}-wrap-popup`]: this.option.popup
};
this.cls = {
[this.option.className]: true,
[`${this.option.prefixCls}-transparent`]: this.option.transparent,
[`${this.option.prefixCls}-popup`]: this.option.popup,
[`${this.option.prefixCls}-popup-${this.option.animationType}`]: this.option.popup && this.option.animationType,
[`${this.option.prefixCls}-android`]: this.option.platform === 'android'
};
this.btnGroupClass = {
[`${this.option.prefixCls}-button-group-${this.option.footer.length === 2 && !this.option.operation ? 'h' : 'v'}`]: true,
[`${this.option.prefixCls}-button-group-${this.option.operation ? 'operation' : 'normal'}`]: true
};
}
/**
* @param {?} type
* @param {?} value
* @return {?}
*/
inputChange(type, value) {
this.data[type] = value;
}
/**
* @return {?}
*/
leaveAnimation() {
if (this.option.animated) {
if (this.option.transparent) {
if (this.setLeaveActiveName(this.option.transitionName)) {
this.transitionName = this.setLeaveActiveName(this.option.transitionName);
this.maskTransitionName = this.setLeaveActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setLeaveActiveName('am-fade');
}
}
else {
if (this.setLeaveActiveName(this.option.transitionName)) {
this.transitionName = this.setLeaveActiveName(this.option.transitionName);
this.maskTransitionName = this.setLeaveActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setLeaveActiveName('am-slide-up');
}
}
if (this.option.popup) {
this.transitionName =
this.option.animationType === 'slide-up'
? this.setLeaveActiveName('am-slide-up')
: this.setLeaveActiveName('am-slide-down');
this.maskTransitionName = this.setLeaveActiveName('am-fade');
}
}
setTimeout((/**
* @return {?}
*/
() => {
this.option.visible = false;
if (this.onChanged) {
this.onChanged(this.option.visible);
}
}), 200);
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value) {
this.option.visible = value;
}
this.setTransitionName(value);
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChanged = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @return {?}
*/
get afterOpen() {
return this.afterOpenEmitter.asObservable();
}
/**
* @return {?}
*/
get afterClose() {
return this.afterCloseEmitter.asObservable();
}
/**
* @return {?}
*/
getInstance() {
return this;
}
/**
* @return {?}
*/
getElement() {
return this.elementRef && this.elementRef.nativeElement;
}
/**
* @return {?}
*/
close() {
if (this.option.closeWithAnimation) {
this.option.closeWithAnimation();
}
else {
this.onClose.emit();
this.leaveAnimation();
}
}
/**
* @return {?}
*/
triggerOk() {
if (this.option.footer.length > 1) {
/** @type {?} */
const button = this.option.footer[1];
button.onPress();
}
}
/**
* @return {?}
*/
triggerCancel() {
if (this.option.footer.length > 0) {
/** @type {?} */
const button = this.option.footer[0];
button.onPress();
}
}
/**
* @return {?}
*/
destroy() {
this.close();
}
}
ModalComponent.decorators = [
{ type: Component, args: [{
selector: 'Modal',
template: "<div *ngIf=\"option.visible\">\n <div class=\"{{ option.prefixCls }}-mask {{ maskTransitionName }}\"></div>\n <div role=\"dialog\" class=\"{{ option.prefixCls }}-wrap {{ transitionName }}\" [ngClass]=\"wrapCls\">\n <div role=\"document\" class=\"{{ option.prefixCls }}\" [ngClass]=\"cls\">\n <div class=\"{{ option.prefixCls }}-content\">\n <div *ngIf=\"option.closable\" style=\"width: 100%; height: 21px;\">\n <div role=\"close\" class=\"{{ option.prefixCls }}-close\">\n <span role=\"close\" class=\"{{ option.prefixCls }}-close-x\"></span>\n </div>\n </div>\n <div *ngIf=\"!isNoTitle(option.title)\" class=\"{{ option.prefixCls }}-header\">\n <div *ngIf=\"!isTemplateRef(option.title)\" class=\"{{ option.prefixCls }}-title\">{{ option.title }}</div>\n <ng-template *ngIf=\"isTemplateRef(option.title)\" [ngTemplateOutlet]=\"option.title\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-body\">\n <ng-content></ng-content>\n <div *ngIf=\"!isTemplateRef(option.message)\" class=\"{{ option.prefixCls }}-alert-content\">\n {{ option.message }}\n </div>\n <ng-template *ngIf=\"isTemplateRef(option.message)\" [ngTemplateOutlet]=\"option.message\"></ng-template>\n <ng-template *ngIf=\"option.type === 'default'\" [ngTemplateOutlet]=\"promptDefault\"></ng-template>\n <ng-template *ngIf=\"option.type === 'secure-text'\" [ngTemplateOutlet]=\"promptSecure\"></ng-template>\n <ng-template *ngIf=\"option.type === 'login-password'\" [ngTemplateOutlet]=\"promptPassword\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-footer\">\n <div [ngClass]=\"btnGroupClass\" role=\"group\">\n <div\n Button\n role=\"button\"\n *ngFor=\"let button of option.footer\"\n [className]=\"'am-modal-button'\"\n [ngStyle]=\"button.style\"\n (onClick)=\"button.onPress()\"\n >\n {{ button.text }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #promptPassword>\n <div class=\"{{ option.prefixCls }}-input-container\">\n <div class=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[1] || ''\"\n [(ngModel)]=\"option.defaultValue[1]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptSecure>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptDefault>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n </div>\n</ng-template>\n",
encapsulation: ViewEncapsulation.None,
providers: [
ModalOptions,
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => ModalComponent)),
multi: true
}
]
}] }
];
/** @nocollapse */
ModalComponent.ctorParameters = () => [
{ type: ModalOptions },
{ type: ElementRef }
];
ModalComponent.propDecorators = {
title: [{ type: Input }],
closable: [{ type: Input }],
maskClosable: [{ type: Input }],
popup: [{ type: Input }],
animationType: [{ type: Input }],
transparent: [{ type: Input }],
footer: [{ type: Input }],
platform: [{ type: Input }],
className: [{ type: Input }],
wrapClassName: [{ type: Input }],
actions: [{ type: Input }],
defaultValue: [{ type: Input }],
type: [{ type: Input }],
placeholders: [{ type: Input }],
operation: [{ type: Input }],
onClose: [{ type: Output }],
afterOpenEmitter: [{ type: Output }],
afterCloseEmitter: [{ type: Output }],
panend: [{ type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }]
};
if (false) {
/** @type {?} */
ModalComponent.prototype.autoFocus;
/** @type {?} */
ModalComponent.prototype.transitionName;
/** @type {?} */
ModalComponent.prototype.maskTransitionName;
/** @type {?} */
ModalComponent.prototype.wrapCls;
/** @type {?} */
ModalComponent.prototype.cls;
/** @type {?} */
ModalComponent.prototype.btnGroupClass;
/** @type {?} */
ModalComponent.prototype.data;
/** @type {?} */
ModalComponent.prototype.onChanged;
/** @type {?} */
ModalComponent.prototype.onTouched;
/** @type {?} */
ModalComponent.prototype.onClose;
/** @type {?} */
ModalComponent.prototype.afterOpenEmitter;
/** @type {?} */
ModalComponent.prototype.afterCloseEmitter;
/** @type {?} */
ModalComponent.prototype.option;
/** @type {?} */
ModalComponent.prototype.elementRef;
}
export class ModalServiceComponent extends ModalComponent {
/**
* @param {?} option
* @param {?} elementRef
*/
constructor(option, elementRef) {
super(option, elementRef);
this.option = option;
this.elementRef = elementRef;
this.setTransitionName(this.option.visible);
}
}
ModalServiceComponent.decorators = [
{ type: Component, args: [{
selector: 'ModalService',
template: "<div *ngIf=\"option.visible\">\n <div class=\"{{ option.prefixCls }}-mask {{ maskTransitionName }}\"></div>\n <div role=\"dialog\" class=\"{{ option.prefixCls }}-wrap {{ transitionName }}\" [ngClass]=\"wrapCls\">\n <div role=\"document\" class=\"{{ option.prefixCls }}\" [ngClass]=\"cls\">\n <div class=\"{{ option.prefixCls }}-content\">\n <div *ngIf=\"option.closable\" style=\"width: 100%; height: 21px;\">\n <div role=\"close\" class=\"{{ option.prefixCls }}-close\">\n <span role=\"close\" class=\"{{ option.prefixCls }}-close-x\"></span>\n </div>\n </div>\n <div *ngIf=\"!isNoTitle(option.title)\" class=\"{{ option.prefixCls }}-header\">\n <div *ngIf=\"!isTemplateRef(option.title)\" class=\"{{ option.prefixCls }}-title\">{{ option.title }}</div>\n <ng-template *ngIf=\"isTemplateRef(option.title)\" [ngTemplateOutlet]=\"option.title\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-body\">\n <ng-content></ng-content>\n <div *ngIf=\"!isTemplateRef(option.message)\" class=\"{{ option.prefixCls }}-alert-content\">\n {{ option.message }}\n </div>\n <ng-template *ngIf=\"isTemplateRef(option.message)\" [ngTemplateOutlet]=\"option.message\"></ng-template>\n <ng-template *ngIf=\"option.type === 'default'\" [ngTemplateOutlet]=\"promptDefault\"></ng-template>\n <ng-template *ngIf=\"option.type === 'secure-text'\" [ngTemplateOutlet]=\"promptSecure\"></ng-template>\n <ng-template *ngIf=\"option.type === 'login-password'\" [ngTemplateOutlet]=\"promptPassword\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-footer\">\n <div [ngClass]=\"btnGroupClass\" role=\"group\">\n <div\n Button\n role=\"button\"\n *ngFor=\"let button of option.footer\"\n [className]=\"'am-modal-button'\"\n [ngStyle]=\"button.style\"\n (onClick)=\"button.onPress()\"\n >\n {{ button.text }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #promptPassword>\n <div class=\"{{ option.prefixCls }}-input-container\">\n <div class=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[1] || ''\"\n [(ngModel)]=\"option.defaultValue[1]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptSecure>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptDefault>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n </div>\n</ng-template>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
ModalServiceComponent.ctorParameters = () => [
{ type: ModalOptions },
{ type: ElementRef }
];
if (false) {
/** @type {?} */
ModalServiceComponent.prototype.option;
/** @type {?} */
ModalServiceComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJtb2RhbC9tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osWUFBWSxFQUNaLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFeEQsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQWM3QyxNQUFNLE9BQU8sY0FBaUMsU0FBUSxRQUFjOzs7OztJQStHbEUsWUFBbUIsTUFBb0IsRUFBUyxVQUFzQjtRQUNwRSxLQUFLLEVBQUUsQ0FBQztRQURTLFdBQU0sR0FBTixNQUFNLENBQWM7UUFBUyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBOUd0RSxjQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7UUFDOUMsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFDNUIsdUJBQWtCLEdBQVcsRUFBRSxDQUFDO1FBQ2hDLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsUUFBRyxHQUFXLEVBQUUsQ0FBQztRQUNqQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixTQUFJLEdBQUc7WUFDTCxJQUFJLEVBQUUsRUFBRTtZQUNSLFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQztRQTJFRixZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEQscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFRLENBQUM7UUFF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O0lBRUYsbUNBQXFDOztJQUNyQyxtQ0FBb0I7O0lBdUVwQixpQ0FDZ0Q7O0lBQ2hELDBDQUMrRDs7SUFDL0QsMkNBQ2dFOztJQXNCcEQsZ0NBQTJCOztJQUFFLG9DQUE2Qjs7QUErS3hFLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxjQUFjOzs7OztJQUN2RCxZQUFtQixNQUFvQixFQUFTLFVBQXNCO1FBQ3BFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFEVCxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUVwRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7WUFURixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGl3SEFBcUM7Z0JBQ3JDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7O1lBOVNRLFlBQVk7WUFObkIsVUFBVTs7OztJQXNURSx1Q0FBMkI7O0lBQUUsMkNBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBFbGVtZW50UmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi9tb2RhbC1yZWYuY2xhc3MnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnTW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICBNb2RhbE9wdGlvbnMsXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNb2RhbENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbENvbXBvbmVudDxUID0gYW55LCBSID0gYW55PiBleHRlbmRzIE1vZGFsUmVmPFQsIFI+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBhdXRvRm9jdXMgPSB7IGZvY3VzOiB0cnVlLCBkYXRlOiBuZXcgRGF0ZSgpIH07XG4gIHRyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnJztcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnJztcbiAgd3JhcENsczogb2JqZWN0ID0ge307XG4gIGNsczogb2JqZWN0ID0ge307XG4gIGJ0bkdyb3VwQ2xhc3M6IG9iamVjdCA9IHt9O1xuICBkYXRhID0ge1xuICAgIHRleHQ6ICcnLFxuICAgIHBhc3N3b3JkOiAnJ1xuICB9O1xuXG4gIG9uQ2hhbmdlZDogKHZpc2lhYmxlOiBib29sZWFuKSA9PiB7fTtcbiAgb25Ub3VjaGVkOiAoKSA9PiB7fTtcblxuICBASW5wdXQoKVxuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICB0aGlzLm9wdGlvbi50aXRsZSA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNsb3NhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb24uY2xvc2FibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWFza0Nsb3NhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb24ubWFza0Nsb3NhYmxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBvcHVwKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb24ucG9wdXAgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGFuaW1hdGlvblR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9uLmFuaW1hdGlvblR5cGUgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHRyYW5zcGFyZW50KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb24udHJhbnNwYXJlbnQgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGZvb3Rlcih2YWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMub3B0aW9uLmZvb3RlciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBwbGF0Zm9ybSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb24ucGxhdGZvcm0gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGNsYXNzTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb24uY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB3cmFwQ2xhc3NOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbi53cmFwQ2xhc3NOYW1lID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhY3Rpb25zKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5vcHRpb24uZm9vdGVyID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLm9wdGlvbi5kZWZhdWx0VmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbJycsICcnXTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb24udHlwZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBwbGFjZWhvbGRlcnModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLm9wdGlvbi5wbGFjZWhvbGRlcnMgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb3BlcmF0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb24ub3BlcmF0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIGFmdGVyT3BlbkVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KClcbiAgYWZ0ZXJDbG9zZUVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHBhbmVuZChldmVudCkge1xuICAgIGlmICh0aGlzLm9wdGlvbi5jbG9zYWJsZSB8fCB0aGlzLm9wdGlvbi5tYXNrQ2xvc2FibGUgfHwgdGhpcy5vcHRpb24ucG9wdXApIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdkaWFsb2cnKSB8fFxuICAgICAgICBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdjbG9zZSdcbiAgICAgICkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uLmNsb3NlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb24uY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICAgICAgICAgIHRoaXMubGVhdmVBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBvcHRpb246IE1vZGFsT3B0aW9ucywgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgaXNUZW1wbGF0ZVJlZih2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG5cbiAgaXNOb1RpdGxlKHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgc2V0VHJhbnNpdGlvbk5hbWUodmlzaWJsZTogYm9vbGVhbikge1xuICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgdGhpcy5sZWF2ZUFuaW1hdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb24uYW5pbWF0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uLnRyYW5zcGFyZW50KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2V0QWN0aXZlTmFtZSh0aGlzLm9wdGlvbi50cmFuc2l0aW9uTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldEFjdGl2ZU5hbWUodGhpcy5vcHRpb24udHJhbnNpdGlvbk5hbWUpO1xuICAgICAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldEFjdGl2ZU5hbWUodGhpcy5vcHRpb24ubWFza1RyYW5zaXRpb25OYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRBY3RpdmVOYW1lKCdhbS1mYWRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnNldEFjdGl2ZU5hbWUodGhpcy5vcHRpb24udHJhbnNpdGlvbk5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRBY3RpdmVOYW1lKHRoaXMub3B0aW9uLnRyYW5zaXRpb25OYW1lKTtcbiAgICAgICAgICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRBY3RpdmVOYW1lKHRoaXMub3B0aW9uLm1hc2tUcmFuc2l0aW9uTmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0QWN0aXZlTmFtZSgnYW0tc2xpZGUtdXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9uLnBvcHVwKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbi5hbmltYXRpb25UeXBlID09PSAnc2xpZGUtdXAnXG4gICAgICAgICAgICAgID8gdGhpcy5zZXRBY3RpdmVOYW1lKCdhbS1zbGlkZS11cCcpXG4gICAgICAgICAgICAgIDogdGhpcy5zZXRBY3RpdmVOYW1lKCdhbS1zbGlkZS1kb3duJyk7XG4gICAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldEFjdGl2ZU5hbWUoJ2FtLWZhZGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMCA/IGAke25hbWV9LWVudGVyICR7bmFtZX0tZW50ZXItYWN0aXZlYCA6IG51bGw7XG4gIH1cblxuICBzZXRMZWF2ZUFjdGl2ZU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMCA/IGAke25hbWV9LWxlYXZlICR7bmFtZX0tbGVhdmUtYWN0aXZlYCA6IG51bGw7XG4gIH1cblxuICBzZXRDbGFzc01hcCgpIHtcbiAgICB0aGlzLndyYXBDbHMgPSB7XG4gICAgICBbdGhpcy5vcHRpb24ud3JhcENsYXNzTmFtZV06IHRydWUsXG4gICAgICBbYCR7dGhpcy5vcHRpb24ucHJlZml4Q2xzfS13cmFwLXBvcHVwYF06IHRoaXMub3B0aW9uLnBvcHVwXG4gICAgfTtcblxuICAgIHRoaXMuY2xzID0ge1xuICAgICAgW3RoaXMub3B0aW9uLmNsYXNzTmFtZV06IHRydWUsXG4gICAgICBbYCR7dGhpcy5vcHRpb24ucHJlZml4Q2xzfS10cmFuc3BhcmVudGBdOiB0aGlzLm9wdGlvbi50cmFuc3BhcmVudCxcbiAgICAgIFtgJHt0aGlzLm9wdGlvbi5wcmVmaXhDbHN9LXBvcHVwYF06IHRoaXMub3B0aW9uLnBvcHVwLFxuICAgICAgW2Ake3RoaXMub3B0aW9uLnByZWZpeENsc30tcG9wdXAtJHt0aGlzLm9wdGlvbi5hbmltYXRpb25UeXBlfWBdOiB0aGlzLm9wdGlvbi5wb3B1cCAmJiB0aGlzLm9wdGlvbi5hbmltYXRpb25UeXBlLFxuICAgICAgW2Ake3RoaXMub3B0aW9uLnByZWZpeENsc30tYW5kcm9pZGBdOiB0aGlzLm9wdGlvbi5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnXG4gICAgfTtcblxuICAgIHRoaXMuYnRuR3JvdXBDbGFzcyA9IHtcbiAgICAgIFtgJHt0aGlzLm9wdGlvbi5wcmVmaXhDbHN9LWJ1dHRvbi1ncm91cC0ke1xuICAgICAgICB0aGlzLm9wdGlvbi5mb290ZXIubGVuZ3RoID09PSAyICYmICF0aGlzLm9wdGlvbi5vcGVyYXRpb24gPyAnaCcgOiAndidcbiAgICAgIH1gXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLm9wdGlvbi5wcmVmaXhDbHN9LWJ1dHRvbi1ncm91cC0ke3RoaXMub3B0aW9uLm9wZXJhdGlvbiA/ICdvcGVyYXRpb24nIDogJ25vcm1hbCd9YF06IHRydWVcbiAgICB9O1xuICB9XG5cbiAgaW5wdXRDaGFuZ2UodHlwZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsdWU7XG4gIH1cblxuICBsZWF2ZUFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5vcHRpb24uYW5pbWF0ZWQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbi50cmFuc3BhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUodGhpcy5vcHRpb24udHJhbnNpdGlvbk5hbWUpKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKHRoaXMub3B0aW9uLnRyYW5zaXRpb25OYW1lKTtcbiAgICAgICAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKHRoaXMub3B0aW9uLm1hc2tUcmFuc2l0aW9uTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUoJ2FtLWZhZGUnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKHRoaXMub3B0aW9uLnRyYW5zaXRpb25OYW1lKSkge1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldExlYXZlQWN0aXZlTmFtZSh0aGlzLm9wdGlvbi50cmFuc2l0aW9uTmFtZSk7XG4gICAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldExlYXZlQWN0aXZlTmFtZSh0aGlzLm9wdGlvbi5tYXNrVHJhbnNpdGlvbk5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKCdhbS1zbGlkZS11cCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb24ucG9wdXApIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9XG4gICAgICAgICAgdGhpcy5vcHRpb24uYW5pbWF0aW9uVHlwZSA9PT0gJ3NsaWRlLXVwJ1xuICAgICAgICAgICAgPyB0aGlzLnNldExlYXZlQWN0aXZlTmFtZSgnYW0tc2xpZGUtdXAnKVxuICAgICAgICAgICAgOiB0aGlzLnNldExlYXZlQWN0aXZlTmFtZSgnYW0tc2xpZGUtZG93bicpO1xuICAgICAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKCdhbS1mYWRlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb24udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub25DaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VkKHRoaXMub3B0aW9uLnZpc2libGUpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLm9wdGlvbi52aXNpYmxlID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuc2V0VHJhbnNpdGlvbk5hbWUodmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGJvb2xlYW4pID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZWQgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB7fSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBnZXQgYWZ0ZXJPcGVuKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFmdGVyT3BlbkVtaXR0ZXIuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgYWZ0ZXJDbG9zZSgpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy5hZnRlckNsb3NlRW1pdHRlci5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEluc3RhbmNlKCk6IE1vZGFsQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb24uY2xvc2VXaXRoQW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLm9wdGlvbi5jbG9zZVdpdGhBbmltYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgICAgIHRoaXMubGVhdmVBbmltYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyT2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9uLmZvb3Rlci5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzLm9wdGlvbi5mb290ZXJbMV07XG4gICAgICBidXR0b24ub25QcmVzcygpO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJDYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9uLmZvb3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzLm9wdGlvbi5mb290ZXJbMF07XG4gICAgICBidXR0b24ub25QcmVzcygpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ01vZGFsU2VydmljZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlQ29tcG9uZW50IGV4dGVuZHMgTW9kYWxDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uOiBNb2RhbE9wdGlvbnMsIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIob3B0aW9uLCBlbGVtZW50UmVmKTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25OYW1lKHRoaXMub3B0aW9uLnZpc2libGUpO1xuICB9XG59XG4iXX0=