UNPKG

ng-event-options

Version:

Enable event options (capture, passive, ...) inside angular templates, based on browser support

219 lines 35 kB
import { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { ErrorMsg } from '../enum/error-msg.enum'; import { EventOption } from '../enum/event-option.enum'; import { GlobalEventTarget } from '../enum/global-event-target.enum'; import { NativeEventOption } from '../enum/native-event-option.enum'; import { OptionSymbol } from '../enum/option-symbol.enum'; import { getBitValue } from '../helper/get-bit-value'; import { OperatorSymbol } from '../enum/operator-symbol.enum'; import { throttleEvent } from '../helper/throttle-event'; import { debounceEvent } from '../helper/debounce-event'; import * as i0 from "@angular/core"; // EventManagerPlugin is not yet part of the public API of Angular, once it is I can remove the `addGlobalEventListener` export class DomEventOptionsPlugin /*extends EventManagerPlugin*/ { constructor(ngZone, doc, platformId) { this.ngZone = ngZone; this.doc = doc; this.platformId = platformId; this.nativeOptionsObjects = {}; this.nativeOptionsSupported = { capture: false, once: false, passive: false, }; this.keyEvents = ['keydown', 'keypress', 'keyup']; this.blockSeparator = '|'; this.operatorSeparator = ','; this.optionSeparator = '.'; this.optionSymbols = []; this.operatorSymbols = []; this.setSymbols(); this.checkSupport(); } addEventListener(element, eventName, listener) { const { type, options, operators } = this.getTypeOptions(eventName); const inBrowser = options.indexOf(OptionSymbol.InBrowser) > -1 ? EventOption.InBrowser : 0; if (inBrowser && !isPlatformBrowser(this.platformId)) { return () => void 0; } if (typeof listener !== 'function') { listener = () => void 0; } const passive = options.indexOf(OptionSymbol.Passive) > -1 ? EventOption.Passive : 0; const preventDefault = options.indexOf(OptionSymbol.PreventDefault) > -1 ? EventOption.PreventDefault : 0; if (passive && preventDefault) { throw new Error(ErrorMsg.PassivePreventDefault); } const stop = options.indexOf(OptionSymbol.Stop) > -1 ? EventOption.Stop : 0; const once = options.indexOf(OptionSymbol.Once) > -1 ? EventOption.Once : 0; const noZone = options.indexOf(OptionSymbol.NoZone) > -1 ? EventOption.NoZone : 0; const capture = options.indexOf(OptionSymbol.Capture) > -1 ? EventOption.Capture : 0; const operatorSettings = this.parseOperators(operators); const debounceParams = operatorSettings[OperatorSymbol.Debounce]; const throttleParams = operatorSettings[OperatorSymbol.Throttle]; const bitVal = getBitValue(capture, once, passive); const eventOptionsObj = this.getEventOptionsObject(bitVal); const inZone = NgZone.isInAngularZone(); const callback = (event) => { if (noZone || !inZone) { listener(event); } else { this.ngZone.run(() => listener(event)); } }; let debounceCallback; let throttleCallback; if (debounceParams) { debounceCallback = debounceEvent(callback, ...debounceParams.map((p) => parseInt(p, 10))); } if (throttleParams) { throttleCallback = throttleEvent(callback, ...throttleParams.map((p) => parseInt(p, 10))); } const intermediateListener = (event) => { if (stop) { event.stopPropagation(); event.stopImmediatePropagation(); } if (preventDefault) { event.preventDefault(); } if (once && !this.nativeOptionsSupported[NativeEventOption.Once]) { element.removeEventListener(type, intermediateListener, eventOptionsObj); } if (debounceCallback) { debounceCallback(event); } else if (throttleCallback) { throttleCallback(event); } else { callback(event); } }; if (inZone) { this.ngZone.runOutsideAngular(() => element.addEventListener(type, intermediateListener, eventOptionsObj)); } else { element.addEventListener(type, intermediateListener, eventOptionsObj); } return () => this.ngZone.runOutsideAngular(() => element.removeEventListener(type, intermediateListener, eventOptionsObj)); } addGlobalEventListener(element, eventName, listener) { if (!isPlatformBrowser(this.platformId)) { return () => void 0; } let target; if (element === GlobalEventTarget.Window) { target = window; } else if (element === GlobalEventTarget.Document) { target = this.doc; } else if (element === GlobalEventTarget.Body && this.doc) { target = this.doc.body; } else { const replace = [element, eventName]; throw new Error(ErrorMsg.UnsupportedEventTarget.replace(/\|~/g, () => replace.shift())); } return this.addEventListener(target, eventName, listener); } supports(eventName) { const { type, options } = this.getTypeOptions(eventName); if (!type) { return false; } if (options.length === 1 && this.keyEvents.indexOf(type) > -1) { return false; } const chosenOptions = options.split(''); return chosenOptions.every((option, index) => this.optionSymbols.indexOf(option) !== -1 && index === chosenOptions.lastIndexOf(option)); } checkSupport() { const supportObj = new Object(null); Object.keys(NativeEventOption) .map((optionKey) => NativeEventOption[optionKey]) .forEach((nativeOption) => Object.defineProperty(supportObj, nativeOption, { get: () => { this.nativeOptionsSupported[nativeOption] = true; }, })); try { window.addEventListener('test', new Function(), supportObj); } catch { // empty } this.nativeEventObjectSupported = this.nativeOptionsSupported[NativeEventOption.Capture]; } parseOperators(operatorsStr) { const operators = {}; if (operatorsStr) { operatorsStr.split(/},?/).forEach((operatorStr) => { const parts = operatorStr.split('{'); if (parts.length === 2) { const operator = parts[0]; if (operator && this.operatorSymbols.indexOf(operator) > -1) { operators[operator] = parts[1].split(this.operatorSeparator).filter((p) => p); } else { throw new Error(ErrorMsg.UnsupportedOperator.replace(/\|~/g, operator)); } } }); } return operators; } getEventOptionsObject(options) { if (!this.nativeEventObjectSupported) { return (options & EventOption.Capture) === EventOption.Capture; } const eventOptions = (options & EventOption.Capture) + (options & EventOption.Passive) + (options & EventOption.Once); if (eventOptions in this.nativeOptionsObjects) { return this.nativeOptionsObjects[eventOptions]; } const optionsObj = { capture: !!(eventOptions & EventOption.Capture), passive: !!(eventOptions & EventOption.Passive), once: !!(eventOptions & EventOption.Once), }; this.nativeOptionsObjects[eventOptions] = optionsObj; return optionsObj; } getTypeOptions(eventName) { let [type, options, operators] = eventName.split(this.optionSeparator); if (!options || !type) { return { type: '', options: '', operators: '' }; } [options, operators] = options.split(this.blockSeparator); if (!operators) { operators = ''; } type = type.trim(); options = options.trim(); operators = operators.trim(); return { type, options, operators }; } setSymbols() { this.optionSymbols.length = 0; Object.keys(OptionSymbol).forEach((optionKey) => this.optionSymbols.push(OptionSymbol[optionKey])); this.operatorSymbols.length = 0; Object.keys(OperatorSymbol).forEach((operatorSymbol) => this.operatorSymbols.push(OperatorSymbol[operatorSymbol])); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DomEventOptionsPlugin /*extends EventManagerPlugin*/, deps: [{ token: i0.NgZone }, { token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DomEventOptionsPlugin /*extends EventManagerPlugin*/ }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DomEventOptionsPlugin /*extends EventManagerPlugin*/, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.NgZone }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLWV2ZW50LW9wdGlvbnMtcGx1Z2luLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1ldmVudC1vcHRpb25zL3NyYy9saWIvc2VydmljZS9kb20tZXZlbnQtb3B0aW9ucy1wbHVnaW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUcxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBR3pELHdIQUF3SDtBQUN4SCxNQUFNLE9BQU8scUJBQXFCLENBQUMsOEJBQThCO0lBMkIvRCxZQUNtQixNQUFjLEVBQ0ksR0FBYSxFQUNWLFVBQWtCO1FBRnZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDSSxRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ1YsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQTNCekMseUJBQW9CLEdB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OzBCQUNmLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgRXJyb3JNc2cgfSBmcm9tICcuLi9lbnVtL2Vycm9yLW1zZy5lbnVtJztcbmltcG9ydCB7IEV2ZW50T3B0aW9uIH0gZnJvbSAnLi4vZW51bS9ldmVudC1vcHRpb24uZW51bSc7XG5pbXBvcnQgeyBHbG9iYWxFdmVudFRhcmdldCB9IGZyb20gJy4uL2VudW0vZ2xvYmFsLWV2ZW50LXRhcmdldC5lbnVtJztcbmltcG9ydCB7IE5hdGl2ZUV2ZW50T3B0aW9uIH0gZnJvbSAnLi4vZW51bS9uYXRpdmUtZXZlbnQtb3B0aW9uLmVudW0nO1xuaW1wb3J0IHsgT3B0aW9uU3ltYm9sIH0gZnJvbSAnLi4vZW51bS9vcHRpb24tc3ltYm9sLmVudW0nO1xuXG5pbXBvcnQgeyBFdmVudE9wdGlvbnNPYmplY3QgfSBmcm9tICcuLi90eXBlL2V2ZW50LW9wdGlvbnMtb2JqZWN0JztcbmltcG9ydCB7IGdldEJpdFZhbHVlIH0gZnJvbSAnLi4vaGVscGVyL2dldC1iaXQtdmFsdWUnO1xuaW1wb3J0IHsgT3BlcmF0b3JTeW1ib2wgfSBmcm9tICcuLi9lbnVtL29wZXJhdG9yLXN5bWJvbC5lbnVtJztcbmltcG9ydCB7IHRocm90dGxlRXZlbnQgfSBmcm9tICcuLi9oZWxwZXIvdGhyb3R0bGUtZXZlbnQnO1xuaW1wb3J0IHsgZGVib3VuY2VFdmVudCB9IGZyb20gJy4uL2hlbHBlci9kZWJvdW5jZS1ldmVudCc7XG5cbkBJbmplY3RhYmxlKClcbi8vIEV2ZW50TWFuYWdlclBsdWdpbiBpcyBub3QgeWV0IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgb2YgQW5ndWxhciwgb25jZSBpdCBpcyBJIGNhbiByZW1vdmUgdGhlIGBhZGRHbG9iYWxFdmVudExpc3RlbmVyYFxuZXhwb3J0IGNsYXNzIERvbUV2ZW50T3B0aW9uc1BsdWdpbiAvKmV4dGVuZHMgRXZlbnRNYW5hZ2VyUGx1Z2luKi8ge1xuICBwcml2YXRlIG5hdGl2ZUV2ZW50T2JqZWN0U3VwcG9ydGVkPzogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZU9wdGlvbnNPYmplY3RzOiB7XG4gICAgW2tleTogbnVtYmVyXTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnM7XG4gIH0gPSB7fTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZU9wdGlvbnNTdXBwb3J0ZWQ6IHtcbiAgICBbTyBpbiBOYXRpdmVFdmVudE9wdGlvbl06IGJvb2xlYW47XG4gIH0gPSB7XG4gICAgY2FwdHVyZTogZmFsc2UsXG4gICAgb25jZTogZmFsc2UsXG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrZXlFdmVudHM6IChrZXlvZiBEb2N1bWVudEV2ZW50TWFwKVtdID0gWydrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJ107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja1NlcGFyYXRvcjogc3RyaW5nID0gJ3wnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3BlcmF0b3JTZXBhcmF0b3I6IHN0cmluZyA9ICcsJztcblxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvblNlcGFyYXRvcjogc3RyaW5nID0gJy4nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uU3ltYm9sczogT3B0aW9uU3ltYm9sW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9wZXJhdG9yU3ltYm9sczogT3BlcmF0b3JTeW1ib2xbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2M6IERvY3VtZW50LFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnNldFN5bWJvbHMoKTtcbiAgICB0aGlzLmNoZWNrU3VwcG9ydCgpO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgeyB0eXBlLCBvcHRpb25zLCBvcGVyYXRvcnMgfSA9IHRoaXMuZ2V0VHlwZU9wdGlvbnMoZXZlbnROYW1lKTtcbiAgICBjb25zdCBpbkJyb3dzZXI6IG51bWJlciA9XG4gICAgICBvcHRpb25zLmluZGV4T2YoT3B0aW9uU3ltYm9sLkluQnJvd3NlcikgPiAtMSA/IEV2ZW50T3B0aW9uLkluQnJvd3NlciA6IDA7XG5cbiAgICBpZiAoaW5Ccm93c2VyICYmICFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gKCk6IHZvaWQgPT4gdm9pZCAwO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxpc3RlbmVyID0gKCkgPT4gdm9pZCAwO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NpdmU6IG51bWJlciA9IG9wdGlvbnMuaW5kZXhPZihPcHRpb25TeW1ib2wuUGFzc2l2ZSkgPiAtMSA/IEV2ZW50T3B0aW9uLlBhc3NpdmUgOiAwO1xuICAgIGNvbnN0IHByZXZlbnREZWZhdWx0OiBudW1iZXIgPVxuICAgICAgb3B0aW9ucy5pbmRleE9mKE9wdGlvblN5bWJvbC5QcmV2ZW50RGVmYXVsdCkgPiAtMSA/IEV2ZW50T3B0aW9uLlByZXZlbnREZWZhdWx0IDogMDtcblxuICAgIGlmIChwYXNzaXZlICYmIHByZXZlbnREZWZhdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNc2cuUGFzc2l2ZVByZXZlbnREZWZhdWx0KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9wOiBudW1iZXIgPSBvcHRpb25zLmluZGV4T2YoT3B0aW9uU3ltYm9sLlN0b3ApID4gLTEgPyBFdmVudE9wdGlvbi5TdG9wIDogMDtcbiAgICBjb25zdCBvbmNlOiBudW1iZXIgPSBvcHRpb25zLmluZGV4T2YoT3B0aW9uU3ltYm9sLk9uY2UpID4gLTEgPyBFdmVudE9wdGlvbi5PbmNlIDogMDtcbiAgICBjb25zdCBub1pvbmU6IG51bWJlciA9IG9wdGlvbnMuaW5kZXhPZihPcHRpb25TeW1ib2wuTm9ab25lKSA+IC0xID8gRXZlbnRPcHRpb24uTm9ab25lIDogMDtcbiAgICBjb25zdCBjYXB0dXJlOiBudW1iZXIgPSBvcHRpb25zLmluZGV4T2YoT3B0aW9uU3ltYm9sLkNhcHR1cmUpID4gLTEgPyBFdmVudE9wdGlvbi5DYXB0dXJlIDogMDtcblxuICAgIGNvbnN0IG9wZXJhdG9yU2V0dGluZ3M6IFBhcnRpYWw8eyBbT1MgaW4gT3BlcmF0b3JTeW1ib2xdOiBzdHJpbmdbXSB9PiA9XG4gICAgICB0aGlzLnBhcnNlT3BlcmF0b3JzKG9wZXJhdG9ycyk7XG5cbiAgICBjb25zdCBkZWJvdW5jZVBhcmFtczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBvcGVyYXRvclNldHRpbmdzW09wZXJhdG9yU3ltYm9sLkRlYm91bmNlXTtcbiAgICBjb25zdCB0aHJvdHRsZVBhcmFtczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBvcGVyYXRvclNldHRpbmdzW09wZXJhdG9yU3ltYm9sLlRocm90dGxlXTtcblxuICAgIGNvbnN0IGJpdFZhbDogbnVtYmVyID0gZ2V0Qml0VmFsdWUoY2FwdHVyZSwgb25jZSwgcGFzc2l2ZSk7XG4gICAgY29uc3QgZXZlbnRPcHRpb25zT2JqOiBFdmVudE9wdGlvbnNPYmplY3QgPSB0aGlzLmdldEV2ZW50T3B0aW9uc09iamVjdChiaXRWYWwpO1xuICAgIGNvbnN0IGluWm9uZTogYm9vbGVhbiA9IE5nWm9uZS5pc0luQW5ndWxhclpvbmUoKTtcblxuICAgIGNvbnN0IGNhbGxiYWNrOiBFdmVudExpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgaWYgKG5vWm9uZSB8fCAhaW5ab25lKSB7XG4gICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKTogdm9pZCA9PiBsaXN0ZW5lcihldmVudCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgZGVib3VuY2VDYWxsYmFjazogRXZlbnRMaXN0ZW5lcjtcbiAgICBsZXQgdGhyb3R0bGVDYWxsYmFjazogRXZlbnRMaXN0ZW5lcjtcblxuICAgIGlmIChkZWJvdW5jZVBhcmFtcykge1xuICAgICAgZGVib3VuY2VDYWxsYmFjayA9IGRlYm91bmNlRXZlbnQoY2FsbGJhY2ssIC4uLmRlYm91bmNlUGFyYW1zLm1hcCgocCkgPT4gcGFyc2VJbnQocCwgMTApKSk7XG4gICAgfVxuXG4gICAgaWYgKHRocm90dGxlUGFyYW1zKSB7XG4gICAgICB0aHJvdHRsZUNhbGxiYWNrID0gdGhyb3R0bGVFdmVudChjYWxsYmFjaywgLi4udGhyb3R0bGVQYXJhbXMubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcm1lZGlhdGVMaXN0ZW5lcjogRXZlbnRMaXN0ZW5lciA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzdG9wKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmNlICYmICF0aGlzLm5hdGl2ZU9wdGlvbnNTdXBwb3J0ZWRbTmF0aXZlRXZlbnRPcHRpb24uT25jZV0pIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGludGVybWVkaWF0ZUxpc3RlbmVyLCBldmVudE9wdGlvbnNPYmopO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVib3VuY2VDYWxsYmFjaykge1xuICAgICAgICBkZWJvdW5jZUNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhyb3R0bGVDYWxsYmFjaykge1xuICAgICAgICB0aHJvdHRsZUNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGluWm9uZSkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk6IHZvaWQgPT5cbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGludGVybWVkaWF0ZUxpc3RlbmVyLCBldmVudE9wdGlvbnNPYmopLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGludGVybWVkaWF0ZUxpc3RlbmVyLCBldmVudE9wdGlvbnNPYmopO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PlxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk6IHZvaWQgPT5cbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGludGVybWVkaWF0ZUxpc3RlbmVyLCBldmVudE9wdGlvbnNPYmopLFxuICAgICAgKTtcbiAgfVxuXG4gIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIoXG4gICAgZWxlbWVudDogR2xvYmFsRXZlbnRUYXJnZXQsXG4gICAgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXIsXG4gICk6ICgpID0+IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHZvaWQgMDtcbiAgICB9XG5cbiAgICBsZXQgdGFyZ2V0OiBFdmVudFRhcmdldCB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChlbGVtZW50ID09PSBHbG9iYWxFdmVudFRhcmdldC5XaW5kb3cpIHtcbiAgICAgIHRhcmdldCA9IHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT09IEdsb2JhbEV2ZW50VGFyZ2V0LkRvY3VtZW50KSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLmRvYztcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT09IEdsb2JhbEV2ZW50VGFyZ2V0LkJvZHkgJiYgdGhpcy5kb2MpIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuZG9jLmJvZHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcGxhY2U6IHN0cmluZ1tdID0gW2VsZW1lbnQsIGV2ZW50TmFtZV07XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIEVycm9yTXNnLlVuc3VwcG9ydGVkRXZlbnRUYXJnZXQucmVwbGFjZSgvXFx8fi9nLCAoKSA9PiByZXBsYWNlLnNoaWZ0KCkgYXMgc3RyaW5nKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHR5cGUsIG9wdGlvbnMgfSA9IHRoaXMuZ2V0VHlwZU9wdGlvbnMoZXZlbnROYW1lKTtcblxuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmtleUV2ZW50cy5pbmRleE9mKHR5cGUgYXMga2V5b2YgRG9jdW1lbnRFdmVudE1hcCkgPiAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGNob3Nlbk9wdGlvbnM6IE9wdGlvblN5bWJvbFtdID0gb3B0aW9ucy5zcGxpdCgnJykgYXMgT3B0aW9uU3ltYm9sW107XG5cbiAgICByZXR1cm4gY2hvc2VuT3B0aW9ucy5ldmVyeShcbiAgICAgIChvcHRpb246IE9wdGlvblN5bWJvbCwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgICAgICAgdGhpcy5vcHRpb25TeW1ib2xzLmluZGV4T2Yob3B0aW9uKSAhPT0gLTEgJiYgaW5kZXggPT09IGNob3Nlbk9wdGlvbnMubGFzdEluZGV4T2Yob3B0aW9uKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1N1cHBvcnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydE9iajogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBuZXcgT2JqZWN0KG51bGwpO1xuXG4gICAgT2JqZWN0LmtleXMoTmF0aXZlRXZlbnRPcHRpb24pXG4gICAgICAubWFwKChvcHRpb25LZXkpID0+IE5hdGl2ZUV2ZW50T3B0aW9uW29wdGlvbktleSBhcyBrZXlvZiB0eXBlb2YgTmF0aXZlRXZlbnRPcHRpb25dKVxuICAgICAgLmZvckVhY2goKG5hdGl2ZU9wdGlvbikgPT5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1cHBvcnRPYmosIG5hdGl2ZU9wdGlvbiwge1xuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVPcHRpb25zU3VwcG9ydGVkW25hdGl2ZU9wdGlvbiBhcyBOYXRpdmVFdmVudE9wdGlvbl0gPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIHRyeSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG5ldyBGdW5jdGlvbigpIGFzIEV2ZW50TGlzdGVuZXIsIHN1cHBvcnRPYmopO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZW1wdHlcbiAgICB9XG5cbiAgICB0aGlzLm5hdGl2ZUV2ZW50T2JqZWN0U3VwcG9ydGVkID0gdGhpcy5uYXRpdmVPcHRpb25zU3VwcG9ydGVkW05hdGl2ZUV2ZW50T3B0aW9uLkNhcHR1cmVdO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU9wZXJhdG9ycyhvcGVyYXRvcnNTdHI6IHN0cmluZyk6IFBhcnRpYWw8eyBbT1MgaW4gT3BlcmF0b3JTeW1ib2xdOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3Qgb3BlcmF0b3JzOiBQYXJ0aWFsPHsgW09TIGluIE9wZXJhdG9yU3ltYm9sXTogc3RyaW5nW10gfT4gPSB7fTtcblxuICAgIGlmIChvcGVyYXRvcnNTdHIpIHtcbiAgICAgIG9wZXJhdG9yc1N0ci5zcGxpdCgvfSw/LykuZm9yRWFjaCgob3BlcmF0b3JTdHIpID0+IHtcbiAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gb3BlcmF0b3JTdHIuc3BsaXQoJ3snKTtcblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3I6IE9wZXJhdG9yU3ltYm9sID0gcGFydHNbMF0gYXMgT3BlcmF0b3JTeW1ib2w7XG5cbiAgICAgICAgICBpZiAob3BlcmF0b3IgJiYgdGhpcy5vcGVyYXRvclN5bWJvbHMuaW5kZXhPZihvcGVyYXRvcikgPiAtMSkge1xuICAgICAgICAgICAgb3BlcmF0b3JzW29wZXJhdG9yXSA9IHBhcnRzWzFdLnNwbGl0KHRoaXMub3BlcmF0b3JTZXBhcmF0b3IpLmZpbHRlcigocCkgPT4gcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1zZy5VbnN1cHBvcnRlZE9wZXJhdG9yLnJlcGxhY2UoL1xcfH4vZywgb3BlcmF0b3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBvcGVyYXRvcnM7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50T3B0aW9uc09iamVjdChvcHRpb25zOiBudW1iZXIpOiBFdmVudE9wdGlvbnNPYmplY3Qge1xuICAgIGlmICghdGhpcy5uYXRpdmVFdmVudE9iamVjdFN1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuIChvcHRpb25zICYgRXZlbnRPcHRpb24uQ2FwdHVyZSkgPT09IEV2ZW50T3B0aW9uLkNhcHR1cmU7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRPcHRpb25zOiBudW1iZXIgPVxuICAgICAgKG9wdGlvbnMgJiBFdmVudE9wdGlvbi5DYXB0dXJlKSArXG4gICAgICAob3B0aW9ucyAmIEV2ZW50T3B0aW9uLlBhc3NpdmUpICtcbiAgICAgIChvcHRpb25zICYgRXZlbnRPcHRpb24uT25jZSk7XG5cbiAgICBpZiAoZXZlbnRPcHRpb25zIGluIHRoaXMubmF0aXZlT3B0aW9uc09iamVjdHMpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZU9wdGlvbnNPYmplY3RzW2V2ZW50T3B0aW9uc107XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uc09iajogRXZlbnRPcHRpb25zT2JqZWN0ID0ge1xuICAgICAgY2FwdHVyZTogISEoZXZlbnRPcHRpb25zICYgRXZlbnRPcHRpb24uQ2FwdHVyZSksXG4gICAgICBwYXNzaXZlOiAhIShldmVudE9wdGlvbnMgJiBFdmVudE9wdGlvbi5QYXNzaXZlKSxcbiAgICAgIG9uY2U6ICEhKGV2ZW50T3B0aW9ucyAmIEV2ZW50T3B0aW9uLk9uY2UpLFxuICAgIH07XG5cbiAgICB0aGlzLm5hdGl2ZU9wdGlvbnNPYmplY3RzW2V2ZW50T3B0aW9uc10gPSBvcHRpb25zT2JqO1xuXG4gICAgcmV0dXJuIG9wdGlvbnNPYmo7XG4gIH1cblxuICBwcml2YXRlIGdldFR5cGVPcHRpb25zKGV2ZW50TmFtZTogc3RyaW5nKTogeyB0eXBlOiBzdHJpbmc7IG9wdGlvbnM6IHN0cmluZzsgb3BlcmF0b3JzOiBzdHJpbmcgfSB7XG4gICAgbGV0IFt0eXBlLCBvcHRpb25zLCBvcGVyYXRvcnNdOiBzdHJpbmdbXSA9IGV2ZW50TmFtZS5zcGxpdCh0aGlzLm9wdGlvblNlcGFyYXRvcik7XG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgIXR5cGUpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICcnLCBvcHRpb25zOiAnJywgb3BlcmF0b3JzOiAnJyB9O1xuICAgIH1cblxuICAgIFtvcHRpb25zLCBvcGVyYXRvcnNdID0gb3B0aW9ucy5zcGxpdCh0aGlzLmJsb2NrU2VwYXJhdG9yKTtcblxuICAgIGlmICghb3BlcmF0b3JzKSB7XG4gICAgICBvcGVyYXRvcnMgPSAnJztcbiAgICB9XG5cbiAgICB0eXBlID0gdHlwZS50cmltKCk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMudHJpbSgpO1xuICAgIG9wZXJhdG9ycyA9IG9wZXJhdG9ycy50cmltKCk7XG5cbiAgICByZXR1cm4geyB0eXBlLCBvcHRpb25zLCBvcGVyYXRvcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3ltYm9scygpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvblN5bWJvbHMubGVuZ3RoID0gMDtcbiAgICBPYmplY3Qua2V5cyhPcHRpb25TeW1ib2wpLmZvckVhY2goKG9wdGlvbktleSkgPT5cbiAgICAgIHRoaXMub3B0aW9uU3ltYm9scy5wdXNoKE9wdGlvblN5bWJvbFtvcHRpb25LZXkgYXMga2V5b2YgdHlwZW9mIE9wdGlvblN5bWJvbF0pLFxuICAgICk7XG5cbiAgICB0aGlzLm9wZXJhdG9yU3ltYm9scy5sZW5ndGggPSAwO1xuICAgIE9iamVjdC5rZXlzKE9wZXJhdG9yU3ltYm9sKS5mb3JFYWNoKChvcGVyYXRvclN5bWJvbCkgPT5cbiAgICAgIHRoaXMub3BlcmF0b3JTeW1ib2xzLnB1c2goT3BlcmF0b3JTeW1ib2xbb3BlcmF0b3JTeW1ib2wgYXMga2V5b2YgdHlwZW9mIE9wZXJhdG9yU3ltYm9sXSksXG4gICAgKTtcbiAgfVxufVxuIl19