UNPKG

@mobsolutions/ngx-dadata

Version:

[![npm version](https://badge.fury.io/js/%40kolkov%2Fngx-dadata.svg)](https://badge.fury.io/js/%40kolkov%2Fngx-dadata) [![Build Status](https://travis-ci.org/kolkov/ngx-dadata.svg?branch=master)](https://travis-ci.org/kolkov/ngx-dadata) [![Coverage Stat

335 lines 26.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { DadataType, NgxDadataService } from './ngx-dadata.service'; import { Subject, timer } from 'rxjs'; import { debounce } from 'rxjs/operators'; import { DadataConfigDefault } from './dadata-config'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** @type {?} */ const NGX_DADATA_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => NgxDadataComponent)), multi: true }; /*const NGX_DADATA_VALIDATOR = { provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxDadataComponent), multi: true, };*/ /** * @param {?} value * @return {?} */ export function createDaDataValidator(value) { return (/** * @param {?} c * @return {?} */ (c) => { /** @type {?} */ const err = { rangeError: { given: c.value, expected: value, } }; return (c.value !== value) ? err : null; }); } export class NgxDadataComponent { /** * @param {?} dataService * @param {?} _r */ constructor(dataService, _r) { this.dataService = dataService; this._r = _r; this.v = ''; this.currentFocus = -1; this.data = []; this.config = DadataConfigDefault; this.disabled = null; this.type = DadataType.address; this.limit = DadataConfigDefault.limit; this.placeholder = ''; this.selected = new EventEmitter(); this.inputString$ = new Subject(); // onSuggestionSelected = (value: string) => {}; this.onTouched = (/** * @return {?} */ () => { }); this.propagateChange = (/** * @return {?} */ () => { }); this.validateFn = (/** * @return {?} */ () => { }); } /** * @return {?} */ get value() { return this.v; } /** * @param {?} v * @return {?} */ set value(v) { if (v !== this.v) { this.v = v; this.propagateChange(v); } } /** * @return {?} */ ngOnInit() { /*this.validateFn = createDaDataValidator(this._value); this.propagateChange(this._value);*/ this.type = this.config.type; this.dataService.setApiKey(this.apiKey ? this.apiKey : this.config.apiKey); this.inputString$.pipe(debounce((/** * @return {?} */ () => timer(this.config.delay ? this.config.delay : 500)))).subscribe((/** * @param {?} x * @return {?} */ x => { this.dataService.getData(x, this.type, this.limit).subscribe((/** * @param {?} y * @return {?} */ (y) => { this.data = y.suggestions; })); })); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.value) { } } /** * @param {?} value * @return {?} */ getData(value) { this.inputString$.next(value); this.currentFocus = -1; } /** * @param {?} e * @param {?} item * @return {?} */ onClick(e, item) { // e.preventDefault(); this.inputValue.nativeElement.value = item.value; this.propagateChange(item.value); this.inputValue.nativeElement.focus(); this.selectedSuggestion = item; this.data = []; this.currentFocus = -1; // this.writeValue(item.value); this.selected.emit(item); // this.selectedData.emit(item.data); // this.selectedString.emit(item.value); } /** * @return {?} */ onOutsideClick() { this.data = []; } /** * @return {?} */ onArrowDown() { this.removeFocus(this.currentFocus); if (this.currentFocus >= this.data.length - 1) { this.currentFocus = 0; } else { this.currentFocus++; } this.setFocus(this.currentFocus); } /** * @return {?} */ onArrowUp() { this.removeFocus(this.currentFocus); if (this.currentFocus === 0) { this.currentFocus = this.data.length - 1; } else { this.currentFocus--; } this.setFocus(this.currentFocus); } /** * @return {?} */ onEnter() { this.selectedSuggestion = this.data[this.currentFocus]; this.inputValue.nativeElement.value = this.selectedSuggestion.value; this.data = []; this.currentFocus = -1; this.propagateChange(this.selectedSuggestion.value); // this.writeValue(this.selectedSuggestion.value); this.selected.emit(this.selectedSuggestion); // this.selectedData.emit(this.selectedSuggestion.data); // this.selectedString.emit(this.selectedSuggestion.value); } /** * @param {?} id * @return {?} */ setFocus(id) { /** @type {?} */ const activeEl = document.getElementById(id + 'item'); this._r.addClass(activeEl, 'active'); } /** * @param {?} id * @return {?} */ removeFocus(id) { if (id !== -1) { /** @type {?} */ const activeEl = document.getElementById(id + 'item'); this._r.removeClass(activeEl, 'active'); } } /** * @param {?} value * @return {?} */ writeValue(value) { if (value !== undefined) { this.v = value; } // this.onSuggestionSelected(value); } /** * Set the function to be called * when the control receives a change event. * * @param {?} fn a function * @return {?} */ registerOnChange(fn) { // this.onSuggestionSelected = fn; this.propagateChange = fn; } /** * Set the function to be called * when the control receives a touch event. * * @param {?} fn a function * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Implements disabled state for this element * * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { alert('disabled!'); this.disabled = isDisabled; } } NgxDadataComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-dadata', template: "<div class=\"autocomplete\">\r\n <label for=\"address_input\"></label>\r\n <input [disabled]=\"disabled ? true : null\" type=\"text\" class=\"primary-input\" #inputValue (input)=\"getData(inputValue.value)\"\r\n [placeholder]=\"placeholder\" (keyup.ArrowDown)=\"onArrowDown()\" (keyup.ArrowUp)=\"onArrowUp()\"\r\n (keyup.Enter)=\"onEnter()\" spellcheck=\"false\" [(ngModel)]=\"value\" autocomplete=\"new-password\" />\r\n <div *ngIf=\"data.length\">\r\n <div class=\"autocomplete-items\">\r\n <div class=\"autocomplele-item\" *ngFor=\"let item of data;let i = index\" (click)=\"onClick($event, item)\" [id]=\"i+'item'\">\r\n {{item.value}}\r\n <ng-template [ngIf]=\"type==='party'\">\r\n <br/>\r\n <span>{{item.data?.inn}} {{item.data?.address?.value}}</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", providers: [NGX_DADATA_VALUE_ACCESSOR,], styles: [".autocomplete{position:relative}.autocomplete-items{position:absolute;border:1px solid #d4d4d4;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items .autocomplele-item{padding:5px 10px;cursor:pointer;background-color:#fff;border-bottom:1px solid #d4d4d4}.autocomplete-items .autocomplele-item:hover{background-color:#e9e9e9}.autocomplete-items .autocomplele-item.active{background-color:#1e90ff!important;color:#fff}.autocomplete-items .autocomplele-item span{color:#555;font-size:80%}"] }] } ]; /** @nocollapse */ NgxDadataComponent.ctorParameters = () => [ { type: NgxDadataService }, { type: Renderer2 } ]; NgxDadataComponent.propDecorators = { config: [{ type: Input }], apiKey: [{ type: Input }], disabled: [{ type: Input }], type: [{ type: Input }], limit: [{ type: Input }], placeholder: [{ type: Input }], selectedSuggestion: [{ type: Output }], selected: [{ type: Output }], inputValue: [{ type: ViewChild, args: ['inputValue' /*, { static: true }*/,] }], onOutsideClick: [{ type: HostListener, args: ['document:click',] }] }; if (false) { /** * @type {?} * @private */ NgxDadataComponent.prototype.v; /** @type {?} */ NgxDadataComponent.prototype.currentFocus; /** @type {?} */ NgxDadataComponent.prototype.data; /** @type {?} */ NgxDadataComponent.prototype.config; /** @type {?} */ NgxDadataComponent.prototype.apiKey; /** @type {?} */ NgxDadataComponent.prototype.disabled; /** @type {?} */ NgxDadataComponent.prototype.type; /** @type {?} */ NgxDadataComponent.prototype.limit; /** @type {?} */ NgxDadataComponent.prototype.placeholder; /** @type {?} */ NgxDadataComponent.prototype.selectedSuggestion; /** @type {?} */ NgxDadataComponent.prototype.selected; /** @type {?} */ NgxDadataComponent.prototype.inputValue; /** * @type {?} * @private */ NgxDadataComponent.prototype.inputString$; /** @type {?} */ NgxDadataComponent.prototype.onTouched; /** @type {?} */ NgxDadataComponent.prototype.propagateChange; /** @type {?} */ NgxDadataComponent.prototype.validateFn; /** * @type {?} * @private */ NgxDadataComponent.prototype.dataService; /** * @type {?} * @private */ NgxDadataComponent.prototype._r; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhZGF0YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbW9ic29sdXRpb25zL25neC1kYWRhdGEvIiwic291cmNlcyI6WyJsaWIvbmd4LWRhZGF0YS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBZSxtQkFBbUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBbUQsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7TUFFN0YseUJBQXlCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUM7SUFDakQsS0FBSyxFQUFFLElBQUk7Q0FDWjs7Ozs7Ozs7OztBQVFELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFLO0lBQ3pDOzs7O0lBQU8sQ0FBQyxDQUFjLEVBQUUsRUFBRTs7Y0FDbEIsR0FBRyxHQUFHO1lBQ1YsVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxRQUFRLEVBQUUsS0FBSzthQUNoQjtTQUNGO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxD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QWdCLENBQUMsRUFBTztRQUN0QixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQzs7Ozs7Ozs7SUFRRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7Ozs7SUFPRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs7O1lBNUtGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsaTVCQUEwQztnQkFFMUMsU0FBUyxFQUFFLENBQUMseUJBQXlCLEVBQTJCOzthQUNqRTs7OztZQXRDbUIsZ0JBQWdCO1lBSmxDLFNBQVM7OztxQkFpRFIsS0FBSztxQkFDTCxLQUFLO3VCQUNMLEtBQUs7bUJBQ0wsS0FBSztvQkFDTCxLQUFLOzBCQUNMLEtBQUs7aUNBRUwsTUFBTTt1QkFDTixNQUFNO3lCQUlOLFNBQVMsU0FBQyxZQUFZLENBQUEsc0JBQXNCOzZCQStENUMsWUFBWSxTQUFDLGdCQUFnQjs7Ozs7OztJQWhGOUIsK0JBQW9COztJQUNwQiwwQ0FBa0I7O0lBRWxCLGtDQUE4Qjs7SUFFOUIsb0NBQW9EOztJQUNwRCxvQ0FBd0I7O0lBQ3hCLHNDQUF5Qjs7SUFDekIsa0NBQW1DOztJQUNuQyxtQ0FBMkM7O0lBQzNDLHlDQUEwQjs7SUFFMUIsZ0RBQStDOztJQUMvQyxzQ0FBMEQ7O0lBSTFELHdDQUFzRTs7Ozs7SUFFdEUsMENBQTZDOztJQUc3Qyx1Q0FBcUI7O0lBQ3JCLDZDQUFnQzs7SUFDaEMsd0NBQTJCOzs7OztJQUVmLHlDQUFxQzs7Ozs7SUFBRSxnQ0FBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtEYWRhdGFUeXBlLCBOZ3hEYWRhdGFTZXJ2aWNlfSBmcm9tICcuL25neC1kYWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7U3ViamVjdCwgdGltZXJ9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7RGFkYXRhUmVzcG9uc2V9IGZyb20gJy4vbW9kZWxzL2RhZGF0YS1yZXNwb25zZSc7XHJcbmltcG9ydCB7RGFkYXRhU3VnZ2VzdGlvbn0gZnJvbSAnLi9tb2RlbHMvc3VnZ2VzdGlvbic7XHJcbmltcG9ydCB7RGFkYXRhQ29uZmlnLCBEYWRhdGFDb25maWdEZWZhdWx0fSBmcm9tICcuL2RhZGF0YS1jb25maWcnO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmNvbnN0IE5HWF9EQURBVEFfVkFMVUVfQUNDRVNTT1IgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4RGFkYXRhQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZVxyXG59O1xyXG5cclxuLypjb25zdCBOR1hfREFEQVRBX1ZBTElEQVRPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neERhZGF0YUNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWUsXHJcbn07Ki9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYURhdGFWYWxpZGF0b3IodmFsdWUpIHtcclxuICByZXR1cm4gKGM6IEZvcm1Db250cm9sKSA9PiB7XHJcbiAgICBjb25zdCBlcnIgPSB7XHJcbiAgICAgIHJhbmdlRXJyb3I6IHtcclxuICAgICAgICBnaXZlbjogYy52YWx1ZSxcclxuICAgICAgICBleHBlY3RlZDogdmFsdWUsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIChjLnZhbHVlICE9PSB2YWx1ZSkgPyBlcnIgOiBudWxsO1xyXG4gIH07XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWRhZGF0YScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1kYWRhdGEuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC1kYWRhdGEuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtOR1hfREFEQVRBX1ZBTFVFX0FDQ0VTU09SLCAvKk5HWF9EQURBVEFfVkFMSURBVE9SKi9dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hEYWRhdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG4gIHByaXZhdGUgdjogYW55ID0gJyc7XHJcbiAgY3VycmVudEZvY3VzID0gLTE7XHJcblxyXG4gIGRhdGE6IERhZGF0YVN1Z2dlc3Rpb25bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBjb25maWc6IERhZGF0YUNvbmZpZyA9IERhZGF0YUNvbmZpZ0RlZmF1bHQ7XHJcbiAgQElucHV0KCkgYXBpS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHR5cGUgPSBEYWRhdGFUeXBlLmFkZHJlc3M7XHJcbiAgQElucHV0KCkgbGltaXQgPSBEYWRhdGFDb25maWdEZWZhdWx0LmxpbWl0O1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFN1Z2dlc3Rpb246IERhZGF0YVN1Z2dlc3Rpb247XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYWRhdGFTdWdnZXN0aW9uPigpO1xyXG4gIC8vIEBPdXRwdXQoKSBzZWxlY3RlZERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPERhRGF0YUFkZHJlc3MgfCBEYURhdGFGSU8gfCBEYURhdGFCYW5rIHwgRGFEYXRhUGFydHkgfCBEYURhdGFFbWFpbD4oKTtcclxuICAvLyBAT3V0cHV0KCkgc2VsZWN0ZWRTdHJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXRWYWx1ZScvKiwgeyBzdGF0aWM6IHRydWUgfSovKSBpbnB1dFZhbHVlOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIGlucHV0U3RyaW5nJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgLy8gb25TdWdnZXN0aW9uU2VsZWN0ZWQgPSAodmFsdWU6IHN0cmluZykgPT4ge307XHJcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcbiAgcHJvcGFnYXRlQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcclxuICB2YWxpZGF0ZUZuOiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogTmd4RGFkYXRhU2VydmljZSwgcHJpdmF0ZSBfcjogUmVuZGVyZXIyKSB7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnY7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy52KSB7XHJcbiAgICAgIHRoaXMudiA9IHY7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvKnRoaXMudmFsaWRhdGVGbiA9IGNyZWF0ZURhRGF0YVZhbGlkYXRvcih0aGlzLl92YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl92YWx1ZSk7Ki9cclxuICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldEFwaUtleSh0aGlzLmFwaUtleSA/IHRoaXMuYXBpS2V5IDogdGhpcy5jb25maWcuYXBpS2V5KTtcclxuICAgIHRoaXMuaW5wdXRTdHJpbmckLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlKCgpID0+IHRpbWVyKHRoaXMuY29uZmlnLmRlbGF5ID8gdGhpcy5jb25maWcuZGVsYXkgOiA1MDApKSxcclxuICAgICkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLmdldERhdGEoeCwgdGhpcy50eXBlLCB0aGlzLmxpbWl0KS5zdWJzY3JpYmUoKHk6IERhZGF0YVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0geS5zdWdnZXN0aW9ucztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnZhbHVlKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmlucHV0U3RyaW5nJC5uZXh0KHZhbHVlKTtcclxuICAgIHRoaXMuY3VycmVudEZvY3VzID0gLTE7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IERhZGF0YVN1Z2dlc3Rpb24pIHtcclxuICAgIC8vIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gaXRlbS52YWx1ZTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGl0ZW0udmFsdWUpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gaXRlbTtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAtMTtcclxuXHJcbiAgICAvLyB0aGlzLndyaXRlVmFsdWUoaXRlbS52YWx1ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQoaXRlbSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRGF0YS5lbWl0KGl0ZW0uZGF0YSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkU3RyaW5nLmVtaXQoaXRlbS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXHJcbiAgb25PdXRzaWRlQ2xpY2soKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBbXTtcclxuICB9XHJcblxyXG4gIG9uQXJyb3dEb3duKCkge1xyXG4gICAgdGhpcy5yZW1vdmVGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXMgPj0gdGhpcy5kYXRhLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMrKztcclxuICAgIH1cclxuICAgIHRoaXMuc2V0Rm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gIH1cclxuXHJcbiAgb25BcnJvd1VwKCkge1xyXG4gICAgdGhpcy5yZW1vdmVGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXMgPT09IDApIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZvY3VzLS07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICB9XHJcblxyXG4gIG9uRW50ZXIoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbiA9IHRoaXMuZGF0YVt0aGlzLmN1cnJlbnRGb2N1c107XHJcbiAgICB0aGlzLmlucHV0VmFsdWUubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlO1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IC0xO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gICAgLy8gdGhpcy53cml0ZVZhbHVlKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbik7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRGF0YS5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLmRhdGEpO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RlZFN0cmluZy5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldEZvY3VzKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnaXRlbScpO1xyXG4gICAgdGhpcy5fci5hZGRDbGFzcyhhY3RpdmVFbCwgJ2FjdGl2ZScpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRm9jdXMoaWQ6IG51bWJlcikge1xyXG4gICAgaWYgKGlkICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJ2l0ZW0nKTtcclxuICAgICAgdGhpcy5fci5yZW1vdmVDbGFzcyhhY3RpdmVFbCwgJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnYgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0ZWQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcclxuICAgKiB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0ZWQgPSBmbjtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmbiBhIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudHMgZGlzYWJsZWQgc3RhdGUgZm9yIHRoaXMgZWxlbWVudFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlzRGlzYWJsZWRcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGFsZXJ0KCdkaXNhYmxlZCEnKTtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxufVxyXG4iXX0=