UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

187 lines 20.6 kB
import { Injectable } from '@angular/core'; import { GroupFragment } from './group-fragment.model'; import { firstValueFrom } from 'rxjs'; import { AssetTypesRealtimeService } from '../asset-types/asset-types.realtime.service'; import * as i0 from "@angular/core"; import * as i1 from "../asset-types/asset-types.realtime.service"; const MO_TYPES = [ 'asset', 'dynamicGroup', 'brokerSource', 'brokerSourceInactive', 'group', 'other' ]; /** * Enumerates the supported asset paths. */ export var ASSET_PATH; (function (ASSET_PATH) { /** * The default asset path. */ ASSET_PATH["DEFAULT"] = "group"; /** * The asset path for devices. */ ASSET_PATH["DEVICE"] = "device"; })(ASSET_PATH || (ASSET_PATH = {})); export class GroupService { constructor(assetTypesRealtimeService) { this.assetTypesRealtimeService = assetTypesRealtimeService; this.icons = { brokerSourceInactive: { icon: 'c8y-group-remote-inactive', iconOpen: 'c8y-group-remote-inactive' }, brokerSource: { icon: 'c8y-group-remote', iconOpen: 'c8y-group-remote-open' }, group: { icon: 'c8y-group', iconOpen: 'c8y-group-open' }, dynamicGroup: { icon: 'c8y-group-smart', iconOpen: 'c8y-group-smart-open' }, other: { icon: 'exchange', iconClass: 'statusUnknown' } }; /** * A mapping of managed object types to their corresponding asset path. */ this.assetPaths = new Map([ ['group', ASSET_PATH.DEFAULT], ['dynamicGroup', ASSET_PATH.DEFAULT], ['asset', ASSET_PATH.DEFAULT], ['device', ASSET_PATH.DEVICE], ['other', ASSET_PATH.DEVICE] ]); this.dataBrokerSourceFragmentInactive = `_${GroupFragment.dataBrokerSourceFragment}`; } /** * Finds an icon based on the contents of a managed object. * It takes into account factors such as type, and specific fragments. * @param mo Managed object to be checked. * @param open Determines whether the method should return an alternative icon showing the open state. * @param fallbackIcon If no icon is found, this icon is returned. * @returns Returns an icon. */ async getIcon(mo, open = false, fallbackIcon) { const genericMoType = this.determineMoType(mo); if (genericMoType === 'asset') { return await this.getAssetCustomIcon(mo.type); } if (fallbackIcon && genericMoType === 'other') { return fallbackIcon; } const typeIcons = this.getDefaultIcon(genericMoType); return open ? typeIcons.iconOpen : typeIcons.icon; } /** * Checks whether a given managed object is a group. * @param mo Managed object to be checked. * @returns Returns true if the managed object is a group. */ isGroup(mo) { return !!mo[GroupFragment.groupFragmentType] || mo.type === GroupFragment.groupType; } /** * Checks whether a given managed object is a dynamic group. * @param mo Managed object to be checked. * @returns Returns true if the managed object is a dynamic group. */ isDynamicGroup(mo) { return !!mo[GroupFragment.dynamicGroupFragment] || mo.type === GroupFragment.dynamicGroupType; } /** * Checks whether a given managed object is a data broker. * @param mo Managed object to be checked. * @returns Returns true if the managed object is a data broker. */ isDataBroker(mo) { return (!!mo[GroupFragment.dataBrokerSourceFragment] || !!mo[this.dataBrokerSourceFragmentInactive]); } /** * Checks whether a given managed object is a data broker active. * @param mo Managed object to be checked. * @returns Returns true if the managed object is a data broker active. */ isDataBrokerActive(mo) { return (!!mo[GroupFragment.dataBrokerSourceFragment] && !mo[this.dataBrokerSourceFragmentInactive]); } /** * Checks whether a given managed object is an asset. * @param mo Managed object to be checked. * @returns Returns true if the managed object is an asset. */ isAsset(mo) { return !!mo.c8y_IsAsset; } /** * Checks whether the object belongs to any type of group. * Types of groups: group, dynamic group, data broker, data broker active. * @param mo Managed object to be checked. * @returns Returns true if the managed object belongs to the group category. */ isAnyGroup(mo) { return (this.isGroup(mo) || this.isDynamicGroup(mo) || this.isDataBroker(mo) || this.isDataBrokerActive(mo)); } /** * Checks whether a given managed object is a device. * @param mo Managed object to be checked. * @returns Returns true if the managed object is a device. */ isDevice(mo) { return !!mo.c8y_IsDevice; } /** * Retrieves the path associated with a given managed object. * @param mo The managed object for which the asset path is to be retrieved. * @returns The path associated with the managed object's type. */ getAssetPath(mo) { return this.assetPaths.get(this.determineMoType(mo)); } getAssetCustomIcon(moType) { const icon$ = this.assetTypesRealtimeService.getIcon$(moType); return firstValueFrom(icon$); } getDefaultIcon(moType) { return this.icons[moType]; } determineMoType(mo) { if (this.isAsset(mo)) { return 'asset'; } if (this.isDynamicGroup(mo)) { return 'dynamicGroup'; } if (this.isDataBrokerActive(mo)) { return 'brokerSource'; } if (this.isDataBroker(mo)) { return 'brokerSourceInactive'; } if (this.isGroup(mo)) { return 'group'; } return 'other'; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GroupService, deps: [{ token: i1.AssetTypesRealtimeService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GroupService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GroupService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.AssetTypesRealtimeService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvY29tbW9uL2dyb3VwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7O0FBR3hGLE1BQU0sUUFBUSxHQUFHO0lBQ2YsT0FBTztJQUNQLGNBQWM7SUFDZCxjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLE9BQU87SUFDUCxPQUFPO0NBQ0MsQ0FBQztBQWNYOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFVWDtBQVZELFdBQVksVUFBVTtJQUNwQjs7T0FFRztJQUNILCtCQUFpQixDQUFBO0lBRWpCOztPQUVHO0lBQ0gsK0JBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVZXLFVBQVUsS0FBVixVQUFVLFFBVXJCO0FBU0QsTUFBTSxPQUFPLFlBQVk7SUFxQ3ZCLFlBQW9CLHlCQUFvRDtRQUFwRCw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBcEMvRCxVQUFLLEdBQUc7WUFDZixvQkFBb0IsRUFBRTtnQkFDcEIsSUFBSSxFQUFFLDJCQUEyQjtnQkFDakMsUUFBUSxFQUFFLDJCQUEyQjthQUN0QztZQUNELFlBQVksRUFBRTtnQkFDWixJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixRQUFRLEVBQUUsdUJBQXVCO2FBQ2xDO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxXQUFXO2dCQUNqQixRQUFRLEVBQUUsZ0JBQWdCO2FBQzNCO1lBQ0QsWUFBWSxFQUFFO2dCQUNaLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxzQkFBc0I7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QU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBHcm91cEZyYWdtZW50IH0gZnJvbSAnLi9ncm91cC1mcmFnbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXNzZXRUeXBlc1JlYWx0aW1lU2VydmljZSB9IGZyb20gJy4uL2Fzc2V0LXR5cGVzL2Fzc2V0LXR5cGVzLnJlYWx0aW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VwcG9ydGVkSWNvbnNTdWdnZXN0aW9ucyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaWNvbi1zZWxlY3Rvci9pY29ucyc7XG5cbmNvbnN0IE1PX1RZUEVTID0gW1xuICAnYXNzZXQnLFxuICAnZHluYW1pY0dyb3VwJyxcbiAgJ2Jyb2tlclNvdXJjZScsXG4gICdicm9rZXJTb3VyY2VJbmFjdGl2ZScsXG4gICdncm91cCcsXG4gICdvdGhlcidcbl0gYXMgY29uc3Q7XG5cbnR5cGUgTW9UeXBlcyA9ICh0eXBlb2YgTU9fVFlQRVMpW251bWJlcl07XG5cbnR5cGUgQXNzZXRUeXBlcyA9IE9taXQ8TW9UeXBlcywgJ2Jyb2tlclNvdXJjZScgfCAnYnJva2VyU291cmNlSW5hY3RpdmUnPjtcblxudHlwZSBHcm91cEljb24gPSB7XG4gIGljb246IFN1cHBvcnRlZEljb25zU3VnZ2VzdGlvbnM7XG4gIGljb25PcGVuPzogU3VwcG9ydGVkSWNvbnNTdWdnZXN0aW9ucztcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xufTtcblxudHlwZSBHcm91cEljb25zID0gUGFydGlhbDxSZWNvcmQ8TW9UeXBlcywgR3JvdXBJY29uPj47XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGFzc2V0IHBhdGhzLlxuICovXG5leHBvcnQgZW51bSBBU1NFVF9QQVRIIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGFzc2V0IHBhdGguXG4gICAqL1xuICBERUZBVUxUID0gJ2dyb3VwJyxcblxuICAvKipcbiAgICogVGhlIGFzc2V0IHBhdGggZm9yIGRldmljZXMuXG4gICAqL1xuICBERVZJQ0UgPSAnZGV2aWNlJ1xufVxuLyoqXG4gKiBBc3NldCBwYXRocy5cbiAqL1xudHlwZSBBc3NldFBhdGggPSBgJHtBU1NFVF9QQVRIfWA7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdyb3VwU2VydmljZSB7XG4gIHJlYWRvbmx5IGljb25zID0ge1xuICAgIGJyb2tlclNvdXJjZUluYWN0aXZlOiB7XG4gICAgICBpY29uOiAnYzh5LWdyb3VwLXJlbW90ZS1pbmFjdGl2ZScsXG4gICAgICBpY29uT3BlbjogJ2M4eS1ncm91cC1yZW1vdGUtaW5hY3RpdmUnXG4gICAgfSxcbiAgICBicm9rZXJTb3VyY2U6IHtcbiAgICAgIGljb246ICdjOHktZ3JvdXAtcmVtb3RlJyxcbiAgICAgIGljb25PcGVuOiAnYzh5LWdyb3VwLXJlbW90ZS1vcGVuJ1xuICAgIH0sXG4gICAgZ3JvdXA6IHtcbiAgICAgIGljb246ICdjOHktZ3JvdXAnLFxuICAgICAgaWNvbk9wZW46ICdjOHktZ3JvdXAtb3BlbidcbiAgICB9LFxuICAgIGR5bmFtaWNHcm91cDoge1xuICAgICAgaWNvbjogJ2M4eS1ncm91cC1zbWFydCcsXG4gICAgICBpY29uT3BlbjogJ2M4eS1ncm91cC1zbWFydC1vcGVuJ1xuICAgIH0sXG4gICAgb3RoZXI6IHtcbiAgICAgIGljb246ICdleGNoYW5nZScsXG4gICAgICBpY29uQ2xhc3M6ICdzdGF0dXNVbmtub3duJ1xuICAgIH1cbiAgfSBhcyBjb25zdCBzYXRpc2ZpZXMgR3JvdXBJY29ucztcblxuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIG1hbmFnZWQgb2JqZWN0IHR5cGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgYXNzZXQgcGF0aC5cbiAgICovXG4gIGFzc2V0UGF0aHM6IE1hcDxBc3NldFR5cGVzLCBBc3NldFBhdGg+ID0gbmV3IE1hcChbXG4gICAgWydncm91cCcsIEFTU0VUX1BBVEguREVGQVVMVF0sXG4gICAgWydkeW5hbWljR3JvdXAnLCBBU1NFVF9QQVRILkRFRkFVTFRdLFxuICAgIFsnYXNzZXQnLCBBU1NFVF9QQVRILkRFRkFVTFRdLFxuICAgIFsnZGV2aWNlJywgQVNTRVRfUEFUSC5ERVZJQ0VdLFxuICAgIFsnb3RoZXInLCBBU1NFVF9QQVRILkRFVklDRV1cbiAgXSk7XG5cbiAgZGF0YUJyb2tlclNvdXJjZUZyYWdtZW50SW5hY3RpdmUgPSBgXyR7R3JvdXBGcmFnbWVudC5kYXRhQnJva2VyU291cmNlRnJhZ21lbnR9YDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFzc2V0VHlwZXNSZWFsdGltZVNlcnZpY2U6IEFzc2V0VHlwZXNSZWFsdGltZVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGljb24gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIGEgbWFuYWdlZCBvYmplY3QuXG4gICAqIEl0IHRha2VzIGludG8gYWNjb3VudCBmYWN0b3JzIHN1Y2ggYXMgdHlwZSwgYW5kIHNwZWNpZmljIGZyYWdtZW50cy5cbiAgICogQHBhcmFtIG1vIE1hbmFnZWQgb2JqZWN0IHRvIGJlIGNoZWNrZWQuXG4gICAqIEBwYXJhbSBvcGVuIERldGVybWluZXMgd2hldGhlciB0aGUgbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gYWx0ZXJuYXRpdmUgaWNvbiBzaG93aW5nIHRoZSBvcGVuIHN0YXRlLlxuICAgKiBAcGFyYW0gZmFsbGJhY2tJY29uIElmIG5vIGljb24gaXMgZm91bmQsIHRoaXMgaWNvbiBpcyByZXR1cm5lZC5cbiAgICogQHJldHVybnMgUmV0dXJucyBhbiBpY29uLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWNvbihtbzogSU1hbmFnZWRPYmplY3QsIG9wZW4gPSBmYWxzZSwgZmFsbGJhY2tJY29uPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBnZW5lcmljTW9UeXBlID0gdGhpcy5kZXRlcm1pbmVNb1R5cGUobW8pO1xuXG4gICAgaWYgKGdlbmVyaWNNb1R5cGUgPT09ICdhc3NldCcpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEFzc2V0Q3VzdG9tSWNvbihtby50eXBlKTtcbiAgICB9XG5cbiAgICBpZiAoZmFsbGJhY2tJY29uICYmIGdlbmVyaWNNb1R5cGUgPT09ICdvdGhlcicpIHtcbiAgICAgIHJldHVybiBmYWxsYmFja0ljb247XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUljb25zOiBHcm91cEljb24gPSB0aGlzLmdldERlZmF1bHRJY29uKGdlbmVyaWNNb1R5cGUpO1xuICAgIHJldHVybiBvcGVuID8gdHlwZUljb25zLmljb25PcGVuIDogdHlwZUljb25zLmljb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBtYW5hZ2VkIG9iamVjdCBpcyBhIGdyb3VwLlxuICAgKiBAcGFyYW0gbW8gTWFuYWdlZCBvYmplY3QgdG8gYmUgY2hlY2tlZC5cbiAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYW5hZ2VkIG9iamVjdCBpcyBhIGdyb3VwLlxuICAgKi9cbiAgaXNHcm91cChtbzogSU1hbmFnZWRPYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFtb1tHcm91cEZyYWdtZW50Lmdyb3VwRnJhZ21lbnRUeXBlXSB8fCBtby50eXBlID09PSBHcm91cEZyYWdtZW50Lmdyb3VwVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIG1hbmFnZWQgb2JqZWN0IGlzIGEgZHluYW1pYyBncm91cC5cbiAgICogQHBhcmFtIG1vIE1hbmFnZWQgb2JqZWN0IHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFuYWdlZCBvYmplY3QgaXMgYSBkeW5hbWljIGdyb3VwLlxuICAgKi9cbiAgaXNEeW5hbWljR3JvdXAobW86IElNYW5hZ2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhbW9bR3JvdXBGcmFnbWVudC5keW5hbWljR3JvdXBGcmFnbWVudF0gfHwgbW8udHlwZSA9PT0gR3JvdXBGcmFnbWVudC5keW5hbWljR3JvdXBUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gbWFuYWdlZCBvYmplY3QgaXMgYSBkYXRhIGJyb2tlci5cbiAgICogQHBhcmFtIG1vIE1hbmFnZWQgb2JqZWN0IHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFuYWdlZCBvYmplY3QgaXMgYSBkYXRhIGJyb2tlci5cbiAgICovXG4gIGlzRGF0YUJyb2tlcihtbzogSU1hbmFnZWRPYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFtb1tHcm91cEZyYWdtZW50LmRhdGFCcm9rZXJTb3VyY2VGcmFnbWVudF0gfHwgISFtb1t0aGlzLmRhdGFCcm9rZXJTb3VyY2VGcmFnbWVudEluYWN0aXZlXVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBtYW5hZ2VkIG9iamVjdCBpcyBhIGRhdGEgYnJva2VyIGFjdGl2ZS5cbiAgICogQHBhcmFtIG1vIE1hbmFnZWQgb2JqZWN0IHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFuYWdlZCBvYmplY3QgaXMgYSBkYXRhIGJyb2tlciBhY3RpdmUuXG4gICAqL1xuICBpc0RhdGFCcm9rZXJBY3RpdmUobW86IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhbW9bR3JvdXBGcmFnbWVudC5kYXRhQnJva2VyU291cmNlRnJhZ21lbnRdICYmICFtb1t0aGlzLmRhdGFCcm9rZXJTb3VyY2VGcmFnbWVudEluYWN0aXZlXVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBtYW5hZ2VkIG9iamVjdCBpcyBhbiBhc3NldC5cbiAgICogQHBhcmFtIG1vIE1hbmFnZWQgb2JqZWN0IHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFuYWdlZCBvYmplY3QgaXMgYW4gYXNzZXQuXG4gICAqL1xuICBpc0Fzc2V0KG1vOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHJldHVybiAhIW1vLmM4eV9Jc0Fzc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVsb25ncyB0byBhbnkgdHlwZSBvZiBncm91cC5cbiAgICogVHlwZXMgb2YgZ3JvdXBzOiBncm91cCwgZHluYW1pYyBncm91cCwgZGF0YSBicm9rZXIsIGRhdGEgYnJva2VyIGFjdGl2ZS5cbiAgICogQHBhcmFtIG1vIE1hbmFnZWQgb2JqZWN0IHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFuYWdlZCBvYmplY3QgYmVsb25ncyB0byB0aGUgZ3JvdXAgY2F0ZWdvcnkuXG4gICAqL1xuICBpc0FueUdyb3VwKG1vOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzR3JvdXAobW8pIHx8XG4gICAgICB0aGlzLmlzRHluYW1pY0dyb3VwKG1vKSB8fFxuICAgICAgdGhpcy5pc0RhdGFCcm9rZXIobW8pIHx8XG4gICAgICB0aGlzLmlzRGF0YUJyb2tlckFjdGl2ZShtbylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gbWFuYWdlZCBvYmplY3QgaXMgYSBkZXZpY2UuXG4gICAqIEBwYXJhbSBtbyBNYW5hZ2VkIG9iamVjdCB0byBiZSBjaGVja2VkLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hbmFnZWQgb2JqZWN0IGlzIGEgZGV2aWNlLlxuICAgKi9cbiAgaXNEZXZpY2UobW86IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgcmV0dXJuICEhbW8uYzh5X0lzRGV2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBtYW5hZ2VkIG9iamVjdC5cbiAgICogQHBhcmFtIG1vIFRoZSBtYW5hZ2VkIG9iamVjdCBmb3Igd2hpY2ggdGhlIGFzc2V0IHBhdGggaXMgdG8gYmUgcmV0cmlldmVkLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hbmFnZWQgb2JqZWN0J3MgdHlwZS5cbiAgICovXG4gIGdldEFzc2V0UGF0aChtbzogSU1hbmFnZWRPYmplY3QpOiBBc3NldFBhdGgge1xuICAgIHJldHVybiB0aGlzLmFzc2V0UGF0aHMuZ2V0KHRoaXMuZGV0ZXJtaW5lTW9UeXBlKG1vKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2V0Q3VzdG9tSWNvbihtb1R5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaWNvbiQgPSB0aGlzLmFzc2V0VHlwZXNSZWFsdGltZVNlcnZpY2UuZ2V0SWNvbiQobW9UeXBlKTtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oaWNvbiQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0SWNvbjxUIGV4dGVuZHMga2V5b2YgdHlwZW9mIHRoaXMuaWNvbnM+KG1vVHlwZTogVCk6ICh0eXBlb2YgdGhpcy5pY29ucylbVF0ge1xuICAgIHJldHVybiB0aGlzLmljb25zW21vVHlwZV07XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZU1vVHlwZShtbzogSU1hbmFnZWRPYmplY3QpOiBNb1R5cGVzIHtcbiAgICBpZiAodGhpcy5pc0Fzc2V0KG1vKSkge1xuICAgICAgcmV0dXJuICdhc3NldCc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNEeW5hbWljR3JvdXAobW8pKSB7XG4gICAgICByZXR1cm4gJ2R5bmFtaWNHcm91cCc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNEYXRhQnJva2VyQWN0aXZlKG1vKSkge1xuICAgICAgcmV0dXJuICdicm9rZXJTb3VyY2UnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRGF0YUJyb2tlcihtbykpIHtcbiAgICAgIHJldHVybiAnYnJva2VyU291cmNlSW5hY3RpdmUnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzR3JvdXAobW8pKSB7XG4gICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ290aGVyJztcbiAgfVxufVxuIl19