@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
249 lines (248 loc) • 19.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, forwardRef, ElementRef, ContentChild, ViewChild, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
import { DefaultControlValueAccessor } from './../../common/default-control-value-accessor';
import { AsiComponentTemplateOptionDef, AsiComponentTemplateTagDef } from './../../common/asi-component-template';
import { debounceTime, switchMap, tap } from 'rxjs/operators';
import * as nh from '../../../native-helper';
/**
* asi-autocomplete-multiple component
*/
var AsiAutoCompleteMultipleComponent = /** @class */ (function (_super) {
tslib_1.__extends(AsiAutoCompleteMultipleComponent, _super);
function AsiAutoCompleteMultipleComponent(renderer) {
var _this = _super.call(this) || this;
_this.renderer = renderer;
/**
* Label position
*/
_this.labelPosition = 'top';
/**
* Placeholder if needed
*/
_this.placeholder = '';
/**
* Delay between the moment you stop typing and onRequestData is called
*/
_this.delay = 500;
/**
* Option to keep the list open once an item is selected
*/
_this.closeAfterSelect = false;
_this.autoCompleteControl = new FormControl();
_this.open = false;
// Var used to manage component initialization
_this.firstRequestDone = null;
_this.init = false;
_this.currentValue = null;
return _this;
}
/**
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.checkInput = /**
* @return {?}
*/
function () {
if (null == this.onRequestData) {
throw new Error('AsiAutoCompleteMultipleComponent : \'onRequestData\' is required');
}
};
/**
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.checkInput();
this.renderer.addClass(this.container.nativeElement, 'label-' + this.labelPosition);
this.autoCompleteControl.valueChanges.pipe(debounceTime(this.delay), tap(function (value) { return _this.currentValue = value; }), switchMap(function (value) { return nh.observe(_this.onRequestData(value, !_this.firstRequestDone)); }))
.subscribe(function (data) {
_this.data = data;
if (_this.firstRequestDone && data && data.length > 0) {
_this.open = true;
}
_this.firstRequestDone = true;
});
};
/**
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.onDropdownClose = /**
* @return {?}
*/
function () {
this.open = false;
};
/**
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
if (this.init) {
this.open = true;
}
else {
if (this.firstRequestDone) {
this.init = true;
}
}
};
/**
* @param {?} data
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.addValue = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (this.value == null) {
this.value = [];
}
this.value.push(data);
if (this.closeAfterSelect) {
this.open = false;
}
};
/**
* @param {?} data
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.removeValue = /**
* @param {?} data
* @return {?}
*/
function (data) {
nh.remove(this.value, function (value) {
return data === value;
});
if (nh.isEmpty(this.value)) {
this.value = null;
}
};
/**
* @param {?} value
* @return {?}
*/
AsiAutoCompleteMultipleComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this._value = value;
if (this.init === false) {
this.autoCompleteControl.setValue(this.currentValue);
}
else {
this.currentValue = value;
if (this.value == null) {
this.autoCompleteControl.setValue(this.currentValue, { emitEvent: false });
}
}
};
AsiAutoCompleteMultipleComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-autocomplete-multiple',
template: "<div class=\"tag-container\">\r\n <div class=\"tag\" *ngFor=\"let aValue of value\">\r\n <span>\r\n <ng-template [ngTemplateOutlet]=\"tagDef.template\" [ngTemplateOutletContext]=\"{$implicit : aValue}\"></ng-template>\r\n </span>\r\n <button type=\"button\" [disabled]=\"disabled\" class=\"remove-icon-container\" (click)=\"removeValue(aValue)\">\r\n <span class=\"remove-icon\" [innerHTML]=\"'✕'\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n<div class=\"autocomplete-container\" #container>\r\n <label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\r\n <div class=\"autocomplete\">\r\n <input [attr.id]=\"id\" [attr.name]=\"name\"\r\n [attr.disabled]=\"disabled ? '' : null\" class=\"asi-focus-error\"\r\n [placeholder]=\"placeholder\" [formControl]=\"autoCompleteControl\"/>\r\n\r\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-autocomplete-multiple-dropdown\">\r\n <div class=\"drop-down-autocomplete-multiple\">\r\n <div class=\"drop-down-panel\" [ngClass]=\"{'open' : open }\">\r\n <button [id]=\"'asi-acmddi-'+ id\" type=\"button\" class=\"drop-down-item\" (click)=\"addValue(aData)\" *ngFor=\"let aData of data\">\r\n <div class=\"option\">\r\n <span class=\"item\">\r\n <ng-template *ngIf=\"aData != null\" [ngTemplateOutlet]=\"optionDef.template\" [ngTemplateOutletContext]=\"{$implicit : aData}\"></ng-template>\r\n </span>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n </asi-dropdown>\r\n\r\n </div>\r\n</div>\r\n",
host: { 'class': 'asi-component asi-autocomplete-multiple' },
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return AsiAutoCompleteMultipleComponent; }),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiAutoCompleteMultipleComponent.ctorParameters = function () { return [
{ type: Renderer2 }
]; };
AsiAutoCompleteMultipleComponent.propDecorators = {
id: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
labelPosition: [{ type: Input }],
placeholder: [{ type: Input }],
delay: [{ type: Input }],
closeAfterSelect: [{ type: Input }],
onRequestData: [{ type: Input }],
optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }],
tagDef: [{ type: ContentChild, args: [AsiComponentTemplateTagDef,] }],
container: [{ type: ViewChild, args: ['container',] }]
};
return AsiAutoCompleteMultipleComponent;
}(DefaultControlValueAccessor));
export { AsiAutoCompleteMultipleComponent };
if (false) {
/**
* html id
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.id;
/**
* html name
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.name;
/**
* Label to display (is translated)
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.labelPosition;
/**
* Placeholder if needed
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.placeholder;
/**
* Delay between the moment you stop typing and onRequestData is called
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.delay;
/**
* Option to keep the list open once an item is selected
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.closeAfterSelect;
/**
* Function called to request new data (can return Observable/Promise/Object) : Throw error if null
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.onRequestData;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.optionDef;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.tagDef;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.container;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.data;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.autoCompleteControl;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.open;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.firstRequestDone;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.init;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.currentValue;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWF1dG9jb21wbGV0ZS9tdWx0aXBsZS9hc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBVSxVQUFVLEVBQUUsWUFBWSxFQUM5RCxTQUFTLEVBQWEsU0FBUyxFQUNoQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDNUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEgsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTs7Ozs7SUFnQlUsNERBQTJCO0lBeUMvRSwwQ0FBb0IsUUFBbUI7UUFBdkMsWUFDRSxpQkFBTyxTQUNSO1FBRm1CLGNBQVEsR0FBUixRQUFRLENBQVc7Ozs7OEJBOUJ3RCxLQUFLOzs7OzRCQUc3RSxFQUFFOzs7O3NCQUdSLEdBQUc7Ozs7aUNBR1EsS0FBSztvQ0FZWCxJQUFJLFdBQVcsRUFBRTtxQkFDaEMsS0FBSzs7aUNBR2dCLElBQUk7cUJBQ3pCLEtBQUs7NkJBRVEsSUFBSTs7S0FJdkI7Ozs7SUFFTyxxREFBVTs7OztRQUNoQixFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUss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LENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDNUU7U0FDRjtLQUNGOztnQkEzSEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLHdvREFBdUQ7b0JBQ3ZELElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSx5Q0FBeUMsRUFBRTtvQkFDNUQsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLGdDQUFnQyxFQUFoQyxDQUFnQyxDQUFDOzRCQUMvRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7OztnQkFyQnVCLFNBQVM7OztxQkF5QjlCLEtBQUs7dUJBRUwsS0FBSzt3QkFHTCxLQUFLO2dDQUdMLEtBQUs7OEJBR0wsS0FBSzt3QkFHTCxLQUFLO21DQUdMLEtBQUs7Z0NBR0wsS0FBSzs0QkFFTCxZQUFZLFNBQUMsNkJBQTZCO3lCQUMxQyxZQUFZLFNBQUMsMEJBQTBCOzRCQUV2QyxTQUFTLFNBQUMsV0FBVzs7MkNBcER4QjtFQXdCc0QsMkJBQTJCO1NBQXBFLGdDQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgSW5wdXQsIGZvcndhcmRSZWYsIE9uSW5pdCwgRWxlbWVudFJlZiwgQ29udGVudENoaWxkLFxuICBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgUmVuZGVyZXIyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcbmltcG9ydCB7IEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmLCBBc2lDb21wb25lbnRUZW1wbGF0ZVRhZ0RlZiB9IGZyb20gJy4vLi4vLi4vY29tbW9uL2FzaS1jb21wb25lbnQtdGVtcGxhdGUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIG5oIGZyb20gJy4uLy4uLy4uL25hdGl2ZS1oZWxwZXInXG4vKipcbiAqIGFzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUgY29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUnLFxuICB0ZW1wbGF0ZVVybDogJ2FzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpQXV0b0NvbXBsZXRlTXVsdGlwbGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXNpQXV0b0NvbXBsZXRlTXVsdGlwbGVDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgLyoqIGh0bWwgaWQgKi9cbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgLyoqIGh0bWwgbmFtZSAqL1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIHRvIGRpc3BsYXkgKGlzIHRyYW5zbGF0ZWQpICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIHBvc2l0aW9uICovXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICd0b3AnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2JvdHRvbS1jZW50ZXInIHwgJ3RvcC1jZW50ZXInID0gJ3RvcCc7XG5cbiAgLyoqIFBsYWNlaG9sZGVyIGlmIG5lZWRlZCAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuXG4gIC8qKiBEZWxheSBiZXR3ZWVuIHRoZSBtb21lbnQgeW91IHN0b3AgdHlwaW5nIGFuZCBvblJlcXVlc3REYXRhIGlzIGNhbGxlZCAqL1xuICBASW5wdXQoKSBkZWxheSA9IDUwMDtcblxuICAvKiogT3B0aW9uIHRvIGtlZXAgdGhlIGxpc3Qgb3BlbiBvbmNlIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgKi9cbiAgQElucHV0KCkgY2xvc2VBZnRlclNlbGVjdCA9IGZhbHNlO1xuXG4gIC8qKiBGdW5jdGlvbiBjYWxsZWQgdG8gcmVxdWVzdCBuZXcgZGF0YSAoY2FuIHJldHVybiBPYnNlcnZhYmxlL1Byb21pc2UvT2JqZWN0KSA6IFRocm93IGVycm9yIGlmIG51bGwgKi9cbiAgQElucHV0KCkgb25SZXF1ZXN0RGF0YTogRnVuY3Rpb247XG5cbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZU9wdGlvbkRlZikgb3B0aW9uRGVmOiBBc2lDb21wb25lbnRUZW1wbGF0ZU9wdGlvbkRlZjtcbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZVRhZ0RlZikgdGFnRGVmOiBBc2lDb21wb25lbnRUZW1wbGF0ZVRhZ0RlZjtcblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgZGF0YTogQXJyYXk8YW55PjtcblxuICBhdXRvQ29tcGxldGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIG9wZW4gPSBmYWxzZTtcblxuICAvLyBWYXIgdXNlZCB0byBtYW5hZ2UgY29tcG9uZW50IGluaXRpYWxpemF0aW9uXG4gIGZpcnN0UmVxdWVzdERvbmU6IEJvb2xlYW4gPSBudWxsO1xuICBpbml0ID0gZmFsc2U7XG5cbiAgY3VycmVudFZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW5wdXQoKSB7XG4gICAgaWYgKG51bGwgPT0gdGhpcy5vblJlcXVlc3REYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzaUF1dG9Db21wbGV0ZU11bHRpcGxlQ29tcG9uZW50IDogQElucHV0IFxcJ29uUmVxdWVzdERhdGFcXCcgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNoZWNrSW5wdXQoKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcblxuICAgIHRoaXMuYXV0b0NvbXBsZXRlQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWxheSksXG4gICAgICB0YXAodmFsdWUgPT4gdGhpcy5jdXJyZW50VmFsdWUgPSB2YWx1ZSksXG4gICAgICBzd2l0Y2hNYXAoKHZhbHVlKSA9PiBuaC5vYnNlcnZlKHRoaXMub25SZXF1ZXN0RGF0YSh2YWx1ZSwgIXRoaXMuZmlyc3RSZXF1ZXN0RG9uZSkpKSlcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodGhpcy5maXJzdFJlcXVlc3REb25lICYmIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcnN0UmVxdWVzdERvbmUgPSB0cnVlO1xuICAgICAgfSk7XG4gIH1cblxuICBvbkRyb3Bkb3duQ2xvc2UoKSB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5pbml0KSB7XG4gICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5maXJzdFJlcXVlc3REb25lKSB7XG4gICAgICAgIHRoaXMuaW5pdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVmFsdWUoZGF0YTogYW55KSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlLnB1c2goZGF0YSk7XG4gICAgaWYgKHRoaXMuY2xvc2VBZnRlclNlbGVjdCkge1xuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlVmFsdWUoZGF0YTogYW55KSB7XG4gICAgbmgucmVtb3ZlKHRoaXMudmFsdWUsICh2YWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIGRhdGEgPT09IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKG5oLmlzRW1wdHkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuaW5pdCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYXV0b0NvbXBsZXRlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19