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

415 lines 28.9 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 {?} */ var NGX_DADATA_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { 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 {?} */ function (c) { /** @type {?} */ var err = { rangeError: { given: c.value, expected: value, } }; return (c.value !== value) ? err : null; }); } var NgxDadataComponent = /** @class */ (function () { function NgxDadataComponent(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 {?} */ function () { }); this.propagateChange = (/** * @return {?} */ function () { }); this.validateFn = (/** * @return {?} */ function () { }); } Object.defineProperty(NgxDadataComponent.prototype, "value", { get: /** * @return {?} */ function () { return this.v; }, set: /** * @param {?} v * @return {?} */ function (v) { if (v !== this.v) { this.v = v; this.propagateChange(v); } }, enumerable: true, configurable: true }); /** * @return {?} */ NgxDadataComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; /*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 {?} */ function () { return timer(_this.config.delay ? _this.config.delay : 500); }))).subscribe((/** * @param {?} x * @return {?} */ function (x) { _this.dataService.getData(x, _this.type, _this.limit).subscribe((/** * @param {?} y * @return {?} */ function (y) { _this.data = y.suggestions; })); })); }; /** * @param {?} changes * @return {?} */ NgxDadataComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes.value) { } }; /** * @param {?} value * @return {?} */ NgxDadataComponent.prototype.getData = /** * @param {?} value * @return {?} */ function (value) { this.inputString$.next(value); this.currentFocus = -1; }; /** * @param {?} e * @param {?} item * @return {?} */ NgxDadataComponent.prototype.onClick = /** * @param {?} e * @param {?} item * @return {?} */ function (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 {?} */ NgxDadataComponent.prototype.onOutsideClick = /** * @return {?} */ function () { this.data = []; }; /** * @return {?} */ NgxDadataComponent.prototype.onArrowDown = /** * @return {?} */ function () { this.removeFocus(this.currentFocus); if (this.currentFocus >= this.data.length - 1) { this.currentFocus = 0; } else { this.currentFocus++; } this.setFocus(this.currentFocus); }; /** * @return {?} */ NgxDadataComponent.prototype.onArrowUp = /** * @return {?} */ function () { this.removeFocus(this.currentFocus); if (this.currentFocus === 0) { this.currentFocus = this.data.length - 1; } else { this.currentFocus--; } this.setFocus(this.currentFocus); }; /** * @return {?} */ NgxDadataComponent.prototype.onEnter = /** * @return {?} */ function () { 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 {?} */ NgxDadataComponent.prototype.setFocus = /** * @param {?} id * @return {?} */ function (id) { /** @type {?} */ var activeEl = document.getElementById(id + 'item'); this._r.addClass(activeEl, 'active'); }; /** * @param {?} id * @return {?} */ NgxDadataComponent.prototype.removeFocus = /** * @param {?} id * @return {?} */ function (id) { if (id !== -1) { /** @type {?} */ var activeEl = document.getElementById(id + 'item'); this._r.removeClass(activeEl, 'active'); } }; /** * @param {?} value * @return {?} */ NgxDadataComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (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 */ /** * Set the function to be called * when the control receives a change event. * * @param {?} fn a function * @return {?} */ NgxDadataComponent.prototype.registerOnChange = /** * Set the function to be called * when the control receives a change event. * * @param {?} fn a function * @return {?} */ function (fn) { // this.onSuggestionSelected = fn; this.propagateChange = fn; }; /** * Set the function to be called * when the control receives a touch event. * * @param fn a function */ /** * Set the function to be called * when the control receives a touch event. * * @param {?} fn a function * @return {?} */ NgxDadataComponent.prototype.registerOnTouched = /** * Set the function to be called * when the control receives a touch event. * * @param {?} fn a function * @return {?} */ function (fn) { this.onTouched = fn; }; /** * Implements disabled state for this element * * @param isDisabled */ /** * Implements disabled state for this element * * @param {?} isDisabled * @return {?} */ NgxDadataComponent.prototype.setDisabledState = /** * Implements disabled state for this element * * @param {?} isDisabled * @return {?} */ function (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 = function () { return [ { 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',] }] }; return NgxDadataComponent; }()); export { NgxDadataComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhZGF0YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbW9ic29sdXRpb25zL25neC1kYWRhdGEvIiwic291cmNlcyI6WyJsaWIvbmd4LWRhZGF0YS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBZSxtQkFBbUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBbUQsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFFN0YseUJBQXlCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsY0FBTSxPQUFBLGtCQUFrQixFQUFsQixDQUFrQixFQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1o7Ozs7Ozs7Ozs7QUFRRCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBSztJQUN6Qzs7OztJQUFPLFVBQUMsQ0FBYzs7WUFDZCxHQUFHLEdBQUc7WUFDVixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1NBQ0Y7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7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LHVDQUFxQjs7SUFDckIsNkNBQWdDOztJQUNoQyx3Q0FBMkI7Ozs7O0lBRWYseUNBQXFDOzs7OztJQUFFLGdDQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0RhZGF0YVR5cGUsIE5neERhZGF0YVNlcnZpY2V9IGZyb20gJy4vbmd4LWRhZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHtTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZGVib3VuY2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtEYWRhdGFSZXNwb25zZX0gZnJvbSAnLi9tb2RlbHMvZGFkYXRhLXJlc3BvbnNlJztcclxuaW1wb3J0IHtEYWRhdGFTdWdnZXN0aW9ufSBmcm9tICcuL21vZGVscy9zdWdnZXN0aW9uJztcclxuaW1wb3J0IHtEYWRhdGFDb25maWcsIERhZGF0YUNvbmZpZ0RlZmF1bHR9IGZyb20gJy4vZGFkYXRhLWNvbmZpZyc7XHJcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuY29uc3QgTkdYX0RBREFUQV9WQUxVRV9BQ0NFU1NPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hEYWRhdGFDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG4vKmNvbnN0IE5HWF9EQURBVEFfVkFMSURBVE9SID0ge1xyXG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4RGFkYXRhQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZSxcclxufTsqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhRGF0YVZhbGlkYXRvcih2YWx1ZSkge1xyXG4gIHJldHVybiAoYzogRm9ybUNvbnRyb2wpID0+IHtcclxuICAgIGNvbnN0IGVyciA9IHtcclxuICAgICAgcmFuZ2VFcnJvcjoge1xyXG4gICAgICAgIGdpdmVuOiBjLnZhbHVlLFxyXG4gICAgICAgIGV4cGVjdGVkOiB2YWx1ZSxcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKGMudmFsdWUgIT09IHZhbHVlKSA/IGVyciA6IG51bGw7XHJcbiAgfTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtZGFkYXRhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LWRhZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWRhZGF0YS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW05HWF9EQURBVEFfVkFMVUVfQUNDRVNTT1IsIC8qTkdYX0RBREFUQV9WQUxJREFUT1IqL11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neERhZGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XHJcbiAgcHJpdmF0ZSB2OiBhbnkgPSAnJztcclxuICBjdXJyZW50Rm9jdXMgPSAtMTtcclxuXHJcbiAgZGF0YTogRGFkYXRhU3VnZ2VzdGlvbltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZzogRGFkYXRhQ29uZmlnID0gRGFkYXRhQ29uZmlnRGVmYXVsdDtcclxuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IG51bGw7XHJcbiAgQElucHV0KCkgdHlwZSA9IERhZGF0YVR5cGUuYWRkcmVzcztcclxuICBASW5wdXQoKSBsaW1pdCA9IERhZGF0YUNvbmZpZ0RlZmF1bHQubGltaXQ7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkU3VnZ2VzdGlvbjogRGFkYXRhU3VnZ2VzdGlvbjtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhZGF0YVN1Z2dlc3Rpb24+KCk7XHJcbiAgLy8gQE91dHB1dCgpIHNlbGVjdGVkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8RGFEYXRhQWRkcmVzcyB8IERhRGF0YUZJTyB8IERhRGF0YUJhbmsgfCBEYURhdGFQYXJ0eSB8IERhRGF0YUVtYWlsPigpO1xyXG4gIC8vIEBPdXRwdXQoKSBzZWxlY3RlZFN0cmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbnB1dFZhbHVlJy8qLCB7IHN0YXRpYzogdHJ1ZSB9Ki8pIGlucHV0VmFsdWU6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgaW5wdXRTdHJpbmckID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICAvLyBvblN1Z2dlc3Rpb25TZWxlY3RlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7fTtcclxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuICBwcm9wYWdhdGVDaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xyXG4gIHZhbGlkYXRlRm46IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGFTZXJ2aWNlOiBOZ3hEYWRhdGFTZXJ2aWNlLCBwcml2YXRlIF9yOiBSZW5kZXJlcjIpIHtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudjtcclxuICB9XHJcblxyXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcclxuICAgIGlmICh2ICE9PSB0aGlzLnYpIHtcclxuICAgICAgdGhpcy52ID0gdjtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2Uodik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8qdGhpcy52YWxpZGF0ZUZuID0gY3JlYXRlRGFEYXRhVmFsaWRhdG9yKHRoaXMuX3ZhbHVlKTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuX3ZhbHVlKTsqL1xyXG4gICAgdGhpcy50eXBlID0gdGhpcy5jb25maWcudHlwZTtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2Uuc2V0QXBpS2V5KHRoaXMuYXBpS2V5ID8gdGhpcy5hcGlLZXkgOiB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgdGhpcy5pbnB1dFN0cmluZyQucGlwZShcclxuICAgICAgZGVib3VuY2UoKCkgPT4gdGltZXIodGhpcy5jb25maWcuZGVsYXkgPyB0aGlzLmNvbmZpZy5kZWxheSA6IDUwMCkpLFxyXG4gICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuZ2V0RGF0YSh4LCB0aGlzLnR5cGUsIHRoaXMubGltaXQpLnN1YnNjcmliZSgoeTogRGFkYXRhUmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEgPSB5LnN1Z2dlc3Rpb25zO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMudmFsdWUpIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREYXRhKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaW5wdXRTdHJpbmckLm5leHQodmFsdWUpO1xyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAtMTtcclxuICB9XHJcblxyXG4gIG9uQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogRGFkYXRhU3VnZ2VzdGlvbikge1xyXG4gICAgLy8gZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBpdGVtLnZhbHVlO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoaXRlbS52YWx1ZSk7XHJcbiAgICB0aGlzLmlucHV0VmFsdWUubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24gPSBpdGVtO1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IC0xO1xyXG5cclxuICAgIC8vIHRoaXMud3JpdGVWYWx1ZShpdGVtLnZhbHVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWREYXRhLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRTdHJpbmcuZW1pdChpdGVtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBvbk91dHNpZGVDbGljaygpIHtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgb25BcnJvd0Rvd24oKSB7XHJcbiAgICB0aGlzLnJlbW92ZUZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1cyA+PSB0aGlzLmRhdGEubGVuZ3RoIC0gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cysrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgfVxyXG5cclxuICBvbkFycm93VXAoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1cyA9PT0gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IHRoaXMuZGF0YS5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMtLTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0Rm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gIH1cclxuXHJcbiAgb25FbnRlcigpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gdGhpcy5kYXRhW3RoaXMuY3VycmVudEZvY3VzXTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWU7XHJcbiAgICB0aGlzLmRhdGEgPSBbXTtcclxuICAgIHRoaXMuY3VycmVudEZvY3VzID0gLTE7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi52YWx1ZSk7XHJcbiAgICAvLyB0aGlzLndyaXRlVmFsdWUodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWREYXRhLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24uZGF0YSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkU3RyaW5nLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc2V0Rm9jdXMoaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgYWN0aXZlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICdpdGVtJyk7XHJcbiAgICB0aGlzLl9yLmFkZENsYXNzKGFjdGl2ZUVsLCAnYWN0aXZlJyk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGb2N1cyhpZDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaWQgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnaXRlbScpO1xyXG4gICAgICB0aGlzLl9yLnJlbW92ZUNsYXNzKGFjdGl2ZUVsLCAnYWN0aXZlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMudiA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3RlZCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZm4gYSBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3RlZCA9IGZuO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXHJcbiAgICogd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIHRvdWNoIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50cyBkaXNhYmxlZCBzdGF0ZSBmb3IgdGhpcyBlbGVtZW50XHJcbiAgICpcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgYWxlcnQoJ2Rpc2FibGVkIScpO1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==