UNPKG

@neocomplexx/ngx-neo-completer

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

336 lines 33.5 kB
import { __decorate, __metadata, __param } from "tslib"; import { Directive, ElementRef, EventEmitter, Host, HostListener, Input, Output } from '@angular/core'; import { NgModel } from '@angular/forms'; import { timer } from 'rxjs'; import { take } from 'rxjs/operators'; import { CtrCompleter } from './ctr-completer'; import { isNil } from '../globals'; // keyboard events var KEY_DW = 40; var KEY_RT = 39; var KEY_UP = 38; var KEY_LF = 37; var KEY_ES = 27; var KEY_EN = 13; var KEY_TAB = 9; var KEY_BK = 8; var KEY_SH = 16; var KEY_CL = 20; var KEY_F1 = 112; var KEY_F12 = 123; var CtrInput = /** @class */ (function () { function CtrInput(completer, ngModel, el) { var _this = this; this.completer = completer; this.ngModel = ngModel; this.el = el; // tslint:disable:no-input-rename this.clearSelected = false; this.clearUnselected = false; this.overrideSuggested = false; this.fillHighlighted = true; this.openOnFocus = false; this.openOnClick = false; this.selectOnClick = false; this.selectOnFocus = false; this.autoSelectOnEnter = true; this.ngModelChange = new EventEmitter(); this._searchStr = ''; this._displayStr = ''; this.blurTimer = null; this.completer.selected.subscribe(function (item) { if (!item) { return; } if (_this.clearSelected) { _this.searchStr = ''; } else { _this.searchStr = item.title; } _this.ngModelChange.emit(_this.searchStr); }); this.completer.highlighted.subscribe(function (item) { if (_this.fillHighlighted) { if (item) { _this._displayStr = item.title; _this.ngModelChange.emit(item.title); } else { _this._displayStr = _this.searchStr; _this.ngModelChange.emit(_this.searchStr); } } }); this.completer.dataSourceChange.subscribe(function () { _this.completer.search(_this.searchStr); }); if (this.ngModel.valueChanges) { this.ngModel.valueChanges.subscribe(function (value) { if (!isNil(value) && _this._displayStr !== value) { if (_this.searchStr !== value) { _this.completer.search(value); } _this.searchStr = value; } }); } } CtrInput.prototype.keyupHandler = function (event) { if (event.keyCode === KEY_LF || event.keyCode === KEY_RT || event.keyCode === KEY_TAB) { // do nothing return; } if (event.keyCode === KEY_UP || event.keyCode === KEY_EN) { event.preventDefault(); } else if (event.keyCode === KEY_DW) { event.preventDefault(); this.completer.search(this.searchStr); } else if (event.keyCode === KEY_ES) { if (this.completer.isOpen) { this.restoreSearchValue(); this.completer.clear(); event.stopPropagation(); event.preventDefault(); } } }; CtrInput.prototype.pasteHandler = function (event) { this.completer.open(); }; CtrInput.prototype.keydownHandler = function (event) { var keyCode = event.keyCode || event.which; if (keyCode === KEY_EN) { if (this.completer.hasHighlighted()) { event.preventDefault(); } else { if (this.autoSelectOnEnter) { event.preventDefault(); this.completer.open(); this.completer.nextRow(); } } this.handleSelection(); } else if (keyCode === KEY_DW) { event.preventDefault(); this.completer.open(); this.completer.nextRow(); } else if (keyCode === KEY_UP) { event.preventDefault(); this.completer.prevRow(); } else if (keyCode === KEY_TAB) { this.handleSelection(); } else if (keyCode === KEY_BK) { this.completer.open(); } else if (keyCode === KEY_ES) { // This is very specific to IE10/11 #272 // without this, IE clears the input text event.preventDefault(); if (this.completer.isOpen) { event.stopPropagation(); } } else { if (keyCode !== 0 && keyCode !== KEY_SH && keyCode !== KEY_CL && (keyCode <= KEY_F1 || keyCode >= KEY_F12) && !event.ctrlKey && !event.metaKey && !event.altKey) { this.completer.open(); } } }; CtrInput.prototype.onBlur = function (event) { var _this = this; // Check if we need to cancel Blur for IE if (this.completer.isCancelBlur()) { setTimeout(function () { // get the focus back _this.el.nativeElement.focus(); }, 0); return; } if (this.completer.isOpen) { this.blurTimer = timer(200).pipe(take(1)).subscribe(function () { return _this.doBlur(); }); } }; CtrInput.prototype.onfocus = function () { if (this.blurTimer) { this.blurTimer.unsubscribe(); this.blurTimer = null; } if (this.selectOnFocus) { this.el.nativeElement.select(); } if (this.openOnFocus) { this.completer.open(); } }; CtrInput.prototype.onClick = function (event) { if (this.selectOnClick) { this.el.nativeElement.select(); } if (this.openOnClick) { if (this.completer.isOpen) { this.completer.clear(); } else { this.completer.open(); } } }; Object.defineProperty(CtrInput.prototype, "searchStr", { get: function () { return this._searchStr; }, set: function (term) { this._searchStr = term; this._displayStr = term; }, enumerable: true, configurable: true }); CtrInput.prototype.handleSelection = function () { if (this.completer.hasHighlighted()) { this._searchStr = ''; this.completer.selectCurrent(); } else if (this.overrideSuggested) { this.completer.onSelected({ title: this.searchStr, originalObject: null }); } else { if (this.clearUnselected && !this.completer.hasSelected) { this.searchStr = ''; this.ngModelChange.emit(this.searchStr); } this.completer.clear(); } }; CtrInput.prototype.restoreSearchValue = function () { if (this.fillHighlighted) { if (this._displayStr !== this.searchStr) { this._displayStr = this.searchStr; this.ngModelChange.emit(this.searchStr); } } }; CtrInput.prototype.doBlur = function () { if (this.blurTimer) { this.blurTimer.unsubscribe(); this.blurTimer = null; } if (this.overrideSuggested) { this.completer.onSelected({ title: this.searchStr, originalObject: null }); } else { if (this.clearUnselected && !this.completer.hasSelected) { this.searchStr = ''; this.ngModelChange.emit(this.searchStr); } else { this.restoreSearchValue(); } } this.completer.clear(); }; CtrInput.ctorParameters = function () { return [ { type: CtrCompleter, decorators: [{ type: Host }] }, { type: NgModel }, { type: ElementRef } ]; }; __decorate([ Input('clearSelected'), __metadata("design:type", Object) ], CtrInput.prototype, "clearSelected", void 0); __decorate([ Input('clearUnselected'), __metadata("design:type", Object) ], CtrInput.prototype, "clearUnselected", void 0); __decorate([ Input('overrideSuggested'), __metadata("design:type", Object) ], CtrInput.prototype, "overrideSuggested", void 0); __decorate([ Input('fillHighlighted'), __metadata("design:type", Object) ], CtrInput.prototype, "fillHighlighted", void 0); __decorate([ Input('openOnFocus'), __metadata("design:type", Object) ], CtrInput.prototype, "openOnFocus", void 0); __decorate([ Input('openOnClick'), __metadata("design:type", Object) ], CtrInput.prototype, "openOnClick", void 0); __decorate([ Input('selectOnClick'), __metadata("design:type", Object) ], CtrInput.prototype, "selectOnClick", void 0); __decorate([ Input('selectOnFocus'), __metadata("design:type", Object) ], CtrInput.prototype, "selectOnFocus", void 0); __decorate([ Input('autoSelectOnEnter'), __metadata("design:type", Object) ], CtrInput.prototype, "autoSelectOnEnter", void 0); __decorate([ Output(), __metadata("design:type", EventEmitter) ], CtrInput.prototype, "ngModelChange", void 0); __decorate([ HostListener('keyup', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "keyupHandler", null); __decorate([ HostListener('paste', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "pasteHandler", null); __decorate([ HostListener('keydown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "keydownHandler", null); __decorate([ HostListener('blur', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "onBlur", null); __decorate([ HostListener('focus', []), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], CtrInput.prototype, "onfocus", null); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "onClick", null); CtrInput = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[ctrInput]', }) // tslint:disable-next-line:directive-class-suffix , __param(0, Host()), __metadata("design:paramtypes", [CtrCompleter, NgModel, ElementRef]) ], CtrInput); return CtrInput; }()); export { CtrInput }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWlucHV0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tY29tcGxldGVyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvY3RyLWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbkMsa0JBQWtCO0FBQ2xCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDbkIsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBT3BCO0lBa0JJLGtCQUE0QixTQUF1QixFQUFVLE9BQWdCLEVBQVUsRUFBYztRQUFy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bEM7UUFBckIsS0FBSyxDQUFDLGFBQWEsQ0FBQzs7aURBQTRCO0lBQzNCO1FBQXJCLEtBQUssQ0FBQyxhQUFhLENBQUM7O2lEQUE0QjtJQUN6QjtRQUF2QixLQUFLLENBQUMsZUFBZSxDQUFDOzttREFBOEI7SUFDN0I7UUFBdkIsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7bURBQThCO0lBQ3pCO1FBQTNCLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQzs7dURBQWlDO0lBRWxEO1FBQVQsTUFBTSxFQUFFO2tDQUF1QixZQUFZO21EQUEyQjtJQWdEdkU7UUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7Z0RBb0JqQztJQUdEO1FBREMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O2dEQUdqQztJQUdEO1FBREMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O2tEQXdDbkM7SUFHRDtRQURDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7OzswQ0FpQmhDO0lBR0Q7UUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7OzsyQ0FjekI7SUFHRDtRQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7OzsyQ0FhakM7SUFoTFEsUUFBUTtRQUxwQixTQUFTLENBQUM7WUFDUCw4Q0FBOEM7WUFDOUMsUUFBUSxFQUFFLFlBQVk7U0FDekIsQ0FBQztRQUNGLGtEQUFrRDs7UUFtQmpDLFdBQUEsSUFBSSxFQUFFLENBQUE7eUNBQW9CLFlBQVksRUFBbUIsT0FBTyxFQUFjLFVBQVU7T0FsQjVGLFFBQVEsQ0FzT3BCO0lBQUQsZUFBQztDQUFBLEFBdE9ELElBc09DO1NBdE9ZLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdGltZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ29tcGxldGVySXRlbSB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tcGxldGVyLWl0ZW0nO1xuaW1wb3J0IHsgQ3RyQ29tcGxldGVyIH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5cblxuLy8ga2V5Ym9hcmQgZXZlbnRzXG5jb25zdCBLRVlfRFcgPSA0MDtcbmNvbnN0IEtFWV9SVCA9IDM5O1xuY29uc3QgS0VZX1VQID0gMzg7XG5jb25zdCBLRVlfTEYgPSAzNztcbmNvbnN0IEtFWV9FUyA9IDI3O1xuY29uc3QgS0VZX0VOID0gMTM7XG5jb25zdCBLRVlfVEFCID0gOTtcbmNvbnN0IEtFWV9CSyA9IDg7XG5jb25zdCBLRVlfU0ggPSAxNjtcbmNvbnN0IEtFWV9DTCA9IDIwO1xuY29uc3QgS0VZX0YxID0gMTEyO1xuY29uc3QgS0VZX0YxMiA9IDEyMztcblxuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2N0cklucHV0XScsXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDdHJJbnB1dCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8taW5wdXQtcmVuYW1lXG4gICAgQElucHV0KCdjbGVhclNlbGVjdGVkJykgcHVibGljIGNsZWFyU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2NsZWFyVW5zZWxlY3RlZCcpIHB1YmxpYyBjbGVhclVuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoJ292ZXJyaWRlU3VnZ2VzdGVkJykgcHVibGljIG92ZXJyaWRlU3VnZ2VzdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCdmaWxsSGlnaGxpZ2h0ZWQnKSBwdWJsaWMgZmlsbEhpZ2hsaWdodGVkID0gdHJ1ZTtcbiAgICBASW5wdXQoJ29wZW5PbkZvY3VzJykgcHVibGljIG9wZW5PbkZvY3VzID0gZmFsc2U7XG4gICAgQElucHV0KCdvcGVuT25DbGljaycpIHB1YmxpYyBvcGVuT25DbGljayA9IGZhbHNlO1xuICAgIEBJbnB1dCgnc2VsZWN0T25DbGljaycpIHB1YmxpYyBzZWxlY3RPbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCdzZWxlY3RPbkZvY3VzJykgcHVibGljIHNlbGVjdE9uRm9jdXMgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2F1dG9TZWxlY3RPbkVudGVyJykgcHVibGljIGF1dG9TZWxlY3RPbkVudGVyID0gdHJ1ZTtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbmdNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwcml2YXRlIF9zZWFyY2hTdHIgPSAnJztcbiAgICBwcml2YXRlIF9kaXNwbGF5U3RyID0gJyc7XG4gICAgcHJpdmF0ZSBibHVyVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoQEhvc3QoKSBwcml2YXRlIGNvbXBsZXRlcjogQ3RyQ29tcGxldGVyLCBwcml2YXRlIG5nTW9kZWw6IE5nTW9kZWwsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VsZWN0ZWQuc3Vic2NyaWJlKChpdGVtOiBDb21wbGV0ZXJJdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTdHIgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTdHIgPSBpdGVtLnRpdGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbXBsZXRlci5oaWdobGlnaHRlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGxIaWdobGlnaHRlZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSBpdGVtLnRpdGxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdChpdGVtLnRpdGxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5U3RyID0gdGhpcy5zZWFyY2hTdHI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmRhdGFTb3VyY2VDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlYXJjaCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm5nTW9kZWwudmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLm5nTW9kZWwudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05pbCh2YWx1ZSkgJiYgdGhpcy5fZGlzcGxheVN0ciAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoU3RyICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VhcmNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5dXAnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBrZXl1cEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0xGIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9SVCB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfVEFCKSB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX1VQIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9FTikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfRFcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWFyY2godGhpcy5zZWFyY2hTdHIpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9FUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVNlYXJjaFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigncGFzdGUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBwYXN0ZUhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGtleWRvd25IYW5kbGVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XG4gICAgICAgIGlmIChrZXlDb2RlID09PSBLRVlfRU4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5oYXNIaWdobGlnaHRlZCgpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1NlbGVjdE9uRW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5uZXh0Um93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfRFcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5uZXh0Um93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX1VQKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIucHJldlJvdygpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IEtFWV9UQUIpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX0JLKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX0VTKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gSUUxMC8xMSAjMjcyXG4gICAgICAgICAgICAvLyB3aXRob3V0IHRoaXMsIElFIGNsZWFycyB0aGUgaW5wdXQgdGV4dFxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChrZXlDb2RlICE9PSAwICYmIGtleUNvZGUgIT09IEtFWV9TSCAmJiBrZXlDb2RlICE9PSBLRVlfQ0wgJiZcbiAgICAgICAgICAgICAgICAoa2V5Q29kZSA8PSBLRVlfRjEgfHwga2V5Q29kZSA+PSBLRVlfRjEyKSAmJlxuICAgICAgICAgICAgICAgICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkJsdXIoZXZlbnQ6IGFueSkge1xuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNhbmNlbCBCbHVyIGZvciBJRVxuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaXNDYW5jZWxCbHVyKCkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGZvY3VzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSB0aW1lcigyMDApLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZG9CbHVyKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbXSlcbiAgICBwdWJsaWMgb25mb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYmx1clRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T25Gb2N1cykge1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3Blbk9uRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZW5PbkNsaWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuY2xlYXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWFyY2hTdHIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hTdHI7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWFyY2hTdHIodGVybTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3NlYXJjaFN0ciA9IHRlcm07XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSB0ZXJtO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaGFzSGlnaGxpZ2h0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fc2VhcmNoU3RyID0gJyc7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RDdXJyZW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vdmVycmlkZVN1Z2dlc3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZCh7IHRpdGxlOiB0aGlzLnNlYXJjaFN0ciwgb3JpZ2luYWxPYmplY3Q6IG51bGwgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclVuc2VsZWN0ZWQgJiYgIXRoaXMuY29tcGxldGVyLmhhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTdHIgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXN0b3JlU2VhcmNoVmFsdWUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbGxIaWdobGlnaHRlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlTdHIgIT09IHRoaXMuc2VhcmNoU3RyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IHRoaXMuc2VhcmNoU3RyO1xuICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZG9CbHVyKCkge1xuICAgICAgICBpZiAodGhpcy5ibHVyVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vdmVycmlkZVN1Z2dlc3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZCh7IHRpdGxlOiB0aGlzLnNlYXJjaFN0ciwgb3JpZ2luYWxPYmplY3Q6IG51bGwgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclVuc2VsZWN0ZWQgJiYgIXRoaXMuY29tcGxldGVyLmhhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTdHIgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVNlYXJjaFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgIH1cbn1cbiJdfQ==