UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

114 lines 15 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { DOCUMENT } from "@angular/common"; import { Directive, ElementRef, EventEmitter, Inject, Input, Output, } from "@angular/core"; import * as i0 from "@angular/core"; /** * <example-url>./../examples/index.html#/common/set-focus</example-url> * * Allows focus to be databound. Note: a "tabindex" property may be required. * * Under the hood directive calls element.focus() and element.blur() on data bound changes. * If host element is not a focusable HTML element (neither \<input\> nor \<textarea\>, e.g. \<nui-textbox\>), * directive tries to find an appropriate focusable one among children. * * @dynamic * @ignore */ export class SetFocusDirective { static { this.focusablesToCapture = [ "input", "textarea", ]; } constructor(el, document) { this.el = el; this.document = document; this.preventScroll = false; /** * Event fired on extarnal focus changes (initiated from UI by user). * Passed value indicates whether element gets focus (true) of lose it (false). * Use it when you need to synchronize inner state of directive's 'nuiSetFocus' property and bound input property. */ this.focusChange = new EventEmitter(); this.onBlur = () => { if (this.document.activeElement !== this.focusableElement) { if (this.nuiSetFocus) { this.nuiSetFocus = false; this.focusChange.emit(false); } } }; this.onFocus = () => { if (this.document.activeElement === this.focusableElement) { if (!this.nuiSetFocus) { this.nuiSetFocus = true; this.focusChange.emit(true); } } }; } ngOnChanges(changes) { if (!this.focusableElement || !changes["nuiSetFocus"]) { return; } if (changes["nuiSetFocus"].currentValue) { this.focusableElement.focus({ preventScroll: this.preventScroll }); } else { this.focusableElement.blur(); } } ngAfterViewInit() { this.focusableElement = this.getFirstFocusable(this.el.nativeElement); this.focusableElement.addEventListener("focus", this.onFocus); this.focusableElement.addEventListener("blur", this.onBlur); if (this.nuiSetFocus) { this.focusableElement.focus({ preventScroll: this.preventScroll }); } } getFirstFocusable(element) { const tagName = element["tagName"].toLowerCase(); let result; if (SetFocusDirective.focusablesToCapture.indexOf(tagName) !== -1) { result = element; } else { const children = element.querySelectorAll(SetFocusDirective.focusablesToCapture.join()); result = children.length ? children[0] : element; } return result; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SetFocusDirective, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SetFocusDirective, selector: "[nuiSetFocus]", inputs: { nuiSetFocus: "nuiSetFocus", preventScroll: "preventScroll" }, outputs: { focusChange: "focusChange" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SetFocusDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiSetFocus]" }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { nuiSetFocus: [{ type: Input }], preventScroll: [{ type: Input }], focusChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWZvY3VzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vZGlyZWN0aXZlcy9zZXQtZm9jdXMvc2V0LWZvY3VzLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sR0FFVCxNQUFNLGVBQWUsQ0FBQzs7QUFFdkI7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxNQUFNLE9BQU8saUJBQWlCO2FBQ0Ysd0JBQW1CLEdBQWE7UUFDcEQsT0FBTztRQUNQLFVBQVU7S0FDYixBQUgwQyxDQUd6QztJQWdCRixZQUNZLEVBQWMsRUFDSSxRQUFrQjtRQURwQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ0ksYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVpoQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQzs7OztXQUlHO1FBQ2MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBNkJuRCxXQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUN2RCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO29CQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDaEM7YUFDSjtRQUNMLENBQUMsQ0FBQztRQUVNLFlBQU8sR0FBRyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7UUFDTCxDQUFDLENBQUM7SUF0Q0MsQ0FBQztJQUVHLFdBQVcsQ0FBQyxPQUFzQjtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ25ELE9BQU87U0FDVjtRQUNELElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksRUFBRTtZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQ3RFO2FBQU07WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRU0sZUFBZTtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDdEU7SUFDTCxDQUFDO0lBb0JPLGlCQUFpQixDQUFDLE9BQW9CO1FBQzFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxJQUFJLE1BQW1CLENBQUM7UUFDeEIsSUFBSSxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDL0QsTUFBTSxHQUFHLE9BQU8sQ0FBQztTQUNwQjthQUFNO1lBQ0gsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUNyQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FDL0MsQ0FBQztZQUNGLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBYyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztTQUNqRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7K0dBM0VRLGlCQUFpQiw0Q0FzQmQsUUFBUTttR0F0QlgsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTs7MEJBdUIvQixNQUFNOzJCQUFDLFFBQVE7eUNBZEosV0FBVztzQkFBMUIsS0FBSztnQkFFVSxhQUFhO3NCQUE1QixLQUFLO2dCQU1XLFdBQVc7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbi8qKlxuICogPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvY29tbW9uL3NldC1mb2N1czwvZXhhbXBsZS11cmw+XG4gKlxuICogQWxsb3dzIGZvY3VzIHRvIGJlIGRhdGFib3VuZC4gTm90ZTogYSBcInRhYmluZGV4XCIgcHJvcGVydHkgbWF5IGJlIHJlcXVpcmVkLlxuICpcbiAqIFVuZGVyIHRoZSBob29kIGRpcmVjdGl2ZSBjYWxscyBlbGVtZW50LmZvY3VzKCkgYW5kIGVsZW1lbnQuYmx1cigpIG9uIGRhdGEgYm91bmQgY2hhbmdlcy5cbiAqIElmIGhvc3QgZWxlbWVudCBpcyBub3QgYSBmb2N1c2FibGUgSFRNTCBlbGVtZW50IChuZWl0aGVyIFxcPGlucHV0XFw+IG5vciBcXDx0ZXh0YXJlYVxcPiwgZS5nLiBcXDxudWktdGV4dGJveFxcPiksXG4gKiBkaXJlY3RpdmUgdHJpZXMgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBmb2N1c2FibGUgb25lIGFtb25nIGNoaWxkcmVuLlxuICpcbiAqIEBkeW5hbWljXG4gKiBAaWdub3JlXG4gKi9cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogXCJbbnVpU2V0Rm9jdXNdXCIgfSlcbmV4cG9ydCBjbGFzcyBTZXRGb2N1c0RpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZm9jdXNhYmxlc1RvQ2FwdHVyZTogc3RyaW5nW10gPSBbXG4gICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgXCJ0ZXh0YXJlYVwiLFxuICAgIF07XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjb250cm9scyB3aGV0aGVyIGVsZW1lbnQgaXMgZm9jdXNlZCAodHJ1ZSkgb3Igbm90IChmYWxzZSkuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG51aVNldEZvY3VzOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgcHVibGljIHByZXZlbnRTY3JvbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCBvbiBleHRhcm5hbCBmb2N1cyBjaGFuZ2VzIChpbml0aWF0ZWQgZnJvbSBVSSBieSB1c2VyKS5cbiAgICAgKiBQYXNzZWQgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgZWxlbWVudCBnZXRzIGZvY3VzICh0cnVlKSBvZiBsb3NlIGl0IChmYWxzZSkuXG4gICAgICogVXNlIGl0IHdoZW4geW91IG5lZWQgdG8gc3luY2hyb25pemUgaW5uZXIgc3RhdGUgb2YgZGlyZWN0aXZlJ3MgJ251aVNldEZvY3VzJyBwcm9wZXJ0eSBhbmQgYm91bmQgaW5wdXQgcHJvcGVydHkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBmb2N1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgZm9jdXNhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9jdXNhYmxlRWxlbWVudCB8fCAhY2hhbmdlc1tcIm51aVNldEZvY3VzXCJdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbXCJudWlTZXRGb2N1c1wiXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNhYmxlRWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRoaXMucHJldmVudFNjcm9sbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNhYmxlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvY3VzYWJsZUVsZW1lbnQgPSB0aGlzLmdldEZpcnN0Rm9jdXNhYmxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZm9jdXNhYmxlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy5vbkZvY3VzKTtcbiAgICAgICAgdGhpcy5mb2N1c2FibGVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMub25CbHVyKTtcbiAgICAgICAgaWYgKHRoaXMubnVpU2V0Rm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNhYmxlRWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRoaXMucHJldmVudFNjcm9sbCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25CbHVyID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLmZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm51aVNldEZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5udWlTZXRGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkZvY3VzID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5udWlTZXRGb2N1cykge1xuICAgICAgICAgICAgICAgIHRoaXMubnVpU2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGdldEZpcnN0Rm9jdXNhYmxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudFtcInRhZ05hbWVcIl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHJlc3VsdDogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChTZXRGb2N1c0RpcmVjdGl2ZS5mb2N1c2FibGVzVG9DYXB0dXJlLmluZGV4T2YodGFnTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBlbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgU2V0Rm9jdXNEaXJlY3RpdmUuZm9jdXNhYmxlc1RvQ2FwdHVyZS5qb2luKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXN1bHQgPSBjaGlsZHJlbi5sZW5ndGggPyA8SFRNTEVsZW1lbnQ+Y2hpbGRyZW5bMF0gOiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIl19