@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
785 lines • 56.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: auto-complete.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, forwardRef, HostListener, Injector, Input, Output, TemplateRef, ViewContainerRef, HostBinding, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { fromEvent, of } from 'rxjs';
import { map, filter, debounceTime, switchMap, tap } from 'rxjs/operators';
import { PositionService } from '@duoduo-oba/ng-devui/position';
import { AutoCompletePopupComponent } from './auto-complete-popup.component';
var AutoCompleteDirective = /** @class */ (function () {
function AutoCompleteDirective(elementRef, viewContainerRef, componentFactoryResolver, renderer, injector, positionService, changeDetectorRef) {
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this.componentFactoryResolver = componentFactoryResolver;
this.renderer = renderer;
this.injector = injector;
this.positionService = positionService;
this.changeDetectorRef = changeDetectorRef;
this.autocomplete = 'off';
this.autocapitalize = 'off';
this.autocorrect = 'off';
this.sceneType = ''; // sceneType使用场景:select(下拉框) suggest(联想)
// sceneType使用场景:select(下拉框) suggest(联想)
this.tipsText = ''; // 提示文字
this.maxHeight = 300;
/**
* 【可选】启用数据懒加载,默认不启用
*/
this.enableLazyLoad = false;
this.loadMore = new EventEmitter();
this.selectValue = new EventEmitter();
this.transInputFocusEmit = new EventEmitter(); // input状态传给父组件函数
// input状态传给父组件函数
this.KEYBOARD_EVENT_NOT_REFRESH = ['escape', 'enter', 'arrowup', 'arrowdown',
/*ie 10 edge */ 'esc', 'up', 'down'];
this.popTipsText = '';
this.focus = false;
this.placement = 'bottom-left';
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { return null; });
this.onTouched = (/**
* @return {?}
*/
function () { return null; });
this.delay = 300;
this.valueChanges = this.registerInputEvent(elementRef);
this.minLength = 1;
this.itemTemplate = null;
this.noResultItemTemplate = null;
this.formatter = (/**
* @param {?} item
* @return {?}
*/
function (item) { return item ? (item.label || item.toString()) : ''; });
this.valueParser = (/**
* @param {?} item
* @return {?}
*/
function (item) { return item; });
}
/**
* @return {?}
*/
AutoCompleteDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
// 调用时机:input keyup
this.subscription = this.valueChanges
.subscribe((/**
* @param {?} source
* @return {?}
*/
function (source) { return _this.onSourceChange(source); }));
// 动态的创建了popup组件,
/** @type {?} */
var factory = this.componentFactoryResolver.resolveComponentFactory(AutoCompletePopupComponent);
this.popupRef = this.viewContainerRef.createComponent(factory, this.viewContainerRef.length, this.injector);
this.fillPopup(this.source);
if (!this.searchFn) {
this.searchFn = (/**
* @param {?} term
* @return {?}
*/
function (term) {
return of(_this.source.filter((/**
* @param {?} lang
* @return {?}
*/
function (lang) { return _this.formatter(lang).toLowerCase().indexOf(term.toLowerCase()) !== -1; })));
});
}
// 调用时机:选中回车或者鼠标单击下拉选项
this.popupRef.instance.registerOnChange((/**
* @param {?} item
* @return {?}
*/
function (item) {
if (item.type === 'loadMore') {
_this.loadMore.emit(item.value);
return;
}
/** @type {?} */
var value = _this.valueParser(item.value);
_this.writeValue(value);
_this.onChange(value);
_this.hidePopup();
_this.selectValue.emit(item.value);
if (_this.overview && _this.overview !== 'single') {
setTimeout((/**
* @return {?}
*/
function () {
_this.restLatestSource();
}), 0);
}
}));
};
/**
* @param {?} changes
* @return {?}
*/
AutoCompleteDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes && this.popupRef && changes.source) {
this.fillPopup(this.source);
}
};
/**
* @return {?}
*/
AutoCompleteDirective.prototype.restLatestSource = /**
* @return {?}
*/
function () {
if (this.latestSource && this.latestSource.length > 0) {
this.writeValue('');
this.clearInputValue();
this.showLatestSource();
}
};
// 调用时机:input keyup
// 调用时机:input keyup
/**
* @param {?} source
* @return {?}
*/
AutoCompleteDirective.prototype.onSourceChange =
// 调用时机:input keyup
/**
* @param {?} source
* @return {?}
*/
function (source) {
if (!this.elementRef.nativeElement.value) {
if (this.sceneType !== 'select') { // 下拉场景不展示最近输入
this.showLatestSource();
}
else {
this.showSource(source, true, true);
}
}
else {
this.showSource(source, true, true);
}
};
/**
* @private
* @return {?}
*/
AutoCompleteDirective.prototype.showLatestSource = /**
* @private
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var tempSource = [];
if (this.latestSource && this.latestSource.length > 0) {
this.searchFn('').subscribe((/**
* @param {?} source
* @return {?}
*/
function (source) {
/** @type {?} */
var t = _this.latestSource.slice(-5);
tempSource = t.filter((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (!data.label) {
return source.find((/**
* @param {?} item
* @return {?}
*/
function (item) { return item === data; }));
}
else {
return source.find((/**
* @param {?} item
* @return {?}
*/
function (item) { return item.label === data.label; }));
}
}));
/** @type {?} */
var pop = _this.popupRef.instance;
pop.reset();
_this.popTipsText = '最近输入';
_this.fillPopup(tempSource);
pop.isOpen = true;
_this.changeDetectorRef.markForCheck();
}));
}
if (tempSource.length <= 0) {
this.hidePopup();
}
};
/**
* @private
* @param {?} source
* @param {?} setOpen
* @param {?} isReset
* @return {?}
*/
AutoCompleteDirective.prototype.showSource = /**
* @private
* @param {?} source
* @param {?} setOpen
* @param {?} isReset
* @return {?}
*/
function (source, setOpen, isReset) {
if ((source && source.length) || this.noResultItemTemplate) {
/** @type {?} */
var pop = this.popupRef.instance;
if (isReset) {
pop.reset();
}
this.popTipsText = this.tipsText || '';
this.fillPopup(source, this.value);
if (setOpen) {
pop.isOpen = true;
}
this.changeDetectorRef.markForCheck();
}
else {
this.hidePopup();
}
};
/**
* @param {?} obj
* @return {?}
*/
AutoCompleteDirective.prototype.writeValue = /**
* @param {?} obj
* @return {?}
*/
function (obj) {
this.value = this.formatter(obj) || '';
this.writeInputValue(this.value);
};
/**
* @param {?} fn
* @return {?}
*/
AutoCompleteDirective.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
AutoCompleteDirective.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} isDisabled
* @return {?}
*/
AutoCompleteDirective.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);
if (this.popupRef) {
this.popupRef.instance.setDisabledState(isDisabled);
}
};
/**
* @return {?}
*/
AutoCompleteDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.unSubscription();
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
this.focus = true;
this.transInputFocusEmit.emit({
focus: true,
popupRef: this.popupRef
});
/** @type {?} */
var isOpen = this.sceneType !== 'select';
if (this.sceneType === 'select') {
this.searchFn('').subscribe((/**
* @param {?} source
* @return {?}
*/
function (source) {
_this.showSource(source, isOpen, false);
}));
}
else {
if (!this.elementRef.nativeElement.value) {
this.showLatestSource();
}
else {
this.searchFn(this.elementRef.nativeElement.value).subscribe((/**
* @param {?} source
* @return {?}
*/
function (source) {
_this.showSource(source, true, false);
}));
}
}
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onBlur = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.focus = false;
this.onTouched();
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onEscKeyup = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.hidePopup();
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onEnterKeyDown = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (!this.popupRef.instance.source || !this.popupRef.instance.isOpen) {
return;
}
if (this.popupRef) {
this.popupRef.instance.selectCurrentItem($event);
}
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onArrowUpKeyDown = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.popupRef) {
$event.preventDefault();
$event.stopPropagation();
this.popupRef.instance.prev();
}
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onArrowDownKeyDown = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.popupRef) {
$event.preventDefault();
$event.stopPropagation();
this.popupRef.instance.next();
}
};
/**
* @param {?} $event
* @return {?}
*/
AutoCompleteDirective.prototype.onDocumentClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.focus) {
this.transInputFocusEmit.emit({
focus: this.focus,
popupRef: this.popupRef
});
}
if (this.popupRef && !this.popupRef.instance.isOpen) {
return;
}
/** @type {?} */
var hostElement = this.elementRef.nativeElement;
if (!hostElement.contains($event.target)) {
this.hidePopup();
this.transInputFocusEmit.emit({
focus: false,
popupRef: this.popupRef
});
}
};
/**
* @private
* @return {?}
*/
AutoCompleteDirective.prototype.hidePopup = /**
* @private
* @return {?}
*/
function () {
if (this.popupRef) {
this.popupRef.instance.isOpen = false;
}
};
/**
* @private
* @param {?=} source
* @param {?=} term
* @return {?}
*/
AutoCompleteDirective.prototype.fillPopup = /**
* @private
* @param {?=} source
* @param {?=} term
* @return {?}
*/
function (source, term) {
var _this = this;
this.position = this.positionService.position(this.elementRef.nativeElement);
/** @type {?} */
var pop = this.popupRef.instance;
pop.source = source;
pop.maxHeight = this.maxHeight;
pop.term = term;
pop.disabledKey = this.disabledKey;
pop.enableLazyLoad = this.enableLazyLoad;
['formatter', 'itemTemplate', 'noResultItemTemplate', 'cssClass', 'dropdown', 'popTipsText', 'position', 'overview']
.forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
if (_this[key] !== undefined) {
pop[key] = _this[key];
}
}));
};
/**
* @private
* @param {?} value
* @return {?}
*/
AutoCompleteDirective.prototype.writeInputValue = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
};
/**
* @private
* @return {?}
*/
AutoCompleteDirective.prototype.clearInputValue = /**
* @private
* @return {?}
*/
function () {
this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');
};
/**
* @private
* @return {?}
*/
AutoCompleteDirective.prototype.unSubscription = /**
* @private
* @return {?}
*/
function () {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = null;
}
};
/**
* @param {?} term
* @return {?}
*/
AutoCompleteDirective.prototype.onTermChange = /**
* @param {?} term
* @return {?}
*/
function (term) {
this.value = term;
if (this.popupRef) {
this.popupRef.instance.term = term;
}
this.onChange(term);
};
/**
* @private
* @param {?} elementRef
* @return {?}
*/
AutoCompleteDirective.prototype.registerInputEvent = /**
* @private
* @param {?} elementRef
* @return {?}
*/
function (elementRef) {
var _this = this;
return fromEvent(elementRef.nativeElement, 'keyup')
.pipe(filter((/**
* @param {?} e
* @return {?}
*/
function (e) {
return _this.KEYBOARD_EVENT_NOT_REFRESH.indexOf(e.key.toLocaleLowerCase()) === -1;
})), map((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.target.value; })), tap((/**
* @param {?} term
* @return {?}
*/
function (term) { return _this.onTouched(); })), filter((/**
* @param {?} term
* @return {?}
*/
function (term) { return !_this.disabled && _this.searchFn && term.length >= 0; })), debounceTime(this.delay), tap((/**
* @param {?} term
* @return {?}
*/
function (term) { return _this.onTermChange(term); })), switchMap((/**
* @param {?} term
* @return {?}
*/
function (term) { return _this.searchFn(term, _this); })));
};
AutoCompleteDirective.decorators = [
{ type: Directive, args: [{
selector: '[dAutoComplete]',
exportAs: 'autoComplete',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return AutoCompleteDirective; })),
multi: true
}]
},] }
];
/** @nocollapse */
AutoCompleteDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: ComponentFactoryResolver },
{ type: Renderer2 },
{ type: Injector },
{ type: PositionService },
{ type: ChangeDetectorRef }
]; };
AutoCompleteDirective.propDecorators = {
autocomplete: [{ type: HostBinding, args: ['attr.autocomplete',] }],
autocapitalize: [{ type: HostBinding, args: ['attr.autocapitalize',] }],
autocorrect: [{ type: HostBinding, args: ['attr.autocorrect',] }],
disabled: [{ type: Input }],
cssClass: [{ type: Input }],
delay: [{ type: Input }],
minLength: [{ type: Input }],
itemTemplate: [{ type: Input }],
noResultItemTemplate: [{ type: Input }],
formatter: [{ type: Input }],
sceneType: [{ type: Input }],
tipsText: [{ type: Input }],
overview: [{ type: Input }],
latestSource: [{ type: Input }],
source: [{ type: Input }],
valueParser: [{ type: Input }],
searchFn: [{ type: Input }],
dropdown: [{ type: Input }],
maxHeight: [{ type: Input }],
disabledKey: [{ type: Input }],
enableLazyLoad: [{ type: Input }],
loadMore: [{ type: Output }],
selectValue: [{ type: Output }],
transInputFocusEmit: [{ type: Output }],
onFocus: [{ type: HostListener, args: ['focus', ['$event'],] }],
onBlur: [{ type: HostListener, args: ['blur', ['$event'],] }],
onEscKeyup: [{ type: HostListener, args: ['keydown.esc', ['$event'],] }],
onEnterKeyDown: [{ type: HostListener, args: ['keydown.Enter', ['$event'],] }],
onArrowUpKeyDown: [{ type: HostListener, args: ['keydown.ArrowUp', ['$event'],] }],
onArrowDownKeyDown: [{ type: HostListener, args: ['keydown.ArrowDown', ['$event'],] }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return AutoCompleteDirective;
}());
export { AutoCompleteDirective };
if (false) {
/** @type {?} */
AutoCompleteDirective.prototype.autocomplete;
/** @type {?} */
AutoCompleteDirective.prototype.autocapitalize;
/** @type {?} */
AutoCompleteDirective.prototype.autocorrect;
/** @type {?} */
AutoCompleteDirective.prototype.disabled;
/** @type {?} */
AutoCompleteDirective.prototype.cssClass;
/** @type {?} */
AutoCompleteDirective.prototype.delay;
/** @type {?} */
AutoCompleteDirective.prototype.minLength;
/** @type {?} */
AutoCompleteDirective.prototype.itemTemplate;
/** @type {?} */
AutoCompleteDirective.prototype.noResultItemTemplate;
/** @type {?} */
AutoCompleteDirective.prototype.formatter;
/** @type {?} */
AutoCompleteDirective.prototype.sceneType;
/** @type {?} */
AutoCompleteDirective.prototype.tipsText;
/** @type {?} */
AutoCompleteDirective.prototype.overview;
/** @type {?} */
AutoCompleteDirective.prototype.latestSource;
/** @type {?} */
AutoCompleteDirective.prototype.source;
/** @type {?} */
AutoCompleteDirective.prototype.valueParser;
/** @type {?} */
AutoCompleteDirective.prototype.searchFn;
/** @type {?} */
AutoCompleteDirective.prototype.dropdown;
/** @type {?} */
AutoCompleteDirective.prototype.maxHeight;
/** @type {?} */
AutoCompleteDirective.prototype.disabledKey;
/**
* 【可选】启用数据懒加载,默认不启用
* @type {?}
*/
AutoCompleteDirective.prototype.enableLazyLoad;
/** @type {?} */
AutoCompleteDirective.prototype.loadMore;
/** @type {?} */
AutoCompleteDirective.prototype.selectValue;
/** @type {?} */
AutoCompleteDirective.prototype.transInputFocusEmit;
/** @type {?} */
AutoCompleteDirective.prototype.KEYBOARD_EVENT_NOT_REFRESH;
/** @type {?} */
AutoCompleteDirective.prototype.popupRef;
/** @type {?} */
AutoCompleteDirective.prototype.popTipsText;
/** @type {?} */
AutoCompleteDirective.prototype.position;
/** @type {?} */
AutoCompleteDirective.prototype.focus;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.valueChanges;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.value;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.placement;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.subscription;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.onChange;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.onTouched;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.injector;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.positionService;
/**
* @type {?}
* @private
*/
AutoCompleteDirective.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9hdXRvLWNvbXBsZXRlLyIsInNvdXJjZXMiOlsiYXV0by1jb21wbGV0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUdYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBNEIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdFO0lBdURFLCtCQUFvQixVQUFzQixFQUNoQyxnQkFBa0MsRUFDbEMsd0JBQWtELEVBQ2xELFFBQW1CLEVBQ25CLFFBQWtCLEVBQ2xCLGVBQWdDLEVBQ2hDLGlCQUFvQztRQU4xQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ2hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixp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K0NBQWdDOztJQUNoQyx5Q0FBNkM7O0lBQzdDLDRDQUFnRDs7SUFDaEQsb0RBQXdEOztJQUN4RCwyREFDdUM7O0lBQ3ZDLHlDQUFtRDs7SUFFbkQsNENBQWlCOztJQUNqQix5Q0FBYzs7SUFDZCxzQ0FBYzs7Ozs7SUFFZCw2Q0FBd0M7Ozs7O0lBQ3hDLHNDQUFtQjs7Ozs7SUFDbkIsMENBQWtDOzs7OztJQUNsQyw2Q0FBbUM7Ozs7O0lBQ25DLHlDQUFvQzs7Ozs7SUFDcEMsMENBQStCOzs7OztJQUVuQiwyQ0FBOEI7Ozs7O0lBQ3hDLGlEQUEwQzs7Ozs7SUFDMUMseURBQTBEOzs7OztJQUMxRCx5Q0FBMkI7Ozs7O0lBQzNCLHlDQUEwQjs7Ozs7SUFDMUIsZ0RBQXdDOzs7OztJQUN4QyxrREFBNEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPbkNoYW5nZXMsXHJcbiAgUmVuZGVyZXIyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgZmlsdGVyLCBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBQb3NpdGlvblNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9wb3NpdGlvbic7XHJcbmltcG9ydCB7IEF1dG9Db21wbGV0ZVBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9hdXRvLWNvbXBsZXRlLXBvcHVwLmNvbXBvbmVudCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkQXV0b0NvbXBsZXRlXScsXHJcbiAgZXhwb3J0QXM6ICdhdXRvQ29tcGxldGUnLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXV0b0NvbXBsZXRlRGlyZWN0aXZlKSxcclxuICAgIG11bHRpOiB0cnVlXHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXV0b2NvbXBsZXRlJykgYXV0b2NvbXBsZXRlID0gJ29mZic7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmF1dG9jYXBpdGFsaXplJykgYXV0b2NhcGl0YWxpemUgPSAnb2ZmJztcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXV0b2NvcnJlY3QnKSBhdXRvY29ycmVjdCA9ICdvZmYnO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGVsYXk6IG51bWJlcjtcclxuICBASW5wdXQoKSBtaW5MZW5ndGg6IG51bWJlcjtcclxuICBASW5wdXQoKSBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgbm9SZXN1bHRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgZm9ybWF0dGVyOiAoaXRlbTogYW55KSA9PiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2NlbmVUeXBlID0gJyc7IC8vIHNjZW5lVHlwZeS9v+eUqOWcuuaZr++8mnNlbGVjdCjkuIvmi4nmoYYpIHN1Z2dlc3Qo6IGU5oOzKVxyXG4gIEBJbnB1dCgpIHRpcHNUZXh0ID0gJyc7IC8vIOaPkOekuuaWh+Wtl1xyXG4gIC8qXHJcbiBvdmVydmlldzogYm9yZGVyIG5vbmUgbXVsdGlsaW5lIHNpbmdsZVxyXG4gKi9cclxuICBASW5wdXQoKSBvdmVydmlldzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGxhdGVzdFNvdXJjZTogYW55W107IC8vIOacgOi/kei+k+WFpVxyXG4gIEBJbnB1dCgpIHNvdXJjZTogYW55W107XHJcbiAgQElucHV0KCkgdmFsdWVQYXJzZXI6IChpdGVtOiBhbnkpID0+IGFueTtcclxuICBASW5wdXQoKSBzZWFyY2hGbjogKHRlcm06IHN0cmluZywgdGFyZ2V0PzogQXV0b0NvbXBsZXRlRGlyZWN0aXZlKSA9PiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICBASW5wdXQoKSBkcm9wZG93bjogYm9vbGVhbjtcclxuICBASW5wdXQoKSBtYXhIZWlnaHQgPSAzMDA7XHJcbiAgQElucHV0KCkgZGlzYWJsZWRLZXk6IHN0cmluZztcclxuICAvKipcclxuICAgKiAg44CQ5Y+v6YCJ44CR5ZCv55So5pWw5o2u5oeS5Yqg6L2977yM6buY6K6k5LiN5ZCv55SoXHJcbiAgICovXHJcbiAgQElucHV0KCkgZW5hYmxlTGF6eUxvYWQgPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgbG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0VmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgdHJhbnNJbnB1dEZvY3VzRW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOyAvLyBpbnB1dOeKtuaAgeS8oOe7meeItue7hOS7tuWHveaVsFxyXG4gIEtFWUJPQVJEX0VWRU5UX05PVF9SRUZSRVNIID0gWydlc2NhcGUnLCAnZW50ZXInLCAnYXJyb3d1cCcsICdhcnJvd2Rvd24nLFxyXG4gICAgLyppZSAxMCBlZGdlICovICdlc2MnLCAndXAnLCAnZG93biddO1xyXG4gIHBvcHVwUmVmOiBDb21wb25lbnRSZWY8QXV0b0NvbXBsZXRlUG9wdXBDb21wb25lbnQ+O1xyXG5cclxuICBwb3BUaXBzVGV4dCA9ICcnO1xyXG4gIHBvc2l0aW9uOiBhbnk7XHJcbiAgZm9jdXMgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZXM6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIHByaXZhdGUgdmFsdWU6IGFueTtcclxuICBwcml2YXRlIHBsYWNlbWVudCA9ICdib3R0b20tbGVmdCc7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgcG9zaXRpb25TZXJ2aWNlOiBQb3NpdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5kZWxheSA9IDMwMDtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2VzID0gdGhpcy5yZWdpc3RlcklucHV0RXZlbnQoZWxlbWVudFJlZik7XHJcbiAgICB0aGlzLm1pbkxlbmd0aCA9IDE7XHJcbiAgICB0aGlzLml0ZW1UZW1wbGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLm5vUmVzdWx0SXRlbVRlbXBsYXRlID0gbnVsbDtcclxuICAgIHRoaXMuZm9ybWF0dGVyID0gKGl0ZW06IGFueSkgPT4gaXRlbSA/IChpdGVtLmxhYmVsIHx8IGl0ZW0udG9TdHJpbmcoKSkgOiAnJztcclxuICAgIHRoaXMudmFsdWVQYXJzZXIgPSAoaXRlbTogYW55KSA9PiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyDosIPnlKjml7bmnLrvvJppbnB1dCBrZXl1cFxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAuc3Vic2NyaWJlKHNvdXJjZSA9PiB0aGlzLm9uU291cmNlQ2hhbmdlKHNvdXJjZSkpO1xyXG5cclxuICAgIC8vIOWKqOaAgeeahOWIm+W7uuS6hnBvcHVw57uE5Lu277yMXHJcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoQXV0b0NvbXBsZXRlUG9wdXBDb21wb25lbnQpO1xyXG4gICAgdGhpcy5wb3B1cFJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSwgdGhpcy52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCwgdGhpcy5pbmplY3Rvcik7XHJcblxyXG4gICAgdGhpcy5maWxsUG9wdXAodGhpcy5zb3VyY2UpO1xyXG5cclxuICAgIGlmICghdGhpcy5zZWFyY2hGbikge1xyXG4gICAgICB0aGlzLnNlYXJjaEZuID0gKHRlcm0pID0+IHtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5zb3VyY2UuZmlsdGVyKGxhbmcgPT4gdGhpcy5mb3JtYXR0ZXIobGFuZykudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0udG9Mb3dlckNhc2UoKSkgIT09IC0xKSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6LCD55So5pe25py677ya6YCJ5Lit5Zue6L2m5oiW6ICF6byg5qCH5Y2V5Ye75LiL5ouJ6YCJ6aG5XHJcbiAgICB0aGlzLnBvcHVwUmVmLmluc3RhbmNlLnJlZ2lzdGVyT25DaGFuZ2UoaXRlbSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdsb2FkTW9yZScpIHtcclxuICAgICAgICB0aGlzLmxvYWRNb3JlLmVtaXQoaXRlbS52YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZVBhcnNlcihpdGVtLnZhbHVlKTtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuaGlkZVBvcHVwKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0VmFsdWUuZW1pdChpdGVtLnZhbHVlKTtcclxuICAgICAgaWYgKHRoaXMub3ZlcnZpZXcgJiYgdGhpcy5vdmVydmlldyAhPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8g6L+Z6YeM56iN5b6u5bu26L+f5LiA5LiL77yM562J5b6F5YWJ5qCH55qE5L2N572u5Y+R55Sf5Y+Y5YyW77yM5aW96YeN5paw6I635Y+W5YWJ5qCH55qE5L2N572uXHJcbiAgICAgICAgICB0aGlzLnJlc3RMYXRlc3RTb3VyY2UoKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcyAmJiB0aGlzLnBvcHVwUmVmICYmIGNoYW5nZXMuc291cmNlKSB7XHJcbiAgICAgIHRoaXMuZmlsbFBvcHVwKHRoaXMuc291cmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc3RMYXRlc3RTb3VyY2UoKSB7XHJcbiAgICBpZiAodGhpcy5sYXRlc3RTb3VyY2UgJiYgdGhpcy5sYXRlc3RTb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLndyaXRlVmFsdWUoJycpO1xyXG4gICAgICB0aGlzLmNsZWFySW5wdXRWYWx1ZSgpO1xyXG4gICAgICB0aGlzLnNob3dMYXRlc3RTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiwg+eUqOaXtuacuu+8mmlucHV0IGtleXVwXHJcbiAgb25Tb3VyY2VDaGFuZ2Uoc291cmNlOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUpIHtcclxuICAgICAgaWYgKHRoaXMuc2NlbmVUeXBlICE9PSAnc2VsZWN0JykgeyAvLyDkuIvmi4nlnLrmma/kuI3lsZXnpLrmnIDov5HovpPlhaVcclxuICAgICAgICB0aGlzLnNob3dMYXRlc3RTb3VyY2UoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNob3dTb3VyY2Uoc291cmNlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93U291cmNlKHNvdXJjZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dMYXRlc3RTb3VyY2UoKSB7XHJcbiAgICBsZXQgdGVtcFNvdXJjZSA9IFtdO1xyXG4gICAgaWYgKHRoaXMubGF0ZXN0U291cmNlICYmIHRoaXMubGF0ZXN0U291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWFyY2hGbignJykuc3Vic2NyaWJlKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgY29uc3QgdCA9IHRoaXMubGF0ZXN0U291cmNlLnNsaWNlKC01KTsgLy8g5pyA6L+R6L6T5YWl5Y+q5pSv5oyB5pyA5aSaNeS4qu+8jOaIquWPluWQjjXpoblcclxuICAgICAgICB0ZW1wU291cmNlID0gdC5maWx0ZXIoZGF0YSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWRhdGEubGFiZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gZGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc291cmNlLmZpbmQoaXRlbSA9PiBpdGVtLmxhYmVsID09PSBkYXRhLmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9wID0gdGhpcy5wb3B1cFJlZi5pbnN0YW5jZTtcclxuICAgICAgICBwb3AucmVzZXQoKTtcclxuICAgICAgICB0aGlzLnBvcFRpcHNUZXh0ID0gJ+acgOi/kei+k+WFpSc7XHJcbiAgICAgICAgdGhpcy5maWxsUG9wdXAodGVtcFNvdXJjZSk7XHJcbiAgICAgICAgcG9wLmlzT3BlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRlbXBTb3VyY2UubGVuZ3RoIDw9IDApIHtcclxuICAgICAgdGhpcy5oaWRlUG9wdXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd1NvdXJjZShzb3VyY2U6IGFueSwgc2V0T3BlbjogYW55LCBpc1Jlc2V0OiBhbnkpIHtcclxuICAgIGlmICgoc291cmNlICYmIHNvdXJjZS5sZW5ndGgpIHx8IHRoaXMubm9SZXN1bHRJdGVtVGVtcGxhdGUpIHtcclxuICAgICAgY29uc3QgcG9wID0gdGhpcy5wb3B1cFJlZi5pbnN0YW5jZTtcclxuICAgICAgaWYgKGlzUmVzZXQpIHtcclxuICAgICAgICBwb3AucmVzZXQoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvcFRpcHNUZXh0ID0gdGhpcy50aXBzVGV4dCB8fCAnJztcclxuICAgICAgdGhpcy5maWxsUG9wdXAoc291cmNlLCB0aGlzLnZhbHVlKTtcclxuICAgICAgaWYgKHNldE9wZW4pIHtcclxuICAgICAgICBwb3AuaXNPcGVuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5oaWRlUG9wdXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmZvcm1hdHRlcihvYmopIHx8ICcnO1xyXG4gICAgdGhpcy53cml0ZUlucHV0VmFsdWUodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3