|
|
|
@ -34,27 +34,27 @@ export interface OriginatorValuesDescriptions { |
|
|
|
|
|
|
|
export const originatorSourceTranslations = new Map<OriginatorSource, string>( |
|
|
|
[ |
|
|
|
[OriginatorSource.CUSTOMER, 'tb.rulenode.originator-customer'], |
|
|
|
[OriginatorSource.TENANT, 'tb.rulenode.originator-tenant'], |
|
|
|
[OriginatorSource.RELATED, 'tb.rulenode.originator-related'], |
|
|
|
[OriginatorSource.ALARM_ORIGINATOR, 'tb.rulenode.originator-alarm-originator'], |
|
|
|
[OriginatorSource.ENTITY, 'tb.rulenode.originator-entity'], |
|
|
|
[OriginatorSource.CUSTOMER, 'rule-node-config.originator-customer'], |
|
|
|
[OriginatorSource.TENANT, 'rule-node-config.originator-tenant'], |
|
|
|
[OriginatorSource.RELATED, 'rule-node-config.originator-related'], |
|
|
|
[OriginatorSource.ALARM_ORIGINATOR, 'rule-node-config.originator-alarm-originator'], |
|
|
|
[OriginatorSource.ENTITY, 'rule-node-config.originator-entity'], |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
export const originatorSourceDescTranslations = new Map<OriginatorSource, string>( |
|
|
|
[ |
|
|
|
[OriginatorSource.CUSTOMER, 'tb.rulenode.originator-customer-desc'], |
|
|
|
[OriginatorSource.TENANT, 'tb.rulenode.originator-tenant-desc'], |
|
|
|
[OriginatorSource.RELATED, 'tb.rulenode.originator-related-entity-desc'], |
|
|
|
[OriginatorSource.ALARM_ORIGINATOR, 'tb.rulenode.originator-alarm-originator-desc'], |
|
|
|
[OriginatorSource.ENTITY, 'tb.rulenode.originator-entity-by-name-pattern-desc'], |
|
|
|
[OriginatorSource.CUSTOMER, 'rule-node-config.originator-customer-desc'], |
|
|
|
[OriginatorSource.TENANT, 'rule-node-config.originator-tenant-desc'], |
|
|
|
[OriginatorSource.RELATED, 'rule-node-config.originator-related-entity-desc'], |
|
|
|
[OriginatorSource.ALARM_ORIGINATOR, 'rule-node-config.originator-alarm-originator-desc'], |
|
|
|
[OriginatorSource.ENTITY, 'rule-node-config.originator-entity-by-name-pattern-desc'], |
|
|
|
] |
|
|
|
); |
|
|
|
export const allowedOriginatorFields: EntityField[] = [ |
|
|
|
entityFields.createdTime, |
|
|
|
entityFields.name, |
|
|
|
{value: 'type', name: 'tb.rulenode.profile-name', keyName: 'originatorProfileName'}, |
|
|
|
{value: 'type', name: 'rule-node-config.profile-name', keyName: 'originatorProfileName'}, |
|
|
|
entityFields.firstName, |
|
|
|
entityFields.lastName, |
|
|
|
entityFields.email, |
|
|
|
@ -67,8 +67,8 @@ export const allowedOriginatorFields: EntityField[] = [ |
|
|
|
entityFields.zip, |
|
|
|
entityFields.phone, |
|
|
|
entityFields.label, |
|
|
|
{value: 'id', name: 'tb.rulenode.id', keyName: 'id'}, |
|
|
|
{value: 'additionalInfo', name: 'tb.rulenode.additional-info', keyName: 'additionalInfo'} |
|
|
|
{value: 'id', name: 'rule-node-config.id', keyName: 'id'}, |
|
|
|
{value: 'additionalInfo', name: 'rule-node-config.additional-info', keyName: 'additionalInfo'} |
|
|
|
]; |
|
|
|
|
|
|
|
export const OriginatorFieldsMappingValues = new Map<string, string>( |
|
|
|
@ -100,8 +100,8 @@ export enum PerimeterType { |
|
|
|
|
|
|
|
export const perimeterTypeTranslations = new Map<PerimeterType, string>( |
|
|
|
[ |
|
|
|
[PerimeterType.CIRCLE, 'tb.rulenode.perimeter-circle'], |
|
|
|
[PerimeterType.POLYGON, 'tb.rulenode.perimeter-polygon'], |
|
|
|
[PerimeterType.CIRCLE, 'rule-node-config.perimeter-circle'], |
|
|
|
[PerimeterType.POLYGON, 'rule-node-config.perimeter-polygon'], |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -115,11 +115,11 @@ export enum TimeUnit { |
|
|
|
|
|
|
|
export const timeUnitTranslations = new Map<TimeUnit, string>( |
|
|
|
[ |
|
|
|
[TimeUnit.MILLISECONDS, 'tb.rulenode.time-unit-milliseconds'], |
|
|
|
[TimeUnit.SECONDS, 'tb.rulenode.time-unit-seconds'], |
|
|
|
[TimeUnit.MINUTES, 'tb.rulenode.time-unit-minutes'], |
|
|
|
[TimeUnit.HOURS, 'tb.rulenode.time-unit-hours'], |
|
|
|
[TimeUnit.DAYS, 'tb.rulenode.time-unit-days'] |
|
|
|
[TimeUnit.MILLISECONDS, 'rule-node-config.time-unit-milliseconds'], |
|
|
|
[TimeUnit.SECONDS, 'rule-node-config.time-unit-seconds'], |
|
|
|
[TimeUnit.MINUTES, 'rule-node-config.time-unit-minutes'], |
|
|
|
[TimeUnit.HOURS, 'rule-node-config.time-unit-hours'], |
|
|
|
[TimeUnit.DAYS, 'rule-node-config.time-unit-days'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -133,11 +133,11 @@ export enum RangeUnit { |
|
|
|
|
|
|
|
export const rangeUnitTranslations = new Map<RangeUnit, string>( |
|
|
|
[ |
|
|
|
[RangeUnit.METER, 'tb.rulenode.range-unit-meter'], |
|
|
|
[RangeUnit.KILOMETER, 'tb.rulenode.range-unit-kilometer'], |
|
|
|
[RangeUnit.FOOT, 'tb.rulenode.range-unit-foot'], |
|
|
|
[RangeUnit.MILE, 'tb.rulenode.range-unit-mile'], |
|
|
|
[RangeUnit.NAUTICAL_MILE, 'tb.rulenode.range-unit-nautical-mile'] |
|
|
|
[RangeUnit.METER, 'rule-node-config.range-unit-meter'], |
|
|
|
[RangeUnit.KILOMETER, 'rule-node-config.range-unit-kilometer'], |
|
|
|
[RangeUnit.FOOT, 'rule-node-config.range-unit-foot'], |
|
|
|
[RangeUnit.MILE, 'rule-node-config.range-unit-mile'], |
|
|
|
[RangeUnit.NAUTICAL_MILE, 'rule-node-config.range-unit-nautical-mile'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -162,17 +162,17 @@ export interface SvMapOption { |
|
|
|
|
|
|
|
export const entityDetailsTranslations = new Map<EntityDetailsField, string>( |
|
|
|
[ |
|
|
|
[EntityDetailsField.ID, 'tb.rulenode.entity-details-id'], |
|
|
|
[EntityDetailsField.TITLE, 'tb.rulenode.entity-details-title'], |
|
|
|
[EntityDetailsField.COUNTRY, 'tb.rulenode.entity-details-country'], |
|
|
|
[EntityDetailsField.STATE, 'tb.rulenode.entity-details-state'], |
|
|
|
[EntityDetailsField.CITY, 'tb.rulenode.entity-details-city'], |
|
|
|
[EntityDetailsField.ZIP, 'tb.rulenode.entity-details-zip'], |
|
|
|
[EntityDetailsField.ADDRESS, 'tb.rulenode.entity-details-address'], |
|
|
|
[EntityDetailsField.ADDRESS2, 'tb.rulenode.entity-details-address2'], |
|
|
|
[EntityDetailsField.PHONE, 'tb.rulenode.entity-details-phone'], |
|
|
|
[EntityDetailsField.EMAIL, 'tb.rulenode.entity-details-email'], |
|
|
|
[EntityDetailsField.ADDITIONAL_INFO, 'tb.rulenode.entity-details-additional_info'] |
|
|
|
[EntityDetailsField.ID, 'rule-node-config.entity-details-id'], |
|
|
|
[EntityDetailsField.TITLE, 'rule-node-config.entity-details-title'], |
|
|
|
[EntityDetailsField.COUNTRY, 'rule-node-config.entity-details-country'], |
|
|
|
[EntityDetailsField.STATE, 'rule-node-config.entity-details-state'], |
|
|
|
[EntityDetailsField.CITY, 'rule-node-config.entity-details-city'], |
|
|
|
[EntityDetailsField.ZIP, 'rule-node-config.entity-details-zip'], |
|
|
|
[EntityDetailsField.ADDRESS, 'rule-node-config.entity-details-address'], |
|
|
|
[EntityDetailsField.ADDRESS2, 'rule-node-config.entity-details-address2'], |
|
|
|
[EntityDetailsField.PHONE, 'rule-node-config.entity-details-phone'], |
|
|
|
[EntityDetailsField.EMAIL, 'rule-node-config.entity-details-email'], |
|
|
|
[EntityDetailsField.ADDITIONAL_INFO, 'rule-node-config.entity-details-additional_info'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -184,17 +184,17 @@ export enum FetchMode { |
|
|
|
|
|
|
|
export const deduplicationStrategiesTranslations = new Map<FetchMode, string>( |
|
|
|
[ |
|
|
|
[FetchMode.FIRST, 'tb.rulenode.first'], |
|
|
|
[FetchMode.LAST, 'tb.rulenode.last'], |
|
|
|
[FetchMode.ALL, 'tb.rulenode.all'] |
|
|
|
[FetchMode.FIRST, 'rule-node-config.first'], |
|
|
|
[FetchMode.LAST, 'rule-node-config.last'], |
|
|
|
[FetchMode.ALL, 'rule-node-config.all'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
export const deduplicationStrategiesHintTranslations = new Map<FetchMode, string>( |
|
|
|
[ |
|
|
|
[FetchMode.FIRST, 'tb.rulenode.first-mode-hint'], |
|
|
|
[FetchMode.LAST, 'tb.rulenode.last-mode-hint'], |
|
|
|
[FetchMode.ALL, 'tb.rulenode.all-mode-hint'] |
|
|
|
[FetchMode.FIRST, 'rule-node-config.first-mode-hint'], |
|
|
|
[FetchMode.LAST, 'rule-node-config.last-mode-hint'], |
|
|
|
[FetchMode.ALL, 'rule-node-config.all-mode-hint'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -211,24 +211,24 @@ export enum DataToFetch { |
|
|
|
|
|
|
|
export const dataToFetchTranslations = new Map<DataToFetch, string>( |
|
|
|
[ |
|
|
|
[DataToFetch.ATTRIBUTES, 'tb.rulenode.attributes'], |
|
|
|
[DataToFetch.LATEST_TELEMETRY, 'tb.rulenode.latest-telemetry'], |
|
|
|
[DataToFetch.FIELDS, 'tb.rulenode.fields'] |
|
|
|
[DataToFetch.ATTRIBUTES, 'rule-node-config.attributes'], |
|
|
|
[DataToFetch.LATEST_TELEMETRY, 'rule-node-config.latest-telemetry'], |
|
|
|
[DataToFetch.FIELDS, 'rule-node-config.fields'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
export const msgMetadataLabelTranslations = new Map<DataToFetch, string>( |
|
|
|
[ |
|
|
|
[DataToFetch.ATTRIBUTES, 'tb.rulenode.add-mapped-attribute-to'], |
|
|
|
[DataToFetch.LATEST_TELEMETRY, 'tb.rulenode.add-mapped-latest-telemetry-to'], |
|
|
|
[DataToFetch.FIELDS, 'tb.rulenode.add-mapped-fields-to'] |
|
|
|
[DataToFetch.ATTRIBUTES, 'rule-node-config.add-mapped-attribute-to'], |
|
|
|
[DataToFetch.LATEST_TELEMETRY, 'rule-node-config.add-mapped-latest-telemetry-to'], |
|
|
|
[DataToFetch.FIELDS, 'rule-node-config.add-mapped-fields-to'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
export const samplingOrderTranslations = new Map<SamplingOrder, string>( |
|
|
|
[ |
|
|
|
[SamplingOrder.ASC, 'tb.rulenode.ascending'], |
|
|
|
[SamplingOrder.DESC, 'tb.rulenode.descending'] |
|
|
|
[SamplingOrder.ASC, 'rule-node-config.ascending'], |
|
|
|
[SamplingOrder.DESC, 'rule-node-config.descending'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -239,8 +239,8 @@ export enum SqsQueueType { |
|
|
|
|
|
|
|
export const sqsQueueTypeTranslations = new Map<SqsQueueType, string>( |
|
|
|
[ |
|
|
|
[SqsQueueType.STANDARD, 'tb.rulenode.sqs-queue-standard'], |
|
|
|
[SqsQueueType.FIFO, 'tb.rulenode.sqs-queue-fifo'], |
|
|
|
[SqsQueueType.STANDARD, 'rule-node-config.sqs-queue-standard'], |
|
|
|
[SqsQueueType.FIFO, 'rule-node-config.sqs-queue-fifo'], |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -249,9 +249,9 @@ export const credentialsTypes: credentialsType[] = ['anonymous', 'basic', 'cert. |
|
|
|
|
|
|
|
export const credentialsTypeTranslations = new Map<credentialsType, string>( |
|
|
|
[ |
|
|
|
['anonymous', 'tb.rulenode.credentials-anonymous'], |
|
|
|
['basic', 'tb.rulenode.credentials-basic'], |
|
|
|
['cert.PEM', 'tb.rulenode.credentials-pem'] |
|
|
|
['anonymous', 'rule-node-config.credentials-anonymous'], |
|
|
|
['basic', 'rule-node-config.credentials-basic'], |
|
|
|
['cert.PEM', 'rule-node-config.credentials-pem'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -260,8 +260,8 @@ export const azureIotHubCredentialsTypes: AzureIotHubCredentialsType[] = ['sas', |
|
|
|
|
|
|
|
export const azureIotHubCredentialsTypeTranslations = new Map<AzureIotHubCredentialsType, string>( |
|
|
|
[ |
|
|
|
['sas', 'tb.rulenode.credentials-sas'], |
|
|
|
['cert.PEM', 'tb.rulenode.credentials-pem'] |
|
|
|
['sas', 'rule-node-config.credentials-sas'], |
|
|
|
['cert.PEM', 'rule-node-config.credentials-pem'] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -283,12 +283,12 @@ export const ToByteStandartCharsetTypes = [ |
|
|
|
|
|
|
|
export const ToByteStandartCharsetTypeTranslations = new Map<string, string>( |
|
|
|
[ |
|
|
|
['US-ASCII', 'tb.rulenode.charset-us-ascii'], |
|
|
|
['ISO-8859-1', 'tb.rulenode.charset-iso-8859-1'], |
|
|
|
['UTF-8', 'tb.rulenode.charset-utf-8'], |
|
|
|
['UTF-16BE', 'tb.rulenode.charset-utf-16be'], |
|
|
|
['UTF-16LE', 'tb.rulenode.charset-utf-16le'], |
|
|
|
['UTF-16', 'tb.rulenode.charset-utf-16'], |
|
|
|
['US-ASCII', 'rule-node-config.charset-us-ascii'], |
|
|
|
['ISO-8859-1', 'rule-node-config.charset-iso-8859-1'], |
|
|
|
['UTF-8', 'rule-node-config.charset-utf-8'], |
|
|
|
['UTF-16BE', 'rule-node-config.charset-utf-16be'], |
|
|
|
['UTF-16LE', 'rule-node-config.charset-utf-16le'], |
|
|
|
['UTF-16', 'rule-node-config.charset-utf-16'], |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
@ -720,23 +720,23 @@ export enum FetchTo { |
|
|
|
} |
|
|
|
|
|
|
|
export const FetchFromToTranslation = new Map<FetchTo, string>([ |
|
|
|
[FetchTo.DATA, 'tb.rulenode.message-to-metadata'], |
|
|
|
[FetchTo.METADATA, 'tb.rulenode.metadata-to-message'], |
|
|
|
[FetchTo.DATA, 'rule-node-config.message-to-metadata'], |
|
|
|
[FetchTo.METADATA, 'rule-node-config.metadata-to-message'], |
|
|
|
]); |
|
|
|
|
|
|
|
export const FetchFromTranslation = new Map<FetchTo, string>([ |
|
|
|
[FetchTo.DATA, 'tb.rulenode.from-message'], |
|
|
|
[FetchTo.METADATA, 'tb.rulenode.from-metadata'], |
|
|
|
[FetchTo.DATA, 'rule-node-config.from-message'], |
|
|
|
[FetchTo.METADATA, 'rule-node-config.from-metadata'], |
|
|
|
]); |
|
|
|
|
|
|
|
export const FetchToTranslation = new Map<FetchTo, string>([ |
|
|
|
[FetchTo.DATA, 'tb.rulenode.message'], |
|
|
|
[FetchTo.METADATA, 'tb.rulenode.metadata'], |
|
|
|
[FetchTo.DATA, 'rule-node-config.message'], |
|
|
|
[FetchTo.METADATA, 'rule-node-config.metadata'], |
|
|
|
]); |
|
|
|
|
|
|
|
export const FetchToRenameTranslation = new Map<FetchTo, string>([ |
|
|
|
[FetchTo.DATA, 'tb.rulenode.message'], |
|
|
|
[FetchTo.METADATA, 'tb.rulenode.message-metadata'], |
|
|
|
[FetchTo.DATA, 'rule-node-config.message'], |
|
|
|
[FetchTo.METADATA, 'rule-node-config.message-metadata'], |
|
|
|
]); |
|
|
|
|
|
|
|
export interface ArgumentTypeData { |
|
|
|
@ -748,36 +748,36 @@ export const ArgumentTypeMap = new Map<ArgumentType, ArgumentTypeData>([ |
|
|
|
[ |
|
|
|
ArgumentType.MESSAGE_BODY, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.message-body-type', |
|
|
|
description: 'Fetch argument value from incoming message' |
|
|
|
name: 'rule-node-config.message-body-type', |
|
|
|
description: 'rule-node-config.message-body-type-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentType.MESSAGE_METADATA, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.message-metadata-type', |
|
|
|
description: 'Fetch argument value from incoming message metadata' |
|
|
|
name: 'rule-node-config.message-metadata-type', |
|
|
|
description: 'rule-node-config.message-metadata-type-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentType.ATTRIBUTE, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.attribute-type', |
|
|
|
description: 'Fetch attribute value from database' |
|
|
|
name: 'rule-node-config.attribute-type', |
|
|
|
description: 'rule-node-config.attribute-type-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentType.TIME_SERIES, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.time-series-type', |
|
|
|
description: 'Fetch latest time-series value from database' |
|
|
|
name: 'rule-node-config.time-series-type', |
|
|
|
description: 'rule-node-config.time-series-type-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentType.CONSTANT, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.constant-type', |
|
|
|
description: 'Define constant value' |
|
|
|
name: 'rule-node-config.constant-type', |
|
|
|
description: 'rule-node-config.constant-type-description' |
|
|
|
} |
|
|
|
] |
|
|
|
]); |
|
|
|
@ -786,29 +786,29 @@ export const ArgumentTypeResultMap = new Map<ArgumentTypeResult, ArgumentTypeDat |
|
|
|
[ |
|
|
|
ArgumentTypeResult.MESSAGE_BODY, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.message-body-type', |
|
|
|
description: 'Add result to the outgoing message' |
|
|
|
name: 'rule-node-config.message-body-type', |
|
|
|
description: 'rule-node-config.message-body-type-result-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentTypeResult.MESSAGE_METADATA, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.message-metadata-type', |
|
|
|
description: 'Add result to the outgoing message metadata' |
|
|
|
name: 'rule-node-config.message-metadata-type', |
|
|
|
description: 'rule-node-config.message-metadata-result-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentTypeResult.ATTRIBUTE, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.attribute-type', |
|
|
|
description: 'Store result as an entity attribute in the database' |
|
|
|
name: 'rule-node-config.attribute-type', |
|
|
|
description: 'rule-node-config.attribute-type-result-description' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
ArgumentTypeResult.TIME_SERIES, |
|
|
|
{ |
|
|
|
name: 'tb.rulenode.time-series-type', |
|
|
|
description: 'Store result as an entity time-series in the database' |
|
|
|
name: 'rule-node-config.time-series-type', |
|
|
|
description: 'rule-node-config.time-series-type-result-description' |
|
|
|
} |
|
|
|
] |
|
|
|
]); |
|
|
|
@ -827,9 +827,9 @@ export enum AttributeScopeResult { |
|
|
|
} |
|
|
|
|
|
|
|
export const AttributeScopeMap = new Map<AttributeScope, string>([ |
|
|
|
[AttributeScope.SHARED_SCOPE, 'tb.rulenode.shared-scope'], |
|
|
|
[AttributeScope.SERVER_SCOPE, 'tb.rulenode.server-scope'], |
|
|
|
[AttributeScope.CLIENT_SCOPE, 'tb.rulenode.client-scope'] |
|
|
|
[AttributeScope.SHARED_SCOPE, 'rule-node-config.shared-scope'], |
|
|
|
[AttributeScope.SERVER_SCOPE, 'rule-node-config.server-scope'], |
|
|
|
[AttributeScope.CLIENT_SCOPE, 'rule-node-config.client-scope'] |
|
|
|
]); |
|
|
|
|
|
|
|
export enum PresenceMonitoringStrategy { |
|
|
|
@ -847,14 +847,14 @@ export const PresenceMonitoringStrategiesData = new Map<PresenceMonitoringStrate |
|
|
|
PresenceMonitoringStrategy.ON_EACH_MESSAGE, |
|
|
|
{ |
|
|
|
value: true, |
|
|
|
name: 'tb.rulenode.presence-monitoring-strategy-on-each-message' |
|
|
|
name: 'rule-node-config.presence-monitoring-strategy-on-each-message' |
|
|
|
} |
|
|
|
], |
|
|
|
[ |
|
|
|
PresenceMonitoringStrategy.ON_FIRST_MESSAGE, |
|
|
|
{ |
|
|
|
value: false, |
|
|
|
name: 'tb.rulenode.presence-monitoring-strategy-on-first-message' |
|
|
|
name: 'rule-node-config.presence-monitoring-strategy-on-first-message' |
|
|
|
} |
|
|
|
] |
|
|
|
]); |
|
|
|
|