UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

160 lines • 22.8 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { CollectionsUtil } from '../../../../utils'; import { SE_ALL_EVENTS } from '../../event'; /** * ** Registry for Events Handlers. */ export class SystemEventHandlerRegistry { /** * ** Constructor. * * - Private constructor to make it Singleton. */ constructor() { this.handlers = new Map(); // No-op. } /** * ** Returns Singleton instance. */ static get instance() { if (CollectionsUtil.isNil(SystemEventHandlerRegistry._instance)) { SystemEventHandlerRegistry._instance = new SystemEventHandlerRegistry(); } return SystemEventHandlerRegistry._instance; } /** * ** Register Handler for SystemEvent/s. */ static register(knownEvents, handlerRef, handlerClassInstance, handlerFilterExpression = null) { return SystemEventHandlerRegistry.instance.register(knownEvents, handlerRef, handlerClassInstance, handlerFilterExpression); } /** * ** Unregister Handler from registry. * * - It should be done in ngOnDestroy() method in Services/Components to avoid potential memory leaks. */ static unregister(knownEvents, handlerRef) { return SystemEventHandlerRegistry.instance.unregister(knownEvents, handlerRef); } /** * ** Find Handler by reference looking through the Registry. */ static findHandlerByReference(eventId, handlerRef, handlerClassInstance) { return SystemEventHandlerRegistry.instance.findHandlerByReference(eventId, handlerRef, handlerClassInstance); } /** * ** Prepare array of handlers for execution of post or send. */ static getPreparedArrayOfHandlers(eventId, reversed = false) { return SystemEventHandlerRegistry.instance.getPreparedArrayOfHandlers(eventId, reversed); } register(knownEvents, handlerRef, handlerClassInstance, handlerFilterExpression = null) { return this.execute(knownEvents, handlerRef, // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.executeRegister.bind(this), handlerClassInstance, handlerFilterExpression); } unregister(knownEvents, handlerRef) { return this.execute(knownEvents, handlerRef, // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.executeUnregister.bind(this)); } findHandlerByReference(eventId, handlerRef, handlerClassInstance) { const handlers = this.handlers.has(eventId) ? this.handlers.get(eventId) : new Set(); const handlerRecord = Array.from(handlers.values()).find((r) => { let isEqual = r.handlerRef === handlerRef; if (handlerClassInstance) { isEqual = isEqual && r.handlerClassInstance === handlerClassInstance; } return isEqual; }); return { active: CollectionsUtil.isDefined(handlerRecord), handlerRecord, handlerRef: CollectionsUtil.isDefined(handlerRecord) ? handlerRecord.handlerRef : undefined }; } getPreparedArrayOfHandlers(eventId, reversed = false) { const specialHandlers = this.getSpecialHandlers(); if (!this.handlers.has(eventId)) { return specialHandlers; } return reversed ? Array.from(this.handlers.get(eventId).values()).concat(specialHandlers).reverse() : Array.from(this.handlers.get(eventId).values()).concat(specialHandlers); } /** * ** Generic abstraction for Register and Unregister handlers. */ execute(knownEvents, handlerRef, executeMethodRef, handlerClassInstance, handlerFilterExpression) { const preparedData = this.prepareEventNames(knownEvents); if (!preparedData.status || !CollectionsUtil.isFunction(handlerRef)) { return false; } try { preparedData.eventNames.forEach((eventId) => { executeMethodRef(eventId, handlerRef, handlerClassInstance, handlerFilterExpression); }); return true; } catch (_e) { return false; } } /** * ** Evaluate Handler register. */ executeRegister(eventId, handlerRef, handlerClassInstance, handlerFilterExpression) { if (!this.handlers.has(eventId)) { this.handlers.set(eventId, new Set()); } if (this.findHandlerByReference(eventId, handlerRef, handlerClassInstance).active) { return false; } // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment this.handlers.get(eventId).add({ handlerRef, handlerClassInstance, handlerFilterExpression }); return true; } /** * ** Evaluate Handler unregister. */ executeUnregister(eventId, handlerRef) { if (!this.handlers.has(eventId)) { return false; } const findHandlerResponse = this.findHandlerByReference(eventId, handlerRef); if (!findHandlerResponse.active) { return false; } this.handlers.get(eventId).delete(findHandlerResponse.handlerRecord); return true; } /** * ** Prepares Event names in Array of strings format. */ prepareEventNames(knownEvents) { if (!CollectionsUtil.isString(knownEvents) && !CollectionsUtil.isArray(knownEvents)) { return { status: false }; } return { status: true, eventNames: CollectionsUtil.isString(knownEvents) ? [knownEvents] : knownEvents }; } /** * ** Returns special Handlers. */ getSpecialHandlers() { if (!this.handlers.has(SE_ALL_EVENTS)) { return []; } return Array.from(this.handlers.get(SE_ALL_EVENTS).values()); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtaGFuZGxlci5yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvcmUvc3lzdGVtLWV2ZW50cy9kaXNwYXRjaGVyL3JlZ2lzdHJ5L2V2ZW50LWhhbmRsZXIucmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsdURBQXVEO0FBRXZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUlwRCxPQUFPLEVBQUUsYUFBYSxFQUFlLE1BQU0sYUFBYSxDQUFDO0FBR3pEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDBCQUEwQjtJQWdCbkM7Ozs7T0FJRztJQUNIO1FBUGlCLGFBQVEsR0FBb0QsSUFBSSxHQUFHLEVBQThDLENBQUM7UUFRL0gsU0FBUztJQUNiLENBQUM7SUF0QkQ7O09BRUc7SUFDSCxNQUFNLEtBQUssUUFBUTtRQUNmLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3RCwwQkFBMEIsQ0FBQyxTQUFTLEdBQUcsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1NBQzNFO1FBRUQsT0FBTywwQkFBMEIsQ0FBQyxTQUFTLENBQUM7SUFDaEQsQ0FBQztJQWVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FDWCxXQUF3QyxFQUN4QyxVQUFpQyxFQUNqQyxvQkFBdUIsRUFDdkIsMEJBQXNDLElBQUk7UUFFMUMsT0FBTywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNuSSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBd0MsRUFBRSxVQUFpQztRQUN6RixPQUFPLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxV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bkMsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgQ29sbGVjdGlvbnNVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uJztcblxuaW1wb3J0IHsgU0VfQUxMX0VWRU5UUywgU3lzdGVtRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBTeXN0ZW1FdmVudEhhbmRsZXJGaW5kQnlSZWYsIFN5c3RlbUV2ZW50SGFuZGxlclJlY29yZCwgU3lzdGVtRXZlbnRIYW5kbGVyUmVmIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqXG4gKiAqKiBSZWdpc3RyeSBmb3IgRXZlbnRzIEhhbmRsZXJzLlxuICovXG5leHBvcnQgY2xhc3MgU3lzdGVtRXZlbnRIYW5kbGVyUmVnaXN0cnkge1xuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgU2luZ2xldG9uIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgaW5zdGFuY2UoKTogU3lzdGVtRXZlbnRIYW5kbGVyUmVnaXN0cnkge1xuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzTmlsKFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5Ll9pbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5Ll9pbnN0YW5jZSA9IG5ldyBTeXN0ZW1FdmVudEhhbmRsZXJSZWdpc3RyeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5Ll9pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogTWFwPFN5c3RlbUV2ZW50LCBTZXQ8U3lzdGVtRXZlbnRIYW5kbGVyUmVjb3JkPj4gPSBuZXcgTWFwPFN5c3RlbUV2ZW50LCBTZXQ8U3lzdGVtRXZlbnRIYW5kbGVyUmVjb3JkPj4oKTtcblxuICAgIC8qKlxuICAgICAqICoqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogICAgLSBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIG1ha2UgaXQgU2luZ2xldG9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5vLW9wLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJlZ2lzdGVyIEhhbmRsZXIgZm9yIFN5c3RlbUV2ZW50L3MuXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyPFQ+KFxuICAgICAgICBrbm93bkV2ZW50czogU3lzdGVtRXZlbnQgfCBTeXN0ZW1FdmVudFtdLFxuICAgICAgICBoYW5kbGVyUmVmOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWYsXG4gICAgICAgIGhhbmRsZXJDbGFzc0luc3RhbmNlOiBULFxuICAgICAgICBoYW5kbGVyRmlsdGVyRXhwcmVzc2lvbjogRXhwcmVzc2lvbiA9IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyPFQ+KGtub3duRXZlbnRzLCBoYW5kbGVyUmVmLCBoYW5kbGVyQ2xhc3NJbnN0YW5jZSwgaGFuZGxlckZpbHRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFVucmVnaXN0ZXIgSGFuZGxlciBmcm9tIHJlZ2lzdHJ5LlxuICAgICAqXG4gICAgICogICAtIEl0IHNob3VsZCBiZSBkb25lIGluIG5nT25EZXN0cm95KCkgbWV0aG9kIGluIFNlcnZpY2VzL0NvbXBvbmVudHMgdG8gYXZvaWQgcG90ZW50aWFsIG1lbW9yeSBsZWFrcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5yZWdpc3Rlcihrbm93bkV2ZW50czogU3lzdGVtRXZlbnQgfCBTeXN0ZW1FdmVudFtdLCBoYW5kbGVyUmVmOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWYpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUV2ZW50SGFuZGxlclJlZ2lzdHJ5Lmluc3RhbmNlLnVucmVnaXN0ZXIoa25vd25FdmVudHMsIGhhbmRsZXJSZWYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEZpbmQgSGFuZGxlciBieSByZWZlcmVuY2UgbG9va2luZyB0aHJvdWdoIHRoZSBSZWdpc3RyeS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZmluZEhhbmRsZXJCeVJlZmVyZW5jZShcbiAgICAgICAgZXZlbnRJZDogU3lzdGVtRXZlbnQsXG4gICAgICAgIGhhbmRsZXJSZWY6IFN5c3RlbUV2ZW50SGFuZGxlclJlZixcbiAgICAgICAgaGFuZGxlckNsYXNzSW5zdGFuY2U/OiBhbnlcbiAgICApOiBTeXN0ZW1FdmVudEhhbmRsZXJGaW5kQnlSZWYge1xuICAgICAgICByZXR1cm4gU3lzdGVtRXZlbnRIYW5kbGVyUmVnaXN0cnkuaW5zdGFuY2UuZmluZEhhbmRsZXJCeVJlZmVyZW5jZShldmVudElkLCBoYW5kbGVyUmVmLCBoYW5kbGVyQ2xhc3NJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUHJlcGFyZSBhcnJheSBvZiBoYW5kbGVycyBmb3IgZXhlY3V0aW9uIG9mIHBvc3Qgb3Igc2VuZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJlcGFyZWRBcnJheU9mSGFuZGxlcnMoZXZlbnRJZDogU3lzdGVtRXZlbnQsIHJldmVyc2VkID0gZmFsc2UpOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWNvcmRbXSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1FdmVudEhhbmRsZXJSZWdpc3RyeS5pbnN0YW5jZS5nZXRQcmVwYXJlZEFycmF5T2ZIYW5kbGVycyhldmVudElkLCByZXZlcnNlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlcjxUPihcbiAgICAgICAga25vd25FdmVudHM6IFN5c3RlbUV2ZW50IHwgU3lzdGVtRXZlbnRbXSxcbiAgICAgICAgaGFuZGxlclJlZjogU3lzdGVtRXZlbnRIYW5kbGVyUmVmLFxuICAgICAgICBoYW5kbGVyQ2xhc3NJbnN0YW5jZTogVCxcbiAgICAgICAgaGFuZGxlckZpbHRlckV4cHJlc3Npb246IEV4cHJlc3Npb24gPSBudWxsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAgICAgICBrbm93bkV2ZW50cyxcbiAgICAgICAgICAgIGhhbmRsZXJSZWYsXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlUmVnaXN0ZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGhhbmRsZXJDbGFzc0luc3RhbmNlLFxuICAgICAgICAgICAgaGFuZGxlckZpbHRlckV4cHJlc3Npb25cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVucmVnaXN0ZXIoa25vd25FdmVudHM6IFN5c3RlbUV2ZW50IHwgU3lzdGVtRXZlbnRbXSwgaGFuZGxlclJlZjogU3lzdGVtRXZlbnRIYW5kbGVyUmVmKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAgICAgICBrbm93bkV2ZW50cyxcbiAgICAgICAgICAgIGhhbmRsZXJSZWYsXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlVW5yZWdpc3Rlci5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSGFuZGxlckJ5UmVmZXJlbmNlKFxuICAgICAgICBldmVudElkOiBTeXN0ZW1FdmVudCxcbiAgICAgICAgaGFuZGxlclJlZjogU3lzdGVtRXZlbnRIYW5kbGVyUmVmLFxuICAgICAgICBoYW5kbGVyQ2xhc3NJbnN0YW5jZT86IGFueVxuICAgICk6IFN5c3RlbUV2ZW50SGFuZGxlckZpbmRCeVJlZiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5oYXMoZXZlbnRJZCkgPyB0aGlzLmhhbmRsZXJzLmdldChldmVudElkKSA6IG5ldyBTZXQ8U3lzdGVtRXZlbnRIYW5kbGVyUmVjb3JkPigpO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJSZWNvcmQgPSBBcnJheS5mcm9tKGhhbmRsZXJzLnZhbHVlcygpKS5maW5kKChyKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNFcXVhbCA9IHIuaGFuZGxlclJlZiA9PT0gaGFuZGxlclJlZjtcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXJDbGFzc0luc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgaXNFcXVhbCA9IGlzRXF1YWwgJiYgci5oYW5kbGVyQ2xhc3NJbnN0YW5jZSA9PT0gaGFuZGxlckNsYXNzSW5zdGFuY2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc0VxdWFsO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aXZlOiBDb2xsZWN0aW9uc1V0aWwuaXNEZWZpbmVkKGhhbmRsZXJSZWNvcmQpLFxuICAgICAgICAgICAgaGFuZGxlclJlY29yZCxcbiAgICAgICAgICAgIGhhbmRsZXJSZWY6IENvbGxlY3Rpb25zVXRpbC5pc0RlZmluZWQoaGFuZGxlclJlY29yZCkgPyBoYW5kbGVyUmVjb3JkLmhhbmRsZXJSZWYgOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByZXBhcmVkQXJyYXlPZkhhbmRsZXJzKGV2ZW50SWQ6IFN5c3RlbUV2ZW50LCByZXZlcnNlZCA9IGZhbHNlKTogU3lzdGVtRXZlbnRIYW5kbGVyUmVjb3JkW10ge1xuICAgICAgICBjb25zdCBzcGVjaWFsSGFuZGxlcnM6IFN5c3RlbUV2ZW50SGFuZGxlclJlY29yZFtdID0gdGhpcy5nZXRTcGVjaWFsSGFuZGxlcnMoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuaGFzKGV2ZW50SWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lhbEhhbmRsZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldmVyc2VkXG4gICAgICAgICAgICA/IEFycmF5LmZyb20odGhpcy5oYW5kbGVycy5nZXQoZXZlbnRJZCkudmFsdWVzKCkpLmNvbmNhdChzcGVjaWFsSGFuZGxlcnMpLnJldmVyc2UoKVxuICAgICAgICAgICAgOiBBcnJheS5mcm9tKHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50SWQpLnZhbHVlcygpKS5jb25jYXQoc3BlY2lhbEhhbmRsZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZW5lcmljIGFic3RyYWN0aW9uIGZvciBSZWdpc3RlciBhbmQgVW5yZWdpc3RlciBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4ZWN1dGUoXG4gICAgICAgIGtub3duRXZlbnRzOiBTeXN0ZW1FdmVudCB8IFN5c3RlbUV2ZW50W10sXG4gICAgICAgIGhhbmRsZXJSZWY6IFN5c3RlbUV2ZW50SGFuZGxlclJlZixcbiAgICAgICAgZXhlY3V0ZU1ldGhvZFJlZjogKC4uLmFyZzogYW55W10pID0+IGFueSxcbiAgICAgICAgaGFuZGxlckNsYXNzSW5zdGFuY2U/OiBhbnksXG4gICAgICAgIGhhbmRsZXJGaWx0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvblxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwcmVwYXJlZERhdGEgPSB0aGlzLnByZXBhcmVFdmVudE5hbWVzKGtub3duRXZlbnRzKTtcblxuICAgICAgICBpZiAoIXByZXBhcmVkRGF0YS5zdGF0dXMgfHwgIUNvbGxlY3Rpb25zVXRpbC5pc0Z1bmN0aW9uKGhhbmRsZXJSZWYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJlcGFyZWREYXRhLmV2ZW50TmFtZXMuZm9yRWFjaCgoZXZlbnRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGVNZXRob2RSZWYoZXZlbnRJZCwgaGFuZGxlclJlZiwgaGFuZGxlckNsYXNzSW5zdGFuY2UsIGhhbmRsZXJGaWx0ZXJFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV2YWx1YXRlIEhhbmRsZXIgcmVnaXN0ZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBleGVjdXRlUmVnaXN0ZXIoXG4gICAgICAgIGV2ZW50SWQ6IFN5c3RlbUV2ZW50LFxuICAgICAgICBoYW5kbGVyUmVmOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWYsXG4gICAgICAgIGhhbmRsZXJDbGFzc0luc3RhbmNlOiBhbnksXG4gICAgICAgIGhhbmRsZXJGaWx0ZXJFeHByZXNzaW9uOiBFeHByZXNzaW9uXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5oYXMoZXZlbnRJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcnMuc2V0KGV2ZW50SWQsIG5ldyBTZXQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maW5kSGFuZGxlckJ5UmVmZXJlbmNlKGV2ZW50SWQsIGhhbmRsZXJSZWYsIGhhbmRsZXJDbGFzc0luc3RhbmNlKS5hY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcbiAgICAgICAgdGhpcy5oYW5kbGVycy5nZXQoZXZlbnRJZCkuYWRkKHsgaGFuZGxlclJlZiwgaGFuZGxlckNsYXNzSW5zdGFuY2UsIGhhbmRsZXJGaWx0ZXJFeHByZXNzaW9uIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV2YWx1YXRlIEhhbmRsZXIgdW5yZWdpc3Rlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4ZWN1dGVVbnJlZ2lzdGVyKGV2ZW50SWQ6IFN5c3RlbUV2ZW50LCBoYW5kbGVyUmVmOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWYpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhbmRsZXJzLmhhcyhldmVudElkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmluZEhhbmRsZXJSZXNwb25zZSA9IHRoaXMuZmluZEhhbmRsZXJCeVJlZmVyZW5jZShldmVudElkLCBoYW5kbGVyUmVmKTtcblxuICAgICAgICBpZiAoIWZpbmRIYW5kbGVyUmVzcG9uc2UuYWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzLmdldChldmVudElkKS5kZWxldGUoZmluZEhhbmRsZXJSZXNwb25zZS5oYW5kbGVyUmVjb3JkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBQcmVwYXJlcyBFdmVudCBuYW1lcyBpbiBBcnJheSBvZiBzdHJpbmdzIGZvcm1hdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVFdmVudE5hbWVzKGtub3duRXZlbnRzOiBTeXN0ZW1FdmVudCB8IFN5c3RlbUV2ZW50W10pOiB7IHN0YXR1czogYm9vbGVhbjsgZXZlbnROYW1lcz86IFN5c3RlbUV2ZW50W10gfSB7XG4gICAgICAgIGlmICghQ29sbGVjdGlvbnNVdGlsLmlzU3RyaW5nKGtub3duRXZlbnRzKSAmJiAhQ29sbGVjdGlvbnNVdGlsLmlzQXJyYXkoa25vd25FdmVudHMpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiB0cnVlLFxuICAgICAgICAgICAgZXZlbnROYW1lczogQ29sbGVjdGlvbnNVdGlsLmlzU3RyaW5nKGtub3duRXZlbnRzKSA/IFtrbm93bkV2ZW50c10gOiBrbm93bkV2ZW50c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgc3BlY2lhbCBIYW5kbGVycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFNwZWNpYWxIYW5kbGVycygpOiBTeXN0ZW1FdmVudEhhbmRsZXJSZWNvcmRbXSB7XG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5oYXMoU0VfQUxMX0VWRU5UUykpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuaGFuZGxlcnMuZ2V0KFNFX0FMTF9FVkVOVFMpLnZhbHVlcygpKTtcbiAgICB9XG59XG4iXX0=