@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
187 lines • 20.6 kB
JavaScript
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