UNPKG

@neocomplexx/ngx-neo-completer-mat

Version:
307 lines 33.9 kB
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'; import * as i0 from "@angular/core"; import * as i1 from "./ctr-completer"; import * as i2 from "@angular/forms"; // 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.ɵfac = function CtrInput_Factory(t) { return new (t || CtrInput)(i0.ɵɵdirectiveInject(i1.CtrCompleter, 1), i0.ɵɵdirectiveInject(i2.NgModel), i0.ɵɵdirectiveInject(i0.ElementRef)); }; CtrInput.ɵdir = i0.ɵɵdefineDirective({ type: CtrInput, selectors: [["", "ctrInput", ""]], hostBindings: function CtrInput_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("keyup", function CtrInput_keyup_HostBindingHandler($event) { return ctx.keyupHandler($event); })("paste", function CtrInput_paste_HostBindingHandler($event) { return ctx.pasteHandler($event); })("keydown", function CtrInput_keydown_HostBindingHandler($event) { return ctx.keydownHandler($event); })("blur", function CtrInput_blur_HostBindingHandler($event) { return ctx.onBlur($event); })("focus", function CtrInput_focus_HostBindingHandler() { return ctx.onfocus(); })("click", function CtrInput_click_HostBindingHandler($event) { return ctx.onClick($event); }); } }, inputs: { clearSelected: "clearSelected", clearUnselected: "clearUnselected", overrideSuggested: "overrideSuggested", fillHighlighted: "fillHighlighted", openOnFocus: "openOnFocus", openOnClick: "openOnClick", selectOnClick: "selectOnClick", selectOnFocus: "selectOnFocus", autoSelectOnEnter: "autoSelectOnEnter" }, outputs: { ngModelChange: "ngModelChange" } }); return CtrInput; }()); export { CtrInput }; /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(CtrInput, [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ctrInput]', }] }], function () { return [{ type: i1.CtrCompleter, decorators: [{ type: Host }] }, { type: i2.NgModel }, { type: i0.ElementRef }]; }, { clearSelected: [{ type: Input, args: ['clearSelected'] }], clearUnselected: [{ type: Input, args: ['clearUnselected'] }], overrideSuggested: [{ type: Input, args: ['overrideSuggested'] }], fillHighlighted: [{ type: Input, args: ['fillHighlighted'] }], openOnFocus: [{ type: Input, args: ['openOnFocus'] }], openOnClick: [{ type: Input, args: ['openOnClick'] }], selectOnClick: [{ type: Input, args: ['selectOnClick'] }], selectOnFocus: [{ type: Input, args: ['selectOnFocus'] }], autoSelectOnEnter: [{ type: Input, args: ['autoSelectOnEnter'] }], ngModelChange: [{ type: Output }], keyupHandler: [{ type: HostListener, args: ['keyup', ['$event']] }], pasteHandler: [{ type: HostListener, args: ['paste', ['$event']] }], keydownHandler: [{ type: HostListener, args: ['keydown', ['$event']] }], onBlur: [{ type: HostListener, args: ['blur', ['$event']] }], onfocus: [{ type: HostListener, args: ['focus', []] }], onClick: [{ type: HostListener, args: ['click', ['$event']] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWlucHV0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tY29tcGxldGVyLW1hdC8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2N0ci1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7QUFHbkMsa0JBQWtCO0FBQ2xCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDbkIsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBRXBCO0lBdUJJLGtCQUE0QixTQUF1QixFQUFVLE9BQWdCLEVBQVUsRUFB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a0JBaEJoQixLQUFLO21CQUFDLGVBQWU7O2tCQUNyQixLQUFLO21CQUFDLGlCQUFpQjs7a0JBQ3ZCLEtBQUs7bUJBQUMsbUJBQW1COztrQkFDekIsS0FBSzttQkFBQyxpQkFBaUI7O2tCQUN2QixLQUFLO21CQUFDLGFBQWE7O2tCQUNuQixLQUFLO21CQUFDLGFBQWE7O2tCQUNuQixLQUFLO21CQUFDLGVBQWU7O2tCQUNyQixLQUFLO21CQUFDLGVBQWU7O2tCQUNyQixLQUFLO21CQUFDLG1CQUFtQjs7a0JBRXpCLE1BQU07O2tCQStDTixZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0JBc0JoQyxZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0JBS2hDLFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOztrQkEwQ2xDLFlBQVk7bUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDOztrQkFtQi9CLFlBQVk7bUJBQUMsT0FBTyxFQUFFLEVBQUU7O2tCQWdCeEIsWUFBWTttQkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHRpbWVyLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IENvbXBsZXRlckl0ZW0gfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBsZXRlci1pdGVtJztcclxuaW1wb3J0IHsgQ3RyQ29tcGxldGVyIH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcclxuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi9nbG9iYWxzJztcclxuXHJcblxyXG4vLyBrZXlib2FyZCBldmVudHNcclxuY29uc3QgS0VZX0RXID0gNDA7XHJcbmNvbnN0IEtFWV9SVCA9IDM5O1xyXG5jb25zdCBLRVlfVVAgPSAzODtcclxuY29uc3QgS0VZX0xGID0gMzc7XHJcbmNvbnN0IEtFWV9FUyA9IDI3O1xyXG5jb25zdCBLRVlfRU4gPSAxMztcclxuY29uc3QgS0VZX1RBQiA9IDk7XHJcbmNvbnN0IEtFWV9CSyA9IDg7XHJcbmNvbnN0IEtFWV9TSCA9IDE2O1xyXG5jb25zdCBLRVlfQ0wgPSAyMDtcclxuY29uc3QgS0VZX0YxID0gMTEyO1xyXG5jb25zdCBLRVlfRjEyID0gMTIzO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ1tjdHJJbnB1dF0nLFxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxyXG5leHBvcnQgY2xhc3MgQ3RySW5wdXQge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8taW5wdXQtcmVuYW1lXHJcbiAgICBASW5wdXQoJ2NsZWFyU2VsZWN0ZWQnKSBwdWJsaWMgY2xlYXJTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCdjbGVhclVuc2VsZWN0ZWQnKSBwdWJsaWMgY2xlYXJVbnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICBASW5wdXQoJ292ZXJyaWRlU3VnZ2VzdGVkJykgcHVibGljIG92ZXJyaWRlU3VnZ2VzdGVkID0gZmFsc2U7XHJcbiAgICBASW5wdXQoJ2ZpbGxIaWdobGlnaHRlZCcpIHB1YmxpYyBmaWxsSGlnaGxpZ2h0ZWQgPSB0cnVlO1xyXG4gICAgQElucHV0KCdvcGVuT25Gb2N1cycpIHB1YmxpYyBvcGVuT25Gb2N1cyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCdvcGVuT25DbGljaycpIHB1YmxpYyBvcGVuT25DbGljayA9IGZhbHNlO1xyXG4gICAgQElucHV0KCdzZWxlY3RPbkNsaWNrJykgcHVibGljIHNlbGVjdE9uQ2xpY2sgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgnc2VsZWN0T25Gb2N1cycpIHB1YmxpYyBzZWxlY3RPbkZvY3VzID0gZmFsc2U7XHJcbiAgICBASW5wdXQoJ2F1dG9TZWxlY3RPbkVudGVyJykgcHVibGljIGF1dG9TZWxlY3RPbkVudGVyID0gdHJ1ZTtcclxuXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG5nTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIHByaXZhdGUgX3NlYXJjaFN0ciA9ICcnO1xyXG4gICAgcHJpdmF0ZSBfZGlzcGxheVN0ciA9ICcnO1xyXG4gICAgcHJpdmF0ZSBibHVyVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBIb3N0KCkgcHJpdmF0ZSBjb21wbGV0ZXI6IEN0ckNvbXBsZXRlciwgcHJpdmF0ZSBuZ01vZGVsOiBOZ01vZGVsLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VsZWN0ZWQuc3Vic2NyaWJlKChpdGVtOiBDb21wbGV0ZXJJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IGl0ZW0udGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbXBsZXRlci5oaWdobGlnaHRlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSBpdGVtLnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KGl0ZW0udGl0bGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5U3RyID0gdGhpcy5zZWFyY2hTdHI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmRhdGFTb3VyY2VDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VhcmNoKHRoaXMuc2VhcmNoU3RyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05pbCh2YWx1ZSkgJiYgdGhpcy5fZGlzcGxheVN0ciAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTdHIgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlYXJjaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMga2V5dXBIYW5kbGVyKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0xGIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9SVCB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfVEFCKSB7XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9VUCB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfRU4pIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9EVykge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWFyY2godGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VTKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVNlYXJjaFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBwYXN0ZUhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBrZXlkb3duSGFuZGxlcihldmVudDogYW55KSB7XHJcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XHJcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtFWV9FTikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaGFzSGlnaGxpZ2h0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9TZWxlY3RPbkVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIubmV4dFJvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfRFcpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5uZXh0Um93KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfVVApIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIucHJldlJvdygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX1RBQikge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX0JLKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IEtFWV9FUykge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gSUUxMC8xMSAjMjcyXHJcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgSUUgY2xlYXJzIHRoZSBpbnB1dCB0ZXh0XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGtleUNvZGUgIT09IDAgJiYga2V5Q29kZSAhPT0gS0VZX1NIICYmIGtleUNvZGUgIT09IEtFWV9DTCAmJlxyXG4gICAgICAgICAgICAgICAgKGtleUNvZGUgPD0gS0VZX0YxIHx8IGtleUNvZGUgPj0gS0VZX0YxMikgJiZcclxuICAgICAgICAgICAgICAgICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNhbmNlbCBCbHVyIGZvciBJRVxyXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc0NhbmNlbEJsdXIoKSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZm9jdXMgYmFja1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmlzT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHRpbWVyKDIwMCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kb0JsdXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJywgW10pXHJcbiAgICBwdWJsaWMgb25mb2N1cygpIHtcclxuICAgICAgICBpZiAodGhpcy5ibHVyVGltZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T25Gb2N1cykge1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcGVuT25Gb2N1cykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RPbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wZW5PbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzZWFyY2hTdHIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFN0cjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNlYXJjaFN0cih0ZXJtOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hTdHIgPSB0ZXJtO1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSB0ZXJtO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5oYXNIaWdobGlnaHRlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFN0ciA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RDdXJyZW50KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJyaWRlU3VnZ2VzdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uU2VsZWN0ZWQoeyB0aXRsZTogdGhpcy5zZWFyY2hTdHIsIG9yaWdpbmFsT2JqZWN0OiBudWxsIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVW5zZWxlY3RlZCAmJiAhdGhpcy5jb21wbGV0ZXIuaGFzU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFN0cik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuY2xlYXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXN0b3JlU2VhcmNoVmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5U3RyICE9PSB0aGlzLnNlYXJjaFN0cikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IHRoaXMuc2VhcmNoU3RyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZG9CbHVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJsdXJUaW1lcikge1xyXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vdmVycmlkZVN1Z2dlc3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKHsgdGl0bGU6IHRoaXMuc2VhcmNoU3RyLCBvcmlnaW5hbE9iamVjdDogbnVsbCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclVuc2VsZWN0ZWQgJiYgIXRoaXMuY29tcGxldGVyLmhhc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2VhcmNoVmFsdWUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuY2xlYXIoKTtcclxuICAgIH1cclxufVxyXG4iXX0=