From 1a4414dca7c4b6ea4c65759c4b37b56c4564e08e Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Fri, 15 Sep 2023 13:27:24 +0300 Subject: [PATCH 01/39] added null-check for search text in sql queries and replaced 'LIKE' operator with case insensetive function 'ilike' --- .../src/main/resources/thingsboard.yml | 1 + .../dao/ThingsboardPostgreSQLDialect.java | 26 +++++++ .../server/dao/sql/alarm/AlarmRepository.java | 72 +++++++++---------- .../server/dao/sql/alarm/JpaAlarmDao.java | 12 ++-- .../dao/sql/asset/AssetProfileRepository.java | 4 +- .../server/dao/sql/asset/AssetRepository.java | 40 +++++------ .../server/dao/sql/asset/JpaAssetDao.java | 26 +++---- .../dao/sql/asset/JpaAssetProfileDao.java | 4 +- .../dao/sql/audit/AuditLogRepository.java | 36 +++++----- .../server/dao/sql/audit/JpaAuditLogDao.java | 8 +-- .../ComponentDescriptorRepository.java | 6 +- .../JpaBaseComponentDescriptorDao.java | 4 +- .../dao/sql/customer/CustomerRepository.java | 2 +- .../dao/sql/customer/JpaCustomerDao.java | 2 +- .../dashboard/DashboardInfoRepository.java | 10 +-- .../sql/dashboard/JpaDashboardInfoDao.java | 10 +-- .../sql/device/DeviceProfileRepository.java | 12 ++-- .../dao/sql/device/DeviceRepository.java | 48 ++++++------- .../server/dao/sql/device/JpaDeviceDao.java | 18 ++--- .../dao/sql/device/JpaDeviceProfileDao.java | 6 +- .../dao/sql/edge/EdgeEventRepository.java | 2 +- .../server/dao/sql/edge/EdgeRepository.java | 18 ++--- .../dao/sql/edge/JpaBaseEdgeEventDao.java | 2 +- .../server/dao/sql/edge/JpaEdgeDao.java | 18 ++--- .../sql/entityview/EntityViewRepository.java | 20 +++--- .../dao/sql/entityview/JpaEntityViewDao.java | 20 +++--- .../sql/notification/JpaNotificationDao.java | 4 +- .../JpaNotificationRequestDao.java | 2 +- .../notification/JpaNotificationRuleDao.java | 4 +- .../JpaNotificationTargetDao.java | 6 +- .../JpaNotificationTemplateDao.java | 2 +- .../notification/NotificationRepository.java | 8 +-- .../NotificationRequestRepository.java | 2 +- .../NotificationRuleRepository.java | 4 +- .../NotificationTargetRepository.java | 4 +- .../NotificationTemplateRepository.java | 4 +- .../dao/sql/ota/JpaOtaPackageInfoDao.java | 4 +- .../dao/sql/ota/OtaPackageInfoRepository.java | 4 +- .../query/DefaultAlarmQueryRepository.java | 2 +- .../query/DefaultEntityQueryRepository.java | 14 ++-- .../server/dao/sql/queue/JpaQueueDao.java | 2 +- .../server/dao/sql/queue/QueueRepository.java | 2 +- .../dao/sql/resource/JpaTbResourceDao.java | 4 +- .../sql/resource/JpaTbResourceInfoDao.java | 2 +- .../resource/TbResourceInfoRepository.java | 4 +- .../sql/resource/TbResourceRepository.java | 4 +- .../server/dao/sql/rule/JpaRuleChainDao.java | 8 +-- .../dao/sql/rule/RuleChainRepository.java | 8 +-- .../server/dao/sql/tenant/JpaTenantDao.java | 4 +- .../dao/sql/tenant/JpaTenantProfileDao.java | 4 +- .../sql/tenant/TenantProfileRepository.java | 4 +- .../dao/sql/tenant/TenantRepository.java | 4 +- .../server/dao/sql/user/JpaUserDao.java | 8 +-- .../server/dao/sql/user/UserRepository.java | 6 +- .../dao/sql/widget/JpaWidgetTypeDao.java | 8 +-- .../dao/sql/widget/JpaWidgetsBundleDao.java | 6 +- .../dao/sql/widget/WidgetTypeRepository.java | 14 ++-- .../sql/widget/WidgetsBundleRepository.java | 6 +- .../resources/application-test.properties | 2 + 59 files changed, 310 insertions(+), 281 deletions(-) create mode 100644 dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 306e9a798c..cff2a67ad1 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -623,6 +623,7 @@ spring.servlet.multipart.max-request-size: "50MB" spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation: "true" # Note: as for current Spring JPA version, custom NullHandling for the Sort.Order is ignored and this parameter is used spring.jpa.properties.hibernate.order_by.default_null_ordering: "${SPRING_JPA_PROPERTIES_HIBERNATE_ORDER_BY_DEFAULT_NULL_ORDERING:last}" +spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # SQL DAO Configuration spring: diff --git a/dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java b/dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java new file mode 100644 index 0000000000..1c70f7387c --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.dao; + +import org.hibernate.dialect.function.SQLFunctionTemplate; +import org.hibernate.type.BooleanType; + +public class ThingsboardPostgreSQLDialect extends org.hibernate.dialect.PostgreSQL10Dialect { + public ThingsboardPostgreSQLDialect() { + super(); + registerFunction("ilike", new SQLFunctionTemplate(BooleanType.INSTANCE, "(?1 ILIKE ?2)")); + } +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java index 30b6c5191d..dc1f9114dd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java @@ -58,9 +58,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + //alarms with relations only @@ -75,9 +75,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAlarms(@Param("tenantId") UUID tenantId, @Param("affectedEntityId") UUID affectedEntityId, @Param("affectedEntityType") String affectedEntityType, @@ -105,9 +105,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + //alarms with relations only @@ -124,9 +124,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAlarmsV2(@Param("tenantId") UUID tenantId, @Param("affectedEntityId") UUID affectedEntityId, @Param("affectedEntityType") String affectedEntityType, @@ -150,9 +150,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ", + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) ", countQuery = "" + "SELECT count(a) " + "FROM AlarmInfoEntity a " + @@ -162,9 +162,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAllAlarms(@Param("tenantId") UUID tenantId, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @@ -186,9 +186,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ", + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) ", countQuery = "" + "SELECT count(a) " + "FROM AlarmInfoEntity a " + @@ -200,9 +200,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAllAlarmsV2(@Param("tenantId") UUID tenantId, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @@ -224,9 +224,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + @@ -237,9 +237,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findCustomerAlarms(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("startTime") Long startTime, @@ -262,9 +262,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + @@ -277,9 +277,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findCustomerAlarmsV2(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("startTime") Long startTime, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java index 358c4aa019..b3aeec305f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java @@ -155,7 +155,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -170,7 +170,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -192,7 +192,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -220,7 +220,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -237,7 +237,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -263,7 +263,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java index b18f80bcd8..f23478e6d5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java @@ -34,14 +34,14 @@ public interface AssetProfileRepository extends JpaRepository findAssetProfiles(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.asset.AssetProfileInfo(a.id, a.tenantId, a.name, a.image, a.defaultDashboardId) " + "FROM AssetProfileEntity a WHERE " + - "a.tenantId = :tenantId AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "a.tenantId = :tenantId AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findAssetProfileInfos(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java index b14f346cd4..c16afc9983 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java @@ -41,7 +41,7 @@ public interface AssetRepository extends JpaRepository, Expor AssetInfoEntity findAssetInfoById(@Param("assetId") UUID assetId); @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @@ -51,17 +51,17 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN CustomerEntity c on c.id = a.customerId " + "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + - "AND (LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(a.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(p.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(a.label, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(p.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true) ") Page findAssetInfosByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -69,7 +69,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.assetProfileId = :profileId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId, @Param("profileId") UUID profileId, @Param("searchText") String searchText, @@ -81,7 +81,7 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findAssetInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -95,7 +95,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -107,9 +107,9 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + "AND a.type = :type " + - "AND (LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(a.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(a.label, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true) ") Page findAssetInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -121,9 +121,9 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + "AND a.assetProfileId = :assetProfileId " + - "AND (LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(a.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(a.label, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true) ") Page findAssetInfosByTenantIdAndAssetProfileId(@Param("tenantId") UUID tenantId, @Param("assetProfileId") UUID assetProfileId, @Param("textSearch") String textSearch, @@ -132,7 +132,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -146,7 +146,7 @@ public interface AssetRepository extends JpaRepository, Expor "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findAssetInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -160,7 +160,7 @@ public interface AssetRepository extends JpaRepository, Expor "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + "AND a.assetProfileId = :assetProfileId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findAssetInfosByTenantIdAndCustomerIdAndAssetProfileId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("assetProfileId") UUID assetProfileId, @@ -175,7 +175,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a, RelationEntity re WHERE a.tenantId = :tenantId " + "AND a.id = re.toId AND re.toType = 'ASSET' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, @@ -185,7 +185,7 @@ public interface AssetRepository extends JpaRepository, Expor "AND a.id = re.toId AND re.toType = 'ASSET' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("type") String type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java index 4c83815d19..e2fe60945d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java @@ -77,7 +77,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A return DaoUtil.toPageData(assetRepository .findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -86,7 +86,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A return DaoUtil.toPageData( assetRepository.findAssetInfosByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -102,7 +102,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A .findByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -112,7 +112,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findAssetInfosByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -134,7 +134,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A .findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -144,7 +144,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findAssetInfosByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -154,7 +154,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findAssetInfosByTenantIdAndAssetProfileId( tenantId, assetProfileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -165,7 +165,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -176,7 +176,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -187,7 +187,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, customerId, assetProfileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -207,7 +207,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findByTenantIdAndProfileId( tenantId, profileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -218,7 +218,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A .findByTenantIdAndEdgeId( tenantId, edgeId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -230,7 +230,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, edgeId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java index fb709b56dc..e34df2f21c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java @@ -69,7 +69,7 @@ public class JpaAssetProfileDao extends JpaAbstractDao "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.userName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.userName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findByTenantId( @Param("tenantId") UUID tenantId, @@ -54,10 +54,10 @@ public interface AuditLogRepository extends JpaRepository "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.userName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.userName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findAuditLogsByTenantIdAndEntityId(@Param("tenantId") UUID tenantId, @Param("entityType") EntityType entityType, @@ -74,11 +74,11 @@ public interface AuditLogRepository extends JpaRepository "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.userName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.userName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @@ -94,10 +94,10 @@ public interface AuditLogRepository extends JpaRepository "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findAuditLogsByTenantIdAndUserId(@Param("tenantId") UUID tenantId, @Param("userId") UUID userId, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java index a605f515d0..f9cbefbca1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java @@ -99,7 +99,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp tenantId, entityId.getEntityType(), entityId.getId(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, @@ -113,7 +113,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp .findAuditLogsByTenantIdAndCustomerId( tenantId, customerId.getId(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, @@ -127,7 +127,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp .findAuditLogsByTenantIdAndUserId( tenantId, userId.getId(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, @@ -139,7 +139,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp return DaoUtil.toPageData( auditLogRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java index aef31602fb..e5b65f5473 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java @@ -36,13 +36,13 @@ public interface ComponentDescriptorRepository extends JpaRepository findByType(@Param("type") ComponentType type, @Param("textSearch") String textSearch, Pageable pageable); - @Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type " + - "AND cd.scope = :scope AND LOWER(cd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + @Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type AND cd.scope = :scope " + + "AND (:textSearch IS NULL OR ilike(cd.name, CONCAT('%', :textSearch, '%')) = true)") Page findByScopeAndType(@Param("type") ComponentType type, @Param("scope") ComponentScope scope, @Param("textSearch") String textSearch, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java index 58a6c784cb..24ed28383c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java @@ -89,7 +89,7 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractDao, ExportableEntityRepository { @Query("SELECT c FROM CustomerEntity c WHERE c.tenantId = :tenantId " + - "AND LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java index a10ea6765c..6dd03625b9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java @@ -58,7 +58,7 @@ public class JpaCustomerDao extends JpaAbstractDao imp public PageData findCustomersByTenantId(UUID tenantId, PageLink pageLink) { return DaoUtil.toPageData(customerRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java index d8b07e9364..bddda18563 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java @@ -32,14 +32,14 @@ public interface DashboardInfoRepository extends JpaRepository findByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " + "AND di.mobileHide = false " + - "AND LOWER(di.title) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(di.title, CONCAT('%', :searchText, '%')) = true)") Page findMobileByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @@ -47,7 +47,7 @@ public interface DashboardInfoRepository extends JpaRepository findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -57,7 +57,7 @@ public interface DashboardInfoRepository extends JpaRepository findMobileByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -66,7 +66,7 @@ public interface DashboardInfoRepository extends JpaRepository findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java index 2e2148f089..b988048db8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java @@ -60,7 +60,7 @@ public class JpaDashboardInfoDao extends JpaAbstractDao findDeviceProfiles(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.DeviceProfileInfo(d.id, d.tenantId, d.name, d.image, d.defaultDashboardId, d.type, d.transportType) " + - "FROM DeviceProfileEntity d WHERE " + - "d.tenantId = :tenantId AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "FROM DeviceProfileEntity d WHERE d.tenantId = :tenantId " + + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceProfileInfos(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.DeviceProfileInfo(d.id, d.tenantId, d.name, d.image, d.defaultDashboardId, d.type, d.transportType) " + - "FROM DeviceProfileEntity d WHERE " + - "d.tenantId = :tenantId AND d.transportType = :transportType AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "FROM DeviceProfileEntity d WHERE d.tenantId = :tenantId AND d.transportType = :transportType " + + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceProfileInfos(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, @Param("transportType") DeviceTransportType transportType, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java index 56f6a7c647..3ca96e7087 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java @@ -35,8 +35,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -44,8 +44,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.deviceProfileId = :profileId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId, @Param("profileId") UUID profileId, @Param("textSearch") String textSearch, @@ -54,8 +54,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceInfoEntity d " + "WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -66,16 +66,16 @@ public interface DeviceRepository extends JpaRepository, Exp Pageable pageable); @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.type = :type " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -84,8 +84,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.deviceProfileId = :deviceProfileId " + "AND d.firmwareId = null " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndTypeAndFirmwareIdIsNull(@Param("tenantId") UUID tenantId, @Param("deviceProfileId") UUID deviceProfileId, @Param("textSearch") String textSearch, @@ -94,8 +94,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.deviceProfileId = :deviceProfileId " + "AND d.softwareId = null " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndTypeAndSoftwareIdIsNull(@Param("tenantId") UUID tenantId, @Param("deviceProfileId") UUID deviceProfileId, @Param("textSearch") String textSearch, @@ -116,8 +116,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + "AND d.type = :type " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -131,10 +131,10 @@ public interface DeviceRepository extends JpaRepository, Exp "AND ((:deviceType) IS NULL OR d.type = :deviceType) " + "AND (:deviceProfileId IS NULL OR d.deviceProfileId = uuid(:deviceProfileId)) " + "AND ((:filterByActive) IS FALSE OR d.active = :deviceActive) " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.type) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.customerTitle) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.type, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.customerTitle, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceInfosByFilter(@Param("tenantId") UUID tenantId, @Param("customerId") String customerId, @Param("edgeId") String edgeId, @@ -163,8 +163,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d, RelationEntity re WHERE d.tenantId = :tenantId " + "AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("textSearch") String textSearch, @@ -174,8 +174,8 @@ public interface DeviceRepository extends JpaRepository, Exp "AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + "AND d.type = :type " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("type") String type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java index 9b63e945ea..bf7d8670b1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java @@ -98,7 +98,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement return DaoUtil.toPageData( deviceRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } } @@ -114,7 +114,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement DaoUtil.getStringId(filter.getDeviceProfileId()), filter.getActive() != null, Boolean.TRUE.equals(filter.getActive()), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -139,7 +139,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement deviceRepository.findByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -149,7 +149,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement deviceRepository.findByTenantIdAndProfileId( tenantId, profileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -176,7 +176,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement deviceRepository.findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -186,7 +186,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement OtaPackageType type, PageLink pageLink) { Pageable pageable = DaoUtil.toPageable(pageLink); - String searchText = Objects.toString(pageLink.getTextSearch(), ""); + String searchText = pageLink.getTextSearch(); Page page = OtaPackageUtil.getByOtaPackageType( () -> deviceRepository.findByTenantIdAndTypeAndFirmwareIdIsNull(tenantId, deviceProfileId, searchText, pageable), () -> deviceRepository.findByTenantIdAndTypeAndSoftwareIdIsNull(tenantId, deviceProfileId, searchText, pageable), @@ -211,7 +211,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -247,7 +247,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement .findByTenantIdAndEdgeId( tenantId, edgeId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -259,7 +259,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement tenantId, edgeId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java index f500600722..7b334330fd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java @@ -73,7 +73,7 @@ public class JpaDeviceProfileDao extends JpaAbstractDao :seqIdStart) " + "AND (:seqIdEnd IS NULL OR e.seqId < :seqIdEnd) " + - "AND LOWER(e.edgeEventType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + "AND (:textSearch IS NULL OR ilike(e.edgeEventType, CONCAT('%', :textSearch, '%')) = true)" ) Page findEdgeEventsByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java index 533421015b..f632ef92ef 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java @@ -30,7 +30,7 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -43,7 +43,7 @@ public interface EdgeRepository extends JpaRepository { EdgeInfoEntity findEdgeInfoById(@Param("edgeId") UUID edgeId); @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @@ -52,14 +52,14 @@ public interface EdgeRepository extends JpaRepository { "FROM EdgeEntity d " + "LEFT JOIN CustomerEntity c on c.id = d.customerId " + "WHERE d.tenantId = :tenantId " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND d.type = :type " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -70,7 +70,7 @@ public interface EdgeRepository extends JpaRepository { "LEFT JOIN CustomerEntity c on c.id = d.customerId " + "WHERE d.tenantId = :tenantId " + "AND d.type = :type " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -79,7 +79,7 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + "AND d.type = :type " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -91,7 +91,7 @@ public interface EdgeRepository extends JpaRepository { "LEFT JOIN CustomerEntity c on c.id = a.customerId " + "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -103,7 +103,7 @@ public interface EdgeRepository extends JpaRepository { "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -113,7 +113,7 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT ee FROM EdgeEntity ee, RelationEntity re WHERE ee.tenantId = :tenantId " + "AND ee.id = re.fromId AND re.fromType = 'EDGE' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.toId = :entityId AND re.toType = :entityType " + - "AND LOWER(ee.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(ee.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndEntityId(@Param("tenantId") UUID tenantId, @Param("entityId") UUID entityId, @Param("entityType") String entityType, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java index 9f2eaae273..91aa61baf4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java @@ -185,7 +185,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractDao implements Edge return DaoUtil.toPageData( edgeRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -84,7 +84,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -106,7 +106,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -117,7 +117,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -127,7 +127,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findEdgeInfosByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -138,7 +138,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -153,7 +153,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findEdgeInfosByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -162,7 +162,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge return DaoUtil.toPageData( edgeRepository.findEdgeInfosByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -180,7 +180,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge tenantId, entityId, entityType.name(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java index 1478e23a54..91dde5e36c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java @@ -39,7 +39,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @@ -48,14 +48,14 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " + "AND e.type = :type " + - "AND LOWER(e.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(e.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -66,7 +66,7 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -74,7 +74,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -85,7 +85,7 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -94,7 +94,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -107,7 +107,7 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -124,7 +124,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, @@ -134,7 +134,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("type") String type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java index e3e9edf80d..1bc9705eb6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java @@ -74,7 +74,7 @@ public class JpaEntityViewDao extends JpaAbstractDao findUnreadByRecipientIdAndPageLink(TenantId tenantId, UserId recipientId, PageLink pageLink) { return DaoUtil.toPageData(notificationRepository.findByRecipientIdAndStatusNot(recipientId.getId(), NotificationStatus.READ, - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override public PageData findByRecipientIdAndPageLink(TenantId tenantId, UserId recipientId, PageLink pageLink) { return DaoUtil.toPageData(notificationRepository.findByRecipientId(recipientId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java index 53b8318d3f..3464133fdd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java @@ -61,7 +61,7 @@ public class JpaNotificationRequestDao extends JpaAbstractDao findInfosByTenantIdAndOriginatorTypeAndPageLink(TenantId tenantId, EntityType originatorType, PageLink pageLink) { return DaoUtil.pageToPageData(notificationRequestRepository.findInfosByTenantIdAndOriginatorEntityTypeAndSearchText(tenantId.getId(), - originatorType, Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink, Map.of( + originatorType, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, Map.of( "templateName", "t.name" )))) .mapData(NotificationRequestInfoEntity::toData); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java index af9b8198e8..a5eb7ce527 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java @@ -49,13 +49,13 @@ public class JpaNotificationRuleDao extends JpaAbstractDao findByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(notificationRuleRepository.findByTenantIdAndSearchText(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override public PageData findInfosByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { return DaoUtil.pageToPageData(notificationRuleRepository.findInfosByTenantIdAndSearchText(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink, Map.of( + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, Map.of( "templateName", "t.name" )))) .mapData(NotificationRuleInfoEntity::toData); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java index 64c679c845..bfa1d1b979 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java @@ -48,13 +48,13 @@ public class JpaNotificationTargetDao extends JpaAbstractDao findByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(notificationTargetRepository.findByTenantIdAndSearchText(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override public PageData findByTenantIdAndSupportedNotificationTypeAndPageLink(TenantId tenantId, NotificationType notificationType, PageLink pageLink) { return DaoUtil.toPageData(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), + pageLink.getTextSearch(), Arrays.stream(UsersFilterType.values()) .filter(type -> notificationType != NotificationType.GENERAL || !type.isForRules()) .map(Enum::name).collect(Collectors.toList()), @@ -68,7 +68,7 @@ public class JpaNotificationTargetDao extends JpaAbstractDao findByTenantIdAndUsersFilterType(TenantId tenantId, UsersFilterType filterType) { - return DaoUtil.convertDataList(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), "", + return DaoUtil.convertDataList(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), null, List.of(filterType.name()), DaoUtil.toPageable(new PageLink(Integer.MAX_VALUE))).getContent()); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java index 8a7cecb3d1..6e3e353b3d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java @@ -50,7 +50,7 @@ public class JpaNotificationTemplateDao extends JpaAbstractDao findByTenantIdAndNotificationTypesAndPageLink(TenantId tenantId, List notificationTypes, PageLink pageLink) { return DaoUtil.toPageData(notificationTemplateRepository.findByTenantIdAndNotificationTypesAndSearchText(tenantId.getId(), - notificationTypes, Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + notificationTypes, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java index c08a3c290e..cd4a538686 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java @@ -32,16 +32,16 @@ import java.util.UUID; public interface NotificationRepository extends JpaRepository { @Query("SELECT n FROM NotificationEntity n WHERE n.recipientId = :recipientId AND n.status <> :status " + - "AND (:searchText = '' OR lower(n.subject) LIKE lower(concat('%', :searchText, '%')) " + - "OR lower(n.text) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR ilike(n.subject, concat('%', :searchText, '%')) = true " + + "OR ilike(n.text, concat('%', :searchText, '%')) = true)") Page findByRecipientIdAndStatusNot(@Param("recipientId") UUID recipientId, @Param("status") NotificationStatus status, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT n FROM NotificationEntity n WHERE n.recipientId = :recipientId " + - "AND (:searchText = '' OR lower(n.subject) LIKE lower(concat('%', :searchText, '%')) " + - "OR lower(n.text) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR ilike(n.subject, concat('%', :searchText, '%')) = true " + + "OR ilike(n.text, concat('%', :searchText, '%')) = true)") Page findByRecipientId(@Param("recipientId") UUID recipientId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java index 126295616f..e7abd8e23f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java @@ -41,7 +41,7 @@ public interface NotificationRequestRepository extends JpaRepository findByTenantIdAndOriginatorEntityType(UUID tenantId, EntityType originatorType, Pageable pageable); @Query(REQUEST_INFO_QUERY + " WHERE r.tenantId = :tenantId AND r.originatorEntityType = :originatorType " + - "AND (:searchText = '' OR t.name IS NOT NULL AND lower(t.name) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR (t.name IS NOT NULL AND ilike(t.name, concat('%', :searchText, '%')) = true))") Page findInfosByTenantIdAndOriginatorEntityTypeAndSearchText(@Param("tenantId") UUID tenantId, @Param("originatorType") EntityType originatorType, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java index 9dfb34c18d..a9d7b6544f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java @@ -37,7 +37,7 @@ public interface NotificationRuleRepository extends JpaRepository findByTenantIdAndSearchText(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @@ -52,7 +52,7 @@ public interface NotificationRuleRepository extends JpaRepository findInfosByTenantIdAndSearchText(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java index 278fea696e..c44f9f4d41 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java @@ -32,13 +32,13 @@ import java.util.UUID; public interface NotificationTargetRepository extends JpaRepository, ExportableEntityRepository { @Query("SELECT t FROM NotificationTargetEntity t WHERE t.tenantId = :tenantId " + - "AND (:searchText = '' OR lower(t.name) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR ilike(t.name, concat('%', :searchText, '%')) = true)") Page findByTenantIdAndSearchText(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Query(value = "SELECT * FROM notification_target t WHERE t.tenant_id = :tenantId " + - "AND (:searchText = '' OR lower(t.name) LIKE lower(concat('%', :searchText, '%'))) " + + "AND (:searchText IS NULL OR ilike(t.name, concat('%', :searchText, '%')) = true) " + "AND (cast(t.configuration as json) ->> 'type' <> 'PLATFORM_USERS' OR " + "cast(t.configuration as json) -> 'usersFilter' ->> 'type' IN :usersFilterTypes)", nativeQuery = true) Page findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(@Param("tenantId") UUID tenantId, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java index 73a25b98c3..5224c07de9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java @@ -34,8 +34,8 @@ public interface NotificationTemplateRepository extends JpaRepository findByTenantIdAndNotificationTypesAndSearchText(@Param("tenantId") UUID tenantId, @Param("notificationTypes") List notificationTypes, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java index f50dd6ed0f..8a65bee2e1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java @@ -73,7 +73,7 @@ public class JpaOtaPackageInfoDao extends JpaAbstractDao { @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.tag, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, CASE WHEN (f.data IS NOT NULL OR f.url IS NOT NULL) THEN true ELSE false END) FROM OtaPackageEntity f WHERE " + "f.tenantId = :tenantId " + - "AND LOWER(f.title) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(f.title, CONCAT('%', :searchText, '%')) = true)") Page findAllByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @@ -38,7 +38,7 @@ public interface OtaPackageInfoRepository extends JpaRepository findAllByTenantIdAndTypeAndDeviceProfileIdAndHasData(@Param("tenantId") UUID tenantId, @Param("deviceProfileId") UUID deviceProfileId, @Param("type") OtaPackageType type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java index 04e978c7d4..a707b9c196 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java @@ -406,7 +406,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { .map(mapping -> { String paramName = mapping + "_lowerSearchText"; ctx.addStringParameter(paramName, lowerSearchText); - return String.format("LOWER(cast(%s as varchar)) LIKE concat('%%', :%s, '%%')", mapping, paramName); + return String.format("cast(%s as varchar) ILIKE concat('%%', :%s, '%%')", mapping, paramName); } ).collect(Collectors.toList()); return String.format("%s", String.join(" or ", searchPredicates)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index 4cf6db0fc1..a49d8bbf24 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -801,8 +801,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { private String buildTextSearchQuery(QueryContext ctx, List selectionMapping, String searchText) { if (!StringUtils.isEmpty(searchText) && !selectionMapping.isEmpty()) { - String lowerSearchText = "%" + searchText.toLowerCase() + "%"; - ctx.addStringParameter("lowerSearchTextParam", lowerSearchText); + String sqlSearchText = "%" + searchText + "%"; + ctx.addStringParameter("lowerSearchTextParam", sqlSearchText); List searchAliases = selectionMapping.stream().filter(EntityKeyMapping::isSearchable).map(EntityKeyMapping::getValueAlias).collect(Collectors.toList()); String searchAliasesExpression; if (searchAliases.size() > 1) { @@ -810,7 +810,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { } else { searchAliasesExpression = searchAliases.get(0); } - return String.format(" WHERE LOWER(%s) LIKE :%s", searchAliasesExpression, "lowerSearchTextParam"); + return String.format(" WHERE %s ILIKE :%s", searchAliasesExpression, "lowerSearchTextParam"); } else { return ""; } @@ -830,10 +830,10 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter()); String nameColumn = getNameColumn(filter.getEntityType()); if (filter.getEntityNameFilter().startsWith("%") || filter.getEntityNameFilter().endsWith("%")) { - return String.format("lower(e.%s) like lower(:entity_filter_name_filter)", nameColumn); + return String.format("e.%s ilike :entity_filter_name_filter", nameColumn); } - return String.format("lower(e.%s) like lower(concat(:entity_filter_name_filter, '%%'))", nameColumn); + return String.format("e.%s ilike concat(:entity_filter_name_filter, '%%')", nameColumn); } private String typeQuery(QueryContext ctx, EntityFilter filter) { @@ -869,9 +869,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { if (!StringUtils.isEmpty(name)) { ctx.addStringParameter("entity_filter_type_query_name", name); if (name.startsWith("%") || name.endsWith("%")) { - return typesFilter + " and lower(e." + nameColumn + ") like lower(:entity_filter_type_query_name)"; + return typesFilter + " and e." + nameColumn + " ilike :entity_filter_type_query_name"; } - return typesFilter + " and lower(e." + nameColumn + ") like lower(concat(:entity_filter_type_query_name, '%%'))"; + return typesFilter + " and e." + nameColumn + " ilike concat(:entity_filter_type_query_name, '%%')"; } else { return typesFilter; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java index ed51f6cab0..7cd3314d5f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java @@ -84,6 +84,6 @@ public class JpaQueueDao extends JpaAbstractDao implements Q @Override public PageData findQueuesByTenantId(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(queueRepository - .findByTenantId(tenantId.getId(), Objects.toString(pageLink.getTextSearch(), ""), DaoUtil.toPageable(pageLink))); + .findByTenantId(tenantId.getId(), pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java index 8b11bbcef5..11805a3109 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java @@ -33,7 +33,7 @@ public interface QueueRepository extends JpaRepository { List findByTenantId(UUID tenantId); @Query("SELECT q FROM QueueEntity q WHERE q.tenantId = :tenantId " + - "AND LOWER(q.name) LIKE LOWER(CONCAT(:textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(q.name, CONCAT(:textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java index 9b6ef62501..641fda927b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java @@ -74,7 +74,7 @@ public class JpaTbResourceDao extends JpaAbstractDao { @Query("SELECT tr FROM TbResourceInfoEntity tr WHERE " + - "LOWER(tr.title) LIKE LOWER(CONCAT('%', :searchText, '%'))" + + "(:searchText IS NULL OR ilike(tr.title, CONCAT('%', :searchText, '%')) = true) " + "AND (tr.tenantId = :tenantId " + "OR (tr.tenantId = :systemAdminId " + "AND NOT EXISTS " + @@ -45,7 +45,7 @@ public interface TbResourceInfoRepository extends JpaRepository findTenantResourcesByTenantId(@Param("tenantId") UUID tenantId, @Param("resourceType") String resourceType, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java index 54494673a1..3a881f5206 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java @@ -33,7 +33,7 @@ public interface TbResourceRepository extends JpaRepository return DaoUtil.toPageData(ruleChainRepository .findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -72,7 +72,7 @@ public class JpaRuleChainDao extends JpaAbstractDao .findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -89,7 +89,7 @@ public class JpaRuleChainDao extends JpaAbstractDao .findByTenantIdAndEdgeId( tenantId, edgeId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -99,7 +99,7 @@ public class JpaRuleChainDao extends JpaAbstractDao return DaoUtil.toPageData(ruleChainRepository .findAutoAssignByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java index 8cc57c62ce..4b6b5a0db7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java @@ -30,14 +30,14 @@ import java.util.UUID; public interface RuleChainRepository extends JpaRepository, ExportableEntityRepository { @Query("SELECT rc FROM RuleChainEntity rc WHERE rc.tenantId = :tenantId " + - "AND LOWER(rc.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(rc.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT rc FROM RuleChainEntity rc WHERE rc.tenantId = :tenantId " + "AND rc.type = :type " + - "AND LOWER(rc.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(rc.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") RuleChainType type, @Param("searchText") String searchText, @@ -46,7 +46,7 @@ public interface RuleChainRepository extends JpaRepository findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, @@ -55,7 +55,7 @@ public interface RuleChainRepository extends JpaRepository findAutoAssignByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java index 9f01494e5c..6f0b810817 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java @@ -67,7 +67,7 @@ public class JpaTenantDao extends JpaAbstractDao implement public PageData findTenants(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(tenantRepository .findTenantsNextPage( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -75,7 +75,7 @@ public class JpaTenantDao extends JpaAbstractDao implement public PageData findTenantInfos(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(tenantRepository .findTenantInfosNextPage( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, TenantInfoEntity.tenantInfoColumnMap))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java index 2d65326b50..e74d2d555d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java @@ -60,7 +60,7 @@ public class JpaTenantProfileDao extends JpaAbstractDao findTenantProfiles(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData( tenantProfileRepository.findTenantProfiles( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -68,7 +68,7 @@ public class JpaTenantProfileDao extends JpaAbstractDao findTenantProfileInfos(TenantId tenantId, PageLink pageLink) { return DaoUtil.pageToPageData( tenantProfileRepository.findTenantProfileInfos( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java index a42dc1c797..57cd8fc06f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java @@ -34,13 +34,13 @@ public interface TenantProfileRepository extends JpaRepository findTenantProfiles(@Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.EntityInfo(t.id, 'TENANT_PROFILE', t.name) " + "FROM TenantProfileEntity t " + - "WHERE LOWER(t.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "WHERE (:textSearch IS NULL OR ilike(t.name, CONCAT('%', :textSearch, '%')) = true)") Page findTenantProfileInfos(@Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java index 5174e3af83..c5340de615 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java @@ -37,14 +37,14 @@ public interface TenantRepository extends JpaRepository { "WHERE t.id = :tenantId") TenantInfoEntity findTenantInfoById(@Param("tenantId") UUID tenantId); - @Query("SELECT t FROM TenantEntity t WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + @Query("SELECT t FROM TenantEntity t WHERE (:textSearch IS NULL OR ilike(t.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantsNextPage(@Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.dao.model.sql.TenantInfoEntity(t, p.name) " + "FROM TenantEntity t " + "LEFT JOIN TenantProfileEntity p on p.id = t.tenantProfileId " + - "WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "WHERE (:textSearch IS NULL OR ilike(t.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantInfosNextPage(@Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java index e1282f7150..391981b8f4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java @@ -74,7 +74,7 @@ public class JpaUserDao extends JpaAbstractDao implements User userRepository .findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -85,7 +85,7 @@ public class JpaUserDao extends JpaAbstractDao implements User .findUsersByAuthority( tenantId, NULL_UUID, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), Authority.TENANT_ADMIN, DaoUtil.toPageable(pageLink))); } @@ -97,7 +97,7 @@ public class JpaUserDao extends JpaAbstractDao implements User .findUsersByAuthority( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), Authority.CUSTOMER_USER, DaoUtil.toPageable(pageLink))); @@ -110,7 +110,7 @@ public class JpaUserDao extends JpaAbstractDao implements User .findTenantAndCustomerUsers( tenantId, DaoUtil.toUUIDs(customerIds), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java index c24c66fc7c..ab7a537ec7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java @@ -37,7 +37,7 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + "AND u.customerId = :customerId AND u.authority = :authority " + - "AND LOWER(u.email) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(u.email, CONCAT('%', :searchText, '%')) = true)") Page findUsersByAuthority(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -46,14 +46,14 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + "AND u.customerId IN (:customerIds) " + - "AND LOWER(u.email) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(u.email, CONCAT('%', :searchText, '%')) = true)") Page findTenantAndCustomerUsers(@Param("tenantId") UUID tenantId, @Param("customerIds") Collection customerIds, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + - "AND LOWER(u.email) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(u.email, CONCAT('%', :searchText, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java index 0548ad814d..81515f6ca7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java @@ -83,7 +83,7 @@ public class JpaWidgetTypeDao extends JpaAbstractDao findSystemWidgetTypes(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, @Param("fullSearch") boolean fullSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId IN (:tenantId, :nullTenantId) " + - "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))") + "AND ((:searchText IS NULL OR ilike(wtd.name, CONCAT('%', :searchText, '%')) = true) " + + "OR ((:fullSearch) IS TRUE AND ilike(wtd.description, CONCAT('%', :searchText, '%')) = true))") Page findAllTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, @Param("searchText") String searchText, @@ -55,15 +55,15 @@ public interface WidgetTypeRepository extends JpaRepository findTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, @Param("fullSearch") boolean fullSearch, Pageable pageable); @Query("SELECT wtd FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId = :tenantId " + - "AND LOWER(wtd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(wtd.name, CONCAT('%', :textSearch, '%')) = true)") Page findTenantWidgetTypeDetailsByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 7a6ba68a36..ca54fd4e62 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -33,19 +33,19 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :tenantId " + - "AND LOWER(wb.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(wb.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId IN (:tenantId, :nullTenantId) " + - "AND LOWER(wb.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(wb.title, CONCAT('%', :textSearch, '%')) = true)") Page findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, @Param("textSearch") String textSearch, diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties index 8cadda8083..05f2cf7670 100644 --- a/dao/src/test/resources/application-test.properties +++ b/dao/src/test/resources/application-test.properties @@ -139,3 +139,5 @@ queue.rule-engine.queues[2].partitions=2 queue.rule-engine.queues[2].processing-strategy.retries=1 queue.rule-engine.queues[2].processing-strategy.pause-between-retries=0 queue.rule-engine.queues[2].processing-strategy.max-pause-between-retries=0 + +spring.jpa.properties.hibernate.dialect=org.thingsboard.server.dao.ThingsboardPostgreSQLDialect \ No newline at end of file From e03e276c5a17266443a6652c723ea15db0b38399 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 9 Oct 2023 13:17:17 +0300 Subject: [PATCH 02/39] fixed sql syntax --- .../server/dao/sql/widget/WidgetsBundleRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index d185d50509..53bda50ba4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -33,7 +33,7 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId, @Param("textSearch") String textSearch, Pageable pageable); From 55b275eeef463d0ec5a9c79f5768b3c71e45d577 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 10 Oct 2023 13:07:33 +0300 Subject: [PATCH 03/39] added yml parameter description --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index f9237b23e7..17d29fc214 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -690,7 +690,7 @@ spring.servlet.multipart.max-request-size: "50MB" # Total request size for a mul spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation: "true" #Fix Postgres JPA Error (Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented) spring.jpa.properties.hibernate.order_by.default_null_ordering: "${SPRING_JPA_PROPERTIES_HIBERNATE_ORDER_BY_DEFAULT_NULL_ORDERING:last}" # Note: as for current Spring JPA version, custom NullHandling for the Sort.Order is ignored and this parameter is used -spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" +spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # we use custom dialect that contains ilike(arg1, arg2) function (is interpreted to postgres ILIKE operator) # SQL DAO Configuration spring: From c195fd5a4cbadb1b235b5cb1a203a58ab856bbd7 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 17 Oct 2023 19:44:50 +0300 Subject: [PATCH 04/39] added ability to add global prefix for all topics --- .../DefaultNotificationCenter.java | 6 +- .../queue/DefaultTbClusterService.java | 24 +++--- .../DefaultSubscriptionManagerService.java | 16 ++-- .../DefaultTbCoreToTransportService.java | 10 +-- .../src/main/resources/thingsboard.yml | 1 + .../discovery/HashPartitionServiceTest.java | 5 +- .../queue/DefaultTbClusterServiceTest.java | 86 +++++++++---------- .../queue/discovery/HashPartitionService.java | 11 ++- ...onsTopicService.java => TopicService.java} | 19 +++- .../RemoteNotificationRuleProcessor.java | 6 +- .../provider/AwsSqsMonolithQueueFactory.java | 42 ++++----- .../provider/AwsSqsTbCoreQueueFactory.java | 36 ++++---- .../AwsSqsTbRuleEngineQueueFactory.java | 26 +++--- .../AwsSqsTbVersionControlQueueFactory.java | 12 ++- .../provider/AwsSqsTransportQueueFactory.java | 20 +++-- .../InMemoryMonolithQueueFactory.java | 42 ++++----- .../InMemoryTbTransportQueueFactory.java | 20 +++-- .../provider/KafkaMonolithQueueFactory.java | 58 ++++++------- .../provider/KafkaTbCoreQueueFactory.java | 46 +++++----- .../KafkaTbRuleEngineQueueFactory.java | 28 +++--- .../KafkaTbTransportQueueFactory.java | 24 +++--- .../KafkaTbVersionControlQueueFactory.java | 14 +-- .../provider/PubSubMonolithQueueFactory.java | 12 +-- .../provider/PubSubTbCoreQueueFactory.java | 10 +-- .../PubSubTbRuleEngineQueueFactory.java | 26 +++--- .../PubSubTbVersionControlQueueFactory.java | 12 ++- .../provider/PubSubTransportQueueFactory.java | 20 +++-- .../RabbitMqMonolithQueueFactory.java | 42 ++++----- .../provider/RabbitMqTbCoreQueueFactory.java | 34 ++++---- .../RabbitMqTbRuleEngineQueueFactory.java | 26 +++--- .../RabbitMqTbVersionControlQueueFactory.java | 12 ++- .../RabbitMqTransportQueueFactory.java | 20 +++-- .../ServiceBusMonolithQueueFactory.java | 40 ++++----- .../ServiceBusTbCoreQueueFactory.java | 34 ++++---- .../ServiceBusTbRuleEngineQueueFactory.java | 26 +++--- ...erviceBusTbVersionControlQueueFactory.java | 12 ++- .../ServiceBusTransportQueueFactory.java | 20 +++-- .../service/DefaultTransportService.java | 11 ++- .../DefaultClusterVersionControlService.java | 6 +- .../src/main/resources/tb-vc-executor.yml | 1 + .../src/main/resources/tb-coap-transport.yml | 1 + .../src/main/resources/tb-http-transport.yml | 1 + .../src/main/resources/tb-lwm2m-transport.yml | 1 + .../src/main/resources/tb-mqtt-transport.yml | 1 + .../src/main/resources/tb-snmp-transport.yml | 1 + 45 files changed, 496 insertions(+), 425 deletions(-) rename common/queue/src/main/java/org/thingsboard/server/queue/discovery/{NotificationsTopicService.java => TopicService.java} (75%) diff --git a/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java b/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java index f6c77691da..b4ba871edf 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java @@ -64,7 +64,7 @@ import org.thingsboard.server.dao.notification.NotificationTemplateService; import org.thingsboard.server.dao.util.limits.RateLimitService; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.service.executors.NotificationExecutorService; import org.thingsboard.server.service.notification.channels.NotificationChannel; @@ -94,7 +94,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple private final NotificationTemplateService notificationTemplateService; private final NotificationSettingsService notificationSettingsService; private final NotificationExecutorService notificationExecutor; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueProducerProvider producerProvider; private final RateLimitService rateLimitService; @@ -431,7 +431,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple TransportProtos.ToCoreNotificationMsg notificationRequestUpdateProto = TbSubscriptionUtils.notificationRequestUpdateToProto(tenantId, update); Set coreServices = new HashSet<>(partitionService.getAllServiceIds(ServiceType.TB_CORE)); for (String serviceId : coreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); producerProvider.getTbCoreNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), notificationRequestUpdateProto), null); } }); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java index 53ef38d96a..4cf290ed37 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java @@ -68,7 +68,7 @@ import org.thingsboard.server.queue.TbQueueCallback; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.MultipleTbQueueCallbackWrapper; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.DataDecodingEncodingService; @@ -109,7 +109,7 @@ public class DefaultTbClusterService implements TbClusterService { @Lazy private OtaPackageStateService otaPackageStateService; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final DataDecodingEncodingService encodingService; private final TbDeviceProfileCache deviceProfileCache; private final TbAssetProfileCache assetProfileCache; @@ -149,7 +149,7 @@ public class DefaultTbClusterService implements TbClusterService { @Override public void pushNotificationToCore(String serviceId, FromDeviceRpcResponse response, TbQueueCallback callback) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); log.trace("PUSHING msg: {} to:{}", response, tpi); FromDeviceRPCResponseProto.Builder builder = FromDeviceRPCResponseProto.newBuilder() .setRequestIdMSB(response.getId().getMostSignificantBits()) @@ -224,7 +224,7 @@ public class DefaultTbClusterService implements TbClusterService { @Override public void pushNotificationToRuleEngine(String serviceId, FromDeviceRpcResponse response, TbQueueCallback callback) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); log.trace("PUSHING msg: {} to:{}", response, tpi); FromDeviceRPCResponseProto.Builder builder = FromDeviceRPCResponseProto.newBuilder() .setRequestIdMSB(response.getId().getMostSignificantBits()) @@ -245,7 +245,7 @@ public class DefaultTbClusterService implements TbClusterService { } return; } - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceId); log.trace("PUSHING msg: {} to:{}", response, tpi); producerProvider.getTransportNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), response), callback); toTransportNfs.incrementAndGet(); @@ -353,7 +353,7 @@ public class DefaultTbClusterService implements TbClusterService { Set tbTransportServices = partitionService.getAllServiceIds(ServiceType.TB_TRANSPORT); TbQueueCallback proxyCallback = callback != null ? new MultipleTbQueueCallbackWrapper(tbTransportServices.size(), callback) : null; for (String transportServiceId : tbTransportServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); toTransportNfProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), transportMsg), proxyCallback); toTransportNfs.incrementAndGet(); } @@ -388,7 +388,7 @@ public class DefaultTbClusterService implements TbClusterService { TbQueueProducer> toCoreNfProducer = producerProvider.getTbCoreNotificationsMsgProducer(); Set tbCoreServices = partitionService.getAllServiceIds(ServiceType.TB_CORE); for (String serviceId : tbCoreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); toCoreNfProducer.send(tpi, new TbProtoQueueMsg<>(edgeId.getId(), toCoreMsg), null); toCoreNfs.incrementAndGet(); } @@ -412,7 +412,7 @@ public class DefaultTbClusterService implements TbClusterService { TbQueueProducer> toCoreNfProducer = producerProvider.getTbCoreNotificationsMsgProducer(); Set tbCoreServices = partitionService.getAllServiceIds(ServiceType.TB_CORE); for (String serviceId : tbCoreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setComponentLifecycleMsg(ByteString.copyFrom(msgBytes)).build(); toCoreNfProducer.send(tpi, new TbProtoQueueMsg<>(msg.getEntityId().getId(), toCoreMsg), null); toCoreNfs.incrementAndGet(); @@ -421,7 +421,7 @@ public class DefaultTbClusterService implements TbClusterService { tbRuleEngineServices.removeAll(tbCoreServices); } for (String serviceId : tbRuleEngineServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); ToRuleEngineNotificationMsg toRuleEngineMsg = ToRuleEngineNotificationMsg.newBuilder().setComponentLifecycleMsg(ByteString.copyFrom(msgBytes)).build(); toRuleEngineProducer.send(tpi, new TbProtoQueueMsg<>(msg.getEntityId().getId(), toRuleEngineMsg), null); toRuleEngineNfs.incrementAndGet(); @@ -576,17 +576,17 @@ public class DefaultTbClusterService implements TbClusterService { tbCoreServices.removeAll(tbRuleEngineServices); for (String ruleEngineServiceId : tbRuleEngineServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngineServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngineServiceId); producerProvider.getRuleEngineNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), ruleEngineMsg), null); toRuleEngineNfs.incrementAndGet(); } for (String coreServiceId : tbCoreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, coreServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, coreServiceId); producerProvider.getTbCoreNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), coreMsg), null); toCoreNfs.incrementAndGet(); } for (String transportServiceId : tbTransportServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); producerProvider.getTransportNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), transportMsg), null); toTransportNfs.incrementAndGet(); } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java index 60fce13560..4feefc5a68 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java @@ -51,7 +51,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdate import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbApplicationEventListener; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; @@ -90,7 +90,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene private final AttributesService attrService; private final TimeseriesService tsService; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final PartitionService partitionService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueProducerProvider producerProvider; @@ -356,7 +356,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } else { log.trace("[{}][{}][{}] Subscription session is not managed by current service (update: {})", subscription.getServiceId(), subscription.getEntityId(), subscription.getSessionId(), subscriptionUpdate); - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); ToCoreNotificationMsg updateProto = TbSubscriptionUtils.notificationsSubUpdateToProto(subscription, subscriptionUpdate); TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(subscription.getEntityId().getId(), updateProto); toCoreNotificationsProducer.send(tpi, queueMsg, null); @@ -439,7 +439,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(s.getSubscriptionId(), subscriptionUpdate); localSubscriptionService.onSubscriptionUpdate(s.getSessionId(), update, TbCallback.EMPTY); } else { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); toCoreNotificationsProducer.send(tpi, toProto(s, subscriptionUpdate, ignoreEmptyUpdates), null); } } @@ -464,7 +464,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene AlarmSubscriptionUpdate update = new AlarmSubscriptionUpdate(s.getSubscriptionId(), alarm, deleted); localSubscriptionService.onSubscriptionUpdate(s.getSessionId(), update, TbCallback.EMPTY); } else { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); toCoreNotificationsProducer.send(tpi, toProto(s, alarm, deleted), null); } }); @@ -504,7 +504,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } }); if (!missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); } }, @@ -527,7 +527,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene DonAsynchron.withCallback(tsService.findLatest(subscription.getTenantId(), subscription.getEntityId(), subscription.getKeyStates().keySet()), missedUpdates -> { if (missedUpdates != null && !missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); } }, @@ -546,7 +546,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene DonAsynchron.withCallback(tsService.findAll(subscription.getTenantId(), subscription.getEntityId(), queries), missedUpdates -> { if (missedUpdates != null && !missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); } }, diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java index b87758ace5..380ba34f91 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java @@ -24,7 +24,7 @@ import org.thingsboard.server.queue.TbQueueCallback; import org.thingsboard.server.queue.TbQueueMsgMetadata; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.TbCoreComponent; @@ -38,11 +38,11 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; @TbCoreComponent public class DefaultTbCoreToTransportService implements TbCoreToTransportService { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueProducer> tbTransportProducer; - public DefaultTbCoreToTransportService(NotificationsTopicService notificationsTopicService, TbQueueProducerProvider tbQueueProducerProvider) { - this.notificationsTopicService = notificationsTopicService; + public DefaultTbCoreToTransportService(TopicService topicService, TbQueueProducerProvider tbQueueProducerProvider) { + this.topicService = topicService; this.tbTransportProducer = tbQueueProducerProvider.getTransportNotificationsMsgProducer(); } @@ -60,7 +60,7 @@ public class DefaultTbCoreToTransportService implements TbCoreToTransportService } return; } - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, nodeId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, nodeId); UUID sessionId = new UUID(msg.getSessionIdMSB(), msg.getSessionIdLSB()); log.trace("[{}][{}] Pushing session data to topic: {}", tpi.getFullTopicName(), sessionId, msg); TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(NULL_UUID, msg); diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index b511989c8b..3454be5ade 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1270,6 +1270,7 @@ swagger: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default in_memory: stats: # For debug level diff --git a/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java b/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java index ef87794d96..511faa6a2b 100644 --- a/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java @@ -77,6 +77,7 @@ public class HashPartitionServiceTest { private TenantRoutingInfoService routingInfoService; private ApplicationEventPublisher applicationEventPublisher; private QueueRoutingInfoService queueRoutingInfoService; + private TopicService topicService; private String hashFunctionName = "murmur3_128"; @@ -86,6 +87,7 @@ public class HashPartitionServiceTest { applicationEventPublisher = mock(ApplicationEventPublisher.class); routingInfoService = mock(TenantRoutingInfoService.class); queueRoutingInfoService = mock(QueueRoutingInfoService.class); + topicService = mock(TopicService.class); clusterRoutingService = createPartitionService(); ServiceInfo currentServer = ServiceInfo.newBuilder() .setServiceId("tb-core-0") @@ -393,7 +395,8 @@ public class HashPartitionServiceTest { HashPartitionService partitionService = new HashPartitionService(discoveryService, routingInfoService, applicationEventPublisher, - queueRoutingInfoService); + queueRoutingInfoService, + topicService); ReflectionTestUtils.setField(partitionService, "coreTopic", "tb.core"); ReflectionTestUtils.setField(partitionService, "corePartitions", 10); ReflectionTestUtils.setField(partitionService, "vcTopic", "tb.vc"); diff --git a/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java b/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java index 0bc1800896..233839bb5f 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java @@ -32,7 +32,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.DataDecodingEncodingService; @@ -78,7 +78,7 @@ public class DefaultTbClusterServiceTest { protected TbQueueProducerProvider producerProvider; @SpyBean - protected NotificationsTopicService notificationsTopicService; + protected TopicService topicService; @SpyBean protected TbClusterService clusterService; @@ -94,12 +94,12 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); verify(tbQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(producerProvider, never()).getTbCoreNotificationsMsgProducer(); verify(producerProvider, never()).getTransportNotificationsMsgProducer(); @@ -119,15 +119,15 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); verify(tbQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); verify(producerProvider, never()).getTbCoreNotificationsMsgProducer(); verify(producerProvider, never()).getTransportNotificationsMsgProducer(); @@ -147,20 +147,20 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(producerProvider, never()).getTbCoreNotificationsMsgProducer(); } @@ -193,47 +193,47 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core2); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith1); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core2); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith1); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith2); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1)), any(TbProtoQueueMsg.class), isNull()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, core1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, core1)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, core2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, core2)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, monolith2)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2)), any(TbProtoQueueMsg.class), isNull()); } protected Queue createTestQueue() { diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index 5be5caf6ff..22bbb48871 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -71,6 +71,7 @@ public class HashPartitionService implements PartitionService { private final TbServiceInfoProvider serviceInfoProvider; private final TenantRoutingInfoService tenantRoutingInfoService; private final QueueRoutingInfoService queueRoutingInfoService; + private final TopicService topicService; protected volatile ConcurrentMap> myPartitions = new ConcurrentHashMap<>(); @@ -88,11 +89,13 @@ public class HashPartitionService implements PartitionService { public HashPartitionService(TbServiceInfoProvider serviceInfoProvider, TenantRoutingInfoService tenantRoutingInfoService, ApplicationEventPublisher applicationEventPublisher, - QueueRoutingInfoService queueRoutingInfoService) { + QueueRoutingInfoService queueRoutingInfoService, + TopicService topicService) { this.serviceInfoProvider = serviceInfoProvider; this.tenantRoutingInfoService = tenantRoutingInfoService; this.applicationEventPublisher = applicationEventPublisher; this.queueRoutingInfoService = queueRoutingInfoService; + this.topicService = topicService; } @PostConstruct @@ -100,11 +103,11 @@ public class HashPartitionService implements PartitionService { this.hashFunction = forName(hashFunctionName); QueueKey coreKey = new QueueKey(ServiceType.TB_CORE); partitionSizesMap.put(coreKey, corePartitions); - partitionTopicsMap.put(coreKey, coreTopic); + partitionTopicsMap.put(coreKey, topicService.buildTopicName(coreTopic)); QueueKey vcKey = new QueueKey(ServiceType.TB_VC_EXECUTOR); partitionSizesMap.put(vcKey, vcPartitions); - partitionTopicsMap.put(vcKey, vcTopic); + partitionTopicsMap.put(vcKey, topicService.buildTopicName(topicService.buildTopicName(vcTopic))); if (!isTransport(serviceInfoProvider.getServiceType())) { doInitRuleEnginePartitions(); @@ -122,7 +125,7 @@ public class HashPartitionService implements PartitionService { List queueRoutingInfoList = getQueueRoutingInfos(); queueRoutingInfoList.forEach(queue -> { QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, queue); - partitionTopicsMap.put(queueKey, queue.getQueueTopic()); + partitionTopicsMap.put(queueKey, topicService.buildTopicName(queue.getQueueTopic())); partitionSizesMap.put(queueKey, queue.getPartitions()); }); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/NotificationsTopicService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java similarity index 75% rename from common/queue/src/main/java/org/thingsboard/server/queue/discovery/NotificationsTopicService.java rename to common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java index c209bd1aee..27023f1619 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/NotificationsTopicService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java @@ -15,7 +15,10 @@ */ package org.thingsboard.server.queue.discovery; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; @@ -23,7 +26,11 @@ import java.util.HashMap; import java.util.Map; @Service -public class NotificationsTopicService { +public class TopicService { + + @Getter + @Value("${queue.prefix}") + private String prefix; private Map tbCoreNotificationTopics = new HashMap<>(); private Map tbRuleEngineNotificationTopics = new HashMap<>(); @@ -49,6 +56,14 @@ public class NotificationsTopicService { } private TopicPartitionInfo buildNotificationsTopicPartitionInfo(ServiceType serviceType, String serviceId) { - return new TopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false); + return buildTopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false); + } + + public TopicPartitionInfo buildTopicPartitionInfo(String topic, TenantId tenantId, Integer partition, boolean myPartiotion) { + return new TopicPartitionInfo(buildTopicName(topic), tenantId, partition, myPartiotion); + } + + public String buildTopicName(String topic) { + return prefix.isBlank() ? topic : prefix + "." + topic; } } \ No newline at end of file diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java b/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java index 5304056a88..8ad5816b77 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java @@ -26,7 +26,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.DataDecodingEncodingService; @@ -41,7 +41,7 @@ public class RemoteNotificationRuleProcessor implements NotificationRuleProcesso private final NotificationDeduplicationService deduplicationService; private final TbQueueProducerProvider producerProvider; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final PartitionService partitionService; private final DataDecodingEncodingService encodingService; @@ -57,7 +57,7 @@ public class RemoteNotificationRuleProcessor implements NotificationRuleProcesso .setTrigger(ByteString.copyFrom(encodingService.encode(trigger))); partitionService.getAllServiceIds(ServiceType.TB_CORE).stream().findAny().ifPresent(serviceId -> { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); producerProvider.getTbCoreNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.ToCoreNotificationMsg.newBuilder() .setNotificationRuleProcessorMsg(msg) diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java index 08609b13d0..5774e59d32 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java @@ -40,7 +40,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -61,7 +61,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='aws-sqs' && '${service.type:null}'=='monolith'") public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -79,7 +79,7 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng private final TbQueueAdmin otaAdmin; private final TbQueueAdmin vcAdmin; - public AwsSqsMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public AwsSqsMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, @@ -88,7 +88,7 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng TbQueueVersionControlSettings vcSettings, TbAwsSqsQueueAttributes sqsQueueAttributes, TbQueueRemoteJsInvokeSettings jsInvokeSettings) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -109,71 +109,71 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, configuration.getTopic(), + return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getRequestsTopic(), + return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getResponsesTopic()); + return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -201,29 +201,29 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic(), + return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic()); + return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java index 257ac37408..d7f7a0412f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -63,7 +63,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -81,7 +81,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbQueueVersionControlSettings vcSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, @@ -91,7 +91,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -108,51 +108,51 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getRequestsTopic(), + return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getResponsesTopic()); + return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -180,29 +180,29 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic(), + return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic()); + return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java index 9b1f9dba0d..9df4cc5c4a 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java @@ -33,7 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -52,7 +52,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='aws-sqs' && '${service.type:null}'=='tb-rule-engine'") public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -66,14 +66,14 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory private final TbQueueAdmin notificationAdmin; private final TbQueueAdmin otaAdmin; - public AwsSqsTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public AwsSqsTbRuleEngineQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbAwsSqsSettings sqsSettings, TbAwsSqsQueueAttributes sqsQueueAttributes, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -90,39 +90,39 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, configuration.getTopic(), + return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -151,12 +151,12 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic()); + return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java index 24453d3c5c..a8f69e6eab 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java @@ -22,6 +22,7 @@ import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; import org.thingsboard.server.queue.sqs.TbAwsSqsAdmin; @@ -39,6 +40,7 @@ public class AwsSqsTbVersionControlQueueFactory implements TbVersionControlQueue private final TbAwsSqsSettings sqsSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; @@ -48,11 +50,13 @@ public class AwsSqsTbVersionControlQueueFactory implements TbVersionControlQueue public AwsSqsTbVersionControlQueueFactory(TbAwsSqsSettings sqsSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbAwsSqsQueueAttributes sqsQueueAttributes + TbAwsSqsQueueAttributes sqsQueueAttributes, + TopicService topicService ) { this.sqsSettings = sqsSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getCoreAttributes()); this.notificationAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getNotificationsAttributes()); @@ -61,17 +65,17 @@ public class AwsSqsTbVersionControlQueueFactory implements TbVersionControlQueue @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java index fa16ee9093..4818affc93 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java @@ -32,6 +32,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; @@ -54,6 +55,7 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin transportApiAdmin; @@ -66,13 +68,15 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbAwsSqsQueueAttributes sqsQueueAttributes, - TbQueueRuleEngineSettings ruleEngineSettings) { + TbQueueRuleEngineSettings ruleEngineSettings, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.sqsSettings = sqsSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; + this.topicService = topicService; this.coreAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getCoreAttributes()); this.transportApiAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getTransportApiAttributes()); @@ -83,11 +87,11 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { TbQueueProducer> producerTemplate = - new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getRequestsTopic()); + new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumerTemplate = new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, - transportApiSettings.getResponsesTopic() + "_" + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "_" + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -103,28 +107,28 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { - return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic() + "_" + serviceInfoProvider.getServiceId(), + return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "_" + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java index 87fc8aa3db..933daac0df 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java @@ -28,7 +28,7 @@ import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.memory.InMemoryStorage; import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; @@ -44,7 +44,7 @@ import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; @ConditionalOnExpression("'${queue.type:null}'=='in-memory' && '${service.type:null}'=='monolith'") public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -53,14 +53,14 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE private final TbQueueTransportNotificationSettings transportNotificationSettings; private final InMemoryStorage storage; - public InMemoryMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public InMemoryMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbQueueVersionControlSettings vcSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, InMemoryStorage storage) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.vcSettings = vcSettings; this.serviceInfoProvider = serviceInfoProvider; @@ -72,62 +72,62 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, transportNotificationSettings.getNotificationsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, ruleEngineSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, ruleEngineSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, vcSettings.getTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(vcSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new InMemoryTbQueueConsumer<>(storage, configuration.getTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(configuration.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); + return new InMemoryTbQueueConsumer<>(storage, topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); + return new InMemoryTbQueueConsumer<>(storage, topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new InMemoryTbQueueConsumer<>(storage, transportApiSettings.getRequestsTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new InMemoryTbQueueProducer<>(storage, transportApiSettings.getResponsesTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -137,27 +137,27 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, coreSettings.getUsageStatsTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, coreSettings.getOtaPackageTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getOtaPackageTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getUsageStatsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, vcSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(vcSettings.getTopic())); } @Scheduled(fixedRateString = "${queue.in_memory.stats.print-interval-ms:60000}") diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java index a789816c34..f578079a4f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java @@ -32,6 +32,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.memory.InMemoryStorage; import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer; @@ -48,26 +49,29 @@ public class InMemoryTbTransportQueueFactory implements TbTransportQueueFactory private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; private final InMemoryStorage storage; + private final TopicService topicService; public InMemoryTbTransportQueueFactory(TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, - InMemoryStorage storage) { + InMemoryStorage storage, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.storage = storage; + this.topicService = topicService; } @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { InMemoryTbQueueProducer> producerTemplate = - new InMemoryTbQueueProducer<>(storage, transportApiSettings.getRequestsTopic()); + new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); InMemoryTbQueueConsumer> consumerTemplate = - new InMemoryTbQueueConsumer<>(storage, transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()); + new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder , TbProtoQueueMsg> templateBuilder = DefaultTbQueueRequestTemplate.builder(); @@ -93,27 +97,27 @@ public class InMemoryTbTransportQueueFactory implements TbTransportQueueFactory @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, transportApiSettings.getRequestsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { - return new InMemoryTbQueueConsumer<>(storage, transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getUsageStatsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java index 22a16de64f..01a1c11656 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java @@ -39,7 +39,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; @@ -62,7 +62,7 @@ import java.util.concurrent.atomic.AtomicLong; @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='monolith'") public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbKafkaSettings kafkaSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; @@ -85,7 +85,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi private final AtomicLong consumerCount = new AtomicLong(); - public KafkaMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbKafkaSettings kafkaSettings, + public KafkaMonolithQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, @@ -95,7 +95,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbQueueVersionControlSettings vcSettings, TbKafkaConsumerStatsService consumerStatsService, TbKafkaTopicConfigs kafkaTopicConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -122,7 +122,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-transport-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportNotificationSettings.getNotificationsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -132,7 +132,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(ruleEngineAdmin); return requestBuilder.build(); } @@ -142,7 +142,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-rule-engine-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -152,7 +152,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -162,7 +162,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -171,9 +171,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToVersionControlMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(vcSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(vcSettings.getTopic())); consumerBuilder.clientId("monolith-vc-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-vc-node"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-vc-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(vcAdmin); consumerBuilder.statsService(consumerStatsService); @@ -185,9 +185,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi String queueName = configuration.getName(); TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(configuration.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(configuration.getTopic())); consumerBuilder.clientId("re-" + queueName + "-consumer-" + serviceInfoProvider.getServiceId() + "-" + consumerCount.incrementAndGet()); - consumerBuilder.groupId("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-" + configuration.getTenantId())) + "-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-" + configuration.getTenantId())) + "-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(ruleEngineAdmin); consumerBuilder.statsService(consumerStatsService); @@ -198,9 +198,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName())); consumerBuilder.clientId("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); + consumerBuilder.groupId(topicService.buildTopicName("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(notificationAdmin); consumerBuilder.statsService(consumerStatsService); @@ -211,9 +211,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToCoreMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getTopic())); consumerBuilder.clientId("monolith-core-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-core-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-core-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -224,9 +224,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName())); consumerBuilder.clientId("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); + consumerBuilder.groupId(topicService.buildTopicName("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(notificationAdmin); consumerBuilder.statsService(consumerStatsService); @@ -237,9 +237,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createTransportApiRequestConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(transportApiSettings.getRequestsTopic()); + consumerBuilder.topic(topicService.buildTopicName(transportApiSettings.getRequestsTopic())); consumerBuilder.clientId("monolith-transport-api-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-transport-api-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-transport-api-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(transportApiRequestAdmin); consumerBuilder.statsService(consumerStatsService); @@ -251,7 +251,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-transport-api-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportApiSettings.getResponsesTopic())); requestBuilder.admin(transportApiResponseAdmin); return requestBuilder.build(); } @@ -294,9 +294,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getUsageStatsTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); consumerBuilder.clientId("monolith-us-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-us-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-us-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -307,9 +307,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getOtaPackageTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); consumerBuilder.clientId("monolith-ota-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-ota-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-ota-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(fwUpdatesAdmin); consumerBuilder.statsService(consumerStatsService); @@ -321,7 +321,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-ota-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); requestBuilder.admin(fwUpdatesAdmin); return requestBuilder.build(); } @@ -331,7 +331,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -341,7 +341,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-vc-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(vcSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(vcSettings.getTopic())); requestBuilder.admin(vcAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java index 9c25a5d420..ed546fc8aa 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; @@ -60,7 +60,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-core'") public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbKafkaSettings kafkaSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; @@ -81,7 +81,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueAdmin fwUpdatesAdmin; private final TbQueueAdmin vcAdmin; - public KafkaTbCoreQueueFactory(NotificationsTopicService notificationsTopicService, + public KafkaTbCoreQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, @@ -92,7 +92,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaConsumerStatsService consumerStatsService, TbQueueTransportNotificationSettings transportNotificationSettings, TbKafkaTopicConfigs kafkaTopicConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -119,7 +119,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-transport-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportNotificationSettings.getNotificationsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -129,7 +129,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -139,7 +139,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-rule-engine-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -149,7 +149,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-to-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -159,7 +159,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -168,9 +168,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToCoreMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getTopic())); consumerBuilder.clientId("tb-core-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-node"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -181,9 +181,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName())); consumerBuilder.clientId("tb-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-notifications-node-" + serviceInfoProvider.getServiceId()); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-notifications-node-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(notificationAdmin); consumerBuilder.statsService(consumerStatsService); @@ -194,9 +194,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createTransportApiRequestConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(transportApiSettings.getRequestsTopic()); + consumerBuilder.topic(topicService.buildTopicName(transportApiSettings.getRequestsTopic())); consumerBuilder.clientId("tb-core-transport-api-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-transport-api-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-transport-api-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(transportApiRequestAdmin); consumerBuilder.statsService(consumerStatsService); @@ -208,7 +208,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-transport-api-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportApiSettings.getResponsesTopic())); requestBuilder.admin(transportApiResponseAdmin); return requestBuilder.build(); } @@ -251,9 +251,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getUsageStatsTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); consumerBuilder.clientId("tb-core-us-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-us-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-us-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -264,9 +264,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getOtaPackageTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); consumerBuilder.clientId("tb-core-ota-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-ota-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-ota-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(fwUpdatesAdmin); consumerBuilder.statsService(consumerStatsService); @@ -278,7 +278,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-ota-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); requestBuilder.admin(fwUpdatesAdmin); return requestBuilder.build(); } @@ -288,7 +288,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -298,7 +298,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-vc-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(vcSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(vcSettings.getTopic())); requestBuilder.admin(vcAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java index 2e3bf784d7..202b209a26 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java @@ -36,7 +36,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; @@ -57,7 +57,7 @@ import java.util.concurrent.atomic.AtomicLong; @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-rule-engine'") public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbKafkaSettings kafkaSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; @@ -74,7 +74,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { private final TbQueueAdmin fwUpdatesAdmin; private final AtomicLong consumerCount = new AtomicLong(); - public KafkaTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbKafkaSettings kafkaSettings, + public KafkaTbRuleEngineQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, @@ -82,7 +82,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaConsumerStatsService consumerStatsService, TbQueueTransportNotificationSettings transportNotificationSettings, TbKafkaTopicConfigs kafkaTopicConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -104,7 +104,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-transport-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportNotificationSettings.getNotificationsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -114,7 +114,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(ruleEngineAdmin); return requestBuilder.build(); } @@ -124,7 +124,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-rule-engine-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -134,7 +134,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -144,7 +144,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-ota-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); requestBuilder.admin(fwUpdatesAdmin); return requestBuilder.build(); } @@ -154,7 +154,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -164,9 +164,9 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { String queueName = configuration.getName(); TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(configuration.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(configuration.getTopic())); consumerBuilder.clientId("re-" + queueName + "-consumer-" + serviceInfoProvider.getServiceId() + "-" + consumerCount.incrementAndGet()); - consumerBuilder.groupId("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-" + configuration.getTenantId())) + "-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-" + configuration.getTenantId())) + "-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(ruleEngineAdmin); consumerBuilder.statsService(consumerStatsService); @@ -177,7 +177,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName())); consumerBuilder.clientId("tb-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); consumerBuilder.groupId("tb-rule-engine-notifications-node-" + serviceInfoProvider.getServiceId()); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); @@ -225,7 +225,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java index 300e0a44b6..11c038a2bc 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate; @@ -58,6 +59,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { private final TbQueueTransportApiSettings transportApiSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; private final TbKafkaConsumerStatsService consumerStatsService; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin ruleEngineAdmin; @@ -72,7 +74,8 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbKafkaConsumerStatsService consumerStatsService, - TbKafkaTopicConfigs kafkaTopicConfigs) { + TbKafkaTopicConfigs kafkaTopicConfigs, + TopicService topicService) { this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -80,6 +83,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.consumerStatsService = consumerStatsService; + this.topicService = topicService; this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs()); this.ruleEngineAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getRuleEngineConfigs()); @@ -93,14 +97,14 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-api-request-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportApiSettings.getRequestsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportApiSettings.getRequestsTopic())); requestBuilder.admin(transportApiRequestAdmin); TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> responseBuilder = TbKafkaConsumerTemplate.builder(); responseBuilder.settings(kafkaSettings); - responseBuilder.topic(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()); + responseBuilder.topic(topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId())); responseBuilder.clientId("transport-api-response-" + serviceInfoProvider.getServiceId()); - responseBuilder.groupId("transport-node-" + serviceInfoProvider.getServiceId()); + responseBuilder.groupId(topicService.buildTopicName("transport-node-" + serviceInfoProvider.getServiceId())); responseBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); responseBuilder.admin(transportApiResponseAdmin); responseBuilder.statsService(consumerStatsService); @@ -121,7 +125,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(ruleEngineAdmin); return requestBuilder.build(); } @@ -131,7 +135,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -141,7 +145,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -150,9 +154,9 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { public TbQueueConsumer> createTransportNotificationsConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> responseBuilder = TbKafkaConsumerTemplate.builder(); responseBuilder.settings(kafkaSettings); - responseBuilder.topic(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()); + responseBuilder.topic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId())); responseBuilder.clientId("transport-api-notifications-" + serviceInfoProvider.getServiceId()); - responseBuilder.groupId("transport-node-" + serviceInfoProvider.getServiceId()); + responseBuilder.groupId(topicService.buildTopicName("transport-node-" + serviceInfoProvider.getServiceId())); responseBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); responseBuilder.admin(notificationAdmin); responseBuilder.statsService(consumerStatsService); @@ -164,7 +168,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java index d851956420..952c9817a3 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java @@ -25,6 +25,7 @@ import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate; @@ -45,6 +46,7 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; private final TbKafkaConsumerStatsService consumerStatsService; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin vcAdmin; @@ -55,12 +57,14 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, TbKafkaConsumerStatsService consumerStatsService, - TbKafkaTopicConfigs kafkaTopicConfigs) { + TbKafkaTopicConfigs kafkaTopicConfigs, + TopicService topicService) { this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.vcSettings = vcSettings; this.consumerStatsService = consumerStatsService; + this.topicService = topicService; this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs()); this.vcAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getVcConfigs()); @@ -73,7 +77,7 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-vc-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -82,9 +86,9 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF public TbQueueConsumer> createToVersionControlMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(vcSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(vcSettings.getTopic())); consumerBuilder.clientId("tb-vc-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-vc-node"); + consumerBuilder.groupId(topicService.buildTopicName("tb-vc-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(vcAdmin); consumerBuilder.statsService(consumerStatsService); @@ -96,7 +100,7 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-vc-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java index 857641098c..554d452556 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java @@ -40,7 +40,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; @@ -66,7 +66,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueTransportApiSettings transportApiSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueVersionControlSettings vcSettings; @@ -83,7 +83,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng TbQueueRuleEngineSettings ruleEngineSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbPubSubSubscriptionSettings pubSubSubscriptionSettings, TbQueueRemoteJsInvokeSettings jsInvokeSettings, @@ -93,7 +93,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng this.ruleEngineSettings = ruleEngineSettings; this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.vcSettings = vcSettings; @@ -149,7 +149,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -162,7 +162,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java index f197082829..3b45992e25 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; @@ -61,7 +61,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { private final TbPubSubSettings pubSubSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -76,7 +76,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { public PubSubTbCoreQueueFactory(TbPubSubSettings pubSubSettings, TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -85,7 +85,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { this.pubSubSettings = pubSubSettings; this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -132,7 +132,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java index 9766bf9915..a60f77852f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java @@ -36,7 +36,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; @@ -58,7 +58,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory private final TbPubSubSettings pubSubSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueRuleEngineSettings ruleEngineSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -71,7 +71,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory public PubSubTbRuleEngineQueueFactory(TbPubSubSettings pubSubSettings, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -79,7 +79,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory this.pubSubSettings = pubSubSettings; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -92,39 +92,39 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, ruleEngineSettings.getTopic()); + return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, ruleEngineSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbPubSubConsumerTemplate<>(ruleEngineAdmin, pubSubSettings, configuration.getTopic(), + return new TbPubSubConsumerTemplate<>(ruleEngineAdmin, pubSubSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -153,12 +153,12 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getUsageStatsTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getOtaPackageTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java index 57db7b884c..8154d04d6d 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java @@ -22,6 +22,7 @@ import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate; @@ -39,6 +40,7 @@ public class PubSubTbVersionControlQueueFactory implements TbVersionControlQueue private final TbPubSubSettings pubSubSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin notificationAdmin; @@ -47,11 +49,13 @@ public class PubSubTbVersionControlQueueFactory implements TbVersionControlQueue public PubSubTbVersionControlQueueFactory(TbPubSubSettings pubSubSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbPubSubSubscriptionSettings pubSubSubscriptionSettings + TbPubSubSubscriptionSettings pubSubSubscriptionSettings, + TopicService topicService ) { this.pubSubSettings = pubSubSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings()); this.notificationAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getNotificationsSettings()); @@ -60,17 +64,17 @@ public class PubSubTbVersionControlQueueFactory implements TbVersionControlQueue @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getUsageStatsTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbPubSubConsumerTemplate<>(vcAdmin, pubSubSettings, vcSettings.getTopic(), + return new TbPubSubConsumerTemplate<>(vcAdmin, pubSubSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java index 5cafaa4c48..edcad873c4 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate; @@ -56,6 +57,7 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueTransportApiSettings transportApiSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin ruleEngineAdmin; @@ -68,13 +70,15 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { TbQueueRuleEngineSettings ruleEngineSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, - TbPubSubSubscriptionSettings pubSubSubscriptionSettings) { + TbPubSubSubscriptionSettings pubSubSubscriptionSettings, + TopicService topicService) { this.pubSubSettings = pubSubSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; + this.topicService = topicService; this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings()); this.ruleEngineAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getRuleEngineSettings()); @@ -84,9 +88,9 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { - TbQueueProducer> producer = new TbPubSubProducerTemplate<>(transportApiAdmin, pubSubSettings, transportApiSettings.getRequestsTopic()); + TbQueueProducer> producer = new TbPubSubProducerTemplate<>(transportApiAdmin, pubSubSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumer = new TbPubSubConsumerTemplate<>(transportApiAdmin, pubSubSettings, - transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -102,29 +106,29 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, ruleEngineSettings.getTopic()); + return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getUsageStatsTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java index 0318b5d06f..7e9833f56b 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java @@ -40,7 +40,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; @@ -61,7 +61,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='rabbitmq' && '${service.type:null}'=='monolith'") public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -78,7 +78,7 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE private final TbQueueAdmin notificationAdmin; private final TbQueueAdmin vcAdmin; - public RabbitMqMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public RabbitMqMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, @@ -87,7 +87,7 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE TbRabbitMqQueueArguments queueArguments, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueVersionControlSettings vcSettings) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -107,71 +107,71 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, vcSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, configuration.getTopic(), + return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getRequestsTopic(), + return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getResponsesTopic()); + return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -199,29 +199,29 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbRabbitMqProducerTemplate<>(vcAdmin, rabbitMqSettings, vcSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(vcAdmin, rabbitMqSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java index 45f5a92980..8311560207 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; @@ -62,7 +62,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -77,7 +77,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -86,7 +86,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -100,51 +100,51 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getRequestsTopic(), + return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getResponsesTopic()); + return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -178,24 +178,24 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java index 37633ced95..ae8a879782 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java @@ -36,7 +36,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; @@ -55,7 +55,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='rabbitmq' && '${service.type:null}'=='tb-rule-engine'") public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -68,14 +68,14 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor private final TbQueueAdmin jsExecutorAdmin; private final TbQueueAdmin notificationAdmin; - public RabbitMqTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public RabbitMqTbRuleEngineQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbRabbitMqSettings rabbitMqSettings, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbRabbitMqQueueArguments queueArguments) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -91,39 +91,39 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, configuration.getTopic(), + return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -152,12 +152,12 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java index ed1da6a302..d32865a05c 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java @@ -22,6 +22,7 @@ import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqProducerTemplate; @@ -39,6 +40,7 @@ public class RabbitMqTbVersionControlQueueFactory implements TbVersionControlQue private final TbRabbitMqSettings rabbitMqSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin notificationAdmin; @@ -47,11 +49,13 @@ public class RabbitMqTbVersionControlQueueFactory implements TbVersionControlQue public RabbitMqTbVersionControlQueueFactory(TbRabbitMqSettings rabbitMqSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbRabbitMqQueueArguments queueArguments + TbRabbitMqQueueArguments queueArguments, + TopicService topicService ) { this.rabbitMqSettings = rabbitMqSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbRabbitMqAdmin(this.rabbitMqSettings, queueArguments.getCoreArgs()); this.notificationAdmin = new TbRabbitMqAdmin(this.rabbitMqSettings, queueArguments.getNotificationsArgs()); @@ -60,17 +64,17 @@ public class RabbitMqTbVersionControlQueueFactory implements TbVersionControlQue @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, vcSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java index bcbd60a14e..1af28b629b 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqProducerTemplate; @@ -55,6 +56,7 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; private final TbQueueRuleEngineSettings ruleEngineSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin ruleEngineAdmin; @@ -67,13 +69,15 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, - TbRabbitMqQueueArguments queueArguments) { + TbRabbitMqQueueArguments queueArguments, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.rabbitMqSettings = rabbitMqSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; + this.topicService = topicService; this.coreAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getCoreArgs()); this.ruleEngineAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getRuleEngineArgs()); @@ -84,11 +88,11 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { TbQueueProducer> producerTemplate = - new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getRequestsTopic()); + new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumerTemplate = new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, - transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -104,28 +108,28 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { - return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId(), + return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java index 950e49dc93..6f2dbdc72f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java @@ -44,7 +44,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -60,7 +60,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='service-bus' && '${service.type:null}'=='monolith'") public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -77,7 +77,7 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul private final TbQueueAdmin notificationAdmin; private final TbQueueAdmin vcAdmin; - public ServiceBusMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public ServiceBusMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, @@ -86,7 +86,7 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueVersionControlSettings vcSettings, TbServiceBusQueueConfigs serviceBusQueueConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -106,32 +106,32 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, vcSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } @@ -145,32 +145,32 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getRequestsTopic(), + return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getResponsesTopic()); + return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -198,29 +198,29 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbServiceBusProducerTemplate<>(vcAdmin, serviceBusSettings, vcSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(vcAdmin, serviceBusSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java index b92629633d..c86efee599 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java @@ -43,7 +43,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -62,7 +62,7 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -77,7 +77,7 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -86,7 +86,7 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -100,51 +100,51 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getRequestsTopic(), + return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getResponsesTopic()); + return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -172,24 +172,24 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java index a1571becc7..28e26ac080 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java @@ -41,7 +41,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -55,7 +55,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='service-bus' && '${service.type:null}'=='tb-rule-engine'") public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -68,14 +68,14 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact private final TbQueueAdmin jsExecutorAdmin; private final TbQueueAdmin notificationAdmin; - public ServiceBusTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public ServiceBusTbRuleEngineQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbServiceBusSettings serviceBusSettings, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbServiceBusQueueConfigs serviceBusQueueConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -91,39 +91,39 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbServiceBusConsumerTemplate<>(ruleEngineAdmin, serviceBusSettings, configuration.getTopic(), + return new TbServiceBusConsumerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -152,12 +152,12 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java index 24cb4fe8bc..76149713ce 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java @@ -27,6 +27,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplat import org.thingsboard.server.queue.azure.servicebus.TbServiceBusQueueConfigs; import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; @@ -39,6 +40,7 @@ public class ServiceBusTbVersionControlQueueFactory implements TbVersionControlQ private final TbServiceBusSettings serviceBusSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin notificationAdmin; @@ -47,11 +49,13 @@ public class ServiceBusTbVersionControlQueueFactory implements TbVersionControlQ public ServiceBusTbVersionControlQueueFactory(TbServiceBusSettings serviceBusSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbServiceBusQueueConfigs serviceBusQueueConfigs + TbServiceBusQueueConfigs serviceBusQueueConfigs, + TopicService topicService ) { this.serviceBusSettings = serviceBusSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getCoreConfigs()); this.notificationAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getNotificationsConfigs()); @@ -60,17 +64,17 @@ public class ServiceBusTbVersionControlQueueFactory implements TbVersionControlQ @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, vcSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java index 0a4bb59663..f6d85577e1 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java @@ -38,6 +38,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; @@ -55,6 +56,7 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; private final TbQueueRuleEngineSettings ruleEngineSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin transportApiAdmin; @@ -67,13 +69,15 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, - TbServiceBusQueueConfigs serviceBusQueueConfigs) { + TbServiceBusQueueConfigs serviceBusQueueConfigs, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.serviceBusSettings = serviceBusSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; + this.topicService = topicService; this.coreAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getCoreConfigs()); this.transportApiAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getTransportApiConfigs()); @@ -84,11 +88,11 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { TbQueueProducer> producerTemplate = - new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getRequestsTopic()); + new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumerTemplate = new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, - transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -104,29 +108,29 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index bc11570fc1..cc4a1bc3df 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java @@ -53,7 +53,6 @@ import org.thingsboard.server.common.data.limit.LimitedApi; import org.thingsboard.server.common.data.notification.rule.trigger.RateLimitsTrigger; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.msg.TbMsgType; -import org.thingsboard.server.common.data.notification.rule.trigger.RateLimitsTrigger; import org.thingsboard.server.common.data.rpc.RpcStatus; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; @@ -95,7 +94,7 @@ import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.AsyncCallbackTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; @@ -172,7 +171,7 @@ public class DefaultTransportService implements TransportService { private final TbTransportQueueFactory queueProvider; private final TbQueueProducerProvider producerProvider; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final StatsFactory statsFactory; private final TransportDeviceProfileCache deviceProfileCache; @@ -207,7 +206,7 @@ public class DefaultTransportService implements TransportService { TbServiceInfoProvider serviceInfoProvider, TbTransportQueueFactory queueProvider, TbQueueProducerProvider producerProvider, - NotificationsTopicService notificationsTopicService, + TopicService topicService, StatsFactory statsFactory, TransportDeviceProfileCache deviceProfileCache, TransportTenantProfileCache tenantProfileCache, @@ -218,7 +217,7 @@ public class DefaultTransportService implements TransportService { this.serviceInfoProvider = serviceInfoProvider; this.queueProvider = queueProvider; this.producerProvider = producerProvider; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.statsFactory = statsFactory; this.deviceProfileCache = deviceProfileCache; this.tenantProfileCache = tenantProfileCache; @@ -243,7 +242,7 @@ public class DefaultTransportService implements TransportService { ruleEngineMsgProducer = producerProvider.getRuleEngineMsgProducer(); tbCoreMsgProducer = producerProvider.getTbCoreMsgProducer(); transportNotificationsConsumer = queueProvider.createTransportNotificationsConsumer(); - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceInfoProvider.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceInfoProvider.getServiceId()); transportNotificationsConsumer.subscribe(Collections.singleton(tpi)); transportApiRequestTemplate.init(); mainConsumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("transport-consumer")); diff --git a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java index ab2dc417ca..e98d49b1dc 100644 --- a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java +++ b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java @@ -67,7 +67,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.VersionedEntityInfoP import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbApplicationEventListener; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; @@ -110,7 +110,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe private final TbVersionControlQueueFactory queueFactory; private final DataDecodingEncodingService encodingService; private final GitRepositoryService vcService; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final ConcurrentMap tenantRepoLocks = new ConcurrentHashMap<>(); private final Map pendingCommitMap = new HashMap<>(); @@ -520,7 +520,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe } private void reply(VersionControlRequestCtx ctx, Optional e, Function enrichFunction) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, ctx.getNodeId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, ctx.getNodeId()); VersionControlResponseMsg.Builder builder = VersionControlResponseMsg.newBuilder() .setRequestIdMSB(ctx.getRequestId().getMostSignificantBits()) .setRequestIdLSB(ctx.getRequestId().getLeastSignificantBits()); diff --git a/msa/vc-executor/src/main/resources/tb-vc-executor.yml b/msa/vc-executor/src/main/resources/tb-vc-executor.yml index 2a35ee73fd..889b2cd976 100644 --- a/msa/vc-executor/src/main/resources/tb-vc-executor.yml +++ b/msa/vc-executor/src/main/resources/tb-vc-executor.yml @@ -48,6 +48,7 @@ zk: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default in_memory: stats: # For debug lvl diff --git a/transport/coap/src/main/resources/tb-coap-transport.yml b/transport/coap/src/main/resources/tb-coap-transport.yml index 825b197e1d..44ba6cf31c 100644 --- a/transport/coap/src/main/resources/tb-coap-transport.yml +++ b/transport/coap/src/main/resources/tb-coap-transport.yml @@ -194,6 +194,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/http/src/main/resources/tb-http-transport.yml b/transport/http/src/main/resources/tb-http-transport.yml index 315b138bfa..1d7904142c 100644 --- a/transport/http/src/main/resources/tb-http-transport.yml +++ b/transport/http/src/main/resources/tb-http-transport.yml @@ -177,6 +177,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml index db4870e40b..f348489e12 100644 --- a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml +++ b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml @@ -273,6 +273,7 @@ transport: # Queue configuration properties queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml index ff26bb6e38..356694d3e9 100644 --- a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml +++ b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml @@ -210,6 +210,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/snmp/src/main/resources/tb-snmp-transport.yml b/transport/snmp/src/main/resources/tb-snmp-transport.yml index db883dcd30..16516c3194 100644 --- a/transport/snmp/src/main/resources/tb-snmp-transport.yml +++ b/transport/snmp/src/main/resources/tb-snmp-transport.yml @@ -156,6 +156,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" From dd5319337140209808dd6c5e788e39b5d2d672a9 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 18 Oct 2023 11:43:21 +0300 Subject: [PATCH 05/39] fixed unit tests --- .../server/queue/discovery/HashPartitionServiceTest.java | 2 ++ .../org/thingsboard/server/queue/discovery/TopicService.java | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java b/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java index 511faa6a2b..44c21a54d2 100644 --- a/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java @@ -62,6 +62,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -88,6 +89,7 @@ public class HashPartitionServiceTest { routingInfoService = mock(TenantRoutingInfoService.class); queueRoutingInfoService = mock(QueueRoutingInfoService.class); topicService = mock(TopicService.class); + when(topicService.buildTopicName(Mockito.any())).thenAnswer(i -> i.getArguments()[0]); clusterRoutingService = createPartitionService(); ServiceInfo currentServer = ServiceInfo.newBuilder() .setServiceId("tb-core-0") diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java index 27023f1619..bab0afbb23 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.queue.discovery; -import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.id.TenantId; @@ -28,7 +27,6 @@ import java.util.Map; @Service public class TopicService { - @Getter @Value("${queue.prefix}") private String prefix; From cc3c05f6e98c811337e2162e2a43838279652c2b Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 18 Oct 2023 15:09:24 +0300 Subject: [PATCH 06/39] updated yml parameter description --- application/src/main/resources/thingsboard.yml | 2 +- msa/vc-executor/src/main/resources/tb-vc-executor.yml | 2 +- transport/coap/src/main/resources/tb-coap-transport.yml | 2 +- transport/http/src/main/resources/tb-http-transport.yml | 2 +- transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml | 2 +- transport/mqtt/src/main/resources/tb-mqtt-transport.yml | 2 +- transport/snmp/src/main/resources/tb-snmp-transport.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 3454be5ade..8a6426c4e1 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1270,7 +1270,7 @@ swagger: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) in_memory: stats: # For debug level diff --git a/msa/vc-executor/src/main/resources/tb-vc-executor.yml b/msa/vc-executor/src/main/resources/tb-vc-executor.yml index 889b2cd976..4ffa1ab702 100644 --- a/msa/vc-executor/src/main/resources/tb-vc-executor.yml +++ b/msa/vc-executor/src/main/resources/tb-vc-executor.yml @@ -48,7 +48,7 @@ zk: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) in_memory: stats: # For debug lvl diff --git a/transport/coap/src/main/resources/tb-coap-transport.yml b/transport/coap/src/main/resources/tb-coap-transport.yml index 44ba6cf31c..437f551690 100644 --- a/transport/coap/src/main/resources/tb-coap-transport.yml +++ b/transport/coap/src/main/resources/tb-coap-transport.yml @@ -194,7 +194,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/http/src/main/resources/tb-http-transport.yml b/transport/http/src/main/resources/tb-http-transport.yml index 1d7904142c..8d4d6fadf0 100644 --- a/transport/http/src/main/resources/tb-http-transport.yml +++ b/transport/http/src/main/resources/tb-http-transport.yml @@ -177,7 +177,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml index f348489e12..8fd1c11e6e 100644 --- a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml +++ b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml @@ -273,7 +273,7 @@ transport: # Queue configuration properties queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml index 356694d3e9..6c51d18ab7 100644 --- a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml +++ b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml @@ -210,7 +210,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/snmp/src/main/resources/tb-snmp-transport.yml b/transport/snmp/src/main/resources/tb-snmp-transport.yml index 16516c3194..eeb6807714 100644 --- a/transport/snmp/src/main/resources/tb-snmp-transport.yml +++ b/transport/snmp/src/main/resources/tb-snmp-transport.yml @@ -156,7 +156,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. Used for all topics and consumer groups Empty by default + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" From f3a0d3a7e8a900397268359e0ae21784a4bd13a8 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 23 Oct 2023 11:54:45 +0300 Subject: [PATCH 07/39] fixed HashPartitionService --- .../server/queue/discovery/HashPartitionService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index 22bbb48871..f0635250be 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -107,7 +107,7 @@ public class HashPartitionService implements PartitionService { QueueKey vcKey = new QueueKey(ServiceType.TB_VC_EXECUTOR); partitionSizesMap.put(vcKey, vcPartitions); - partitionTopicsMap.put(vcKey, topicService.buildTopicName(topicService.buildTopicName(vcTopic))); + partitionTopicsMap.put(vcKey, topicService.buildTopicName(vcTopic)); if (!isTransport(serviceInfoProvider.getServiceType())) { doInitRuleEnginePartitions(); From 603be29f1bc001fafa73fb9954986d95faec8623 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 23 Oct 2023 12:35:38 +0300 Subject: [PATCH 08/39] fixed topic naming --- .../server/queue/provider/KafkaMonolithQueueFactory.java | 4 ++-- .../server/queue/provider/KafkaTbCoreQueueFactory.java | 2 +- .../server/queue/provider/KafkaTbRuleEngineQueueFactory.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java index 01a1c11656..1d18b0ad6f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java @@ -198,7 +198,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName())); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); consumerBuilder.groupId(topicService.buildTopicName("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); @@ -224,7 +224,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName())); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); consumerBuilder.groupId(topicService.buildTopicName("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java index ed546fc8aa..09dd7d8820 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java @@ -181,7 +181,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName())); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("tb-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); consumerBuilder.groupId(topicService.buildTopicName("tb-core-notifications-node-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java index 202b209a26..441e60c36a 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java @@ -177,7 +177,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(topicService.buildTopicName(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName())); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("tb-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); consumerBuilder.groupId("tb-rule-engine-notifications-node-" + serviceInfoProvider.getServiceId()); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); From 15e6190a9d62a35c9008a0e3c6ec88f0ecf3ad0f Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 23 Oct 2023 17:40:39 +0300 Subject: [PATCH 09/39] optimized topicName creation in HashPartitionService --- .../server/queue/discovery/HashPartitionService.java | 8 ++++---- .../thingsboard/server/queue/discovery/TopicService.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index f0635250be..ad55334030 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -103,11 +103,11 @@ public class HashPartitionService implements PartitionService { this.hashFunction = forName(hashFunctionName); QueueKey coreKey = new QueueKey(ServiceType.TB_CORE); partitionSizesMap.put(coreKey, corePartitions); - partitionTopicsMap.put(coreKey, topicService.buildTopicName(coreTopic)); + partitionTopicsMap.put(coreKey, coreTopic); QueueKey vcKey = new QueueKey(ServiceType.TB_VC_EXECUTOR); partitionSizesMap.put(vcKey, vcPartitions); - partitionTopicsMap.put(vcKey, topicService.buildTopicName(vcTopic)); + partitionTopicsMap.put(vcKey, vcTopic); if (!isTransport(serviceInfoProvider.getServiceType())) { doInitRuleEnginePartitions(); @@ -125,7 +125,7 @@ public class HashPartitionService implements PartitionService { List queueRoutingInfoList = getQueueRoutingInfos(); queueRoutingInfoList.forEach(queue -> { QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, queue); - partitionTopicsMap.put(queueKey, topicService.buildTopicName(queue.getQueueTopic())); + partitionTopicsMap.put(queueKey, queue.getQueueTopic()); partitionSizesMap.put(queueKey, queue.getPartitions()); }); } @@ -423,7 +423,7 @@ public class HashPartitionService implements PartitionService { private TopicPartitionInfo buildTopicPartitionInfo(QueueKey queueKey, int partition) { TopicPartitionInfo.TopicPartitionInfoBuilder tpi = TopicPartitionInfo.builder(); - tpi.topic(partitionTopicsMap.get(queueKey)); + tpi.topic(topicService.buildTopicName(partitionTopicsMap.get(queueKey))); tpi.partition(partition); tpi.tenantId(queueKey.getTenantId()); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java index bab0afbb23..40e19519b0 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java @@ -27,7 +27,7 @@ import java.util.Map; @Service public class TopicService { - @Value("${queue.prefix}") + @Value("${queue.prefix:}") private String prefix; private Map tbCoreNotificationTopics = new HashMap<>(); @@ -57,8 +57,8 @@ public class TopicService { return buildTopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false); } - public TopicPartitionInfo buildTopicPartitionInfo(String topic, TenantId tenantId, Integer partition, boolean myPartiotion) { - return new TopicPartitionInfo(buildTopicName(topic), tenantId, partition, myPartiotion); + public TopicPartitionInfo buildTopicPartitionInfo(String topic, TenantId tenantId, Integer partition, boolean myPartition) { + return new TopicPartitionInfo(buildTopicName(topic), tenantId, partition, myPartition); } public String buildTopicName(String topic) { From 11f77c68b01198aff0815ce750d5377a32751511 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 25 Oct 2023 14:58:22 +0300 Subject: [PATCH 10/39] Fix 'Device created' notification when creating alarm using REST API --- .../controller/NotificationController.java | 3 ++- .../NotificationRuleController.java | 2 +- .../NotificationTargetController.java | 9 ++++--- .../NotificationTemplateController.java | 4 +-- .../service/action/EntityActionService.java | 5 ++-- .../notification/NotificationRuleApiTest.java | 25 +++++++++++++++++++ 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java index a88a7ee4f6..24dc41f199 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java @@ -271,6 +271,7 @@ public class NotificationController extends BaseController { @ApiParam(value = "Amount of the recipients to show in preview") @RequestParam(defaultValue = "20") int recipientsPreviewSize, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { + // PE: generic permission NotificationTemplate template; if (request.getTemplateId() != null) { template = checkEntityId(request.getTemplateId(), notificationTemplateService::findNotificationTemplateById, Operation.READ); @@ -386,7 +387,7 @@ public class NotificationController extends BaseController { @ApiParam(value = SORT_ORDER_DESCRIPTION) @RequestParam(required = false) String sortOrder, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationRequestService.findNotificationRequestsInfosByTenantIdAndOriginatorType(user.getTenantId(), EntityType.USER, pageLink); } diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java index 2afb67a8bd..4321be8122 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java @@ -161,7 +161,7 @@ public class NotificationRuleController extends BaseController { @ApiParam(value = SORT_ORDER_DESCRIPTION) @RequestParam(required = false) String sortOrder, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationRuleService.findNotificationRulesInfosByTenantId(user.getTenantId(), pageLink); } diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java index a4c829796b..51ed86441b 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java @@ -139,7 +139,7 @@ public class NotificationTargetController extends BaseController { @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true) @RequestParam int page, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission NotificationTargetConfig targetConfig = notificationTarget.getConfiguration(); if (targetConfig.getType() == NotificationTargetType.PLATFORM_USERS) { checkTargetUsers(user, targetConfig); @@ -159,7 +159,7 @@ public class NotificationTargetController extends BaseController { public List getNotificationTargetsByIds(@ApiParam(value = "Comma-separated list of uuids representing targets ids", required = true) @RequestParam("ids") UUID[] ids, @AuthenticationPrincipal SecurityUser user) { - // generic permission + // PE: generic permission List targetsIds = Arrays.stream(ids).map(NotificationTargetId::new).collect(Collectors.toList()); return notificationTargetService.findNotificationTargetsByTenantIdAndIds(user.getTenantId(), targetsIds); } @@ -181,7 +181,7 @@ public class NotificationTargetController extends BaseController { @ApiParam(value = SORT_ORDER_DESCRIPTION) @RequestParam(required = false) String sortOrder, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationTargetService.findNotificationTargetsByTenantId(user.getTenantId(), pageLink); } @@ -199,6 +199,7 @@ public class NotificationTargetController extends BaseController { @RequestParam(required = false) String sortOrder, @RequestParam(required = false) NotificationType notificationType, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationTargetService.findNotificationTargetsByTenantIdAndSupportedNotificationType(user.getTenantId(), notificationType, pageLink); } @@ -219,7 +220,7 @@ public class NotificationTargetController extends BaseController { if (user.isSystemAdmin()) { return; } - // generic permission for users + // PE: generic permission for users UsersFilter usersFilter = ((PlatformUsersNotificationTargetConfig) targetConfig).getUsersFilter(); switch (usersFilter.getType()) { case USER_LIST: diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java index ab171efacf..514210ec00 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java @@ -150,7 +150,7 @@ public class NotificationTemplateController extends BaseController { @ApiParam(value = "Comma-separated list of notification types to filter the templates") @RequestParam(required = false) NotificationType[] notificationTypes, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); if (notificationTypes == null || notificationTypes.length == 0) { notificationTypes = NotificationType.values(); @@ -180,7 +180,7 @@ public class NotificationTemplateController extends BaseController { @ApiParam(value = "Slack bot token. If absent - system Slack settings will be used") @RequestParam(required = false) String token, @AuthenticationPrincipal SecurityUser user) { - // generic permission + // PE: generic permission if (StringUtils.isEmpty(token)) { NotificationSettings settings = notificationSettingsService.findNotificationSettings(user.getTenantId()); SlackNotificationDeliveryMethodConfig slackConfig = (SlackNotificationDeliveryMethodConfig) diff --git a/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java b/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java index 99884b013d..77cc275ab2 100644 --- a/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java +++ b/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java @@ -31,9 +31,9 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.audit.ActionType; -import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.HasId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; @@ -179,7 +179,8 @@ public class EntityActionService { } } - private void processNotificationRules(TenantId tenantId, EntityId entityId, HasName entity, ActionType actionType, User user, Object... additionalInfo) { + private void processNotificationRules(TenantId tenantId, EntityId originatorId, HasName entity, ActionType actionType, User user, Object... additionalInfo) { + EntityId entityId = entity instanceof HasId ? ((HasId) entity).getId() : originatorId; switch (actionType) { case ADDED: notificationRuleProcessor.process(EntitiesLimitTrigger.builder() diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index 33aaf2af35..9af213a844 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -269,6 +269,31 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { }); } + @Test + public void testNotificationRuleProcessing_alarmTrigger_createViaRestApi() throws Exception { + Device device = createDevice("Device with alarm", "233"); + NotificationTarget target = createNotificationTarget(tenantAdminUserId); + defaultNotifications.create(tenantId, DefaultNotifications.newAlarm, target.getId()); + defaultNotifications.create(tenantId, DefaultNotifications.entityAction, target.getId()); + notificationRulesCache.evict(tenantId); + + Alarm alarm = new Alarm(); + alarm.setSeverity(AlarmSeverity.CRITICAL); + alarm.setType("testAlarm"); + alarm.setOriginator(device.getId()); + alarm = doPost("/api/alarm", alarm, Alarm.class); + + await().atMost(15, TimeUnit.SECONDS) + .pollDelay(2, TimeUnit.SECONDS) + .untilAsserted(() -> { + List notifications = getMyNotifications(false, 10); + assertThat(notifications).hasSize(1).first().matches(notification -> { + return notification.getType() == NotificationType.ALARM && + notification.getSubject().equals("New alarm 'testAlarm'"); + }); + }); + } + @Test public void testNotificationRuleProcessing_alarmTrigger_clearRule() throws Exception { String notificationSubject = "${alarmSeverity} alarm '${alarmType}' is ${alarmStatus}"; From 5495ec454f3b87ff4da87be866ddea978971c005 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 25 Oct 2023 16:57:02 +0300 Subject: [PATCH 11/39] Version control: fix edgeRuleChainId substitution for asset and device profiles --- .../sync/ie/exporting/impl/AssetProfileExportService.java | 1 + .../sync/ie/exporting/impl/DeviceProfileExportService.java | 1 + .../sync/ie/importing/impl/AssetProfileImportService.java | 1 + .../sync/ie/importing/impl/DeviceProfileImportService.java | 1 + 4 files changed, 4 insertions(+) diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java index 340298db7a..710e33f106 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java @@ -33,6 +33,7 @@ public class AssetProfileExportService extends BaseEntityExportService ctx, AssetProfile assetProfile, EntityExportData exportData) { assetProfile.setDefaultDashboardId(getExternalIdOrElseInternal(ctx, assetProfile.getDefaultDashboardId())); assetProfile.setDefaultRuleChainId(getExternalIdOrElseInternal(ctx, assetProfile.getDefaultRuleChainId())); + assetProfile.setDefaultEdgeRuleChainId(getExternalIdOrElseInternal(ctx, assetProfile.getDefaultEdgeRuleChainId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java index 82ce17893a..b95d8b83e2 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java @@ -33,6 +33,7 @@ public class DeviceProfileExportService extends BaseEntityExportService ctx, DeviceProfile deviceProfile, EntityExportData exportData) { deviceProfile.setDefaultDashboardId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultDashboardId())); deviceProfile.setDefaultRuleChainId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultRuleChainId())); + deviceProfile.setDefaultEdgeRuleChainId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultEdgeRuleChainId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java index 3255c418c5..68481bad66 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java @@ -46,6 +46,7 @@ public class AssetProfileImportService extends BaseEntityImportService exportData, IdProvider idProvider) { assetProfile.setDefaultRuleChainId(idProvider.getInternalId(assetProfile.getDefaultRuleChainId())); assetProfile.setDefaultDashboardId(idProvider.getInternalId(assetProfile.getDefaultDashboardId())); + assetProfile.setDefaultEdgeRuleChainId(idProvider.getInternalId(assetProfile.getDefaultEdgeRuleChainId())); return assetProfile; } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java index 70d09f6678..0684858803 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java @@ -49,6 +49,7 @@ public class DeviceProfileImportService extends BaseEntityImportService exportData, IdProvider idProvider) { deviceProfile.setDefaultRuleChainId(idProvider.getInternalId(deviceProfile.getDefaultRuleChainId())); + deviceProfile.setDefaultEdgeRuleChainId(idProvider.getInternalId(deviceProfile.getDefaultEdgeRuleChainId())); deviceProfile.setDefaultDashboardId(idProvider.getInternalId(deviceProfile.getDefaultDashboardId())); deviceProfile.setFirmwareId(getOldEntityField(old, DeviceProfile::getFirmwareId)); deviceProfile.setSoftwareId(getOldEntityField(old, DeviceProfile::getSoftwareId)); From 9d6ed7912324229f6278c39eabc06c51443674d7 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Thu, 26 Oct 2023 13:03:25 +0300 Subject: [PATCH 12/39] Bump TBEL version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6eba036d51..834a1faf92 100755 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 3.8.1 3.21.9 1.42.1 - 1.1.1 + 1.1.3 1.18.18 1.2.4 1.2.5 From 3917e184cb21f35619273fe76c6a14f2f29813fe Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 26 Oct 2023 13:50:41 +0300 Subject: [PATCH 13/39] UI: Indoor Environment: Humidity widgets. --- .../widget_bundles/indoor_environment.json | 12 ++++++- .../indoor_horizontal_humidity_card.json | 28 +++++++++++++++++ ...izontal_humidity_card_with_background.json | 28 +++++++++++++++++ .../widget_types/indoor_humidity_card.json | 28 +++++++++++++++++ .../indoor_humidity_card_with_background.json | 28 +++++++++++++++++ .../indoor_humidity_chart_card.json | 31 +++++++++++++++++++ ...r_humidity_chart_card_with_background.json | 31 +++++++++++++++++++ .../indoor_humidity_progress_bar.json | 29 +++++++++++++++++ ...humidity_progress_bar_with_background.json | 29 +++++++++++++++++ .../indoor_simple_humidity_chart_card.json | 31 +++++++++++++++++++ ...e_humidity_chart_card_with_background.json | 31 +++++++++++++++++++ 11 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_humidity_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 90717e5745..9df61bf1bf 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -17,6 +17,16 @@ "indoor_simple_temperature_chart_card", "indoor_simple_temperature_chart_card_with_background", "indoor_temperature_progress_bar", - "indoor_temperature_progress_bar_with_background" + "indoor_temperature_progress_bar_with_background", + "indoor_humidity_card", + "indoor_humidity_card_with_background", + "indoor_horizontal_humidity_card", + "indoor_horizontal_humidity_card_with_background", + "indoor_humidity_chart_card", + "indoor_humidity_chart_card_with_background", + "indoor_simple_humidity_chart_card", + "indoor_simple_humidity_chart_card_with_background", + "indoor_humidity_progress_bar", + "indoor_humidity_progress_bar_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json new file mode 100644 index 0000000000..1d630dc25c --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_horizontal_humidity_card", + "name": "Indoor horizontal humidity card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQ/pxrg4ODz8/NXsja33qnOzs7IyMisrKyf04zz+vHn9ONLrCi2traHyHD5+fnb29vCwsKQkJDn9OJvvVPb79S8vLw9PT3n5+eTzn7V1dXP6cZYWFhjt0V0dHTD5LhmZmb19fXt7e2r2Jur2JqCgoJKSkp7wmGenp4vLy8hISH9/f1hfASuAAAABnRSTlMAIEDfv1C6kOEmAAADLUlEQVR42u3aa3OaQBiGYdukD6+7nJGDKApKtDGapv3/P64cYtFOqvmgDXGea0YHd794uy6DIwMiIiIiIiIiIiIiIiIiIiIiIiIiIiKi/+nLp9dkfL0zPrvh3beqw/iOT++78XVwr3ADvt8PhrgFv4Y3EgKG9A1D+oYhfcOQvrnxkKfSwwHHQJHhwBaA7dgO+nOd9maIK6J9dJY2nAelYMBonuEAhjMubHunDKgr1qxMH8DUbHhoeBvXPxPSdRyXLH/Y2wf7AUtjtp2t10vMsF3Pxs54PBu9qK2DazFFTAChNHzUUq1Lmb4nxJVG6XUhD+P1a0i1EPhZhbzAqUKMJcY/ZgauJNVtyEQ23Yq4gQcdVnOLMyFTeZUffbWOQ9RsH2LP1riWXHQTUgo6rq7KQuQaZ0K07C2O98hu/dKtyHi9q0LULsPSwZWkkk+aEAngYe9J/FTnqfhnQkyRcBNI8CyicUy98UIZO4Ur0dpvQjwJApFnHw2vrDewDnEmRIsAYTBFWS/JeT9GuBK3imhCUgnCXHef63SKJ+2fDGl3iLsqp3CbXfKBUgnRhsBLq0cgi24uMKeu658KWUglaDskxAfS4ppmKeEKrVBc7IVhGkxKmZ4ISV87njfBx66IJ680FqYPIO9CTPHzAND5iRAEIiu4AoT1QUvhDeoRx5TCJS1qpeTVhpDnZoUW+0btImxOwqdCXBGd1/vkYHeN2hiFxxiNKEI0tOqBISIAc2eOKI7biQi4WFJ71tISupPu7aw08BT41UY5FeJp2TMPQorCim3bqo4SJHGSRaPEKgrbyh6tLAKsucqyGMpqJiw7u2QI0omITHwc8CbViHcqBOm+ZIPDEGukbGtutSHzIq6Oq7F5bCV2EzKM4yrEHs1tVeUmChfl+R7+4vvnrrU8sxQJwin+cKw4sUaFnah6RawsTkZqZFvV2GM2ty3UIVG9IvPMqSeKJMEFXP+HVTzHvxV2jPfoQ0gUnZpUeI9ehPQRQ/qGIX3DkL65pZBfuAXDwf0N/M0OqPvbuWFg8O1uaHx2d19v6aYaIiIiIiIiIiIiIiIiIiIiIiIiIiIiov/kN5uj+TgHcSVHAAAAAElFTkSuQmCC", + "description": "Displays a latest indoor humidity telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'humidity', label: 'Humidity', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:water-percent\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal humidity card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json new file mode 100644 index 0000000000..b2776b6a8d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_horizontal_humidity_card_with_background", + "name": "Indoor horizontal humidity card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor humidity telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'humidity', label: 'Humidity', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:water-percent\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaAAAABcCAMAAAAfz5G9AAADAFBMVEX6+vv+/v73+Prn6Ovt7vH19vfv8PLZ2t3r7O/OwbPV19vi4+fIuKnx8vTDsqLHt6fT1NbFtKTKvK3o6uzR0tXMvq7b3eGzs7XKzNDf4OPT1dnk5efHyMve3+Ht7e/X19nKuqvq6+3h4uTAwMPO0NXOz9PQ09jJys3NzdDBsKDZ3OCfn6Dm5+nLvKzX2d7Exci+vr/Cwsa2t7m1tbfj5unNw7nHuqydnJ27vMDf4ua4uLvc3N2ur7CrrK/Mv7LLztPNv7CUk5WwsbPMwba9v8O7u72qqqxrWE1vW0++rZ3Qz9DR0dOhoaKPbV3Ex8u5ur1yXVGamZqKa12AfXt6ZFjExMWoqKmPjo7c4OTOwrWYl5fW1Na/r56KiIiFg4LOxbylpaZ4YFPKvbCjo6SRkJJnVEnMy82xr61gUkjU0tKYkY2LiouclZG8qprPy8eVcV6tqKalqa6mpql7eHaid16zsbJbTkavrKqSiYOKhILGys/Hxsh0cG6go6jBxcmPhX+EaFubnqNmYV6bdWCrr7OfmZWGhoa+wseSjYpkV06iparPyMJ0X1SYmp+hnJh6Xk9wbGmPioeCgX/a1taAZViqpqPb2dqkn5t4dXKFf3yztrqUlpmGfXZ/eniMgntpZWJ9aF5iXVmJZ1TMxcCeoKWKgHjOzc2Xjoi4vcGoo6Csl5GiemN3XE1VT0vSzsumop9+YVHLx8eDeXOAdm+PaVbVyb18cm2CbGHEo46xloqusrdtaGWDZFKeclrFwsLHp5VeWFXEyM3TxblaVFC0ub1LQT1QSES/oIunjICahX2UbFd4bWivkoWFcWiSdmqab1jIvrXRw7XXzsO7rKWziGmgioGpfF2wg2Lb0czDvb22mImTf3m7npyMcmW+npW6nIupg2ulkY2pkYaMenR0Z2BuYVnZycG7kXafjIm9l323jXCaemjdzcfAubfBnYS0mJStop3hx8GuinicfXDSx8S0p6Kkg3W8tLPjxLi9sKvdvKzs4t7Wsp3n2tDnupvXn4MrcydfAABCZElEQVR42ozaC1STZRgH8AqEkiwKaiIDg0msRm1s5Whs1RZbJZM5ka3wbE1ZdIzMAstIzFvR1Q4iFUKEZDczLbW0JEmzLNOKMs+JKLuYdrFlpUl26pz+z/vs3TfwcE7/D2hdPWc//8/7fN86Sa/O1xcZrb4ql6VCPVqtMVrNgY7W1taGpu6G8pqwt8rhUBnbfP66hqbOzq6upoamrjU7dqzZvnVRZ1NDXXOgBgkE/HZzVahKpzPr3O6qqlCtz3UTsocyM5q33nrrn3/+/vvvv2R+pxx8e/rxP1/8du/O/v0fbpoy6cY7d+zYsXVR98b1/Tt//PbFFw9/Gc3h3e/vPPLRR1999aHMJs7kyZMnTpyIn+IFviizRCZG+gbmZiSmpeSmZGYmJJ6aPFKrVe+hv0v/woIFLS0tU0SmTZv2yCOTcMVlyoqNG9Y/uby+vj4QqPGH7e3IknYlS5YsXPgMZWF8npk376Hb7713c9s7L7xQcn/ZttFXjDt/5MiLLzz3ustEUlJSLrnkkoSEhLS0tFNFEhMT8Y3Q6+hfSUpKGjUCOQU5qTpPq9Z4VHN8LqNGANm89QzUCSC7N+RQqYxGV7iuobtzUVdXd0PTou071gCoC0KtHc3BxsbGQE24ssrn8oXc8JFCcxhICu2bKYHIBjrsw0A/7gTQ+g9XHHjwznff3bG9q3vX+v75P0Lo8GEJ9Mb7xwAEIYEDHgm0afJXYCEeXArP4sWzJh7vGag4NwaUnTwyrzr/+KyJ8IkCCR3yYSAWkkC7Ng4BWoIoPgAioXlsxDzQud0GnrZ3wHNP2d3kM2ak4AEM0RCO1GGYJCT6A3/Cf2nUKOaBz0npqaX5eoPR6rKaDPr8Mo3FVRmsg09DNxoUsHt9KpPJ2AYgahBQCGgNQkLdDXXlzSCiAtVaHaihjgKikM9325w5f+7hKA2CEPnEeA4evbRXAPX3P7t//a7vD9y5491313R17lq/f+dgoN0MxEKbFCHyobAQRwChJ3/2DPQkJ6ZlZkAIQMXJDMQ+AEKoPgwEImmDrwMA2rB+eRQobLfDRKYdlwBinnl0iRfwsaE+76A+8NkGn/PPH3nxxfABD1xkYjYyEEmKC/Owz0ljxqRr1YUGk9WqclaoyzRGl71ZAqFBZpfJaDJaog1ahNY0dW7dDh8GagVQYyNNQpfK6HDVulmISvTYbbf9KYWunTkTX7JCBPQL+wAoIoDmP/XUs09u2HXgQQLa2rlrw/75dzEQ+yhAEILOik0rVmzatAAXKqQIgQgFIR/kgxfXDRiSs9Mys0SDErMAVD3wEQNJH9kfGRbCNwEpBZI+Sqgw8QEP+Wze3AYe9hlHPtQfMdbgwr3hRC3wdUIUHyR5bGpedZnBeNMch0Wj12ssvnBzHXwamppamwN2s9ViMVreAVATgBD8oWvrdoRmHAEF4VNpDlkBaRNAZggRUUzoAghRLjhDALHPL78c/P3g0aMrewH06I93Aeip5R2tTV3bdwBoEYD6UaHYIbRPAB1RgMgHQisWoEJSh3wo7IMKfUdApxIQGpSdmHFuenU+gNAh+AwDREaU77/HiANQYCmAqEBkEusQ90fC4BI8wofHG3yuwHwjH+4P9YZh4qKQIKNwjRCvFR8GKtXmVzgdrjmmosIKjTHkb+6QQDV2ncPjtFgsNgEkKtQJIBEecfDx271un8NoUVlrq9xExCVateqx31gIRpQzzjrz9HMABB8R8lnZB6D7ADT/qfp6CHViBYkBoUJKg944duQQV0g2iII3moWggyg+JHRsXSSSmsZABdnZuVkjBRB8RIMUn0kMdM2ka66Bj9gXpnzPDUKBasJokFfwsJI8gKAigGDzEBLnU4b+iP3gwguvu07MN/YZxgY0g8I8nLFjU9PzCMjnczg1FRpT1QMERKkL1lRWmYqKPJ64BkGpiyOAmuET9uqqbNgkVLZ4IPeqVb/9FhU6vueMM84Cz+nnnfPJJ28f/IVzNAp0m2hQPRLsaFi0dQ2Amjbu75+/Mzbj9nGDpBD1J+pDQkqD4nxWr168+NDKyEB6QlpBVi6ATk3MzbhYq2YgahD7MBDnGoQrNASICrSQEv0pCwQgXAgR3c7rm+JD58+FSn+Yh1GkjMQZjgdJTR2TWjq6wmMNhayYcSUOXYCBML4AVGs0AMjispcDCAGRBMJ5hH8k4A+3m921NofJhDMoREBmAtK5X14FIil0/PTx48efffb0K097WwB9jksBuvmu+eDBwh6sw5DDCv/9xvWoEAORz74vdv9xjIUkkCSKFyIe6bN69uLFfX0D2swcAiooyElMyUjWokHxRxCvB5IH3xSecwJoOYBownnJhCOdqD8ywEHkek3z7W7a33jADfWRJmKiSRPhIr6YR0l6OjXoHqc1VOUyAsjqDTSXExCNL7/XZykp8RR5ANQAIBaCTRdBERANOBTIZbOqsMWhQTqzGUAIhAiIiY6fOX769N7e3suv+gRA8EHWkk9PX2RgzhM3L62vX7o0HA7XNLd2d2F4DgU6LIEODQJq4Q5BZ2h9CGj24oG+gfyUtALa4qJA6sgRAoIq+ShAsFHCQLJBVCDJAxdcIif6bI7br3mB4wNIrNW0QrMPriG9AYuM9FGSV5qOM6iQGkRARS57Y5CA6PxvDJtdACoqQoOaceeKAIh14IMJByBRIJ/NZrWKGyEJhCH38ssAYqHj46f3XnXVVZdeeukNN7x2ED5C6NZ163p6+gbmrLrvgaVL/fbKykp7oLyhE78A3p3BDfp69x9SiIGm4IuEWrhCzCN9okKLZ/YN9GSkJeRmACgtOyULQH1HlAbxAaRMuFhwGh3AkiCBlLtSWqolEMEwDwHZRH+wYYsCjeYCnXvudTzg4vujRNZmeB+kWluaNxq3P1afz+op1Dtr/QzUSm++XeeyaApLDBZbe7C1iYWoQezTREcQCmTGbY+LIgvEQgTEQgTUe9UNK1c+fJSyFjgzcBHQ3J4e58BtT9wStlea3VU6b7ixrgm/RBwQdAjoCwLCnkBCkwkIoRJJIPZB+PzhCu0GUFZCQkpGZmZBQnZuRnKeuu+Y0iBlQ1AGHHI1vWCgIAN5zdQcJbwgUHPoB/EInzblBkjZsOWCQD7xQw1RaEYM44Oo8/Pz1XoAuVyqoooKi7umMdgMINrPcHtj8wCoxGNb0og7VRBxh9iHHiQ0iglXW+ujhITPiTMOQL290FlLIZ5ly5ZNnTFj7XPVEKrQOO/wmb1mN5R9Ia+/mdaR7hjQPs57APoGOaIAUSQQfJQGkRADHeuL9CUnJGQCKCEtJyXjwjx1z8645wjxJxBU4jO4QVygebiYR2wIXB0Ggg8ViAccb9gAuo6AFB+5Q3NxcA0pDi7SGSxUMVev1xeWGB1Wh6VwrsbhDQQbAYTjnwoUshYV4u96HDp/Oe/ecUA0BQMM5MNFG4JZAqFFTwgg9on0rXz41rUzZixTAqIJE7TV1fl6PP8LuUM2B+LSteMYaupmoL3coLf27XsdDYLQsW++WU1Cm6QPA0kfKTRbCq0eH4mMLWCghJzM3KxUdc/eybzE8Qkkebg6/APfB66WDcKOQEBMIsN/wuWJ+sgHPFwgOoEw4QiIB5wskFKfoTgMc2IMGkqR0WRyGsrUJTY7Hq0BqI72M6875DDcoy/UFJlC9sbyujp6hIpdgW6GANRK/5AEEj46BQhCBIS71T3HByJ9PSvhM5VcHn/88eLiYvwcO3ZqemnpBDzHcKoAbFWpVI7bach14PfBro0xIAi99fp7P/0AIMqhQ7MYSCC1KEBKhUAkeGZvmYkbocyEgtwoUMYYdcV3kxGlQAoQG12NbyRuxPntS7ARDA5PuBgPwv0RKzY2OJxAyoqQM2TAnXjqKMU5UQl3oc4iAzZpJz0rdVbVBAGECUdvPd55lUZfhucLHpe3prG5vLxOrArCp5smHD1FAKOP+hPCCUQ05EN3Qy+H8DzupjsGwNPXt3KdAAJOlkwxEaWWTqjWG1QuAKFAtpDOa8euvXGXBGIfAP36w88/f0ZAqwE0uYVwhgLNEhE+s0kIQG9EIqUpCQnYsvE+MdCLMaDYLZDEwSVwHryGgToAREvcEnCwBVQQpT2KD4DYR55ABDRkwkmfQeGxNnzo0wSLx+k0aPTVWrXRG2wOEBDugcJmzB2LRo0UFjl0dn8g0CiEOE3cMjzmISCXr5Y+bmAffhrnm3OHyeI0QKcHISDUBz65IhlZxcnJAMJzjLkGkw174L02PCoye9v9jeUS6Ls3Dn+tALEQZtxXkxdIH0TuCMgHJLQlTujYQOS5XBxCOKgJKHfk3MJvWxYMOoEe4ftTBmKjIUDtC8Eh9gAbG4kFm3EQ5pEHUFnMBzsc36SSDwMN9VE6M/yIc7msDnofC/X5eVq91Y9jBatuK07/SnetS1Wiz0fKNG215nZ72B8ox5RDsCE08ITD9oVPGmwuCKFBvGXjabZrjlVlMWh6ZESDyCcD4wZJyc0qLkaDUKE8dSGtKDYbtkCd12sPB4IdChB8COj1X3+IVggr2qzJOEEYaAoDCR1cXKEtUSD83BOpBlABBlzaqTk52dk5OVnL1vZ+FweECB0K6cAHFeqKA/I+Iz7jQSSRsrtxe6TP/cJnSIFy5BE0dL6d9L8SqiUhp6YsXztutKGqsQ5AHQAKhM14PODRq0cj+EzPUaszV9rDUgh7eGvH8voaKpDLio8abHwXhEDHeofJiJlZqK8o7OkT6Vm3joGETwGmDUYcFQhA+Xp6mI7fiwKo3e5v7Nh4ItBPBPQZA00EEL3BXCHRoFeF0QcffIxs2TKbQjPucCQ/l3BGjcD7gfcmKbEgISeh+PoFg30AJMcbgHBdLYEwI5bMwxgjhDZGIhvmkT7g4UcI8T4MJHcE6XPiscMvho27CkIqT2E+7ljzjd7y1vIATum65ppKt8tkwbmkRfBBngdPQkGE+UMfRpBPHe9wbpcDpzsJYcjRHRGe+hhpZhoKKyo0mHCRSEQI3TpjKgEJIcWHbpPnlnhM9J+wukI6s7cyXLN8w8YNDPQFgCjcIAWIdzAo8Yx7+lXKBxT4AAhElC3HBtQZ2YxDj4qT0gqyR+XkLvv8u2mI4sM6nAfptWgQRoT4sPghG+8AYBBI6JH0QSAnFwS5wQkgeZeKBiXFA/2f/pysfJl1EMKGrU1PzSuzhutaOxqDHa11zX5zrQN7gzYvb9y4cdrRZSVGKwR0lf5AsLyjDukoX06LXpXNoTIZQQQhGpd3qEx0pBUBCAuiwRkhHwaaMFU5gtgnndY4WrSLPMY2RGUjIbu/fv0GBtrNQNyg4YGeBhBFVIiFOHjakzFC4AgeTLhRIwoeX/vwwxdNeok2BEVIhvrzIJBiQOH2Z/AUBwIcGEEoFnAJO8UH/Rkzhidc9AgiIOUmiBM7dOSCPWwqvTp3rdWi16amajWhpRhcQQB1BP14iFCoHp2XincxLw+7sKdN5bDV6vD7O4Bb2ebly5vJJ0TbsclkwppOL4xGowU+4HE6iYiALBEecc+JJQGnUJbYEKSPtnpuIZ7H4l/EtdlGNbUvXf7k/ijQ168PAwQfCL3S0vLmm08jAijmI4m+XpY0imwo2dnZeJ1T/Pmnr91w6ScLJk2aJn0QxYd/HpBANdjhbPeKRwQiJUQEI4SB2qQPFoRtPODYh4CUzxnYRwFC/leFAGTWCaD00nyPO9Da0NGMipTX20OqEvQndcwYvI/jcE6UFFlIyOzFrlATAFIj+1CMHsIgFI+HgAxFThECQuADoAm8ZoMoi3zGYr4Rj1pfYTC2mUxtoKWPlLBmVIaXzu/v79+7930GQgYBLZ71dMs0ziuvvNICICnEQJJn97+jEooLspNAkyR23KTMx8Hz2ms3XD99LzY3xhlUH64QOiSB/O0Lb78XKzT+D5Bt28ruARH3CEWitCGsxwcQA4kTaOiOMOJEIOUUGj4AcuODBrV2nFZvMgcBFAyW43Sp9Bn1eePwe2Fk6jgCoucJGEE+nOOVlTDyB7CHY74JH8xCel6kARGALKARVKJEckegBwlTxwIIkT6l8ME55VFhRbA6YKSyERA69PzzO3cCaJgGzXr6zSlRn2mvvMkVijVIHkKr9yVhJcjMTMum37ynjMrJLF72+acIgE4bPxN3pNJHCt0Ym3CxBtX4vfNsm995gd595O6774FRSYlAgg3xSJ9tGHCDCyTvgrhBzMORJsPanMzfyH+c3HlsbGMYx/HWVq3qQum0ptcyM2as0+mETqrDbU3LbTmjaFFbaRWxX7tBLBdBLCGWVEQsQewSe+wk1C6x/CH2iPUPSyzhH9/f+8w7Z9q6Ih5z27HTT3/P+5z3PadjtLipfDGIpKJ9+clrXIu7hiG7tz8WibcxzTfAA1AQKxR7BlcNa1RgIR8YmBko+/QNFTJJ1qokOw45gNTiHFSPhOw6yAGNsNVj+wgsQBoPRsynL9s/wXzBUtg+OHzOHr26zL3y2G++WS1QmKCrriJCi4B8gj6pWXst7kRYX2vPhltcbzgO6MUddt6xcV+EuPyBp+JzBEL8ulTlgG7mavCKy1bN3X2JW13i8V0iZ73wwrkOCSErfOApX6F6H1YgAYUJWrQEhcmpaK2GqLeXOa6fcTqayU5wvwibcOpeM3u0ZxJtZLWhsy2hNUgLeXaQYZoNAxEBu7LfdTdN6IyAiUg0E+tWhsQCUJZlRUDmAxBCBwJEaUDQ/MZ8QOo46ZtiF0+nSqt4p8uoqakHr/z8Gwf0j0PC3k8/ZED4WITCFldegT74q7a2Zv3N1+va6dqjH3AwIdC7y3dsfl9AqlDnCBU41S1u4PzLVhUL5+oATiUiM4JIhY8CZD5loO3LASoPcesumbKXcnguPi0ZszVnc6jAbsE0W8mcILhDxOls2oBa8IlEgkwhRwMaFpAda+/BKTc1lIkm4q4SkWSQ6a5MB4wNfQJ69tnxEj6zliAipLr2QJsPcB9i4ZmYlnjv9Em6WtVNdf1HnvjjPZ+/+uobTy4FOkUtzgHdpwRZhFR+DTKfr2tr1+46+vjbD93BTqEerfg8+mL9Bo2tzchU4mM6fJSP6tavrrYWN3DHSU/dLR++8J2dCIkII5ciCp5qIHwE5BKEj1pcCITPaoWQWWxkLY5dzmHG7Bz5GO7lfhFNlgCNrcymI/GWTgWI3qsZYW6w33bcVNNT+WyxWMwV0qlEWxxDFioylFaG3Hyd6yNAvIOnVMJn9s47BWRC2kHwQN09AtrGMknP5HKI69zsqSf+aECvPOGB8Hnvww9dggC6ygqfhauQB/qptqbjztt3dce4B+zwIqNBmYcA1W/Q3Nr8i985EE5Yl5rRV68/Zgm6Iz9XCCK2Pd3QABEp2kVEzsgpeSBrcfx1fgnyCQqHhEVrkH/je13oUzGa0CYLjarInv/kMYfsQ4COYYe9d8IN2W0t+OjASD5V94RMcRdPrjtXCPhLNOTF9SmRiqTHY6C4K9QhGpziYzwAjQDk9rM33VSnQQ4oyQhnLU5CLGrtRX2r9AwNZY/88R4H9EQIJB+XoNcM6D4JCYhaBPTBz+vXrr3p8bu+c/gGhx++c/0B7yKkks+L9csBamoiMBJShTo+QQDdeDMJuumcVS9fogBpZdneiBCKqNMFwbkOSUAmFM4ILEEuQYrQsiVAS0xWf6bqxida1dzgyl42krnNTT7cKZot5tIsLpGzosG5mcLdGrBYKKy4y4rJIIimYGExkZF+KUKsQ7FxTpiIkIDkEwUIHwMyH4BGqNlkaTyD0KlMh9PYT+ezhSB5Vkwt8tQTAVqaoA9CoDBCEFX3OAH9WVu77MDb39lRtcFyCb2IkXjefVdAzU3NvyAUrj7UUW4JOsrWIG02MiwxI9wN0JZu4TchtTmIELLFiALI3SqC0BIghKzHyee/VXWwxNMHUPvEHmMznKYyIOAzMDa9qr0nFwuCIB0rFPimZn7Dhz406b7TizHlq5NqIWWGpAwl06xm6VIpHRMQVhKqAkKIEtAox3UApUtg0uXyap8r8z3sOSWisRjHrL/e84UBISSg7zzQM2GCqptcdYLufW/t2jU2OVpAjQBttFG9EcFDg6vfaIPG5qattsJFryU8lqCzdZwy06slKEKA1La2RgggL+SIAiNSl0Mo3MkOhQBaZleq/4doUEsJI9fglNsk8ECT26wchqiYo+P0Ea9+uhDTtVXvyp5YcpcES5SAWvQJIlnFIYpG6YmBepxGBAFpAQKIC6GjQyAFaDZa4jBjnPmcgObptYPa0uhMkMM+AX1hQE8sAnrtEQMyo1AojNC9f9TWrt/1wA5lICdU/64rfJZvtB1ABzXPV8JjQEddetRRADkjnt0Q0MD5J71cCBQgAyJBXkgrkV+LQqCqCNkiFM5x/w5kJ+HhUbhPEGtJTgnpn2IPbD/bIBigxty9OoPawUFngssffAYo8PbI83XUZNBmQvwX8VnfXCKKUEli0bcACA/5ECF8DOjOWTDh5FeGJc6dTOWCVEtDG5dUv7MGGRBC+AhIa9AHH5zytgN66Kr77ruPX2Lyy5CP0Clfr11bsy5L0OE0OANaXk85n3cFtJkS1Li7m9yMhxdlRkqQO9E/5qY7VjHDAWQJkpCGOR8ipchnKFyFwgshD7Ts34VkIiArvQkXo/ZiIRNjBMhPA6RtNq7NQOAuG4g4y/ZHpZyk8Ucp1ifu/4kmEnxhI/EyEDsDdZQjSuCj6xumOIBKAjIe63DmY0AECJ9SEOWmiHa11Ew6moI7le7+/USGBO3FfVoGshmBBD3z9mu3OSAT8l3ORwigU+79gRm7Qx3OgBBajpAvgHZkSjio9UlnY0C+FCAPdAhL0FMFAXU6IGtyXkhEJiQf20tQghZHSEDsly4FMprVlBdqz2V00wgz3BUAqcUZ0H40Oi03Y9RN1IB4+KP7KUDtuSgTW4ZLIDW2LQGi2CDYWkSKEEBDbg1SgpIOKOxv1x5dDtDDJZVbhgrsO3A4GElGUkSxrdStAL3KcQM+C4FOOSUEojxQ2OMI0Cdco67V+YADanQBAij0UYLU4w5qPi8U8j728dZb3InxzPknzQkoXgbyXQ4ghIxITc4nyDYT/F6PB6rucVQ1T+jjNnX1st8oD8QmQpApMsQBxD61A+KthjmRLCzY2EHI5qJclMZiaXaDmA86t6/jP71LtfHWDW0pgKKsQQLKcJWapMH5/GxqCfJA41SGIsM5d7YREVBdW2no9B8/LwMhpA739XtloGfCFqdasAqZz2fLCNAWRx/PEqQyIIRCoA3oca1brWg6qGoBWpghB3QxV0Ha5+EyqALkZ+3qEKnJ+d0en6BwLyHscYuIPI1+W1r219a0FwJd5+Tah5ni9nMJIiQDDHQXc8VKz6MO0Qd+R6VHgQByX9RYLGDmAqhBQB2uuupaEghFmZ6HBJQuRZPOBxaN2Nf7FgdQafxZLml55eSTZFBPJZORloa6RKbvRNtIqAIyHw9kAQqJ8DGgEy5kQiBAdQTIL0ESql8ODb+5FkeE6HErVjTPI+MXoNO8z0s+QQdfwU4pG9nW4zZ2BZCEQiK/P7e4xVX3uPDIYamQafCk0IKSpwqgqPuG79GUYED0NgY6XFTcykNdQ/GnMBrYY6KfwYLRmypk+Jshaqjb2gFxLwhA8YR2fbopjdzqcJVLIO0iVBLEbaXdMOZy/GK/lW4Zj6aDCJ8jsVN//Fx7pW+oxf0jEEKyCVchA5LPczW1zNgtDytAPkFhjyNKAmrUmLBiRePjR0EEj4AQMqSXDOgalqD8U0UB2ZxdJSSjihBEAQEK1OKqd+MEpAj5Qc4ReSTPIw1q2TJe63Iygubmetn1bc1ggY1svuEVIbFYgiZlBQo3Wrm62SnZEVB+1SDjN8V4rmVD10P67+mST8fGdZ3al1OEBDTOQ8qzqRHysynpUVmElKDouHz6dEBRxKehoS0SE3lbPN19+pVsZi9ocd/hswTIE6nFyecEfN5YW7ukW4yyzeOBJKQAVXy0CKnHHdfUvBcgAJkQBQ9vDWjGAbEIRQCyUABkXc4ZWYqszXFeV3XLlSVIPc4muc0BsBAZkOmIBxs8Nt9wzbC21W/cKsYlVE3/kJZmAeWnr1BuQJixHgfPzY7nRoQg4hSCR+441tbOkAHlMlGW9UQLERKQOlyDthUQ4niIAI2XBDRKgMxnJyJElgQ06wLUx6aqpmv+GS2JdK4IUCIZy15HgEhQGegVJWgRUFWLMyCE9tzzwu9/XlZLgNa6/s7b3/EtDh8JGdBG8tnAA61obkJIpfi4sgRdcDUnYwPnA6TDOhYhAwqFPJEJKUPhmF0tBJGEICIeFiNKNhWeDSHh4IriKfAtKD7qjR7KqMn38TUW0Fx/+TzbPfEXAuFjQIoQ9yDoHp45ImSVCYhQJK45jh4nn842CbldHzW4aHQ2lRodVYLsJMiaXAiUPZXb5wpBnPk8musRUCTdd/oN37w/rxbngb4V0GrWINtP0N09e57w/W+cMgC0ZgsbpfjYdaoRufTAowABxG7cVscdd1BjK0ICko9KATrqeT27AdA5JwlIixDDpfuKI2REPkWVDLkhzl+pSmgREUh2eGeFjXTEg4xc3BpO7c9Hld7WTLR3M2ezM5MdnJgem7HpDaCB/RYmCB5uQuBu7WG3eVcs5AoqxgQqkkCICHV1bd/ZRoOLI8T1DTrkhw43MtpiPiYEkQMaR6jn1CN11xfDRjIoEKVzkykF6Nj35+dfXS2Qtnrks7sDOkzlbu75+C3zqVlni9HjmRHwAagi5HDMp1EJalKEttqudTfp6GUF1kvu8cGLBaTjukCDtv9pBwiJyJDKM7cTilB25m1APkTOiIZFuYGOYr2h1t18ww3JDjqSKf9T6yj7rGqomc7P5QqxAseluvH2JsZqpmuue0IgdMiPhgTOWXVbFfsLfbmCOhivIKoiQxLamAaXUPExFZEcPCRoZLRNp91dXWaEkID0ZAMbpUdyh2PahZi1iOOLVHroyBvumgfIt7hXPBA+AnrbA1F7yYcfdgAQPr+Yz9qb141cvgNAEvJAvKAxHwLU2NwsoOOO22o5QopQpfByQAffJCBLEP+DAloPINqclRlZiJBBRz7xhRGiEFKMPNKGvIiN72tERzqISLuz035RetNSo+ezOaSm1fCE3B66fXSGAE1OeiDj2cfNcNxsOqF7q9p78MkoeJm0dmqCUpJJTqN2Hb2NSsSVI5BgSlFE6MDr6wCiJMQ6pDE76oBO7RvKlAKdCIo9kkp2t193LD84YZ4AKUHUaoF4Eg4fd/vVeY9//HHZZw0XINvnCRMUxgefzfBpbTWhpvrW3aTi6yVeZaAr7rAEhUDrQYQR5YMkImtzVu7sNRTCR0QdKPF3U5tsosFhE73Fhuh08HWr86N7+WiAHqQaTdToBt/Bdm252YboJN0NoDFugBOQSt0NHt1NvxKfPFN2TDoKT5KKBmk1OSWoIe5yk0BI/x4qIZ8KUAe/yYgjb3fDVfeQNoQyKLOZUECdjsnR+0VnfPTRLwJ68p+A3F6P7WbzvK8B0eA+/ngeH2qNtVmBGLI9kAmRHV58KgMhRIQOAmhFa33jXpIJI8Rjsu7neJSBzi23OIYyE8LIKcnIhCCyAmiRUMf+rrqojkXFlf1OZRzWbvum5iqSF+U+1szo6RGeX7R7Q92WNTxjvZPcIg0QPJQ9J+MWIM6PetgdCigNcCk6WUCMUvHOOr4VGrRDVxHSNjfNbkRAdDiNeeX75jeVUGqWBOmu/WQqxcaEKs02eHbiyrs+IkDvLwbCh5LPI+XtbGwsPvzUhDc//kbzmzW42YdvX+hDIYPPdrw2E5BF6KAVEmquf/fNis79p+mnQPAE7skXA3RZfs5PcXYnooi8kpCqdn9CpfIohxFEWl38ArP19lphttdbXiq3tQdOYpdIkoqqkpxiBCX3tmY/7VtPrdRXftg2ra8Yw6eXx0AA8j6HnMkzpL1TTHB57hOOuYUn8CeuvONkLwSSUEpELWqjCI2OjJaBrOy2uLYULS4WG6c/cu9qVIkMyFF2oveuj778JyDxsBXngR6Sj3jQ4WfDvPnj+mWftbYYfZgVSDQS8j5KkAIkJ4AQUo9DSKNc/YvznkdVBpoZE1CBvZ74lupw3IjIbypDEpMn6lwgxDtWEkOCIxwpqHCFoVroahzSOBn3LJ3b+jo3U67Y342dB2zVVRTGqxWLLUilaO2mxVqsD2wBAdta64AoJaLRVhEHKaZoRSVqAxVHxGAc0VC1CgqOoCAaXAiuBHHGHUWNK+69NW5R9PvO9z/v3mfV+PXfRwtOfnznnHvuufdloWQ71M4j8Bjj5HBOG2PYTEIC5Hz2w8gAEpAAqZmdj64B2wnBQU6IMydGqBWAhlU0NoIPS/s8AkIWagWgDcAzEk5j0QdX4iDSfrOOmv8BlAkIfD5/1QE9/fQ96JZeeSfpiA/wfPDVVuKTtW2JBbgXVCGgVwpC0ig8iYyQAFmhMKR53W4XOaI1AHSjAbKpRXVLdeVBNkVCjskJWYJ3SHyG2ZfFwhQjCRSrGdL2YfMfHeO2NhZddXVs0bC5gpc6fGYhcpEQEIHQ5HYO7eAbO897zAWXLwUdJKCeHtx7xcsqMEGNTF7P8AYImjsFIVYFzEEoEnZWYkIEtaEgOrgV4li2lmCcnLfBuNaVKMThPfisOH9kjdmnoWnWET1rn3suOEiEvnZAZ9BBBGQnsMQHeJ6b3+h8BhTsNPKuFQIkDXcP4XFA5qAhXAqxTjjoIBB6pPkDj3J2VZQB4lTcAdpRZQay1QwrMVmJEiJlIo90zsBKOsnRkQsrPqqGQe3MUgQPWAVwyGUaBwohvlAAxG0FeAZxDgUAPQTNRKy79ohjeo5divAGPr3okTZxdYrnAGaKUiKgRYrZekOoszK7rBabDYaHLTp2uSEwRIRjgEPVYstlJCEC6qxBk6E6l9U+HLQHJs2uOe2okw5bf8MNAPQUAL1PBxGQHOR80nftuH/eXNu9dZrPtnkwEKd5LL4NQYQDIEkVnOWgEOPkoYO2H9LyyLqTLzIDrYkAYaF6wMPKQMZnIBEJE0llIApNOvWAwAGldzUEJvaQjSZUS8EFasMn4bDpJTSs16T9+IkQxz1SIDJCe4MQZwPwOhXbD73H9FDH9KLAnlzYYOazCg6AQCBfIUzlAAAVIcahbOOHVQkwECtInjIRoDyr+w0QigTWd9X5ObU5WN3ujMnVW645bd8LljyIqVsCekWASIgGAiDxwVQcTwFDvCnB/NMl+4hPKnflKZesAJ/gIOFhgWAioEHkkwA6+iDo6N2G7PjiOpiIiHTZ2pJjOZiNZin6CAhw3DoYKDmlgMhbQEIkShyhk2wRiz+3FHLAwwfvgZO/0AhDU6dBXKHZD2qSOA+9dxYNlBCaBUA8iMW1Do9jodTGBRPHHNMLPjiMovYOlipWYVuAU+M9l/ONgAEEbMXBxDbsY6aiRs+YQUB0DwUflaHOhq+oYgDKJZ9p0x6Yte+xSxZuvOiQw91BHuLeEaAzIPBJHHQv6QDP+u4BaT5bD07VTunEtOL+1ojr6FCEk5wP7SNAjHGOCHc9DZ3+yLqXPlqTvmzNAF2DmRELcMbH7kZ0wU7OCCYKNbcgyUJ0C2oyqlQv9Ey9XONBzeg4HJZrEDjgac8CH8gITQUgVtvSZBzo5ZQ8dPxRu7c3NRAOHhqIhHZWBMvNNQzsT+BKnL12Gp3P9Q/gUPi5IsQ9NrKdD/uAESArJNCFG9GAua99jz0LtwVedGAECDEOegNnvD9/1/icT0K8rgqVm2WfrhLRkX+yG1tXnnKXA6KAR2Jsg5mGSwIEQgREQkeDEIq5detWPUpAqBLO4kgCqmzOjNBAPG2qFprkZnJCkFwEaTzLAhp2IjScxeYxpWKgjmg8qhkdMw3JQDMTzcoyPvCQADXZaTn5q30mSjkgAsLd0W6YhHUkxH+JAO2Sn5MjMEWIbbWIcFgpF9WOtjkfFZg5tUUUiurGIsQ3NWvlIEzPE1A1vYarTqYV7j3V+DzxxAlpB6lKECAcwhcfhri3qOeoZXdlBfuAT1HxFES4SwxQx1ARIpakPoCbHI/HOHmIgHbbfsjwZhDquJkLIQfEFFRMA4mPb6cFSJVEhIIubtN5A4gOwn4rF+H8043+ZR2/nOgZRynHIpvRERoUAXdgetfOymdx8ICAeKMLJ28heQ2ENGnFc/ZNqK2Zz0QHn6U1cBAAQVadYZUMPgTAtgWtpWWYldZYLsNd7DpJRTq+NQWqhjhYvF/7hOPBZ83jjwPQh8FBsBAQ4SolAZKBQEeE1o5FdAvhDXwqWh2QEaIMz3jsAFl1ID4g5BZSHoJEiB76ePxaqxIOAyDMle68CwwkPvHepwgpIdFDUZuOgBTjtJeHNhbMMg2aZGTwyDnE072f6MwDHsIhGmiC6VACMkI4aYd1KM7IQYVjDREJ7a450rF1bVzYMn7yk3zQfZN5kPxhDbSaLIhZ4y80E+0Xq5K/CK/EY1ckgM9ICO0M5p9r9p5wxGHkQ0AHpgFZjKMESAZ6noCeh567uiQr5lOeXZWTjwiHGmFPAyRC6RQEOiIUO4geigmNan4Rtz1t+vGsjSjjOPgrQHuNM/+E7eltAiHbbDNAe1lXR4QIqJqADkaZdgDPeBIJP1hEj6XMCx7agKcPhzqmXn31ZdChixTZurLwCkDQBO5l42+lGBLloVlYIGG2vg5IICA62CChc4DDQ7Wo29ipxaltWBw/YB+QrCj1z8v2gnFIyLo8bMVV6XwdD29BNVwK1DcUtk84Yinue36cgC7yKu4VASIfA3Qb+Tx/6vPSB3Mahcfj20DjM4V8AIgxjiKjjkxEgxxPTIiM8LLDkFHbgdCmLz/+ccn1Sy4AoGnnIAUhwrmBjBA+GO4iQqlx6f9xIPIJVPZvHBB5QCQkNjRPk2nevHbg6Vu9+g7SWQTNgbqgC7PIhw8vfeOFCebBMQlcOwyyN/i01dRwVgcmkoG0Mk2iWgn3ZwFJrfTsFFq1/PPEXuBe40DNDt1HYokwzPh01tjASvdpE45f+uDGNU/EgJ4SICoBhCsUz/8CfN6ie+a0Ck/wT0lZBfjcDkDHHScHEQ8/0grxzQRCO1AARETU9iK0bhPutPvqJAB64BYAQgrKrgQR0eGjRCQ+IJRNQFJCKMfLuFKOP6FTj6hUGKkbka17ttGZPHlu+9z2mX2r7yAf0hEbioCACKKBwIftBRBKADXZ5kLDCHarGY1oIdtiwNhvLls3TPzcPIfsthX+t5qSXai8FJmlquCmRskMdAV72SKEI0WFkxHfFjuffoCgZ58EoJ+Ahxf64Xm+a8rWkX1Qvg2uTBXl5J9ofC4BHziouSMhFEGCgfiMJyOlIEtCkAMCIdzb+Ygutfvq4osBiA7KG1fpBgIavlKaJ9C+m7fnGOcwfSYH8eyBRzizD9GADegAzezZ86C5c+EemCfCIzrze3ERpYU4O7CAThtmdbWodT/in8LtzjZzDHs66Oex5azNBeIpIR0DZFPi2iWsJKZxVQx/BQPxMyV77ZRzFYThRgh8ZnByHs/ITtTXqA96l9t99o9Ta9KAPn3//fsd0JO4Le4LiozmnJiVgWdr8KmqakTYjAERjxjh2dEJEY29OCKzkOSEBsFEj3xsiO6aeAAddGRecBD9Q0heyanSjtrcDO5scSnC8eyuR7ixMg/URM0mHqgv8FFkW7XqwvkQbtq9OYvm4e06uFqnEHxYptdNhIVMOsDN7YBddHZBgLA9h6KafIDGBS4CVInRiPLK7BR3EbO5suNFbRUSEWE71fjYhhC6ozMXXbh88UIZCA5yQDRQAAQJ0PfPz2ndOhMPTm8XlDRWiI8iHAA1Qx0BkgMSnvFpQCENOSB8i8tvt6OJiGhlUsQxBWnUg6C8Sii3CKfAPs5DHJdDEaB68iEgpR74p3t292xI/ukTHxYHiX2AB3DsKvFlWbo+jPeNdI+pq2dvCGcNJgkQ0hlv8akZ2YqVp13aYh3xBTsPy1XdLDJ6JSCokhdrGKASJCfC2qZgHFZCFAdH8BU2U20XD7dB477uqXN6l61/8MZH5aAI0Kfvgc+tBuh98uF1i99//17+1lHukX3ApyhnxokJHwIyQh3/BEiKLeR5iEoIoX4Y3jIdiDYR0Qzs1AkQREbx0AcMZGGddIQIDhIgVtlKQZGBus1ACZ/JwON8hGcO3EPziA8B8QYxnVMtZCxDkmmrp4XGUA3T+HPkU1HBvjWTEBrQ3Foo4z2gCRoHZBaycTsCggrIpzw7r4yAMA1nlMBnJQl1Yi5uLC6Unb9s/TO4izsNCLewrBcgvLvG/fgQIF7L/P2nnTi2ENGx1SnK60YeqsQsJAGtIKA93UKBkgPSVkPgk0kIH36DNA5DPCJEV43LrkwAZVYIhscNJEKsX1nFYReuujpEuEKX41F8k39WR/5Z5f5xQHbgFMd2u7FRuoBV1YJ6zlVT0xjzsJ8GPlBybqEUGzija3mliwPymTubKjL/bzOwgIAswAlQDshAttW9stPKgwUjJhX2XdbVg3cE+PD6hWlAjxqg6576lIAg8kkAvbJgQMIm4Bm8Da4Za0TLnKOQzEAxoMwox0Q0nvZRlCMfLxQMkEseGjJ8VEszT05uYkVX5Ksgzz//xMdzECdAYCA7cniw19hj8YiPA4oTUAwobSAAujtrJnQa+YxlMd1pf7Dr1ShCSYfGm22oIXkIEFRtBTZTkLCEochKjeURkH4JbsL/BAGNFiDx4b+F96R29y1aBT7rn1mMm349Bz3KOySW8Z0bAEiSg14ZM9jhpPHAPgUlbEwYIFyI+ndAAVJGjMNOxJDIQa5MQoOG7tiMM0WIdPRRdiiyIeGhbGWRAqFQZluNYHwwHegVgroGbqAYUB8NpAohAuQhrh3iqBuvC+GZ1Gr+3oHQREAiHwS4fCZ3/h608vDBSHQQymzrLSUqWgakxGMwxRQkYBC+thBn9mF5DT4Kb7NXL1p17tK7CehBOUiAPvxwvQDd6nofeGYXZMY2XS42MFXCzh4y5BTjQ0ArPAkZI09FXskRDz6IB8+/IyKh4aN2bGkmImSjj6/ARUxJgBMdsw/4kE5soKTIJp8aGkirFiniAzkfA7QochDwQOYgHvLGuffCMRzjxf4ZJn3oIVbbPDvCuQP4R4BQyIEg/KMKLuV8ClL4Tr1EFThAptu8ITqoyAAlfJL0w+uyu+ZfBwOZgxzQmo0CtMoBMQ+9/8q31jZwAwkP/iAUpLi5BPLyTwAEQgK0nRgB0o4JINuBgIWoJMZFAppgIpbkQ4XoY9joCl5bIjxOx8KbRkkiA9UiAyljs4RrYAIy/xie7sAHykxBARD5mIN4VWg3/n6UaygH0Fy2C9xwEx+EyfdOJKCcHI4GGSA8aT7GQGvTFL+rLN9WgmmsZGBK4jcGqDjhA+Foaj3Kt9WXdV3YAwMB0IMxIN7xcfN8AZLeW7QylG5uH4a3gdloUmBHUIDEhzFOFpouRk4IHlJrDmyMjxPyNJQUC3oISoyGY5w7cdGmMgGSe0iH9hEZ9w8b+6O50awuDyo4AQIfAeoX4MQnjnBxkcDYaJe2TBzBcIbmPwgBPRhhsLpzyrB8+ocpyAQ3gY/yjzEoN0DkowrB+AgQamyKf8rZvZ7Ryv4bEGEoG3xwm/mq3v8HqA7JJyjhg+ra+JRVuIFYZP/wA8tsAgIiarv94SFBaqGHKBlIMc4Vm8htxC9Z0WEUKEH08e1VBOTmoXtiqQWZo0GAGvYQGOAaPAEZHjwZfNThCSWCDBQAEQ6kW0s7MX2DORBNAXGgo1p8NFkgPo1moBS35zVnDL8QFmkofQ4EGxmIkoNsg84G5BTfZs+9Y9GcCwFo+ZL1ZwGQyuwnDNAzz6wFoK45AvTevJIITqjexKcsh//BAnRKALSnAZKJgjD961mIScjVj5ADIiMK3Z9BQ4mINy28VrmNVj7C4w0e4fEuTzHPolmBoAoOH8Lj8vwTlXAxoCjENUySBAjb2FZPWx+zM+KDnwSgiuIcMxADXBoAeQAV+VBcXDsgxbtUFQFZfMOAHOdJv+qe23d1Auh0c5AtVMEHbx4EA61dCkBdtNB731ZkZfBx/+AfDD6614wH9oKBBIiaDkBUMFGHCMlCjoc909BT4GcsxTp26NxFVzG8JXQw0ssHhGQf8Mmxk9TOR43nwCckIIr+iWvsTEAklEU00ogFnVaxkVArJ3bJp9j5uIGSDKRFj06G+cB+aB/KQuUChHXKTg7ILjJvayic17f6skVdctCSsxwQhGWQAHV1cSE0Z9K2GdFNYnzDUov+QXyLKwTyWZF20PTpeMinH6ChsFBIQu4hPGJkVKjdQt3Nmq652RDdXjSwQHuo7Njj0yDphEKtunAYuCWgafDPGM8/AU+8RlUF510E8skEVJcWl6StMJBNfWJgAPloBr6D2EaggxThVCEUwDMJDwgvDkjIKgnQvudCpcwAkQ+26RagwJ7Xd4cD4nX2BmiNAC1czCvfe7tI6I4i2ScykPsH8U18FN8ECHxkIMkBNQdAOtowCqUCa23ONRJRXG4LkfiIkV6FqKXFAt0Vqey8PNQDVBmEwWt9w20Gi28y0DTfmVPxNo+P44kCnCqE4J84xI2gdJ50QWe11jzkQam+pqVMAmQZKABChCMhhriID3OoA6zkSoWAEODgzc49JhXOntt3B0JcVy/mv3E+DIA2OqCNC2Ggu3sAaFVXvdduMSDg4fI0G9sZNDb5CA8MJD5QwoeEtqM8CwEQPTQK++C2L0REVCAUctDfGHmPrsOK7k2NAKRTQjvVRrPXFt/kn5iP/EM0whMX2CEBeQknPuokAJAjAiDPOd571tdIw4pwpMcIp6J6GwcECZBHPPBBCPSUVMBRUu6lYQCYgLCB2jS3b/XVlx0FCx271By0EA4CIXxsvB6AlvX0Xtg7K5UJJ84/BSkONrA6CHwiPIpwRgiA8DghMxA/bfaKT2ahIEDOSHRM/MEYwW1DLRfdXrWXRTSKrxT3Ue0Mdan4oMAWH9ERnBiPL1GDgSDnI0BtmNYGoA11G2wZhJzjaqQEaIZHOAOEDAQDqQSIa4SYDyzmNV1BCknIAGHGqngK7pnvxt0ysxDj9j3+wh6+HxvWqQREQmvwVrp45ysAKlV0ixF587ocfBg2yUf1m8Kb8DggVAh4SCjKQTJQQsghOZ8YUdo9sfAtuY3vaH4ELrrK2tY5DgeyswK0z8FokfJeNSjwifFA/8rnqWAgAoI2mIkAKF0UsJiGyho9wmkUUYDMQEASthTtTJ+U7NCjyktWrVzGVtluDf7hV82oXjBiTOFsAMI8Cs+SX44ktBhVNgBReBdiewNgt09sIO8feHmN6qC1lXxCeBMdrxBIiICaQ4yzECcTDU8PkWQGOWdkeIyQKB3NF4U7mIgueo0TMqJjp+NUXovPAewgGB+PbjEd84/whG2GkIDcPwS0B/hsIKG2EOEatdhBlDdAxQGQ/QINBD4OyPkIlPgAULlHuOwSA4QzXDlljcXVpbx8jIOrU+2SeSQhARIf1Ah8y4F/yj7iw+VPymKmVQda/vSPb4ammXjoIDIKOcjiHNJQsBEUr1uj1WpEx8Z+kkiHVjerhU2NyENmHtJhq4XhDR1sa2EHPlHiUfHWJ/N4+okKbOpm8pGB4CAKhBDhOluBQMFN29kCJD6QF3EcPlBM86oAD/gIEPmgzEtHOH5XlIMpkXyeTyke2TZpDEIc54X6AbKDU2edfvqhYWkaIfLdBSuvc+zWYOcT4QnhDZ/CM71ZgJIT3uDDTwt1tFC8A+6AJMU4AaIOwgcoEZFvur6GYUW6h+aB6B/c9KUFqsJbhEfOgYTHlz9ReIvtQzx3r00A4SNZBSXxjZWaHUOAg9KAKqyIs0UqoMTSVjekQ//8SwRIEa4IxQ164IiZuETELg8+zQFd4IAgzXOePmZAPzyhfZ1dkmJ8Ix5u/DmeFWiRxuU1CXl9wE9zkAMyB4EPCFEZJhIgmUiKAJEQ5G/ayzC3qSw7byfi4flFztWgga36ILFPE+mIjOAEOv9QHRAOHuEBn7VZC9ok9d0EiBTYyeAQtSxEPN7nKbHGzsC/EWJbjqKBCMhriMpsntgS9io4qGZEQyEA4RgS+PB+LVQJixcSkN7d+Kwjcv/dPtsCfx7CG4IJ92U7Fd24NgUeKIPPdkHAg0sS5CE5CFlIYqCjibT/4IT+tg1udPRQmqDbYfhwe1fYK1KV2VU8SEg6iG+aQYBkn8neETUZmYSNuyfKPiG2CU8AhEvDVmKS3QERgv3Rt71Q4+OA8gyQAppDsu4Bv+FGgyJceQwITtT5oNphpXUGyC4I5HUZWAmZgzYS0MKb3/hq8H/wQULjqpfraNlHfAKduMOj5DM9ZCDywSNGhig4aNR4VdxDXIFQMJATko1sQKuZtcLmzZXlJcX71OgoFvjYXK/bB3TSaEyLHE6/5oHBgZwOGslZYCMDrYSBBIgnRThpoN9a9XmUgeSglA0gqLoWJLziayNlFYIMFABV+YRw7bA9UCNoqBiAcNsZLjQ5nYCgxe///vsfWf35eHuUO+nkU6zwdoqJeKSAhw7CDxkOwgvYEE9AxBhHQMlA43gnNMij3PaBkOSAiIjDC8OHNk9HmHvtj83l22bnH6zkww06Zp8mRTcsRqmIjZxDZbZ2HE7AQ0AykGWgBBBckgrTh43WKI0bPfzFAjFKl9j6UffOaBnrgMAZyrMGEQFNQhGnEEcHBUDr39my5bfyrf7dPwYbXswFnxDfoJiPkg8URzjloRZKdFTKMQkRUXonnITGCxCkUs4BiY7LA90Og0Y1s/fzJRBtO6CgFHDYHcVgVTfH4dvNPkbHuLhvxMbpQBGdtYAjPNQzWYZHGcgNZCYRIeUPB0R2avRIbqNIlQaoIDGQAfIrNbKBaqfi0olWZatISAAhBy0/ecuW39eF6qC/f2x7rsjGuldCgc8Kw3Oc4zEpuOFxiU8MiF/5uTsT8cBFgU8U5ADD+LiBTEmYQ2OBJnptc/mAwRXcXGiCdFgh3kxwMM6Go6NxZItCm8sBEVGnIpxHMSeE+MSYL0LF/DVzAqfkg49UXnsNlwoGMgeJtKiWlI2uOUA56LQAaMniJb/+suX3+674t/AW8k9jhdIPA9xdd8V4nM90lQgGSF0Ed1DEKBaHfbTR2r/cdkJRFnKdjE+dKTITYZgbqah8cNUknDngSVJNw4dWaDxvTTZS1BWNw5uLIW6DR7jqCBAICZEVCjoGHABBKUh8fGCRhNTk0TLWHeQbwwYI89Mos6/RnRk37U5ArLOn/vHHlj/frgxYIjkfzKdiGVUxrJp8OsVnxSVJcR01dyTzjvNpdkJGJwPQKMABI5goOZjSfydcw3KUIbJT+3ihDBHmUFHNKcwhFZVvmNyuM3KqDEItHfj0ms6dfy4B9VxHiZAYiZOCHdZBG6AEUL4ykB3jISFu66ZY1oJPNTZbsYK1XC/p14EDHpLIR4DCInagAIl4CQFNRJWAd4G7eOp5qBKwEDpp5eZftnzy0oB/xENpe6Egz65qmjISfICHfKiwNoW8vyP/QHGIawYeY6RiIVI4na9ERGV6KAYkOnjhjzQRaoWOZmtxv3bV5vLNK2bOmqm3uAidHCjiI3E2nuoxREupZYfhg8+y5XcvX7Z8Oa5Ksm62XSdR3UoHwSQUTWQWoYVY11bbL8teQERImimNCVVWik9lXH8bIREFoNE7108csx8BnXbTeVZnH1oC+/z5wlb/xWcwc1teWS06kUw/d1EJHgPkiIQHCgEuFhEFSBEm0XETyUf/XGwbHzwmmcnCXIdtiP8w47U/yr97YebU5Jyc+DigiBCeRD2uY3uWZko3JeGtous2oA+H3e5qc5AO8Gi9UyBALGzpILbiyA7SqaBkZs/qOfdPiRpBTsgvRcPfwINCRbk19dPGAhAInX3epddee3z7APD5ZNO/hzfwUX8Hx0tiPqYYDyQ4oMMPp9KPkLuIL1HzB4RY1Q3yXYg4EYWOjwAFRBbmtsccasuLQPTrCz9c8cd9L8zSAdMJE3hW7rKjQMhjnDMKhHDVQW8ECU+EiIAgACpNBhCMTg45eSmn3Rwc3faVapEQCZAm4qCki01n2e2Pku1G+P79uJIqdBLwTmsRoL0HbN7y5+cr/iP9GB/uWDT+jQ/aB8IT+MSAZKNM6dJfs5HAaF3UIhNZ4R0dYo3KbQhGsZapADkeg5UsWkFo0Lcv7fnHn1+/MBN8AAjCYUY7wEhCxxsjV7DRMfx0RpDogA8IZU00QLyvCguhnEbDw1pBK1LVcY1eaFfk0kMk5GcbsMLhjzSR+BAcEUnCBgNxroJnwHc9GO9VCD4CdGjhgK1++fPll/4RTwKIg6qpPAw8jx7G9NN5SpoPZGj4CI/nHydjzewX+zGyUkGKc5L6czrj1f8AkUzkhEjHhW918KulZcjJn/785W8vvwMPAZAQ8QwwRQ8dEehIJzmkiBAe+YcO0tBIPUfgHBD4iBCCki2FuHhPCm1dHguRkPCRCGSASuiTzDNDBcxL/A22Q/o5u5wz8bFC4NkbgG46rx1nFX7/5LPUf8U3FnDjuDUGA5EPAYX8I0IOiEAkwXBUAVKLfSoRuWShkIvcQ1Qo5VTMsYOgOjvgMUKsFXAN6snfvPT7Q++++9DrWEUIEAjpHH0X3hvD8TDE2RcnUQIEkQ91+bGXkxAB/QUZb4ZjkMOy5AAAAABJRU5ErkJggg==\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal humidity card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_card.json b/application/src/main/data/json/system/widget_types/indoor_humidity_card.json new file mode 100644 index 0000000000..848cf84203 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_card.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_humidity_card", + "name": "Indoor humidity card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor humidity telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'humidity', label: 'Humidity', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:water-percent\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":52,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Humidity card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json new file mode 100644 index 0000000000..f1a69015fa --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_humidity_card_with_background", + "name": "Indoor humidity card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor humidity telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'humidity', label: 'Humidity', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:water-percent\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":52,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor humidity card with background\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json new file mode 100644 index 0000000000..0c8502b5a8 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_humidity_chart_card", + "name": "Indoor humidity chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor humidity data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'humidity', label: 'Humidity', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: '%', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'humidity', '%', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 4 - 2;\\nif (value < -6) {\\n\\tvalue = -6;\\n} else if (value > 6) {\\n\\tvalue = 6;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Humidity\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:water-percent\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json new file mode 100644 index 0000000000..bad113015d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_humidity_chart_card_with_background", + "name": "Indoor humidity chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor humidity data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'humidity', label: 'Humidity', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: '%', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'humidity', '%', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 4 - 2;\\nif (value < -6) {\\n\\tvalue = -6;\\n} else if (value > 6) {\\n\\tvalue = 6;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Humidity\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:water-percent\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar.json b/application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar.json new file mode 100644 index 0000000000..fe33da9152 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar.json @@ -0,0 +1,29 @@ +{ + "fqn": "indoor_humidity_progress_bar", + "name": "Indoor humidity progress bar", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEXg4ODf39/g4OAAAADg4ODf39/////g4OA/pxr29vYhISHx8fHn9OPHx8fj4+OQkJB0dHQ9PT2srKy6urpYWFhXsjfv7+9XsjaHyHC33qmGhoaBgYFvvVKenp6Xl5cvLy/z+vHP6caf04xit0TV1dWpqanc7tbLy8vD5LhmZmZLrCiTzn7CwsJ7w2E8PDzc3Nzm5ubU1NSxsbGr2ZtKSkqpy9RjAAAABnRSTlPvIL8Ar7DvmsykAAAD+0lEQVR42uzPwREAQAQDwDiGh7/+S702wmQ7WLg91HZhDsPkeg1DdB4wD5Un4EqkFCGjCBtF2CjCRhE2irBRhI0in9061nEQBqIo2r3iWTNjGzrLckPjhir//22bwK5YFBJTAZFykWyQqyOm8NV6A+miW7btzDDnKVAvOKE2JFBxr6fiRY50CyQzAZ0p9nUlCIYBCwTi5pddnQMRG4DBBGoiKQ2YFsAyAE0pesp0bjf6OFgHIJtDo+MhxghEGoSBhayPRQAGQAsfj0znoTBUxwIoRzQ6DlL9vbCGjIo0L36G9DToOEN+R6ufvhIaHQcJj7iGeEBYAWU/Q1gA+BUk06Yf2ei00VogfoHc9yeIY3C84X1XgziGJwh6ZkY0OgOSmYG8CUGgA+oa0rE0J+sUiDDkHLYhxhCNC6R2gCvs0egUCIwsdRuCRI7pDzKME8EfOlkLpJ1T9+YM/1I3QRR7u/DtV4UVrT4B0rMoWn0CRKJDs0+A7OgL+UJ+2J9jFABhIACC3XHFtaKCRfD/j5RArK/dwM4PZhdGaIzQGKExQmOExgiNERojNEZojNAYoTFCY4TGCI0RGiM0RmiM0PSRqopp1DKCqI3cmUdMby5PEHWROv/ItXfkY78OehwEgTAM3yaf2bkaIeEgkBCD8dT//98WW2jXw1Ib23Sa8urN0xNhUIUCMYj63EQSuwOZgJghXuir2AcZoIYMiVhIcHWIQ88FAswkdWTdgzCgKUMY8BGAYrokjFSFDFBUIBa5/iJR3gQSVA3iAL5C2MSZKfg8fq0huxDL2f8VCAOOCqQ0RmBcIYqCISVnFFcgCyKnEoR5c7CEFdRP86wViel/yIQ/bdabpRS7ExsmMe2GzErR2pIhKaWtE7O2anskVZbWDTAAY37uuddek4wypNJt/PaWWAGqPGDtaJKyTXZDyG3PETo50vN6y2g/hPQAICqma+OwDFL2e4bsK9gw0iY5315f9M/+ITWItBpEWg0irQaRVoNIq0Gk9QUQNjiUD90rehzicTDTvaSHIThcl/pJ91OvxyEGB/NnRvf2N8IehzKhSz0d88VT68NqEGk1yG97d6ziMAwDYNhp7/5ibsiBQYNCtYUshjR5/4e7a2nXQrpYTfWDd3140ChvBcRbTyC1t0Ljch0BMTO5D7QdIirYTNOyrgqMlcmYNcsg2yHLGUrzLxEFVMgDdYVx2g6ZRjeQ39srJSBeICowUF+EyJA5L7TsAbGZxZgN9LIdQtHeaNoDclG7Cta+L7wAIWe8JPeBPnuzv1cB8VZAvBUQbwXEWwHxVkC8FRBvBcRbAfFWQLy1I0hiF53SYQenp+HnO3VpB8en5Z9x7L5O7146dMc/B6Inq4uieH4AAAAASUVORK5CYII=", + "description": "Displays indoor humidity reading as a horizontal progress bar. Allows to configure value range, bar colors, and other settings.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 2, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.progressBarWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.progressBarWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '280px',\n previewHeight: '180px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'humidity', label: 'humidity', type: 'timeseries' }];\n }\n };\n};\n\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-progress-bar-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-progress-bar-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"humidity\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"default\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"tickMin\":0,\"tickMax\":100,\"showTicks\":true,\"ticksFont\":{\"family\":\"Roboto\",\"size\":11,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"ticksColor\":\"rgba(0,0,0,0.54)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"barColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}]},\"barBackground\":\"rgba(0, 0, 0, 0.04)\"},\"title\":\"Humidity\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"mdi:water-percent\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" + }, + "externalId": null, + "tags": [ + "progress", + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar_with_background.json new file mode 100644 index 0000000000..b307fdaf46 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_progress_bar_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "indoor_humidity_progress_bar_with_background", + "name": "Indoor humidity progress bar with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays indoor humidity reading as a horizontal progress bar with background. Allows to configure value range, bar colors, and other settings.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 2, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.progressBarWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.progressBarWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '280px',\n previewHeight: '180px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'humidity', label: 'humidity', type: 'timeseries' }];\n }\n };\n};\n\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-progress-bar-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-progress-bar-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"humidity\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"default\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"tickMin\":0,\"tickMax\":100,\"showTicks\":true,\"ticksFont\":{\"family\":\"Roboto\",\"size\":11,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"ticksColor\":\"rgba(0,0,0,0.54)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"barColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}]},\"barBackground\":\"rgba(0, 0, 0, 0.04)\"},\"title\":\"Humidity\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"mdi:water-percent\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" + }, + "externalId": null, + "tags": [ + "progress", + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card.json new file mode 100644 index 0000000000..86d70e2a9c --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_simple_humidity_chart_card", + "name": "Indoor simple humidity chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAflBMVEUAAADg4ODf39/g4ODg4OD////g4OAhISE/pxrj4+PHx8fx8fE8PDyQkJCsrKwvLy+HyHBYWFhXsjbn9ON0dHSrq6uenp633qnV1dWCgoJmZma6urpKSkrz+vHn9OJ7wmFLrChvvVOf04yf043b79TP6caTzn5juEXD5Lir2JpwKyMUAAAABXRSTlMA7yC/r1EOHTEAAAR2SURBVHja7M9JAcAgDAAwytEP/v0OGdAlDtIAAAAAAAB+p4/I181+HrHX83b0Ngs8zmS0XCVElUiKXEbkNh/79bZiKQxEYfhqsajKiYCGmOz3f87ZOgxK202Ghg6Rzk/Eou4+yIVOyGhNyGhNyGhNyGj9AsjDflO+hMjL4ZK6fecEt6QcZKWYktG5NkQseZU4AlAqbuUi/yBRkSJ61oa8+C59AvEC4837eC/GV0C8wXtYKcaLluD3xf406gPZeKR3CD2EKrTR2ldkhFIQQwwUoXeW0TDBU9CoC0RoUwiF8QI5OiEJlRlb2CHKinpA4CwQ435adYFsXBBzJvMJUdV0gfhdAMf95QnoCUlBuKJRH0ghbc6BrLer9TnEXCEmFBo06gNZGHJeKqk3SFiQPkIMHdwJQWRBsy4Qpa1hy7S4QRIZP0Lg9qX8XRLQTjerDUHh0Yp7Rr5YnlMN6FMbgo2krfhWm93QrBcEEME3c87g/5tfvxMydhMyWhMyWhMyWhMyWhPyIxnvFpfy0yGyBNKStP7RkBTCpgaQ1XIxz4U4Rjnnl3kqRLngbOXyVMgfdu1uR1UYCsPw0Ze1SgulLVB1i4CoM3P/N7gdQRj/cWe2wYTnxMhR3yxao6iUPJ1P8J4hEaX4SSrzniFK4VRK0TuGdAPpGSXfIUT+iQJ5ZyBAQOH4Q4Shb4lAI6MUF4yWowkRWZKEAc7NtA5nIkhIzdqOJXBtJCMJkQsirYiUOMvT7RWhaJFFmSEjcUWixf8McdscgwilQwnIVOkZflJdmQwVEZkUVwltfiNkyxxjb82NGN9WFTN/YQilZ12RQC+kFD0pJG7JKDkJE/JfQmy79t1JSMy7reUc2LrhJ6rQc3QCmmOokFTQ9kZGE5FKgmdD1se1Fxy7b3mT9wF49oC1uG+p0Jn3IxFKSQz2R9FyHkVZokkfXhWp6KmQFduyCal4jU4XsmaHu2aUoiP0UqKxIIFnpIb21Dw4vlf7N2J4iGVvm5CSPXpV6bDjzxXHuC85WXDaHl2BoQxD3NkbwYIoEQND1vyBNoQ5Lmz1lePAs/1gi8o63CUoubhHFsmSdPo7XyWXw0JWJbs2ZMUNeywpijr37B9u9RlOiNQoZUKJXyHlsJCCaxxDClu7Tc28/tFpYzyglniBRyGeLZqQTsUlOjG7TVEVDjcMea77ipDVPsF7X3LlN30bu/6jsl5xWdjS3Tt7H3hFiOfOGrnLz0OsxY432PION4Tj+AvHJj4o2cafiNk2dxP3J5pDxcDtIzikOV6pD7nU7ZHtYZtvynbV7fpjzrG5MZHA0Kies7chiJlLy2zdMWTnAM/FZ8Eel+ScdIbHXh+C2jJz5XCiZuYal0JNocRL9SEPOZfjXH7lGgJFRuBpY/s1XhhSAQYacUimdYjBRhyySCSGG3HIU6aQKeRdTCFjM4WMzRQyNlPI2Ewhf9u5jwIAQBgIgqHlg3+/GEAAZcbBCbg9jSGnySjjCRntsi/r3uzvRJCi9rxdaTUAAAAAAAB+swByyaNbfaMtTAAAAABJRU5ErkJggg==", + "description": "Displays historical indoor humidity values as a simplified chart. Optionally may display the corresponding latest indoor humidity value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'humidity', label: 'Humidity', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'humidity', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#FFA600\"},{\"from\":30,\"to\":60,\"color\":\"#3FA71A\"},{\"from\":60,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Humidity\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:water-percent\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"%\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card_with_background.json new file mode 100644 index 0000000000..0d597209ea --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_humidity_chart_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_simple_humidity_chart_card_with_background", + "name": "Indoor simple humidity chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical indoor humidity values as a simplified chart with background. Optionally may display the corresponding latest indoor humidity value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'humidity', label: 'Humidity', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'humidity', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Humidity\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":30,\"color\":\"#F89E0D\"},{\"from\":30,\"to\":60,\"color\":\"#3B911C\"},{\"from\":60,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Humidity\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:water-percent\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"%\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "humidity", + "indoor" + ] +} \ No newline at end of file From 94278a401e558729940f7ce740b608d232927860 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 26 Oct 2023 15:25:00 +0300 Subject: [PATCH 14/39] UI: Indoor Environment: CO2 widgets. --- .../widget_bundles/indoor_environment.json | 10 +++++- .../system/widget_types/indoor_co2_card.json | 28 +++++++++++++++++ .../indoor_co2_card_with_background.json | 28 +++++++++++++++++ .../widget_types/indoor_co2_chart_card.json | 31 +++++++++++++++++++ ...indoor_co2_chart_card_with_background.json | 31 +++++++++++++++++++ .../indoor_horizontal_co2_card.json | 28 +++++++++++++++++ ...r_horizontal_co2_card_with_background.json | 28 +++++++++++++++++ .../indoor_simple_co2_chart_card.json | 31 +++++++++++++++++++ ...simple_co2_chart_card_with_background.json | 31 +++++++++++++++++++ 9 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/indoor_co2_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 9df61bf1bf..78ed32295d 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -27,6 +27,14 @@ "indoor_simple_humidity_chart_card", "indoor_simple_humidity_chart_card_with_background", "indoor_humidity_progress_bar", - "indoor_humidity_progress_bar_with_background" + "indoor_humidity_progress_bar_with_background", + "indoor_co2_card", + "indoor_co2_card_with_background", + "indoor_horizontal_co2_card", + "indoor_horizontal_co2_card_with_background", + "indoor_co2_chart_card", + "indoor_co2_chart_card_with_background", + "indoor_simple_co2_chart_card", + "indoor_simple_co2_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_card.json b/application/src/main/data/json/system/widget_types/indoor_co2_card.json new file mode 100644 index 0000000000..3a3c955819 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_co2_card.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_co2_card", + "name": "Indoor CO2 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEXg4ODf39/g4ODg4OAAAAD////g4OA/pxpXsjZvvVPn9OOrq6vP6cYhISGf04y4uLiHyHDz8/Pn9OK33qnw8PDIyMhLrCjj4+P5+fmenp7CwsJYWFjz+vGwsLA8PDzb29vb79TOzs6Tzn7n5+ekpKSr2JovLy/V1dV0dHSQkJBjuEXD5LiCgoJ7wmFmZmbU1NSdnZ1LS0ur2ZtFpJtfAAAABXRSTlPvIL+vAC9A4IoAAAXKSURBVHja7M8JEQAwCAOw8irAv9ZNRuEaB0Gao7cLSxim1hsY4sDjTxxdJ+BKpBUhowgbRdgowkYRNoqwUYSNImwee2XYmjAMhOFPR1vjmW0mPSUSZLA02Wqx+/8/bnfWuo2iIIMZx54v97bJhzy8Df0XyY2fiRAN05D5NqFJEqYoNaacRBqP6DWHFhFbnvsgU1AoilOcG1NGIuQ7amIwkFCTwgQWE2d7dyIKSWwUhCitBGN5EupxjVrvNKTIT45tfa8yFYlhmA2qzw72SKOI95r72qMB17Gn4rIyFfHDtEcRe5BKY1uWXxhcG1TEG+Tu9DFTkTBMOadU0XD0LYwiCoXEdagAhILLU4SPPnxXoTv2Qz6CMDYyxOCiVHOry14VTLkBWNQS5jDB+N7q3hMbJdtiYo+grW2OIrzc2M6ACajZIFhq1Q1Enoq6LOtiCVAWEhYwhRyik3Mnj2Et/xWhA0Z7kuXQSle9WEfeSxA7OPFbIhXAfLFlkZIDi2TOJRHhL4o8FMwrZMpFkWX19kVkUVVVXUCmnBPZFAdERKaICNXdicBzxew2AO+HMAPY7u6xkQlyR16WyzlkylUi89lsBlfxCGdZrW4nIsAJ+8GOGaxWEMJQdHWFEmgIKKgQRBS6nP//u5raDjy6eqvJwoMMIbnCHJzFYMILUf57FGwGbvLVYdT+lMjnh4GbWrHIkgGsR+YLVtnKv10pFgBGkV0sJjOwEltkNwV7/shP4xYRYopQpqvPVUCKrao/XdWCsAKZS8WaJxiNYd3ZgT0FWXCsUp4TiUG4yxQJ4IZb5EJKgxALRhQaq5WL5Jn/RLjtT2sM0RYsCG3o6ckTSdrRmF5FGq7a2MrOaZrIKMx8i1DYIkETtV4tSMMmj4mkBO6jI/CfSI7FXrKmMa3UkE0k5ykYuE/EtgG2R9sOsu15RCQRUYqknHKdFPA1h+lNJVQlFaTJtLrKAURoKw0jMCCk/AVYk9sKaoEosXi7aawN7xBwqc8r0xTeiytHnyLv8Pzlgy+OiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOiDeOyDc7ZrMqOQiE0VXxlSIiLbhyIUI2CdnM+z/cTKHRjlzSswnthZyNKbW76/iXpGfjEZmNR+SCmIyJ9Ik5RCwATYJBw5LwUhCcpmumEHmhiSyDyItR4A8mU4hwF7EAq4KvTcF6GwBFl8wgYtFFHLBQZ6sNBoChKyYQeQHcRFRPuHrtR32mgajjKdY/x3Jxt0jLvYmsQKKGhMuxd1ZqZGZvFAD2JCjmtAQASpeNxUwLlzhmaXD6dhEP2FcTCUB8G0EA5ugVThO1vh8JDCgUTD08XAmDYUDgeLPIi8GxiUQAuQ9tFzEATiLAbl2o7SwpZ7tLEYsI1myLrMpW2pebRRzgqYkkNPylSB36eppxPZ49AFtE9rJq+8V+r4gHHHURyVdZ6yAVlyKKBFumgCX/mrAqX5eoiunaj28ViQzWh4hglkWKFID8WaSm3EUWIAzjQoK/WySXtdtFhGOoP4qUDlsRad3iF0ReQDD/8JKPScOdMP6fiB9E9BdEVrzjqNAzogD48fgdRcwgQl8QUaPIYm3qa+TthmgB9YNImmSPGF/4A2DxRhKHPVLlsofUoZwHkT5RXWQH1DdEKv2XLRB0fXp37WGxl10kpKPbcB/xU4hEBoKzOUhmx+IrsaOOQ6uGLiLgbLMUNIUIJUYhbDS+WJ1nZHjW4vqx9F0RZtb10rHks2s6xTbSWURtK4B1oypivfRT6fR1iZlJ2JjV/SIjWuuLuG/2KPVNpLx/zPwvSmMUEbrI998QH5FHZB4R79wp8ezc9itFfuIReUR+BY/IbDwis/GI/G3vDogAAEEABiIg/SNbY3L7BkswGkNoDKExhMYQGkNoDKExhMYQGkNoDKExhMYQGkNoDKExhMYQGkNoJuKuMJE7ls21Z6Ldp+Z3kacfdfnHuKciYmcAAAAASUVORK5CYII=", + "description": "Displays a latest indoor CO2 level telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'co2', label: 'CO2 level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"co2\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3FA71A\"},{\"from\":600,\"to\":800,\"color\":\"#F36900\"},{\"from\":800,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3FA71A\"},{\"from\":600,\"to\":800,\"color\":\"#F36900\"},{\"from\":800,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"CO2 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppm\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json new file mode 100644 index 0000000000..3629187ba6 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_co2_card_with_background", + "name": "Indoor CO2 card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAADAFBMVEW/s60AAAC8tLHNyMrl4ufn3+ewpaG8ubjJyMqzgFn5+Pn39/j29fb08/Ty8fHk4uc7kRzz8vPx8PDw7u/Nzcjf3uPY1tve3OHu7Ozm5Onv7e7s6+rLy8fKycbo5+bPz8nOzcrh3+TQ0MrZ2NXt5eHa2N3e3drU08/i4d/r6ejk4+Lj4uDm5eTS0s3S0NXW1NLU0tfz8O/b2tfFwcLn2dDR0c3q6Ofc29nV1dDX1tP08vLJxsnu5+Tf39zg397T0cvw6+nU08zLyMvo5uTV1M7r497o2tHZ2NLj4ebp4dzl2NDPz8vY19TMy8rBvr7U0tHv6ebp6OnCwMHc29bn5ODW1tHGw8bh39zX18+Btm3Qz82+u7zS0c7Ix8Xy7evZ1M/r3dTp3ti9ubjo3NVqqlLLysjs6+7PzcjPzM7j1c64tbTf2dIgHx/b2NWcd1dSnTbe3dzr6ezf29cjJRHQztKZxIqkgWLf3tjX0cyXclLc1tDH27/u4djW1dXZ2NfZ2c+iYjfl29WnhmqeaUZxb2qkbUfq5+Wri3Hb2tLS0dCgfF1pqVE/NzF6em6hbk0pLBUdIA6ylH2SbEtlQSipnpi3sbCek4tGlynr4NgxLCrh692Rj4tXVlWMZkYxMRmyqaWlpaWvpqKUk5A7Oh+cZD6VWjVsSS6TVS3d5tiro52jmZKNjIl+Wj1dOSGZmJiwr7CreVWdWzBWMRzJpo+KiITAiF6mck+vbj+GXz5zUDVFQyWajoN+fHjEjmezc0WmaT9IQTmioaK1mYRmXVKKTimx0aa1n4+wj3Z0Y1auzaHCrp+yd0zr8OmHg385OTmenZy9pZFoZF9NSEOraDmsq6rFk3B6VTezraqAb2GkyJaqm4bKmXa0gl66flNkU0eVvoSchnmEgnZYUEhNLRu5r6rbu6S2pJiNvHyMem9WTi/i39jS4czItammkX6gn56Tgnd3QyS71LFOmTPNwLuXXz3FvLfKnoCKtnh/ZkdepEW/nIaOjHh2sGGRi4NmXDK2y6Yjmb2TAAAACnRSTlMgAO+/tyC/sK+vmYehdgAALvxJREFUeNqM1EFI21AYwPG6KYxV18NoHpVdCgvsMNqOMnrIkFEQctGuPfQw1x08dEWYWBKEHepBAuKwJDV6kG7FWVA6xJMDWzyURdwQhCpFd5CBwxV22BBGLxuFvS9NXxtfrfsTayRP+H55Ty1dPd2It5ninYhlXDHOu7uz9sGNkP3yEMTmQqydRSyJaeaBdieQsRx+AaJXevRcbfJf3Q1Ll6XHTgAUpLKzQyCdKKOx+oR1DMOilvlgwtIEMktYRIEZw0EX8xtxODOAPAhbLN22/4Q4L5MABH8j43nCDHsBwpK3gdpDaIY4NiLWb4aGiAMkOoaDqwUYvm7h+Y6Qk0DDodcRglh9wtg70XxkYEfIcuJgSLRDFEc1WU67RP+m9E3i6i89xJEuMKrV0DULTH7RQiDnBOJs1E5SDtudzTcdW3Cx5i0pmR2wiD5YDcJIuiyWNVmQ5aSrfChnBSl3/OXvwUFBOKxxLRHGWWVmelwFCImCqHC0TBBa4rSjBQ4BxBiSSwOE5KEgAKYcBsOfzGZ//AJGJsktZ95szBW/ysrnbEYRMooijZgg+Jx5q9XKp9fz+fWOkF117cQEoS3IZedRLcQ2Ici/b4JQO0I5wAoKaKVQLGQVoSilvaK4vzy2lJEVQdnGn4osKLI2zDWD87ZXOkvNq/nVrc6Qc/j3SxztKMwwy6P3XvxBJLENDxwcGkIkLP0nAo4Yjjudy2pztSFR/3FxCe8DTioKWJIRhIwW4lry7s2kZtbV1aP8qyshCQQOImlW93kWARJGvKHAW+M/ZsikNMTk8DQ3BM8NiSJXOx4FBoTnz+oQDUNgT4SCFgk3GJFwtZQaf6uq+fnxVCvEEb0N9fdH40EHP+B7+fvjn+/3gvFoh2zuYDT+1BmPxvUczmDc53UEIYeR7f4LeIQXG4saz2wOG1wQfi8DE74pdyCSexaIPLwzFpmdDQSGt5Pbm0lcbiWZlCQJ352eegOJRGIK53P7Q5XpSXXraGvy52QLJGi9aWS19vb23Xr+5O7g4KPHD/qs+AFcVnzhL7iBRRAs/MdYHau2DYRxAN/dxGDLg5O0VtGFO9nyITgQOkGlNDgQgrSURksI9dYlxIQMoekWDzF0U/sOnfoAzarBgj5Ahs6lQ0jfod8niRNCSZy/E+KzAr6f/99ZedaKBa46HViWUZfxehl1BX/L6512W9uamMJjjMMP50zGEfHksROGocMZd/TeS0gvZMS3xuPJYLjV71+/+jO7/H77db5YJhVkY61Vh2xWkPLl0lIoWnVItQDHMyDrVdDe7vaHI59I2DIwDAMlXizZseOAw2Y8LCBHjFDTsqzReDAcDieXNz9vZ8nvLEkryEflwDdbr0OqstTfHFLb6VoDgnkMUj6qQgYWjZhjlOFcxrFtS8aY9CKPQSUQ3ZGE+j498wPrcHI9+fft5stFslwu5xVEa6kgpBit7XojdU4JUVtXqpWQZiFa/904EDYPdd3Qdb2nF514npR2RAQpJHrIY0GpKwhxffPg8CD9MUvSRZL+LRrBY6cg1WgpCKSqoRyyIoUDAnt9EtKcrPpgbWIhBHaL6UFAAqeEEM+LBD2jIoayYMps4lIqIjv2Ts/v7u6Ws9kcCsnSarSakA9v32xXjTRTQdptpGBWN9KEdFQhHg9fVxC5T4QQJMIPP6DEk1gRLAIqPHbMpqcn51dwH5mnizRdJg9BXpSNrIKoQtoYJemsaKTBUIVIByfLKCBcEjefIkEDy/SpgHoEPDdNH0bQ2dmbnpxc3V8ssmWaJAjZwMdDZ0RbAWmpI9LFqFLyJytGSxlyBxQyHAUunIPQcDhHiW7s7edNiGLzgU8hPpxxywwE/OfOpxySpfMM+lDfWnB7ao7WMyGdHKK1cwiuITlE7RldDUeJgHS7fbiHQCH8yOFMSpDoxm783jehCVcIlwbo8AMTYuFrkWS7088A+TVPsmSRZggpC2lCtOdCYCuapnXL4cr3BluvQ5qTpRRdrb81GFFiMwccHolixg0uCTXHIwsgIMFQHxEmmlyyP50i5Px+MV8k4EiyopEVkNZTkHw0ckghgYlHEzpqkGYhqND+c2J2oUmFcRjvOnVY88I8dTxozHk8IglOrXSMBl7oqlNIZdYgFkUdzVrZFxWIYG3EKogwbEi7XKybLkq86SKiqBMbXVQXxbqJCoLuioJ6/u85042zGvUQ6NyC8/P5fzzv67DbOS8vxoLgyPg9KTy1Ox2JpMEhiiK+fbc7hX8YwbAEMSYI5XKJM2cOg+PY00rpaukqmqTyF5C9S4MQh26Igz0+6xhAMZA2iRGEcRCG19uzSfLFgml/Rkj6o0HWF2hrzYBC0I1Nom1FbYZFA4Fo4uJFcJAAUqHKejxibHbSPEf2rjP/GQQcrDYIZK62Ouh9h9YVRpAWB1UVMHhJ7N4R63KnkUEoSBUQpHxxNDXlEDZ0KXmF9MwSiFwKZf2ewQQ4mN4UKwRSKZaWLK296/8MUgjjrxwOh++cyECk87yFfbLhHt8Gmdfr9fo8EPSGd5Mv1rUd33OEstRAMhLslnp6AEfyxcPoG38mmXSSkB2zoUxSEJKYvKgs0pnZb5i/lUq+VNIdMYIs7chxVVHUu3aOayqK0gTIVBWvKwjkoRLGoxsdqdXmQBgHWx7RSD+SomBbg0QY7RJ7OI7zAmaT2B1OeRBZBMipoYBiYMAmuECCVgfHmdmxxrdSfqRUyi+bM+QPIFv/6EhBnS4cLFcL8nPl5ZaHyr3O3cqkZVLZTYWvg+goRhCtP7gekWYuNqBgW71mzWohlIqJXjvEUf8XaEGCwmbTQIBEIKuFA67evlODgxcwuX6MXRkfGcmP5PO6I9C/gtSVgslyXn3BV8syZ29Wxd3lFZbzyt2VDg2k0FRrh0yTZbO5XuPNk+pMnUDaExsNIu0IRliqXQ0OgGTdMThCJGRWOAo/NIFVtwQgNtsBZ29vX39/f1/fZVxKfMufLuo98l8g5epyk2WlXd6svADIQ+UcmsQyhReHnYGo6qFyVZ5SZHNt2tys1ieVbW1HqLDIkJTfCQpg6CAFH9/j5Tg7h+jl9mSoMzIul3ZEcSU1EJDYnECBXLN0+gVGUZtaEIEsIFkaRAVIh12+rkzxnP2Lsg+zakC5hydkINvw3LIyJSv1sFI3K02TaaasgdBk66DBi5gYyZAbmjC0aHlIEli8vA+QSepwEr58ml2oNHCQgEKy/cDVypX3xZH8tWV6iv8PEDhiBsiAMiXJ3G1lj73znNpkGw5Y4bpCmjTVputVS5D9UAPIAkNibo9T58DDMZA41O0TsdIBKQgE4sHg3RkhlDmQ/UTC9GMClxLDr/K37sMRUPxPaU0px03mAeWFVK0BpKza7efUMnFw3JwjpHq1VrbAGvZDGwSGbOoOp0OaIezBBDo0IVNRGokVkOkFdDkDSScSREIgwKD/sV8nudwYR3G9PX0azQ4MI4hpyAod+bR267sb9OasEeSoOrPt+ox6SZpUnh9qKve4gFq9u3v3Hk4DkdWZg9umZZNcVe5aLLXqtkKz3gahkYVW97gwrlaDYwBfPuX2GOI6RZLzOBImCS5J+SsdTaTTNKWTwlxHtUAmJsaHJ9DuBLJIs9+03jhy5Ib19dqtR6z05sRi87eGatnASd1NVane5rg9Kmmak73cSzVsxq+r6AxTeQbTVy7jbwum8rQGwnYIVRbWIIke2JN2h5Fvu4JY5kglWfYrGr0ZkEAUVEIgATpzhOaxbbYx0ZgYHn9QZCCQEWS0o/Pru7MAOWI2nWUgRtHYAkjch9rC1HRg8GKZyTLn6LDMi7u02RckFFQWgruvK4qZBRFHNpCiAxRSIl0JZVFF+BwiVzLUJhBdqpAn+8kQ7QQ2C0NQW3fyI38DQY8sBYJuB0hc5GUGgrHJ8zwDMS8EaZPoIF4GkqStTT0dQFnpTY7DBoIJKyINRW/5dBQBP+sSALIf653kbI41cJE6/K3YApGWBNllhb4bQXhfnFnCDJF5STKAmBeeq9qOpDyZZCYEIb6jrFi+wmEjheKiPUkQennh5OgJ0FVEfxaEVFiu3l6AXB5mIB/zfy2tJ6O/5oGcGBoaumFdvlBmi0MWMTDJEmaI1AIxL+aIvkZaPeIPeSIB9ATiO9lBh6Yg5E6DRLC1JQi4VHEHt+cGPS4CPAAOIgHIxBhA4MgqIwhInlmZCIReAcI0ZF28SWAJzzk6HUd5UQSTnR1IFnGkFRlpjdA9lgcnQrpVoP7wsZMIFO7aDhKWSoS5mJXM4CZo+7FcYrDXaWNpq6/PTyDjIGGOMA7jZv8wNDo6+vPT2o2vR+HEz5vLl3/+2XLEWFtxUQORRLrLtOMAbzE4ooO09whFX7R4jO4V6Dweo7NhIAqQk9sT/TiEQKg8ttNDWU9aB3FRWSFpMZCxsUajMfatqIEYx6+pHeP1Mzt65PWjR2cNIKy2YAnPda7s5CSfD0gaiLkFYnSEFmePGEcddaHFYYaPccAhD754gOTStABBgQ9o9kLRVC6XOzN4CjWF7LuTgcyODxPIrWJlGa0RoyNGENNv0s0mptEqCsPu+6O0LCo4TMPEaaEdG5mUUg0lSA0x0kEKQixFEpMKqaEBNQzFwILFqE1GklY3kpIGkm6mPwmrVlfdaOKms2i6mJXGxKjJMNtZ+p57T7+ffIVqPMNM+aCZuQ/vPeeec+6ZD1764vvvv1feod1bHnISh81q3xEgOwOdWvdjBmESc0cRkCwswEtC25Pu0ZmhoRnvqCgHqWeNzba4uLg1OxEWIHAflPHYcmQQZH1vDxj7++sC5Mfnn52fH/8lT/beICAxAYSMvw27e1fZW6Nojg+GhvpIETdtMpvcWjsVBtlWQeyRZZHGJ6Pk7+BGikh1O+RBbeKPxYjk1uwsTvJp/7A4JtF0QDVMMMyB+hAk03D2J6Xj8+PzbDqTekFsrF5biwxRCybEEba6Sp9bFxwDI0MBz8JCK0LizLlHAyP4YQ8AZJBArINmy3Zl0Gyy7giQZrUKEIcjedeOIOcJ4HbA4R6cHBod889NxGWeOAELu2ihiFVjkyIuu1ETQ5AwQER1CEkQtp4UT08hSCoFkO7OrmkHqUcCSaMBwdPHhWRj29FoNdeWm4VRqyPwyD13spAsVBtec6vVqpgCeIM9WVk1v3lZiJrJXgPIQaPaXEYMjjVbTa+j2WicDcXOmic3kIJQToLq/A5MgEwgMNPmQ48CJCqIdJanpR9Oz5+nM3D2/wDCBDBFkZdf3UneHa24Rw8s1QPssu1H7gOAvGWJRkMFk7diCnl3GtvjFbO9smO7tHVAqp/3fbQMjz88cDcSsaYjcDbUvDfWKoAD5kQFNczmR2rvmRnH3gMJBS0JwiQAKR7/AEEyfLL3BjEaKxJtLdsjrcaBGSAWe+gEIOPJTcvm6kGVfOTNarRJIKFKtVpVQBoHAsQ2X/iombiXHAydeCtrc8kzJ5/kZDcliSsYQGeFvGjJAxKATLEkINl70s4dl2rZdCqNA/F/gMDjzcnlw6jtoAoQRLDQyfY8FFm2rEZDl9YXK+bWoZ1A7PbLHVNI2VrJe31JUqQacTQSwYr38MTTrE5cNpCiI/2QRiS8tyggjIPE/fenkEEBgec/reWK+WwqfYWPmP4NSLRQKNwdKrSq93aSlcahefMyZO4b+O6sWYGPNFo7puhltWDebLaqc5ZGwfxagX3kMGmxLDQK1bcAsnnZbCVGkmeXjyZjZ4/OolxkSaNzD01g1+xtN6rf8fEHM0srn+7vwXNUkl8xKpDNp1O7mf+iCLq5RiYzqgvOSPA5LmyQaiU/x6P2qpT7jtKUaypZTo6MOGdWK2O+uJOLdw3IHaC4KG55ZxSQ4Y0N0gRGIMViDYqkUulrfORDPQivpAuIVUmtQE+V7uqBfORVvyFA8EtLwq1f1C8Pks3LSPDrdyMJBmESJyVUdFMdHLu94vHOzBDI+tQG2kF0tDNIrl7KZsWBeFXU6uuAvGFmNciMKEIRK6/cQgm6oyOQDkT9C1gQBnkgzsJ5vyKIAMFvJLzTRDKNwz2Aw2Rpyb2y5RvuRzmyMQwUsm+f13OlfB4nIh+IPbeWjoNfVUVUEKSDaAvRyvUgJiOIjUGWqLz92u+EIho9qOMDEkKZpnzx/oob8XfO5aR3JUgUQnlaLJaLpVqaKkTYNYqoIEZjRSwSxNyhwpP+6k1VRH87ooLcCtKhHpEeQjUjVVRCEiS5sDBIKEve8vn7b9xYYxKgPMvlirk2FFG7KL2jVjcQfidpgEduLPwrEGtHkSGA4BbE53o3Qg1g0TgZviklAQiRYHfNLiLXH0Nr5RWAEK8k+bNcr2OmJp9Ps49c1aBjH2EQ0xUgNqEINxa6g5i6gwxQgeVZoSaQL07dN9FqQN9HgvinwxMTIHFNzAEkgPdQxQ5DtUt+svfs93q7Xa+l8pqoZesCgoGB9yQIo1wBwlm7BsSi9YhrQXDXI1JCtHppP6G99b4o2clZhu8IEODMjhHIhF/pSaBsx9H47KKcTeXaWYDIUSPj1mIQajVariDROzvpJX0EZRWT9AKRN4jjqEc8qHv9dIOALF7chtKCIYkrHBYgdLe4hZ3FhTxRQhKAXBRrtSIiMBS5Jmq9/fY1IPJZAVEexBUik+iGhwzRl0BAQih0zR5/l0GCBCJJZNxyUY2ydcuHdwAAhhe6XMDW+r1cqpWRppCP9AB5XS25dSYfRd0q7gw1IFaVhMOvAUQKAgMKefyKAIk4Yy4f3Rtia5HrUwgmg5Pc4hGhDQYRivx6US7X2yWoIhTBR1cQjDnB222W7iSqUyggFh1IZ4oJkhpArAzC3UncJW69H8fqI5AEHFgxOCQJzI+jJAi+mJNBOIUJPy3jZG9/ky22qWYn6waC6aB3aGALC4HpQCSasnIKv3oQImF7wwgCQVRFROCiTmkMhztIqGU3LEDW1m6Iazc58+RDDNCBTE2vP8kVS20ciPki34/0AtFbZ98QSR+t5xoQHH2GraW4iOQY8bpvw5E5a3wFtQh8mkEQj51g8Yffxw07QDQ+QneiPxUvysV2Pt3OSkVgRpCBDkifcdiHSdhFuoDohn+6g9gYhBpc8GNsm4RYeyIR6acFqyC4cgjD2ztjdEpOub7/uFQuQ5RU/kgZPLsahHyEReBRPza5LAlCsDz3ABBFEDEXYO3EvW6KYGMtTdL9LXXZae04t4nE2XGSfioWXTSEFpSKsGHuZv2rx6Vi+aJYKuXT3QfPtCAiavG6eMqMDSgqiMRk19dx2GhvMoZREYCgm43UI5EgEGIBCESQJLKFTS0iAoFqFJUZxLX+yeNsKZfLtZFtGUHIdCBWXqMSbWxWaTwNpFFExuLOUIoMsjCAcGFmBJEX0XFKahO4uRKyJMjjZRKJyheCxCeCYniWMhdhwtfDs5/8ks7Xc+V2LVfqBYJzRIKwyYWSsUdLRXAE8gJVEPkMQfDNK3zELkBGoQiSeCyfZhvAgmEOfzyOC0MOwOh0+YK+eeKg40UB2RcgxVyxVs/LeS18GIdqBkYkCActCzszCUIeLF6Ed+tA5JCTYuJZH38tWhL2EUpP6AhxxekTEAEkpoK45L2bkIOLL4q+BFKr19v1bDbVw0cYhJcgSGC8FLzyVbMCom45eht/hZ3dAMIkIzQ9N49maXw+KEMsfD3mp3XT1nLSZBAS4k7lpYLA2X9J1eq1Ur5Wk5ehxnFZPkdkrqW/b4Ip3m/cWswpPucXCWIIW4okGDtZwXDfvMs3t4Vs3gUAqkrI21mQaeK4GRHxeA1GJBS1wvuP09laDX2UbLaHIjoQdTG8JD5I1KhlNBVE7yRMAhR5sAfEkFxgTJQcIgDL61sQgQOdd/KYNWFMsgFJwn+gOARFPgUQksPgI1eC6JCkQjJx16a6MC2HEYS/TiSQBNWuB932gBhNno9RsBIhjP6krDFMDe2b/XoQeY34E/rwaDOmd3v4iD6NNxqPSCj1iNbUsMUg+r3FJCQJNheqxJVJrgETtIPYAOKnun2Kk6+OEcgG8sk/Upl0JpsWvV8+2q91dt068KRtojCIsUOhHDvaC0XjkKkIXGIi8P6nVDoJl07ABAl8HQXJFIGQJHqQjZs/ZnZTKXzw1ro+alk5QdQYpydqBaJfKhufj/bXrd2nTGWMkyQP0LW6v0i1bAQMkQhCl5LHT4GDQHj+RoKI5LH/4V8YcdpNH6V7h1+ZorBZDMZnOYPoYfiAtHUBYRLWhDL5GTRTFoN3YpQixuJ0iiBrZBIyeVsdIb3IRRjkt9PMbmb3CDBXgJi12a++au1EWbWDawRRSfhkV0EMJGp76/4WcmA6TnyodqHNK7xkjGsIEmFCF3m0g+ThaTpz9OVRJnPUSxGA0Dq6/Pt44eOZQADbXRNN9mvsY8NUEM9tgOAaOngYEB0ThC+OT3AHAqHs0c/tB3DAMPlQgh5fZnCr2xvkdT0IOyrzSA5gCdm67y6rxaCINAaxUXUlq10XtaxpJp5KeKeyi0gTLDsWp5NxWJjccA/PM2nykp+NijCJzLXe0SmilwXGeQZ+g0Qriq49J0b+u/9/Hr0kK4vBsItmyZe8Xsx3fC3avJqf/zCGBuiyFwbvnyJ7mKthVhaCfHm9jwDkH1rONUTGKIzjPrvlWqKsW+4SMphcWzWU++zYHUTkUoqp1Zg0RREtUpJLbVlJaYiSb/g8GM0HvmD2g0tksXwYJUT4/c85M+/M+2Jd1l/Meww772+e8zznvOc8zxnhA/EZBhIkFAviJ3HP7EFLOTkQmURrwLEY2TV1gwnHyndcvEmTlRKI9qojwyN7GhoaQLFppk8vnz92aBedq4OuZUD6lkC8W/kxiQPxIwvEIwnGDYHIJPStKFkpbOKG1NDykEKYlrTl8NqFW0QqQVPTHljmzyfRcd261qvPLp3G29/+BsgyHsgth0ci+UkE8qOxPewsEgTxTOIWgcnimMY+m5KxQ2NZejzIHHjN1GECGaKVFNJUUilDIrNE0J1d9y+f30XP8oM4eSALR4zxgwT3B2Bx7h4sBEOVFgmOSAbErsuPHY3qqJUEBPtQE0b9nl1xKHE4EBShZiFy58npZ8+uXTq099avfGRMNYhQAg7gOb63tOjjAMTj8FvEW3RU5xqvmk+bHc/0a7ZJ24gxr2cOTLqWEolmpRwHJKC8eXJo1+lnV0/vqrDIQF/XciB1YwYqfHooAmlPp9vtDWXSZeXtHeZzj5OF9soR50ddy+fujiQUYked7dEQqQ6146mDgWXR/Kk1cEykkFKpUFE4PJL3h9jQPc2K0PYOLQKI1oOqlCa7Jm4vv3DplO4hJU+ZRiLj4jPqoGtVkBjRx6xpTOKGSkuGrTKVSuPq6ogHEdyjTLL1QuvbQ3t3Xbp8v8uCnzq7B9LbR5IQiH3y2OgDaePCT+IPv8G+VSKR5PU4iynGxVNSkyPzlcRFEKhl37S+AiSyJ/L54tnjra1vT28/HexaUpVFSCOr3u5I9nIgCKYvcSt1pxzvtLVncpjlMLcXAPHcK2ASkSDr9FT01BkQTMAy/KLdcKg9nm06SIhaiPzspy/PnL3Z+pZaGFlkAb99FvGB9K588sv08kC6c5WvGCEP80Zfhnp1vgwMaFIHIOVJMCjWU8aPw6kBCRmLMHSY3WmCmd1wxCYIGoE8PXPmxd5Wqlz9FgmChMjxA0SyCwwYYWMJREmcFbc0WD1MIH34RwUNLszhAck0N3frli9mFRCkTCbTvUe+mEvnLQntwX36tOeKGT3CR4uFbzWj6w6EQkyJBTKSFNRam6CGtQjABiQCyJFXz58/P3PmzM0XQRA4PJD1AsFJSiS2YyXjJZA0zlBRHSlDjBdHH/0LJvBM4mURwLMFRYFTSQNCO0cbJc3/PUy7aNrxsYNsuPiSOnCAGXE9ICa1Wc5vk4TqU2WQ2JFzJ7ZuPXECmo4tMkYWQQ4mc6pXonclyOHeBOOM7SBF7sBO7D/wRt9JkyyHQD71smoTSEU77kASrn34g/4UiXI29NTIFnu9SvFhsb3NA1l05N7WDdLWrfjIgl+G39oxA0hRNBKKGIoOJBzuXeBLPmU+PzMJydd5AeQxtzpJFGE4TGxLJLMF3W3agmAc1xaI3n+co6032gqP3/Ga4umXaIuiqVn1uI2yi0NlkAg5nMMfnBDG6tUbNnDkjgMZ+JPZL84uEHV4PjIHQs+eAgmLjfstKeeB0Kd4IwGFywzaSKuZHtsM9EaBKDzLvIpu2PKw2nxCRkDt40ZOUx8tKGeuKaJ7lsNPxuUJXYMdCBw8f22CAi1ZvfonINp1Zg9RD1bLALECJUMVBt+9QIhHXOgLzOXi+iIPhMMCCRsljfO4SZpAkjbDU1HOgMRN4FI7ZINdHynBRe3oxm3bMElbfWpaNMJcfb6ZH6pCn8olxpiohcNM44ZsWL3E6hcgk8h8UOrDQPq6pC86rm/egtBtUHsuo5ec9Vu92NgmEAOBPJDu7fyDdgtiPU7tChAuHo+vpz8B8qGRHHmbijK/oSHGxH3GtpH1ytHkuqEpVQ/VmtUCWbFkxQqBiGQBIL6wNWnt3GUzZy5b6zicD3wKI4Go93vaaPpMlvuyc0NAPumqEgTlrZNUhe/iD0BiAqFglA33OSJB85SDplr9aGS6BeH0iqVwQLFiyhRAkLWIzyRhSObOXbvWIGiADocSGCSN+LwvmiV6kgW6dXMgKAlYKb+2AqS7B4LdkJzLB1I7mkdegUSm61AOQ2IX6dgnYQdOuc3qWRppAEFTECASo7sPRGuIAKBw+bvHIJXCfcvKCqSrwm9Xozgg5kIsv7ZI2gfCDlZklEBmCKQGEson+T3MPLVPV6I8LtL4ehwgE8HAJA5ECoBAAkqJobtR1g/SnEwmbaJ80hTJNOtvbYEGzmouqi2S9vmIaQtEwcOBqM7SgERmzJ83zEocgNg9H3E0pQCpPQCIMKpANvtKvCVfAk1z1kkekc3mzY2nSzf+hZdTrtQkz0XR/SSH1U1SlOte0bXU7u1ARCIQnVhjQOTr2AFB4kyifKEYT1TR1Os6QC5sxUPEsTIA4qEEZe8KydnNxScMkee1AFGW1yQ31mxfE/nyTxLIKTOOuAcZte04QrsEggzIIKpbpwskSpxlP6GGrBNA5CXknc6zIM4iJy9gkJ9aJMjiAJAPRF0j0Zb8ohe1GfHU1sidrPg5ZiSPJ9s0CcgYEFRq+y0yaPDoaRMFklI9zJwam29KBCZysecDiLpW9HU9Jmk9/l4gssjQBQuGOpAOFQThq3dKWN8ou1G8qjzTm0sl3VxLDG7W6LPIgOVUgFsQxvB5w7TyQC4gamggKQ0Rffc0Nb4eXVd3Z+fOF0usRYZKfwrSlkiUXLkZKE2c8lXtRMFfZ5rMCmUjIcv5iGl/Kpqpc5yfZ0C4KAzU+VSf3r17PHIWJpnHapBSUZq0omVo4IBkHSSvF77fdWXf2wDI34pCH187X4lRjlr55mZROBBibybjPVo5EbkGYpKR1LlGZ7H3Q3FMzRBAIk2NqcZGpomRBpd4uq4JlC1fd+4/dsOCgOFA/pO8cQRVgiA/CBwq7Rvvqq/GMchT/iaQaCM9DRJA8Hr5/jpc/u31r1c+vtpqQSD5jyBVUxRUBqnebvFI7BkKOplmnNayJ8coaydjk6EcYZGYQMyAj6e0Xm/5+PXcxRKIHP5/gYikA4sETcLSL1XttSGebJU5ZEurISGr1nLUIKHc5VTHV9ePWBAnQMxA0enyQDSb7BhEJqGAZ2xtiLU6m3HTjyxaUv21fa1tBUDYraoRyPWWz6/O3fYsIhD6snXOzu9ahXi8WOZAtLPdfwYCiRYdwRjAzrXOftAq9rBRzHxVI+42qwnK+Mnd6zsufgXEZxFIOl++fXlPP/MRd6AQGKwOMTpOXqqkjhrqkmWRmIYRzntieZ7Q1fqq5dHXcw99IAqUnW8Rj8SzSJDEwzAkoFD1oFBM35ookCETZkwbaTI9FkVUyKuMiFjD5x0tLa/OfQ6ClA8u/D8GYe75SxDkSFAfN6ZMmzjVgeggBYTHz5vKNHhGJPJ5x1Hqp09Wg1SVGnYWhn51aBLPInCURVsBjEn9miHs9KxZpCM6cHgqK1W7H1s0ebJAjra0HPeDlD63cz3kL7qWZNo6ZM8cDWEPTeGAJ3vkmSrHqRaPtu7AJOdOBEA60yTeuaEV+hVInx+C6BgY5RGsmTiZIyHqWKYbbwr4WeaalQKEY1GOrBBIfw8EOXfXHXSyNYI2YbenGgRVcwiEGSQ5Q3ZjQYXWLNExyCAKlmdZkAeABH0E2T72z85h/wxiBG0ijiCIZAb5kews6AwCW2htN+YQmyWpGy34yOofg3hnyHaej3skHYAEuxYg31m7n5Y2gjCO4y9CRFEIgUJoSmBJCEqqxlwMxEZWbaHQpoVtDsaDkKTnLOQi5NRLEd9Lj301vohCv888szOuQ/5o/JV07T+6H56Z2Ulmd/xcIk3qIYptggWNrAL/efj18y8O3lhlmxJvAnFZq3H5ITxghI4QwkYFGr2cCIQH3mRdoYzCRReE7u7+Pfy2kE0gOBTi/m/bOF6i0FfAmC/xXSQz7Gg4XZZ2gLCqoNtVafQPZUL2jc8ejAOIxkLWxSghMISMsGkpQ5/xGe1eaMxz7FQESGHvQvqHhyApRCjEEUA0FsDrmaOx/zdLGeGdIJmC068wxprAKI3HYyS6OqIUJyk3rGNZRXit7rB/M1T48SpUBE+OXRQ4e3aWlMidp7UbUtsfNt8qRsriKRNaFg4D2XKQXPzw+TzInMxDKASHMsry/FuplqbdiSYyaTTepNyOhgYLnUUlJL2kHgrZyiCjPEMphC/0q8WNzPdvOQZ5angv3cJvL2sd3GzaLKXdKI7jmUmPHB/3erJnObuTg8FS2FMJbTHF4SBhRcLkBqM5EMUvLEhWgGr1u4Qhtso8MWtWZjeEUtqIZ9zZOBgUba4+FMmA35vFEZYjs+USECRUxEOsZJQ/c/vDH9zpulMPmtTC0UoLAWJjh9WKc3J4ft5qbe9IJ/eOWpe7mwZnLkCuimfyUAYZcOfmJB3ybl4lQC4N4wCIiULChDY9aQfIqEY735EhqhtikJWwEwkLYofl1u42DHUwG2nETBGLjyVFGAcSwXyZTfaZrJS1m3T56NdADhxka7Tw9H1JeHmFG2uXKgTBwhGIkw5JkqTfT5KOLLfe3sqtALcVHOMbnqMWCQ3LOTwEyaAXpUMg6KFMgKgEiAbIyoFgjYEiHHJVQafQUohhOp322+12vT4lCRY+V2dHBxZxPwokimdQBKNB4jKgIunRI4gpCXkJZGkdfM8AYRUgaE6dpM+5n5pcEw5q+UQU0hVJLAOW0eiBvm96O6PXhBtsFEKAyALJCpDFp7y8RVVRtFRBLWCgUIaLWBIkzKnGXP66SKC4uF9E5ptDyLXxXSWbeElFVoSsgUChDUr6xT19oj+tQ3AQJ9GaAKEiUhIkNo2ubIKfmnCZH5Lm4xlk9HWliqxVCVVoi7qnFvQKywgr0s8qMvaQhkFQgX0u6UbQbDKdh1Hxk66JW55+NQhdO1+JDNERhWHgAHB6XT+tc/aOUe/j8BBpWgrBURPFEQJDYLJFzNtdC4kNhLweJDc+0SkEQSlsLWDgkHC85sVPGSMx4xYQOjudBIdGIexNrghDIOrIID+QiGP9pqUGVTgEBnutQAECxpy0qQYXRm5poiJyHclB0gwCwzu0IkQhSNZpWuEVTwdZ3yckIMK0yX/S7l4loTCO43hXUERTNAUGDY7i5CCIgUOa1GbDObkJQW0NLmcRvINzH95FUxfiRfT9vzzP46OHwvodGoPz4f/yWOKx4CI4aj78v1oJ5DZCJhPtLa3Im0FwNEOQ/LO1MORTEWaiTls29lMygJDUdVEohJNdzvXdikyIDkmCIGmCrF+0JH+HOAEDiKQYldZOMHQAPE5wA1lK8BrkAUhoLZYWBXEJECQ/QSYGQQLk5hgIgFSHUzH4gvKjwoZCGFGSK5zRgg2kY5BUkccIQRKHJMz6JVeEEK3IzCE4wAA57qwjEMRgc0FDYfDYclUEyRU1WfKqtzccUbgKSC9VBAidFSAMSQaJYWupYxei3zMnFCC/KxxxgSEQwpoVRbjtTuyp/VLIaLBvW/xya8Qk3e1BXh2y9t5qXFtp/64XQGYBwoXlnROt6fb9sEsHha9YE7Bma1IWvqAc0omMIinUwQBVcyD9/mpYCqRu9bo8ZKutB6JDeHHovZWvrTbXwYxYSU6C42Zqb8PYbTe+OWMMFCCUUFoK4g6XJFMyhAGveGkFhP+9PZXVnUO6OUT+SPchCRCRXLaZkQxyv3AJFbHQXXLHTbUIsRMPhu5YAHNPBiHJoYoUfq+seAxeNRr05dHF9JZCet1UEWY9g+ysLamH9VforPYsQMZAQq7P5b4zDYrMcYHDt+w8bKhdiE93o2NIFMIT/coBjzm+WhlkmEOsIs+xIkB82pUyGCRId4zDph2INpYV5Wx6EP/aOT7H8bH93G63X5vNhh/Nd1l37+I0HIcB3BdQ/AfcBN2cpODgIDi4q+DgIi4FsRwODoe4CMEaXLRwNA2UE0MlMbRnNUmbBKlJxCsqF8SXGHqYRuK1SofTK7QWKQg+3yTX+vJc017haPvJ8/umS3uZThvTxixTnF/m1tJ0utSYNBqTSePLn7mG/w55aTTCA2xtRd+ef7ty4tDhE8f60dJz+rtLB47+yGb7/UqN5/nWr9dIs9lcWV6+/+jN92rlQ+dxKd3z2LL4NBB9W/fUwYsLpYVUQpB/s39/fDM/5eLiwdHai5dXFUMxChRFYVmDFaWxJEmyrLKu69q26shyu91mGMcORds2Pd0KAl23fNysjXKLueOnSxUuGgx6Wr0oPUzOHFjRhkPZn/j9Cse3WoNXn+Js3KY8e/bs/fuNjdV3727eefr5NVj3kyzzNY6rVitCp1P6C7J/TkgzN+RAeH5DMQylUMjTRSGOwbKO40jkaMtxGNN2GIaxTdPzPMZhXT0ILN0Kw6DR2MwtxufQPLoAyPorQIby+pEYckErDiVr4n+tcK3B+qtXq6uxpDyTEITOHvgUkJXUsdwiyQyysA3Z/18ycQ25uAa89iR5MV8wDCM/Thmsw6gMdUBh8Ltneqrqmaath75lTQI9tLr+5qUjSfB457ICFz0s1jWt2OaTRhafaEO5O/Gn/GAdDgpRLieSFAIJIGklcPxq8TwoFUhSSPZ/SPz4IExf3uhizxeMBJHPG3kW1yxlPHaAoE2VZYlBPPyoHhymZ+oWFBau/cnmJXq4meTk2Q4XPejV61hPpXRnDXrDNhsEfrS1NYAFGqLcvjxv5C5Vkq6tZXKsEKRWI0pnLiHIHIEn+7H2HNOgGHmECKAYCpsXRWwsK4qMRE3EAcRxbc9hsLBU1Q1DF1UElu/7etdfG12f7Zg0uXOlalSkEWk/yWXSIenV22Iw8TEhrS2SxKW8TyqhIfkTAgmy0oKkVuOQKnVSiiH4kP+RDALDxR9rb5duFEiAOR7DgdlmqQXDcF0gJApVoMpUheQ4pm17ps24oc5iqnVLD3w91K23hJjvnQxtVMnxhWqkaYAMf6bPebSvabKIaf/Ib1OokfflcjmpZAbBkDRXQMEFbVAlmJJKpYpa4oEHZPdi7ugmeuh2rxo0zwhqyLMKGYBCEQqWGSsyDKZaRQ8qrkzTBIIktu3qemBR9O7LaVoFjiApJA1Vcr4S9QCpD6MMcvJ0SRCe9IYMDgxLPJJQINkoI0kj6ZAAAglBmvc5pEYQzLsACidQK3t37ABBUZQuouTHWEJYRHRgHUNADDTiKg5iOgzimK5t2jg4mS6WFIMDbzzdOAQrt76eySQ9wIHMIdsFCFEZhdSLXObIuSy+UdQRBr265MaQeEcnlNXbSSVpI9triyTN1wBQ0AdtAoLb/q4dOB/4PjjwOlDDeEyAOHJbklhHlLCicA8lMHjtnu26dmhiJHCgxUx4oR6GNn663bejTOb6jJEkgcwlx/utez1aXEK2X8KbGShcT2uLfmDFO5lGmCfKKkHmEoLQeyTyulmrURE49godARjcQfbs2PkbsJbvvZKeAEAAAAAASUVORK5CYII=", + "description": "Displays a latest indoor CO2 level telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'co2', label: 'CO2 level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"co2\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3B911C\"},{\"from\":600,\"to\":800,\"color\":\"#F77410\"},{\"from\":800,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3B911C\"},{\"from\":600,\"to\":800,\"color\":\"#F77410\"},{\"from\":800,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"CO2 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppm\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json new file mode 100644 index 0000000000..1fa38e4b05 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_co2_chart_card", + "name": "Indoor CO2 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor CO2 level data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'co2', label: 'CO2 level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'ppm', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'co2', 'ppm', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppm\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3FA71A\"},{\"from\":600,\"to\":800,\"color\":\"#F36900\"},{\"from\":800,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppm\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 4 - 2;\\nif (value < -6) {\\n\\tvalue = -6;\\n} else if (value > 6) {\\n\\tvalue = 6;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppm\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"CO2 level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"co2\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json new file mode 100644 index 0000000000..c8db6aa95d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_co2_chart_card_with_background", + "name": "Indoor CO2 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor CO2 level data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'co2', label: 'CO2 level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'ppm', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'co2', 'ppm', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppm\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3B911C\"},{\"from\":600,\"to\":800,\"color\":\"#F77410\"},{\"from\":800,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppm\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 4 - 2;\\nif (value < -6) {\\n\\tvalue = -6;\\n} else if (value > 6) {\\n\\tvalue = 6;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppm\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"CO2 level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"co2\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json new file mode 100644 index 0000000000..87ed101aee --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_horizontal_co2_card", + "name": "Indoor horizontal CO2 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQ/pxrg4OC33qnn9ONXsjbz8/OHyHBvvVPP6cbz+vHHx8fOzs6f04zV1dX5+flYWFhLrCjb29u2trbCwsK8vLzn5+fIyMiQkJCTzn5Xsjd0dHTD47jb79Sr2Jutra17wmHn9OKenp6CgoJmZmY5OTnD5Lhjt0Xt7e1KSkqTzn9juEU1uySMAAAABnRSTlMAIEDfv1C6kOEmAAADkElEQVR42u3aa2/aMBiGYdZ2b0wSx3HOISGcz7Rl+/8/bq+dCE3rhAobG6Dn+mCMjSbfDRlCbQ8AAAAAAAAAAAAAAAAAAAAAAAAAAADgX/py92zG07Nz7/rPX7nDyejuSeep9yLpAWQvvT49hD5CbgxCbg1Cbg1Cbg1Cbs3nQjajlCgaLc1Qm+cp/STd0v/3qZDtNjpEy120W0a7dC+JphFJSQ6RYx6jnC41cz0e566leRouktfrhRwkpU4eUbTjY7chdZ5vtoNo6hx2m8tDXCFcfgiExU2JYBN9rZA9sTylNCcajciE5KPNIZpuB9Ptcn9xyNpvQ5RYtFckFJNwvhLja4XkEY2i7YaWU9NhQ3ajKKJ9TlN+vDhkLHwb8iaoFZinWhRkaU/r11fPzki7ITGvm+mQN06FhC6/TPOP5+eXpXmeS2efH5xon+e1CUnz3YZGU97ilAtD1uKbsiF8ck1ki8xpfeGR4YpVIfgamcCV4Jln9gIzm/s8Lk6FiDdV0KxQfkI/k8fhSB4fL+VPPNVdAj7wymsTzBh2ISKZBaLQxEPivgll9iauyxXfzMbJEI88chUlCV1bwhE2ZC2KYMwn/BiyIjIv4ZAF9xZi3u4tTBIVwvtciBIioOtZm3/dhpBe22OGH0ICeyON23uHVjzaPdeG+KdD1PeC3EJNEtLeQtH1+CJx+e0SvB5v9OS3IQmPbUhwTsjM3uw8ejT21YKuRovOhELXsz958yaY2feMPobY9S7E7J4O+T0VuOGJ+1m+/7og6Ryh8SbGc1qIVXcdEvMRMuc2y+3WZ/Zq0VoI76KQsVJjsgZtjKT3kqwso6wfm4U+ZUQ0XA4pK8t2gxc+ndT+r+WLIFHm+Lrgmc9rXUi3ziF2PaCLQoxjSJrGZdPEPKuoKqs6G1RxmjZx/R7XGVE8lHVdkoztRtzU54TQWgkhlDmW+XwoFmTY8/LT754JGfNM6b8SMpBNPIzbkGFa8pzXhmVcNTakX5Yc0tTDRnJuJeks2tPU8o4zc4/w0+4T38w+ODdkGZdVPEibSporEtdlNZCDJua1dz54TCYkM1dkWC/NRlpV9OdsiGFDrvLFqhye2Eybksf7CMmyU5uS/pL58avJLJnjq+69QcitQcitQciteaCQlwf4NTuRfOk9OQ/wi/bMeer1vj73nXv3/PRIf1QDAAAAAAAAAAAAAAAAAAAAAAAAAAAA8I/8AKu9AITe3vWrAAAAAElFTkSuQmCC", + "description": "Displays a latest indoor CO2 level telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'co2', label: 'CO2 level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"co2\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3FA71A\"},{\"from\":600,\"to\":800,\"color\":\"#F36900\"},{\"from\":800,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3FA71A\"},{\"from\":600,\"to\":800,\"color\":\"#F36900\"},{\"from\":800,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal CO2 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppm\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json new file mode 100644 index 0000000000..1c12804184 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_horizontal_co2_card_with_background", + "name": "Indoor horizontal CO2 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor CO2 level telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'co2', label: 'CO2 level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"co2\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3B911C\"},{\"from\":600,\"to\":800,\"color\":\"#F77410\"},{\"from\":800,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3B911C\"},{\"from\":600,\"to\":800,\"color\":\"#F77410\"},{\"from\":800,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal CO2 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppm\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card.json new file mode 100644 index 0000000000..5b4e7fac62 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_simple_co2_chart_card", + "name": "Indoor simple CO2 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAkFBMVEUAAAAAAAD19fUAAAD9/f36+vpdXV3k5OTy8vLu7u7U1NSKiori4uL///8/pxohISFXsjbj4+OHyHDx8fF0dHQ8PDzHx8fP6cZYWFjn9ONvvVMvLy+f04yenp6CgoLz+vGsrKyQkJDV1dXb79RjuEW33qlmZmZLrChKSkq6urrn9OKTzn6rq6vD5Lir2Jp7wmGyHTrBAAAADXRSTlMAH8cQ8eMsj7mrczuPx27hgQAABNFJREFUeNrsz8kRgCAQADDk8qT/dh078Ak7SQdJAAAAAAAAv5VteeVr9KeOxdXzLmlrI4DW0zVC2FMeIRxRIllkMiKzedmto9WGYRgKw09wEEKyERgbxxfGgb7/881eOja2QQuDoYJ/aA+BXOQjJGRDvLUh3toQb22ItzbEW89DspZzbb1WDi2MlSl+KRLjH3seYqkoZaAk7WtDOEIQ4NUglRg4EiKdc0kiNTSKwAWRnBnxBFoFYj69QFTr+++zkgBwvC9V8Me1LggHs8SVBN0mt4fuBGJ8co+KzzR8XToAcFCsTKFhTpFUQTeh21Q0H5DBcUHYQsPqG0QoAzKGYGWKse6IwfQkiTRsUPUBKZpF9SZZI65yEuA0yTQ3UlwkxmpBgsUYG2LSjkZ5HogPyD22KriSVKQFm9tbCwEoKTJ/vLWOxJIbJKXb/FMW9QWRWhn3zkBkDPC1TCsF3iGiRIOXDkALRMXJw/5rLNeK4GfCP8/8e/sT5YXbEG9tiLc2xFsb4q0N8daGeGtD/iE5erDCeCLXkJxoqBEdeJxnSCXjOdwp42GOIRwGrnoSPMox5I09s1tSFAbC6BN05wcyARQQAXFFnfd/u22TRmfXZYMFVXLhuUkzmYvvkE475ezEflCa0FwrFjkYGEgSCLFiERHDQC4UBFiviPsyk4nCvbU2EVUcDjtXxRt4kBgIsDKR/WZzNP71mwM8yPl4xlmZiDEKoBBVpGKOPrW33iwSVUaYWD0m7hmIQhA5wCu99V4RZURSxcKov+J+5XkEzNTeel2kTGEpfP+oTcI3RJxHj86wrdrtnpRCIqdGaiCsdPiHq0REvZDLJnZLJSLvZaL/jAGz26uvRBBmB8w0EY2YuezoyXzdkYosYT7+H8SEEoVfYhhHHQWxyZU6G8HXappIiyyyxSx1UC3xu4RTh1tYgJxPAgpR0Nvm7hllf++qShiqJoqUEhsvovEbmAtiTUuPcrgvJZTWlkOdWgs30ntd1na0D5MjMIUgjHplSuRTRXrU2otkj/e/xY4Pq+RnuUVEeXW+Wt/q2h1cn7n60tGiy5ErUjyS/eK3PZGomCpyQpmySEMJs6xNXVjJB5OyCGJzi2xpj+uOtiQtGdWSFqq3o1dkLmERiS2wSIcOmd5F7A+RK0l3mDmR2m31ANL9do+uKRts4AkeVgHmi2xdNG6trq9ripz9U4SXctjLaCER7X/N8jE+wVckwGyREyVlkYGewz6L8AygPf7RNJFIFBBgvgh1Q9u2GcrWAsNhn0U48bDXBkUCf3UsKXLCOxocnOp5arHI6yey38QQYL5IqR0SpW7h6lO3FNYl5mg/RfQfd6QJiLBH6GNjvgjDd4Tn0ImsyLDDb1drGES27tlPrYvz7SeInAMei4twWtl0PtTV1W648hY9I48GxIZqmYZFzuIYQYDlRaCVt4z2UWfOg09EInYXn7fnvZBIJZKFPVgkSF2nP+qSK74jbs/nLW0KYSoRQ5DlRMKwiMOLTKKa9QGyIpE8hxmsSGQ+y4ucrIWB2tbwPlb2vdZH5COyQj4ia+MjsjY+ImvjI/K7nTuoARgEAiB4hQTaEvzbxQJPuMw4WAN7GiGnKfHOFEr0mcIfLccE6Yk6vvu3VL3VPKMwAAAAAACAPQv8h/dr54xixAAAAABJRU5ErkJggg==", + "description": "Displays historical indoor CO2 level values as a simplified chart. Optionally may display the corresponding latest indoor CO2 level value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'co2', label: 'CO2 level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'co2', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3FA71A\"},{\"from\":600,\"to\":800,\"color\":\"#F36900\"},{\"from\":800,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"CO2 level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"co2\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"ppm\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card_with_background.json new file mode 100644 index 0000000000..97e51b9c66 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_co2_chart_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_simple_co2_chart_card_with_background", + "name": "Indoor simple CO2 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical indoor CO2 level values as a simplified chart with background. Optionally may display the corresponding latest indoor CO2 level value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'co2', label: 'CO2 level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'co2', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"CO2 level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 160 - 80;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 400) {\\n\\tvalue = 400;\\n} else if (value > 1600) {\\n\\tvalue = 1600;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":600,\"color\":\"#3B911C\"},{\"from\":600,\"to\":800,\"color\":\"#F77410\"},{\"from\":800,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQoAAACACAMAAADESdfxAAADAFBMVEXl4+fg3+Pm5Ojj4ebi4OXa2N3f3uLe3OHc2t/X1Nnd2+DFw8bY1tvPzdLa19vV09jFwsPU0tfT0NTJxsnRz9TT0dbCvr/OzNDMys7EwMG8t7fDwcO7tbTHxci/urrBvb24s68YGA0VFQsTEwoQEAm+ubchIxHKyMu6tbEcHQ8fHxEaHA24sa0kJBQXFgu2r6smJxTMycwaGA29t7TQy84fIQ4NDQgpKhS4s7MkJhC/u7wYGgy1racsLRfMx8rJw8UdHw0vMRkfGw7AvLs7PSAoJRCwp5+spJwjIg46NRkuKRKqoZgzNBuYc1I1MBc4NyExLxQlHxKyqqKnnpSkgWNISyo1ORwwLBwrKBg7OxlGRyUrLhKyq6VOTy2hfF26s681KyiglomTb04/QiOSVi2OaEeCXj59Vzm2sLFBQyc/Qhk0NRRVTkIJCQWdlpOeeFhjQylcPiVEQx9DPhx2UjZOTiGJgnSRa0qyrKuOh3p1TjDEu7rCuLWmn56lmo+IZEQsIxSim5hTUjWdYDSYkI6YdldjWlVZWjhVOCFNMx6oj3l6dGNbUUxnZDKpiXBdWEg5MS1URSqSiomckoO/iWJHQTduSi+WjYBwa1tgYDxfWi+Zk4iIf318c25rajpJQyxpSCsuKSc0MSKvqamDeGaITSg7LxqNhYOjhGp1bGeZel5NPyA9OSpVTydISBtBNxiYjXmrh2mSc1dORECtpqa1pJaDe25qZFM3OxSzrq+0k3qBeHaKfWmwn46xjHBkXUpjVj+IYD1VVS9FPStCOyO5sKipo6OqloNqYFzJtqzEp5Wtc0hORjZcTjRXWSSRg3CRYT5COTTXz8+1m4azeU+Jak9ubElmZkZ6W0BrTzWbgWWDclx6blx3bVKnaTtfYilhUSgoJCI4JhW9mYF9fEl8ZEl2dD57RSS/q5/DoYpwZmPJsKJwX0hwWT52ZjhFLBqTkV9CMh+whF7NvLWPiVMiHhzNwsCIf1bSxsSdim58eFmHVTS+k3WjgVKWcUJrOR4InRDfAABJaElEQVR42oybCVjTfx3HWey37Td2sLExQAR3MNjGxhiMOWDKcIDAALkROQQCpBBBSdRC0AAv8sBELQlCE+RvpWiaR96alWZWXn/tzqeyrMfu43mq9/c3Tq/69GcczsXntffn/H718voIzIv897p5ebO4lEAsjV2w8FP/+uinP/sttrfXhL35ZM9reMzba+6528tfHDoVRLPnj8SfWhfA5bOOxXf5SaQ9fQPRXBaLxYFxOVw+n8/j86jvn+dyPD/kcsnPKEokEMulAX7+YZFpG/MjN2q1WqvbbDMkJFmX6XQJPft0SfjJ+sDAwHNnHTa3Qa/Vrl20NsFkMsCsy5TpZqfWvq8pP2SHq/RaofPzjZo4jSb5eY5DqzerTCbVoLuh1GW2OY83FDYMHjebc15mnaxg/MJ/HiLvRvHpaRTTNN4KkJji8KHlvRf2BYrZ/k23bq+QsrisnuBNfvTcFxe6hIzXDAsYH0Z9/xccDgs/xo8YOjxKRIvlsoC5oUFRmVX5kYesdrvdYTcnAIUtSZewb1Gvzm42Rwb6+wfGOO02eKg/vk9nSFCrlQkJ1iRltlKbpFFVHchZ/8i1pXxZ2ilNXJzmzh6HWas3mlQm3UsXUBhtOQ05pe6GHKPR3Jx18uTst/htKGT/pyom0RAYkvau5ctP3QeKgPkX2ufSXB6/t6ndR7quZ+SCkDVhUyx43/8FF2Q8UsG3FAUUEgZFcGJmVWbkgNWutZmNxgSDVWtPSko6Hhg0bHacDfUPDfUPPGvXLluiM+gNCQkmtcpqNtt1BqveYNXE3U8tSd5VtKVwMOIYUCjvHbUatUkGlUr16u7m8vIGs6Mox1Hqtpm1Ru3zrKxVHlW83S2v11Th/R4Us3XB6erbvXz57sM0SyTu6QrncfiS+32Hg4Qjt0dGpOxJFJMsgGI6QDwoBLREKiQo1mVWpc27jQBx4BceBhK71pB0PNS/vaQxxt8/FCxulVj1S806qxKWoNPCkpJ0uiSr1uY+26i3OMtr1sbsR4D8bixXr9XpTWq16uVg+ZYthWaHs9hW6oKkgKKgouJ/oOBBFW9F8T9gbOoiKJpkHLbiVJcfh8cK2H0orE/WdKjxkJTPmWZBYEyi4EyjEAloOUHhH5yYX5VWeSDJbrfhF95vh5l1SXdCQxftmgcO+BwSummfcXGpwahSKnVWrRbEyKPWvqymJvuAKnlxzYGY/ZcPaIZ31icDkV6t0ZS8zCks31xoczhKzK4ipxHP3pNV8d4AISgmVLGBQeH1ThSvv8imkPvLly+/LeR69fWcDuDzWNHLb104FnD4i7sHBFLBFArYBIrJgAEJBoUYKJA2gwiKyBEkSaAYjthlt9nMSYbeRYsWhQBD6KKotQd29FWWrX30Zd2wMWH1mjVrSnNsdjNhYVu2zN5oVBnN+448iyzbd7etrlMHA4oP9uQ0FG7ZbHPYjMYlpU4HWOSMryp4zQev13IFTzSJ4sef/a33TBbvN//TI0DRK+NzTvX5ilkcduzy2wMvggJu924SB9A8LnsiWTAsgIIIhcEymSqmUWxMjdyEt9usM54NSXMW1dQYEhqBgihi0edLEAyG4vbKyu2fSytOz0gy2+y29KVLP+6AfEjZ0ektyRlnKyPLttfV1xXrdQaDRqN+vMfZUL7lmhNZVGcrz3GYzWbXeEEB3t93p03OFIp/AcWMtDmT3VuN3e7Xu3z5BYXMZ3eTv4jtzZYu/+KpQ+0LRhrD6LmCcAWfM+E84/9UgBCJMKliAsWckMTMjYmVm5K0iAt9fljI+huF7gSgCFkESztgRB7Ua82XKysTTzxKT1FrVM7hHHim1S75uNNmhdmuZ+iPR0Ylfu2bHUPJBoM+Qa3pHN/jHCzcXF5cXGLUm0sbciCLG1kVBcSv9+WKaRR//C2b5f3/aQJ2Ln5g+fJj4SMvett9ON7ebGo3yNBhCw5zeXPp+eG8GRECVfxmNgrRBIpwn0WRaWlREVHFZrvdUBwTExbWo7UbEo6FhSyK//w+I6qg0Zl9pSr/XtXNe3u/usRi7bzcM1BitiFjGJFh7VatNQm6+HxiWd7Xxn7eadIZlWrN3VVPcpA3y905zhKtrQithdt45WRBxXsCBCg4PBE9heIbcinFmkDxP2mwDm9CgAT3LO8JkbK8vNl85I4BVuwmBZfjIz0dzWNPkyAoOJ6u4g0U/sF5ZfOCIw5A7YbrBEXMMbPBmBYWFtKn1xvNtozikgMRwRGVNy/ebT6avXpx41pbXJxqfwNiA5XEige7TaU8Xpb3jQ/Htm1L1mtVmqPjWY8HSzcf3JyTAxZmZ01DYY35+aUCpM1363wGiu999Mef3a6gWeyJIPGG4ZE8aRZHb/ItIxshyun9xt27D4XI8Vw2qxciYYW+COBywv03hXPZM4oIL3YaBUNiEkW0n++ieZUxYUHrSpASGoNjwsCi/c56fI4Y1muNNij8eu+ueydOnHh6Zc/d7JSvbgxLt2k0OzK7GoetWmOxq8HmrlGpTI0bRwtat/UPFevVnfW13eM3CjdvKXeBxXWzvaGmwV1c3V3BoJipeK93oECu+DZJ82zGL/LA5lA88Jh+OgOHUQwbj963ehrv716+r28hl5Bj9exefpsT1OtPsYS3mhSsmc0F/+9AAZusH4wq0Fcoov18AuODQhaFhFxAQ423PywmJiY4IgY2oEeOMBbvKlEZH92svLk3NTXz4ZLrf/vE2rNfN2msaUC2rmzjw7zInDt5jSalctdoVuvPtza35maMd2dldTgJihxXzubxo3ZXjsPxpC1rVdZ7Yp9UkFkoOCxAIMbhUTxaIKK4U3mUzaUpDpflUQyUg1e89aLx1L7l9w8LvAkK3j7ECyuoN1DECegKkrOhr+me8+/IFW9BERAQPtdnjn8oWqmQFwkJA/MAgaAIjonJNOq1ucb183pV+lJ18uUTiRFf+0bi7++Vfg4R8TF1QvEt6Gf9s8jgiMuNkWWNStXw9lVDQFH3oLuiu7u6DVlzc8OwM+dl7Qd2l017tzqrIgsVZBKF5+E9KKAKGNEDk/6BA98wf58jUEhpLlB4s7y5wMX0HV37Tp061dslxHdAIULaPMVaccGHYi/o8+OxYSyPQRXTKCYaLAaFTIEI8fPxnRMY6B8admg3QREMErCYHgwdPetjGpXK7CRL9p7k2zvK19zJ/0zRZ2xG3ceLDNbLIcE7LpLnrr8elZjaaDI97fhD57YNj6ur22o7qkcfFBYWoojmPN6w1ZxjLqnOWrWqYBXx/Z3V9HUUIECM8QK+eDMCgHEFFJdPcXhcFlsAEB6ttPeMdIVJOROyYfXuW75bFDXiR7HbDwu5rEkUMC7/r3jpmQ2WiKZpCZIFWIRDGL6+gYGLgoKj5s0LhkXMA4vh4k0xO67c0emM2Updeq7GaHOu1u7bm776mtHuKLQue7Tx8ufDgGJeXnFaYmLeM8uruhaLurOlrmN8vPbq1dq7Ra4SvX5b3YYWo9uZ3ZaVVVEBFK+5/2YxnUZBHOZz4IQ3yRnwGA4RPxk6fC+M4mimWORP8TKnj52eHyBgTczu3gO7l39xRVDfXIodFkuzZqLgEBTcSRTUNArIIgAw/Ob6+MwJDYmZFwlZEPfmRVSWfD7k2Zo1ep0uW59gztap3CX2Ur12fc3qL5jNNrdrWdG1TKSLiIh5N68fTyxLTT37u/GWXJNKtedBVndtW21d6zKn0dA5VH/1idHp2lOBrgJp83UG0z+Ap5yZKH7DJZmC/NJwFrmT45E+CRlvFgCBCJ+NL7kc5jXW9dxaoaBYk3M7mc+6bmFQZ8+Xk6TDkODxmAj567en0yblCRBEiFwmFCqYIIEw/OM9KIKD50VGVkasjQnbvCYdojAqDdk5xcU5du1qvX7wR6XlhQ50j0XLNocgxYJa5K7FVYOdJTl3njZve2Wx5D6uzqruHutuu2HW5bY0t9bVHXW4Xq5aVbHq5Kr39xVTKK4CxQ/4PJIPWBDCRHrksLw45HvyP/BgsxkX8Q1JP7egCiEPKGB48vzdu5dfaDq0QMBGdzJpPD4TIX9iVMGZig+QICikHhbhHhTB86IikTEJCsIk/8Yas05rVist2Qfyr2OCX4qa0lBaetDsQN9V45wHVQQDxefv7Dh74MCuwaOdr7a9yk3eNjaWldVWW/0k9yhI1D9pfWW73gbLqp5a3UwDeCuKfxEUXHzPx4enoLIo5m3lAQ60gS6dRA2LFBHkUmAJHmg/J0NPNqEw7r77y3f3jCykWXgSxfGkHIryoPitJ1dM1g8GhZhBIWRQzPX1D4mIigILvNVQR2RZjz4n26DP1quUSSXDZWcxj65J0lvNhaXXXA6H01nkvBzG5IrKyNSbUeiwto+2/Pzo0ZLcXETI2Nh4XV39UDNQ1Pe/OlrXgVyRhVxBOMwC8W4UWL4J54hJ+YPTcJYnkPPFYh7SA4GA4CCFwdNdwKIHos7JeQgb8j3K0aHd95ffb/KTsPCqPHyQKKFkAoLiWx4U/NkoECFgMamKsHmJeWWJkRERlRBF2m5V8hWdRbdUlZDgMOuPXwaKUqveai0tLf8cUDRs/ngN0mYMnj0PA0he6vbaVfU/bx56ldt5d2x8vKOu48GD+g1DQ81XN2ytr62uXgUSBMW70yZ7Vov1A/JeSuABh8MnhZND0RIWJRIj3sk7DVmIuJQ3QsUz18h7+87J+eyP4FUAicdZcP/+8lNNfnI2m2IhHoguYumA8BkooApqGgUCREoChMmbgaHBUXlpaanroIjIqKh9SqXRoEvQrVFadMVmoxo9uLnUrNdb3YXXvuDKKSpyFbnWEllAF1GJZUCxqiJraMOGuiedH2TVVo8/aG1tbd66bVvLhvqhutrqtupu5M13jxNer6M4z+MwcmaJZEIxRb6iaUiEx8MDG7rgoBZwCRYYQoY+1HVOgiaMTSoNCRtfNFx9vlLmWZ4Xmi8NjEbdoH79LY8qJlHQjComUZAKgvhITM3Mz8yLAonEAaUyNxkkjBkWnSW7xKiyOxw2lwNTSVFh+bVCBIhNu2xHGJM4PSg+7Kit/cO2XHVc8p7qtrYOTOx1/S3NLVub6/vrq6trK9BWdE+1mm8i8Xqt8d5O4bclIwMt5ou4kAb2OsxEyWexUWYJCcZJEiXwXDFw+pyY8kba8OKgDMN1ye37F+KlyJUEKYHnHx0UwKd4b0chIXlzRnyUpeVvzE9NhCY+36nM7dQgPsz40KWXmNUOl6vE5tZb7QfLr137gtuNJZ32LEiQehOFAEn75odtHT9XYa2n6hzv7h4ff9BRP7R167aWodahDrAgPVa1Z909s5Z6vW0G+TdBQbPQVjAtBBwHCkogpChIhfyMgx6ExYYzaEHRVSBM6GMj5wJ4YAK/8RQelye+0NvuJ2GLRORvo4ZKFoT4iVg8EffXf+LO7CpE9FSATKEIiszL3Fi1MS0RJHKVyZ0WlcFiKVEmGMxusz6uYUuR2bgGRwBnDz46+IWaIqdDm1B05sCB9REkntBYfOObH9YnazQak8rSuefx2IcdD6o7hlpaWpqbm/vr2mpRQFaRCvKuzRzq41Ta/PePf/zZnTRXRJN3lEvh7ecCAUckpmnUQ0BAq4msStE8Gl97k94rum9+kIJP+i9Sgvkiis871JvvIyF8PaHGocKFPB6S79f+BBATKF4vpmQO8aBI21hVlZmY+Hmj0tJZolEmKJNLDDqDw2FUx9UUFtnQWFitDRf/ueXgo0Is9FXLihwNDTsqJ1Bs3/4YqzyVWqkEwD11Hd1jD1qbn/zu+eMnT+rqamtroYv3LB6AYrLx/iRRxQ9EfIGIxlvK/MI0xRfirYU7AoQK6iMtgCdciuRDNmm8pCOHz0VTJDqI4xTCiuo6Nj8a0sLTODAMMfAbLOTfAApP1nwNBUiQVLEQARJZBhR78xMzS0wIjyMa7Lf1xTq9wWHTx6mLGoocRhdQWLc83FL+sKGhwZXg3JJTWJNzNjEyESg2/uN3R9UaGFAY1eqSxx2tT1q2vnz+pL+5ecNQ3dW2VRXd755BpisIUDBpU8QjTRbpEwUShZQnliE1QOdCPt8bgcGlRFL4JcITmBmef6ELKLy9+UxLTVKK6PRAaDTNRlDx8DchAuI3kdIP/jRDFMgVr6PwDfTkiqr9G8t6TAiP4f2aBBQRI5aV7hKgsBW57XoXNv5JzvLCUmyzywGj8MulN3JyBvcnZq5/duXJ0+tqDWBYlMkpGg1YPBh/sq0F4dGM0b3uanV1QcV7ZnQmbVJiDwpsvEdjERgsAUTApxVyOSVSwH8ehyOVcFk8AZ9CECCLkHYTIxne4ttNoX58L28eHz06POTw6MPH5ioEbL4YCoJ+AIESAItQ8oO/ekQxUxWSaRQLgYJUkPyqE1VpPzNZcnN3XFBZlMoSM0FhPj5s0i7DmmspdvuGBCyCyw9iBn/UkJ5+Y/DLq3NcPzqyP/Pe8/FikIgDCqUW50OWVx2t/S0tW7c2929oab2KAEFf8UaymKmKWSgu0RSXEQWMTwoAxRLIBVykCo5CLqLBAw0D+kdkT/Is7otDK3yAgsUBIDHNR9pp6goMELFFtEAgEfB4ACviM9L4wd89ong9QDxZE/Hh678oOCo1c+P+qrUIj9zjkbdNFh2DQmcz65WXybmHcalVp8MPHa7yawcPYmFnd6ffuHFjcHBH3tpinCDqDKSCqHUmXRyI6PaMP2/e9oetQ/X9SJxZdcic79vZzgwQHBTulFDwEQbnoGuyx+EgdXDZAp6Y9pNTJAcIcCaIxpwpqadvzY8mKHiolwFiEYR/a8BXJmJLFUKcc6BNhVaQauE5UBB7OwoypPv7LwoiyWLvxtsmXW7x/ogepAoVIaG3mUvO5O2zm23oJnRQyb71robCR48ebSl0a/Q5gzduXL+bdtmCM7EEnVJNDpFTjEqN2mwpft669Q9/QHQ8bu1v7SBDyOzx4/0oxCIelzSaHCgePOAhwl7AZXPECprG6gZ/LBHwmaacRFdf+3wZ5jW5IlwulApIWmjvDZKJWGKFSCSMXxEgIMlXhP8H+gfff3uuEGKR5edDUgV2esFRKKeZPZbG/YM3I3YpTSa1Hls+M7Z6NyvPAoRjWZHeqk8qTjtTU3jw0aODhYMOlb6saseOvWn7jxen6PX6hASVRq21mkuMOkdy7uMHzX/4w7aWxx21SBZZHbVA8YYW3oWCCRBkThBA/4PqL+Gz0V5hDKPC5ZIAvkhOcUCEjxxJ5g7OsXZfGQezyDohace4Ioq1onedEFGFOhROCXh8D0uaEvzg+3z+TBQ0s6+QTzRYEEUoUMQEI3PmHdsXFbFxXsQLJZF8QoLBqDUPR8474y5yuJ1FenKiHnyi/NqWhw+3uNxuvZ7sbVJT0zLzj6SkL0nR2pOXWJMWZ5SYO3Nzh/pb/rB1a0tLW0Vdfx1mU6bFIh9w/HUQBAV/GgUqCIYJJjxIWqDwborEcrEE/sglfrRQTotoSoxoQD4hYwh3YOCWECiQVWAksvj+PSsCeCwJEoscL0Dc55GXoV5XhWcam+g1fTwowoKCgoIjI5uiIsgaqwu9kpGowmi07aqsvLmlpgZjhxVTmU3TefDho4f/fFT+OZdD2YhCmpaWlrm2UWVJ/2Cp89WabFhJsdmc+7ijrmXbtq3b6ttqhzbU1ZIAISjeOp56zULx0c+OSjgiFhk9yQOzxWLzBXAGkUIpJMga3miv0XAxmz6g6DocT7PwGehIkoEGgkYWKiiEk1AiQmRAYPCeeH6eoOCjhMycTOVTKMiaFygmDRvL4Ij7luJ9B/Q6oDieGXmzaQuWlUVuHJ+btXGazf/858O1Pypd/QWXUbkrDyjyG/UJSpU648s/ffL7r2ZnpJQU682WPfX9W/8AFM0brta1bEA5JSReH86nWAAFNY1ip5RWEE89AxeB4YXhg4dWk/RXcozbIgrBIZ2jULBRT9mHmhaIuV54IlDQ0rnhc+cebloo5HGjw6OF2JfzSCkl9VQgBoopWcxGwex5A4kowoIJBmYJQVA03RjclXoc1yqMZ27eTC22NRS6iop0Oq1dHRenP/jw4JFHdue1azla3f7UzPV39MnJFp0ppbNl6IlJlZKOomNXWl52tG7bhiJSXzu0taX2atsUirfOILNQVAQGzRdQ+CXJXAqfSVvJ5YtFpHGkKYmUK5Kgq4RHQqmYiwR7qF0sRAVBRAklEAOmMN8L8QEUf51EIQYJWihApkBlpaXnv8+fRMGb2udJPChIUxEKTWC4CiLKYFBURua/ysDJmAEXKvITE8/EKd0YzF0GQ5J1JUqlc0vpkS0J5pqHW3KMBzbusiTnWpINKpOlc2hD89E1a9LdRlWK0lRcj9EU2WLD45cP+vuv1nq960QYTGao4uqXPvrZ84eDYoECMSNAQyWmJUKOSBEgi0dF5CD7wTEBh/ChyFc+IsGFPv8AoCCZRegnlCr8ApsOxSv4VMicAJqWIhegSxNjihFLL9GTKHgeFFNr3vAJFIQBI4qgGEgieMf1o0ezsy1KQ4JBu/Zm3m6NyuzIaahJ0CUlAEWcweX+0UNVgqv84ZaGBqNeqUxO1iu1Sz7Y2jK0rTMlfY3TrLPrdMVjDx5jIHvy+HHHqrYNG+q9pmwmCM+wOjNAgOIS8vzEWR4NGkBB8yQrVkj5AowVQiqIK6TYeAaF06G50fHhit6+ECHrIyy5UADd0AKZiF7w4nA0P7ovUKZAVlT4BdAUaMjl0vOiyQCZ2m16dlhMV+GPUhoUHARhTKgiOPVHR47+fFuGSoVLR1rDvv1q9f1dOPusMeisqjiY0eW6VqhW57i+8GhzkcliMhWfuGLSL05++WTbts7k9O+WFumNOv1wdW3/1q0bHj9urf9eW1t/v4fCFAtCYIoGAmQaxZf++CAmQChBLMMxZufvOeYT8GlaIYifrwiUCNF6kk6cO2eOj5+v/6lNc2i+F0uBBMnh01xxtHjBi+BYfuiheSg2lNw3VIZPFC2XyIBiVoDQkwvvAM8AsigeKILCQkIAA0uIHR9k3sPKNkNJLqElGTQq/YG8467NDTW4hMXMXDlbSmsMarWxtPRRYZFJ2bu26gAabnXJlz+R/GrNat3HS53kwtad8azx51vrWrHhvLpq1Yb+t6qCfMxWRe2XvvTDl00rbq3wk8+RK0hfTZKAiAUNcEnZkMafVggEWN2RkwFOX++pw5T8Rd85io9mUy6Uy3k8KSUWLDwWrKBi58fTYhIRCp9wqUxOS8SyS6LpA6EZqkCq8KAIjUfSBAmGRcSO7A8uPn12xmJJUaoS0ENq4jrvnVWbDxa6DQlWNRm53JvLS3FFTVXoQpE9sCM/f2+JUoUjxTVrLMVrPqdf/DGH2aG3PB3tftCKXNGPUtpWu6HC660s3kBx9T9f+uHzsnhfPwXNkcuZBQ6bKZyYxskDJWvy46K0ABAgcWOjo2nJwCGCgi8Sx8oUtJRGlVlwO0pBUX5CroRCXhXMXaAIkNK0LPakCCRgb0Hhw6CAKoJjPCjWD341I+N47tHBYVVyMg7Jk4Ai7livWl1Y7kxSGTRosS36ms1bjCqVOqemwbW5KjMz/7JOpdG4Vy9Nx2b4Mw6tzYarGYYHBd3VdU+2bW0e6r+a1dZ26S0ovGaiEE2jOBmL9plMnmIMEfCfKxCDCTGM5FyxgovhlJyGECBQh6hnYD7F9WL7hKw7LUTXQQnpBbeDsKsJV9CIA4lYRCsUcxRiWrrwJAKEM4WCmkYRDhSetIkCGgYQMVE3vrrUokq2lOQmW0w474IBxc/MeNPdy4qs4IB4MbnLN+dYVGob2q7G/Mz8KiOepK0pXZNhMS39TLrN6NTrbNqLo6MFHaij2/rrIYvqLK+3sHhjX+H7yTqguCRC1iRKoCRBChHFRkFFPw2veGQiwbpLNpcPrTCbG4FEJOi6sELAJ4fsEuZgUDxHNr/nsILiyWQKpBy5jEYqjQ4QhkeHFPAmD49no2AaLAZFTGUlQgQo9qenL4lTY4+lUluUFr0JnZMa5VOlwnimG1SpVclqfLgLy8tzlWrjEXfRHXTdZzCeq12FN9YkWzTpXy7E/V+nwXHjQ5wO1aLPQl1prb+aNRUgs9PnxAPZYokZFPVbP/rDgu/z8LYBByWb7x8QQATBFQiQ3KRY6mHqkkeHYDbDKRGJGJTL28fOURykXlRXHtnyBvi1377lQ+owyqT/wjlCmTQ2Xhbtfyu/AigIi7egINs8oAiujKwkrUXMmfT0xXGQQq7SpLRYUCNNaqhCzaDobcSjnuA4Wlp+kKSHql3u42mZG8+ClrmwPCcduTNl9eecTkeRLuH6ztEPx9o6NjS3DDXX19fXtnm9yWJKF0AxGSCt//nod8YX0mIkObyZivBbTT4Ulv4KodDndPAcH6lAMMc/et26QISMhM8lyhFxRy6sE3C8eMDAlwSQE4IFx26PzMHfp8MVvmfaFyqkknPx8wMvbEqEKogxsphCIfWogokQqCIyEi0Wqkd6sS5OpTQZLfA62WQ1wGE1IwrlqbxGTOl6fK/uXF14MEenUq3NbHAjQBpBq6G8NDvFAqUsxZmRw6lTHR/dvr0gq7aOsKjrQO58DYVnOHsNBVTR+quPfufxAjn8kPigp5C+GJgvpjhUvNSnfaTnxWl/odw/aP6mvtPRQEHBIALxi5FzYo43c/Yz/1A4jfHr8EBXLOU/VxYaQgdGozsTrgja1L7p1sKTTIBMoZiZNskhIWQRFBFZGYwAgSqM5jjEhs6EdtFsMVl1SqWJQbEvM7HRqDXqVWDRWVO6paFEacLWxp1fVXUAO5vyctdqHVRhLbrmtJmdZlXuhwWjBdW1V/v7yTHyhqGO2ShmDyPTAcKgOClFjLNkCiylOGLZumgf8dyRCxdONZ66fzhULhYIBD6NfQF8gUwu4CG7UrjRfFiBCZ4UG1GIj0Ih4sY29UnRiZIBHa+BL8RYzsxduODSRIBMnx9PBMgkCv+Q4MhK5lZa2fGSG3ErLWrEg7J4vTlBCbMMq0yqkvy8xMsljhISIHF/ONqwuRBHRM+epZ0dsKgb1XGG0kKXA9RUducnnGaCwjj24ejOser61v6h1ua2jo5xr9dtBonXUFySYt5gMQeFZPzgk/MPHl8av8D/dPumEGFg9KFTPStOnxMGyBQymdxv7sC50+HMkzGPKKTRITKOKH6TnObwPbtusJAIEQMBvpkFSECzOgsBGdI9qvCsNkPDIogoECF30o/cj1OqsbkxXS9bbwYEU8J6lSphfV5q1Hq320lUEZf784bCchSKtc/uHCnWYKm50lhTU6RVmZRqm6PUiau+WvXx0Z0FBd0d9WixWus7agveg2L6oNBvAgXNAwkkRXCAi6iaZH+BmR1RQOErtJoS34Ur2rtGBuYvPLeu63bgOT8uYGHuEij8/Pr8+dzQw7HR8JRLC6VSERMOwnCfwKgC7hvX0sgMMokC2QI1hLRYaMAHN9/8/F8QElDDrtS0vcdNJkPOFaNKf7w4ed+zBpeboFip+XlNYaHTuGvv/rXHVSaTRR1XVJrjNKmUOrXTudqBm6t69cuxgg8LKtrqhupQSztau0e93jDCYEoV0yi+9J2TYrJ5EIMCCwEAEljwMleU8RMCxmN4f3lY39LR527f8g/nsyWCuU2KOSFNI/MDxPS5WzgtgUm7Dvv7Sih4jvlOEnhp4uI/UIDFVN4k6wqggCzmoIgsgoWEBd+5HFV2Rq9C+dDvT8vMzFy7KyXFYsHAlduZvaTQg0ITZ9nsctmMuw4c+4smDqaJs5W6jWpSZnBR06xNsumKxz8cG8XxYN3Vq/VX2zpq61Z5vWlvoCDFFKo4T/MhdgH5jUlXBQMENJseKsy3ZCD3FXLJoEoLe0d8F/JYQb4CPxlfHIuRPDa2L1hMiflC2cLeU33RNI9HyzCDKP46hYKRxaxqChSegjpxzz9y9dmovB1k/2C5k5qWn5+fmdaYQU44BoctysVFRQ6DGhXFlHy5qCjJXbrEaXOqyKy6UufWKoFCo1YuqzHq9em5d3/3vLpgFc7FOjqu1mbhNL3W6+32Bgqo4rwU8Y19HR8AmCMwzxIHoeJNPhMm0AebOQ1gwR+cgwSQjTCyC+kqZByMrXxA4kpk2JDH0hRZ3ACG4K87OQzF6YZTQJIFkzfBAihIQYVhsRe0+XIiUOhTkov3QxP5+RsPJKstGDxMuy4nKxe7bQa1EiTu/s3ldFy8uObjzppSzcq4lSuVZmAgPQiOmrHw+UpGyteX7nmAviIrq/Zqd3Vt1ji2WO+EMeMulgcFjbebpuCqJ0vARZwSMx8MCPyQySOM6+BxeyRW4fERKWHuQqlYHi6C9zQHKUIgRmQIyKiPevH3S1wWY1OyYJY3pJpOssBRITHEyaPNialrFw9WnTlRtTE/c/+p4WEN8iL5uH5lsdLhMKCCFOe2HPly9sWqu9nlW0pdrriVsATyLKAw2ZxKg/0rS/RLv144iJNSXFOr7sb1I1wqeKcxKGapAhlPTJOWgTWpCg4wEBBsAoQJF8Z3Bgn/WBctZJMTIYQVh0DkiVgCHjkkRKvOJV9QAgkKJ/X3829DIWFQgIUnXeDCIpFG/Po9eXmZl9dWnbi3fu/GzN2aZLzpGjVhoSxJydU59KqStWfUnc+P3rh8L3nNFw5eK6pxrCQGFCp0nQlOo0prX/3xxdbVH0/v7i7AhRvc78W/oqt4L4rptIlc8cPzSHmognANJcMje48WvL3gPTEggTssirjP4vUM0DQGOqJ7cBBxEF1cEQ5OSFblU4wyFsainsr/en7qlvOsZMEcpE/owpcYWMRHbs4vQy+9997Fiyc27ldrLGqgYFiocRyam6xHRrj+Qe6Pvnkv9eWXly1xlde4axhZxCkNBk0cOYG32O0fS7cZ1ixbMj62CrewqisIEaTNd9qsGQSN9y9E2L/AF47nMBiyYKIBLnoBC5c9kT8VXBI7iKXeTRS5qsYEiOcqO59JDyRI+HPFGMb85s+JDvWbW3meM4vFdAnxoPDECDHfOaFB+ZlAUbX/4sWn96ou48jPBC/VDAqLMhco4jSGFFPG08R/7Nd/7Lt2Q1F5Q42SQTFsUyJEICKVzv6V1W5ziSPjg7GT3d1ZBaPdWWPVbf83CgSIRE6Tt4zjMZbHcJOZj5gBEniNP8YjONHeEqpnRAixABahxaQMgZhH+m+aDiDbTYFQtsAnqKm358gUiqkLWRP95iSL8EkWc/xD5uOUDAfJF58+PbK3GGGhW+lhARSwEo3GYLNYMn5+5c9L4kyr0WubcbGdoBgeLtHhadCQKcm8erWrKGVxuuPVGIYydFo7V9W+q5jORIEA+RTJFePBcorUAArdBBfBzyc7BrgtELJYcxYGykjA8wkSLiQjUAh6N0m50ImnxkIRkAUF+SM4sNmFmwsPf3JFSNemvguZUwEyEwU9dXEzOnqqkEyi2Lj/4rMfPX1mgv86In/NPrWa3MPBpwSbBedFg1/9hDU9I+O7Tr0e9/UIrl1GdFqky1CbrNZPFNa43Okul/n5ydHugoqxSxUFY+9VBXNZcarbfLAwQBLgTw5/xGTsRgZg7powFzAFNFELKS3AQPIkiyc9tYlmunRgAyOwoLlAyezDRYgSHADIxKiS7aergGKmKniT9wqk0gldwAgLwPCPJ0fqWNEBxe+KjTgZN8bBVp5d34heA9ttg9WqBAqb/SsGS/InPneN/HvBBtfKlX/Zex/PY1BYrHagcHR+UORy/q6goODk6KWCip2jXu+TBXsaBVQxKhZIxHOkAlo2R4heev6hrvamrpD4QCkOtpjLm1j/4hPwMLmk73awhIJrPAYFh3jII40o2ndKhGzBk0iY1BiuSPwFa6YsZjRZcg8LGFjAECEEBRqKvfee/ujuYrNak7v+FNyzrE3NW5uTnI1TVIcSO72UZbaPGZSWa7/8jNto1NoL41Y2VpV4UGiGb1jthaWl2owPljiddwvGCrZ/eLJiFe54v88YFLIABEjrl7C6iZVKeCTeoXMuKqMwMPDwiva+C8eaRgZe3H7R8+LCoQvtQSF+vitCYoOiNzUeC+FjqUMxMQM8ZG8BV5nTdxwb8OEu5AEWATdnoeBPJYupu82AMZE9feYsYlCkVQHFHb3RqB5OTRvYfXx9ampe4pmUJUqlNRmNt8VZ5FiaYrKUf2ELZKG3OrI7T6zVeEiYjuRol5WW1iTk/hx3oI8WEEFsH60Y3fk+Et4TKJA2+1FMu2NpmRjvFTNkI/vBR/jGFAseLzrwVtO69k0jXe1dt0/tO3Uo/PDArXhvSgZ/ueRAmcFBviASoiQiavIyBWYQqOJtyQIsiCzQXYAGWAAG9nv4Z+qn09LyNq5/+uxKrjFDb96blom7rampZYl5xYgPrQoZ1IT7ih9PMSlrPnfwmk2r0yW5Lj69kqECio//5HNHiu0ud2mp7uhRrdZ4ZbTi5GjBzoqCnSf/Nwqmgmz4z0d/OBYrkclEEoGYJu0SFM8lHDz3V1FMSXgwDyxB1yZv0YVDXSuw6pFLeEJMYOSEAMg4eDpQoBUlkxwlYM6AZJk/eA3FzNNC6ALGsACKuUCBu3qpiZknjjz9XYnNlmt6lgoQeXllZVGRg7jWqiJbLaXN7bYtUSltnzv4uRta3EhxV208Yjn61Qz7T37yk09YnS5HTs3iV6+s2uy2se7RnaOrKs7/LxT4bT2q2IC02b1Ahl29VAQUYmBAKfG01QACGHCWMS6PZEoWQMlpvsInQC6Qi1BBmcvQPJJFmGsHJMh4TKOBY+Rv/YZpUafGEI8saNhEtphIGIwsgKIstSwqFT3W5fSMFJu6sSwVl79hUU1ag0GnUuI+iX6Z22n7OFYZ5V/43Jdx+cBi25u/VqP5+Hd/8pnv/uQLZqNZ63AVP//AZm1pbUM5rUDu3Ln9v5SdDVCTdRzH62S4sT172Ps7w4w2BEFgHDAIyBpsU9eE0giQs7qi4VFBMyixLMuLGhxRmWD0IllGvFRCWGKUGmWKd9mbGsEVEpYVZ16mddX3/zx73EYo1y8YBlfH/7Pv7+3///0fL4kC6yIoZBo4CDb0tDrsT1PQhIDUzyKcgxNdQAdk3g4FBjPhCygAwyPLQrrQbMw2yTHoSvwD2kDkJESwVqbeZFasVnxyABwYC7qVHgicAAFT+VEotdElBTXxJYU9tYOuNJsz9uUlDAdcC6hNiFuAPQmMZzYWQRUuCGTFl1s+XIhhtaWrC1vnF422jY6eOfMLtjgzF+478fqhNCc2/pfd8OijDa81NDTMogoubBIUbxllahpvEeiImO5RJIbc4esSiVyYRNG0VKXA74/lzkWuhAfBCai6KKuQEsEzeIgoWCQ8hADBH8U8WizCP5QcKFjj9iyYWMGhAAs5xwIoNLgCUBIfnViwevMLLwCFrbGE4QCrzYyLTbgCJJIPfnjripscyCSL2jbdeE1s5rzrC/PzGyfahn3jv3Q0daNdv6r92C3dzqZff737vmWrGhpWNdTvuXRdMdcfNtfd/wrqiiiTSk5LaZrmoa/EeohLiDBQoJaodDV16ZE1Rr3WqrVqyrXpSk2OOgK41NqtdTuVcgFhwwMGsKAFfDERBIZ2QBOboiEoWFWEooBx9QVSSJS5JtGMif681qbm62022xpwIFYWXZkcuwCawBML1mwpve5qRzKa1BtLb7wmEyiW5OU1nzkzMXGmpbvd556/4JvVza+73F/ci2PCex+FJIZeu2EWFDxRAMXd22QKWkrxwAKtOls5QebkC420qJDQaplRn75LmV63YeeOt99+rPKpJ3e8+vGGnUpCjoQIMWoGcQQbCCAJtVQsSEqXikJRBMImN/POGMmpkIVBh3IzWqvFIHvfw3m1Lpvtuej4MlwbgsUvXHjTfHJSFNf3JVAsWoSDgavQjsXFzWtEPOmZmjo70ebtbpvocteiYD1lcx4/dvtRjJksQ6R4rf6yObOHTRmD4vPHN8oRKyQkOSJIEM8nX4k2wvBBanAF8itNh6NWIIfCWIUQChEqBHAQMpUilmPjRorOXCDCBJdEQBnkarVRRfcGowgPqMIvCxhI+EtwWSRuTqVYrdoY/ZMHMfB9/b4CTLRHl5nJtcvKJbWQBG6UFQyWrlhkTyNPe9l081I8n+CJ1YV5Z8+Oj49PdPomzgz3H87L73G5mo6de/3Zx3999v4HcQ4AFHMugYILmwyKnxNNVjUuQBAUZLeecRDStDN9R5g4LGIO4gNCKNG4OJw4hEo2l+08mMIiHB4jVfNwkkxmWFUCGkfHIuz4Th4InwUFYcHKgqQQvZUMZ0U9uTIrOj5vdTTMDBLMaFL8muS4BQt2lB2qwvx7Mdry1E23rkiNO7j58O72r9rGJ8bP+s5MTY12DefnnTrUvnpo6NzrR79+8fG7l91V3zB7MmXDJlA0pZuENEbeaRoeD+OTDoRMMsNZMEIhJJk0nF020Q2+i7YEuYP5PkIos0RKoECRJshWWuBQYrHFlC5XTEIVnLElVoiDMDA4WZgMyhitUoOtPevGBWv1ekQNGEhoMaQEZej7lq/cao4+iGS6MC0TYzibv/IserkQkTVr02jbxISvbWpqatjr3TR4aKRnydCxW1bdcMvX3z1+xwcPvnlJVZBYIcEDXlgHOZpOCU0CCdl35EMGGPYGCfwBHBA3VGIA4EEU5JIMZnwFAIG9O4qM5JDsSUeIRHyqUmLMVmG3BofkOrlUathZp5UKJn+aFiuC7seABbEACpnGGqXUacje3o73YxA0CA5oAjLBJ/69ssZYVnbQsRTVwwKM4bQWnP9qPcm2tUVe38Swh0XR5e4Ya2k5v6T+0bdQUzyIC0P3rkKsuHRdIbkQKwaNcgOFAMZHMmXmY8j0Pg84aGYrnKmqsb1LEDCHzCoIQy6Qwy3CpaThUFmyjRuikuS4K6AW62SGGO1OpdBk3JYEFNOqzQAKhR+FlMunqCyMGqCARW3Us+OcZGKtZG1WlBWTrlajUWk2P/Pd1VfBFtjTliDTMnXHO7GequGiVOIgXd4K5/mmsV+8tfnr19evevTcLbffc/efQHHJZBoUNvc+FalC5QD/Zhtt7ONANGi8MamMXEJRKLkoHqovCCZsLkVuO0AIWrFKKLqcVqj4Sdlawc7HHrOocH6Gdp+ilCYVLZfTmt4LKAInZNytQgkDIggFcohSo8M9dTKBwo5zkhPE3Xud7X3XGsFBqYnUpxx8cSw19yrMnl0PCGCBz8aE2Fhb7hWjZ6bOeDwVFVt63A7vh3jAwVD90FD97Q8+eD9QwEUu6SAciqM1QoyTyRU0AgicBH0WboTwkBlQHpjEOxFNpZQ8QiTE/5EJlmIRtv9qKvnhWjmNWTW+CEfnCpVMoTAkfaQx0YAslWH6W77rPyh401Aw1UWgytJpIokxAQMsYDFrXQ89ZLs+BlLBz4yt7U1jXzSS0cXYxkTOnsAZsy35yqLxqfGuqiJP6f5DdpsDx4u9Q0cG6uEmywiKy2ZDoUkhdcWpV1+1CCkhlSQlMFAjYTefFx4mRZmFhVtpQ7iAV7P1yffCrJfhTzw5NKXCqlB6mpQRl89VyOpUfIk8R06rNI8ZpNnZ1FykZhpN+kAABVgED3oHoZD6mzIT6dR1LApGF9oYkNi+fbszY2UKtCIUmntGbr7OfSoLR4SL7LXxTAWWGJ9Y8MbyhxyL7VDFuLfL27kperfT5XqnBCyILva8++6lY0WEXxUpRBUnlBt2KTU4GcZZuQhvskDB4xnkIhn6LzFkQqkUBhp9GrQQjpWQwoNH+k5KhElwa11Nzo6XdoRHCWgETYUMxQZlUktoqUzNoyc/CUkgDAmuM2WCBUmpFypOoPBvfzOxE7ahEbeKbQ6XXQ9JGDQ9PWdHrlt6MCVxTayrFhw4Kzz1uDPZOzE+7vN0+XxrzYe7O6pHMA4/2dBwpP7IwEAAxawOcsJqEO6q1FJyegPFg/bFkDFfjLGTjWE43CG7+QoUTWF64zYsJwJbEka+QoKYQunUIimVlFSe/qNYLhWYpJRaRdWVK3buTJeoKBMyyCcBEqEo4CGsgUUoCk4W1wJF3ft9Gze09j23pSAyUmhYcrZ+6OyK4hWJevOG/GjWWBZlhX0PDwPFcFHX8HCB/ni3a2FpHmJq70BeXm9vL1Y8qyrgID8ARb2UMmBgQEGpdaSngCgEgMGjtB+RDQyRKVJklWExNK6P0XyLRRxBGcQmmVikQAuCKCmL2rZRg4ElnmWnvlwWGRX/EWWQYDKzXDIQpApu2oRzkACKQLAwCNlgoeNYxNQ8v3ab1agcKIs07D93YuDwSJW7eDPyLFN9mRkW5MVs3k1qC09Rv8ebaD5kW5R6dSv5GeJqb0HW/0AxJKXe01IoEyV8AWk+NSqcBglU6U+9vQ3yQfXE59PYjeCTIyCKRoYVZQvEQoVIokasxO0RmRipVZ+DaWZ6V/mr0pptFquBJ1enC3sDquCOhDgUfl0Ex00ZM7XHyQIscL6+ZvFDe1cjYjaXDQx9U2a6Nn/QW/VcFFN/MihgLJUtw6OjvoqK/v6vzM3b7bm59kozKUzKytDHcKueTmEO+WTaMQooyl4EiuPPv/pkjUpASiw59mrT3wsPQ0mF7c5KWYQEPTiNdiuCpjQYuxIZeJhclqgsKrEoUmYViekkOWXQSK0fPWUq11ueSqfFOdssOVnrJid7j3z/5m9BDhKqCs5F/NsWbNgECYYFSahMFol+ebmjo6l+YP25u48Ork+J39C6ttr7oR6jv3oCg8VASMR7vcOjw8XFFf3NJU3bU+fF7U1E+kkhptfPkkH4pNoEin9IBtmhVf8opCQCOX5FKV+tAwp+BGZaMequ42PnQsbjSXjajVbSfEolStRiknKRpFymo3gKaZIlCW+sRqrduuabIaz/hmWnT5/e8/2Bn377w8IPoAjU3aGq8HchrH+ABYOCZWGMil+5cPvx/UrN/mO3H1Oa21sOXd1UXd21ngzpxJujW5+vJCxg+sQu77DPU1ycVho/sj0tNfPlQjINCiMvzBOuZgYRtIsFFFBFpWhu+laadFXCDXXll8/B5pQCyU8i46OgosVWaxif7OmokGtVeNKNiBepUMtxlyop+/d163qGJg+cxA7inr++P3ny5IHJT4DAIse4CdkDnkkVYAGbjgIOAhRgQIThR2Gsud7Vfq1S2ZtXULYkXra2v7Mo4+ri4o7dee17V768NyEhoTGRRaGHg/j6M4oz+nZ3d2dkvF8CEsTIFEtUEIo50x2FfZwglQQUP9x226cHt4r51EcRIhP11I7HdmwNw0ZeUhIZrMrRKDXl5ZdbssnsnpQvlYgVqpxsZcr+rN76+vp39+x5EwBOHjjw0ye//fY7AGBgk8z6kYMhPgExMwpOFyFRE9vefhQ6FBd4ZQrw9g7HM4Mj9SmaoZyczTkxtxb7KnANO/XU3R3bbfYEjPwu3uHv2QZ8o6MV9owbDz/ksL3QatbGMBiMjF1cFRwKqIKgeOTzyXB4xi6FjodgasJxCCrFXXUqNF741cmehFj72e8P7M/rnRw40nDDsrtu2PPXX99/f/InAPjd8hlqJIVEAFZiACAbOSg7/E+xCCM2sypgoSg4ByEUdJyHrB9zXLG8Y3BddM+kMGf95vSC6/rbbi5dcdVel7vj5+7l86944bk3NuvNTIA83zZanNGYf3zwiVYzajNGEUa2YA9RRSgU7rlYfhSfTkoktMgq2VYOL6BJ8EQmVZd/lv3Auv0DQ0N49988vWrVaeIAB5j1/0EAYOSVUOIWj9XDWAasMRw4EjOhICxCEgiLgqk4dUxf1jrmnr9838j5sY7WyKyVzpueXNvvGS/98rrciu7CmMGme0bym48XlmQBRWLjG+7+tOfi9ev3I1z6QQADMQ2WDyMcOCDBKBALMSuVHVn2ClDsRqVogAA+0zxQko+a5Mi7DQ14dtBp5t3H+icvLF/if/exfv/isfSLWJjfQruxUBShPQgmOVkTClkUWZ3vzE/uaDk65n5HsybBiU3wzv7htirMYVW3x7Q+sbe7aeXy2sM9ifq8wZdz8aDjjJtrm8u0UYwFSAAFY2z+5F45keAAlJUFHlP87edHUKzXN7z55mnY039h/Vg9++5bpOTtx/pDlx+y2lDjvjcnwCEEBS8QK9CoMygCgydQBUuCoACLxE7HlQt9vpYx577otCtsbvv8pf2eDyd83hUju1fvs+GG6aJ5i5vz9Pq8iowMPJzVXXHzl835rCY4FBo/CtiMGYSRBQ8n2payd1c9/ReJ/Jz2LRQF78f6GQCs+v3LJyu7sNo5+JjDvEw37ichoQIWEja5jgwk/BmEHbUIRmHc3bkb1zzGOptSXUsy4hbjEaQJXZ6KlvHDnm96uru3d1e7bVckOJueSMy32YqXFq2oKvJ6O7tPXAiYAAGL5FCARag8YEDBnFogLEgpS3YSif1yLB+VJKd/FkDwux+0VOaFZUrMH5YCP+ZeQWI6CrAIRgHVTUOhAwl8YVQx0hL9jG2s091hd0RfnZtb7bTPr/J19bf4qkpfsNmc1dU4Pk1Y3PTdofX7HNWdLZ2dnb7xibFfYlgSSsaAlvs18REgcsFZyKQAYLB6DY3+4RdBECSrILYcaM7zQtQBCxwIcXEzOIOwovCjICmEM7Y9zW+uPJhR5c7ttj8c+f5VGW7XQwvivjzv6fdii8bp7HZ4qp2Y6O2yLbanZqRlOIt8Z8+dqT+3PwACqmBQzGQcCu6XZMI+ALAamBYEZvaw0EKF+zL9ayiLoPsxoXUFKwouhSBwhqBQGh+z2514AJCtL7Iyrdhe7XIuSN2ypb/fW+S2OR0VRV225Li4Lmdm7t47lyJUuCs6x3sfAIesGPy3hMR0FNOoBP+qF4v8nOqDjL2XObMFZ+s53AeHItRBgmPFtPP0IBQ6trCwPo+5gdhUlys6MvLWFcW4d25LiCv1VFR5bE6nw+Xx2mLj7A5n8sp4c1ntqcNZiQVDvcZr1/V0bdEChZ8EUEz33RA/YS0Q2QKhf2YhcDczZzcW9IwoSAoJSaZcM8ahkHGi0MFI6R2/EoeBi12bsKBSb1Vnh8ORlhCXaiu6OcHu2r7J07UYJA67c1fmpackbj516JvmI3sGenunvF2FrCYu4iAB0U8LgMQ4VBcBEfrsf/IxCwp8ciimJ1MWBItCzqlCFaoKpsgCCvPy5IR5dtdeY2TOFp/P11bksOdmOhfbq92ZjkMlHk9crr1rxGHP7DP3XVfcicP02/8+kqJ84HznEqAIqGI6iQsv/nDHufrMCGb+myECWGYRyKVQEBh0oNjkZMFOLnKmY1hY1yxPnmdzuduFOT3jZ9smOovsmfOQPNyu3H152pbiTHu/9/w+e+47WzweT8vUmL322LHeod6sE0P7jUq/KHL+Le08Y10KwzhuxRdCgxB0GaUcWiNVbYm6XD2t4CDGUUKJ1YpQaWPETqwSK1avTYiYiXXFXiExQgSJENwgPlAjREgqnve8fddxav61xyUk+vN/xvv06bmV8Foy9QNPgqIgiR9fDIQdYCjKySBhEMCsgID0LRbtNUGwioSrKRUOEf/snS6IBWWao0bHFS+2vtpa6pObtI1lBk179sjq+FJaqqqpIwu8sg8mFYdevCoteXx8wFlbl0d98h/PXW1IXFGNBb++J6D/6t+rSjEhSrqiItDkTEE/YMkPLEiHRUhgFMCCg4ES58oOTT19E+UDTT0ARHaFHJAkaeVGOIo/uzZgfySVOJxtk4n65FIl/uBLWC7JfXWefd2w4ZE+Hxfmz8KbCTyKqkyCL/6Wgx5KwTSiOB58581QiK5gqzcYBbYFFYoQ64R1LllRyzfUMD1YkRycGgMkPL5m/XLP7m+/OP7Zimerezeak5HlaGLT+9URj3JnyeoBy87Osr79eGPhl94w+WAoqhbVf3iiEiGBn7pjL/OEbs+E3c9DjwKPLHCEWGpwFdXmt6Y7RFS1vMxk+ZaCgZ0q+TwerxTuPXDA17Gjz6TXrj3TcWQmGE2M+JKbFilZPXfp/jdHLs49u3rux++ftrqFAPlnFEUSBLmKf1iPQuxaWKoA8aexOj+hQCDgQl1hs87o3zccnjbdZJrd3RePlgeDPo+vb1mjRmevnu048OumlbFezpOyktr6av80Wc7mDu/fvzV359nBw/n896dPOBRcXJCCSfU7EsY0GAoeiNCWi/WD7ucZn0H0KEA1CAoTQjG7f6RUzdYHu8zfdGlDUpGARObkha9X7fcc5i6bmrZO20Nwb+sX8C1ESvtm9x8+3PfQs3xudXh/fkV8mJ2ioC+f9RB/7ori1kAPwwwh1Gf+jE5QiBGCiinLFSRZMFfgd5IXeUuUBw3R79vauBWf1Kqd7GqaOH8ku2KD2RyTmwXKQuHFl1Jw1x9Z3RqOJORDqfz3w/sjK3KH1Pk0V1QmB2kNCv7q/3NFkYSJB0VCW8+yJk6b9JhOUODzGGahtZt8gOCG0z+5f0XFbhMiZHPEpkUkTwv4QJm8LZFQVna2t1nQtPnOW4lkVgmXlih9D8qSJ3joUD6/v6/yIBtX01BOAYVO2BlM/1ZLcSNRVSShnw0xVxiiABZ8hGAUrJpaRBQ268CpH+ZoKPyNQl9v9YzAp2VK5KiUkBbA7D8TaB4Zpyrw8blI35fJREBqEkzFv+cPKeEYoMhgVxjq31EwGR9U6QVLnGEBCP6ugtgVLEKKo0AwdlecrF9AAbe76NUfPk4mRz0BJTAJUJQFO+25+DYs95sXUcPhSNOg1PXBoVz+oK+ffWt5OMNcIczcfp4//E0ZYV+LUSFCEU56nCeggECuwKKugCLCTEHbTQt/PkUoYgPro1/VRSjMHc+jGxgkogHJJ20EFMPbNi+ZOVNxHVirTFOmeQJS8Oa3eO57SvbEtiapK4yFywk3eykuHYWidZRR5aKQtJogEh7MFqy14Hqs9loFKaBojMd6+FTVGBFCKMzm0B74cFRJwhfwdJAy6CboB5o1q3h2OLLhsTpMjUitpODJdDybSyV9i7eqybRJj0JwiDDIEF7GH8D4kwO6gAL2uFimICRqsd6bDxBiC+oKHCKYhKVuXbSc5hwCKJSEzyW7AAWwmAQ3IEzHTmwcVj4o2crVOhhMzyi/fdDnjSsr4mNiWoAYDqTxoJahoC43FkVAz6d/CoLNybQIYamCRQirIcwVGAJDAb4AFUjURQHSpj9seCeiLRCKjYACFjpdTcvs5i6JaDIeaBIMekNry1PPfJIcvR1XQwUUlYkTDOPkD3MG54Y/ByGOeAkJyoKdQxgK8WjKUAALkxYeIBQg9qGw9694JZcnENyouUJytR7gNG/wetUWriZScKUjlkhekj1SUI0nhxMUID40KhdDgS6/GVf8VnQ0VujqCAl2FkMyRsEqCMPAWOBEgVGALTa6ml6G+tEhACjaAIttrVwr7U7neV/C28QlBbuGrGWJeFb2yEFf+TAnkGAoWFwQIBQFi5N/kjjrFbpahoJlTSNb4HJaj6JgEAxQtPQ7AMXa/iWrYW2gFbzsfVBB3EOCQ2YDisxEb1AKtBo62dFjd+J2rtQrezzqYhtBQYVQ4IABGZ3T/heFbnLI4oPe36WQNsXWAtcQxAKjsBi5QiukmjCKeR2u+IIBqWmg1QlA0WvoENiycHZ22je2aCXtLGvk6HGh/FBObuEDFGUNQRQFk4ii6n+jEDtuKuI93hQEBYAw7rIICtEVGgd4WLApWtocwGJGxbyT4IqAS2oxHwLEPWm+3d4ZvZe+e8i2zK5GsBI+LB5/KreQgi0e2uqbiCsMxUJE1L9yYH02XFkc8u+zsLQJOFiAsKl3EVdQFBYgASisgCL9riQ9xhdwuWDJCOWKLnaMorPT7TQ3AhQdk6p6O+qBpd9MfYyi+FvcxiS4ue8fQiCRQc7ktMlkdRRA8CSYKejUQtjGshA7wA/CgqQK6Do0FLsr+s9IK54mAekErOchYRQIg7ZQ0GOBGk8p6Lv3ldVHqaJGJZojeFVnFZbOMf7ZGQCC8qjGGUKY2dBSCsKeEFmgAKEodJ7AJGjWrFsf3R/ocf8PsUa7TyySDrgRBSd6mjUhElYQQrEpKnuGuDUU3QBFMen7zr9jwQbm5CchQ/yKBJGwkUW2sRq0bIkbbiFVwIOwAFcACcebpdvPov6ibHhnsAM84YJcgS2hoegZT13Y2LX0PJDQXFH9FyyISCNACiDpM37DguKgEhta45aCmkJY32RpEyKALx20ljIU2gcCLlRMOQ4oOiMQQAH9ROLDCiz81h4r1WR2cv0ZJ7s0/isUhIGoPyyj9O/xfRwT13LrXSFUU7GCsHyJxSIEUDisHd++Gz/ADOrMiQ8Pv3+GenCOdohr2BiRQLmiOAoqfjdEhEIjobj09ZPVULGlYLWD0qgJoijYhoWFtVbwxKcx3GLhMwicx0ZOWTJ+JAdCs0YhaWog/DbHyQdOIEGWmRCK6vAQ/o8MbUG+ov/DBIVxI8rFD5uYEhmjwCTgyVzBoyCfsGSuAATaoMKPhA+mqLewoBarV8XSt0ACJ4kJcGG5woFQ2Pw2WARGJOABIDQUaGECXfQlpNB5ktknw2IYLrhKMADsuEJ6CUpBV6xA4viKZ0EPp/gtMg4F+KE+QAAHaLLaYIcTHUnh5U53T3BuqJh6X0sUE9q0gQeSvUDCQbbRbGjbBu1/NsYo8PIMv0UnYqnGi7yoYhVFDBWMiHITcoTeFCDuHEZZ1GSzXraCZMEJQrtjL3qxE+y7Jm/ed3053Cxi3d27q1bdvbvu6Oql7y6c3jv5mNs94ZS7oAlgC8wCXIGEhhw4yxijqF4cRWXmDL1oO0khMAasmzDggEEgiflSjBAIEB4FhAaA6Dxh+vDhw4+FNi+6C9+fftUqeKLrjh2jVo1asn3m0h07dqxat3zLmtB093QQmAXD0OoHI2GiKECGuYKxEFW8qmACIgoxRTCxNhOk7zKxdMf0OoQEeAKBMLuHh+C+u/M3w/fP3aHX83frL15+runz8x3rrm8ODccwUPKEcPJjU+DSw1Bg8WnCCIUBE10tYYttIgkmHQkko4lNYQcOvsAoaoOwKYgn/FbzhOm9BsK3nFp7YtVzeOXPCwSo3i2ZOuozpx1Ht8zvAizAGRoLq5+gqEH0A39FUWXG43fAAAAAAElFTkSuQmCC\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"CO2 level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"co2\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"ppm\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "co2", + "indoor" + ] +} \ No newline at end of file From aae995de5d848c319e0b1e23e292d918a76bc14d Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 26 Oct 2023 16:07:35 +0300 Subject: [PATCH 15/39] tbDate: java11 date to Instant --- .../thingsboard/script/api/tbel/TbDate.java | 442 +++++++++++-- .../script/api/tbel/TbDateTest.java | 605 ++++++++++++++++-- .../script/api/tbel/TbDateTestEntity.java | 92 +++ 3 files changed, 1024 insertions(+), 115 deletions(-) create mode 100644 common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java index 3f79dc2cf7..084bc25c1f 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java @@ -15,79 +15,153 @@ */ package org.thingsboard.script.api.tbel; +import org.mvel2.ConversionException; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.StringUtils; +import java.io.Serializable; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.time.ZoneId; +import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.time.chrono.IsoChronology; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.format.FormatStyle; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; -import java.util.Date; -import java.util.GregorianCalendar; +import java.util.Arrays; import java.util.Locale; import java.util.function.BiFunction; -public class TbDate extends Date { +public class TbDate implements Serializable, Cloneable { + + private Instant instant; + + private static final ZoneId zoneIdUTC = ZoneId.of("UTC"); + private static final Locale localeUTC = Locale.forLanguageTag("UTC"); private static final DateTimeFormatter isoDateFormatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd[[ ]['T']HH:mm[:ss[.SSS]][ ][XXX][Z][z][VV][O]]").withZone(ZoneId.systemDefault()); - private static final ThreadLocal isoDateFormat = ThreadLocal.withInitial(() -> - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")); - public TbDate() { - super(); + this.instant = Instant.now(); } public TbDate(String s) { - super(parse(s)); + this.instant = parseInstant(s); } - public TbDate(long date) { - super(date); + public TbDate(String s, String pattern, Locale locale) { + instant = parseInstant(s, pattern, locale, zoneIdUTC); + } + public TbDate(String s, String pattern, Locale locale, String zoneIdStr) { + ZoneId zoneId = ZoneId.of(zoneIdStr); + instant = parseInstant(s, pattern, locale, zoneId); + } + public TbDate(String s, String pattern, Locale locale, ZoneId zoneId) { + instant = parseInstant(s, pattern, locale, zoneId); } - public TbDate(int year, int month, int date) { - this(year, month, date, 0, 0, 0); + public TbDate(long dateMilliSecond) { + instant = Instant.ofEpochMilli(dateMilliSecond); } - public TbDate(int year, int month, int date, int hrs, int min) { - this(year, month, date, hrs, min, 0); + public TbDate(int year, int month, int date, String... tz) { + this(year, month, date, 0, 0, 0, 0, tz); } - public TbDate(int year, int month, int date, - int hrs, int min, int second) { - super(new GregorianCalendar(year, month, date, hrs, min, second).getTimeInMillis()); + public TbDate(int year, int month, int date, int hrs, int min, String... tz) { + this(year, month, date, hrs, min, 0, 0, tz); } - public String toDateString() { - DateFormat formatter = DateFormat.getDateInstance(); - return formatter.format(this); + public TbDate(int year, int month, int date, int hrs, int min, int second, String... tz) { + this(year, month, date, hrs, min, second, 0, tz); + } + + public TbDate(int year, int month, int date, int hrs, int min, int second, int secondMilli, String... tz) { + ZoneId zoneId = tz.length > 0 ? ZoneId.of(Arrays.stream(tz).findFirst().get()) : ZoneId.systemDefault(); + instant = parseInstant(year, month, date, hrs, min, second, secondMilli, zoneId); } + public Instant getInstant() { + return instant; + } + + public ZonedDateTime getZonedDateTime() { + return instant.atZone(zoneIdUTC); + } + + public LocalDateTime getLocalDateTime() { + return LocalDateTime.ofInstant(this.instant, ZoneId.systemDefault()); + } + + public LocalDateTime getUTCDateTime() { + return LocalDateTime.ofInstant(this.instant, zoneIdUTC); + } + + public String toDateString() { + return toDateString(localeUTC.getLanguage()); + } + public String toDateString(String locale) { + return toDateString(locale, ZoneId.systemDefault().toString()); + } + public String toDateString(String localeStr, String optionsStr) { + return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(locale)); + } public String toTimeString() { - DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG); - return formatter.format(this); + return toTimeString(Locale.getDefault().getLanguage()); + } + public String toTimeString(String locale) { + return toTimeString(locale, ZoneId.systemDefault().toString()); + } + public String toTimeString(String localeStr, String optionsStr) { + return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).withLocale(locale)); } public String toISOString() { - return isoDateFormat.get().format(this); + return instant.toString(); + } + public String toJSON() { + return toISOString(); + } + public String toUTCString() { + return toUTCString(localeUTC.getLanguage()); + } + + public String toUTCString(String localeStr) { + return toLocaleString(localeStr, zoneIdUTC.getId(), (locale, options) -> DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).withLocale(locale)); + } + + public String toString() { + return toString(Locale.getDefault().getLanguage()); + } + + public String toString(String locale) { + return toString(locale, ZoneId.systemDefault().toString()); + } + + public String toString(String localeStr, String optionsStr) { + return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL).withLocale(locale)); + } + public String toISOZonedDateTimeString() { + return getZonedDateTime().toString(); + } + public String toISOZonedDateTimeString(DateTimeFormatter formatter) { + return getZonedDateTime().format(formatter); } public String toLocaleDateString() { - return toLocaleDateString(null, null); + return toLocaleDateString(localeUTC.getLanguage()); } - public String toLocaleDateString(String locale) { - return toLocaleDateString(locale, null); + public String toLocaleDateString(String localeStr) { + return toLocaleString(localeStr, ZoneId.systemDefault().toString(), (locale, options) -> DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(locale)); } public String toLocaleDateString(String localeStr, String optionsStr) { @@ -95,42 +169,34 @@ public class TbDate extends Date { } public String toLocaleTimeString() { - return toLocaleTimeString(null, null); + return toLocaleTimeString(Locale.getDefault().getLanguage()); } - public String toLocaleTimeString(String locale) { - return toLocaleTimeString(locale, null); + public String toLocaleTimeString(String localeStr) { + return toLocaleTimeString(localeStr, ZoneId.systemDefault().toString()); } public String toLocaleTimeString(String localeStr, String optionsStr) { return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedTime(options.getTimeStyle()).withLocale(locale)); } - @Override public String toLocaleString() { - return toLocaleString(null, null); + return toLocaleString(localeUTC.getLanguage(), ZoneId.systemDefault().toString()); } public String toLocaleString(String locale) { - return toLocaleString(locale, null); + return toLocaleString(locale, ZoneId.systemDefault().toString()); } public String toLocaleString(String localeStr, String optionsStr) { - return toLocaleString(localeStr, optionsStr, (locale, options) -> { - String formatPattern = - DateTimeFormatterBuilder.getLocalizedDateTimePattern( - options.getDateStyle(), - options.getTimeStyle(), - IsoChronology.INSTANCE, - locale); - return DateTimeFormatter.ofPattern(formatPattern, locale); - }); + return toLocaleString(localeStr, optionsStr, (locale, options) -> + DateTimeFormatter.ofLocalizedDateTime(options.getDateStyle(), options.getTimeStyle()).withLocale(locale)); } public String toLocaleString(String localeStr, String optionsStr, BiFunction formatterBuilder) { Locale locale = StringUtils.isNotEmpty(localeStr) ? Locale.forLanguageTag(localeStr) : Locale.getDefault(); DateTimeFormatOptions options = getDateFormattingOptions(optionsStr); - ZonedDateTime zdt = this.toInstant().atZone(options.getTimeZone().toZoneId()); + ZonedDateTime zdt = this.getInstant().atZone(options.getTimeZone().toZoneId()); DateTimeFormatter formatter; if (StringUtils.isNotEmpty(options.getPattern())) { formatter = new DateTimeFormatterBuilder().appendPattern(options.getPattern()).toFormatter(locale); @@ -140,13 +206,13 @@ public class TbDate extends Date { return formatter.format(zdt); } - private static DateTimeFormatOptions getDateFormattingOptions(String options) { + private DateTimeFormatOptions getDateFormattingOptions(String optionsStr) { DateTimeFormatOptions opt = null; - if (StringUtils.isNotEmpty(options)) { + if (StringUtils.isNotEmpty(optionsStr)) { try { - opt = JacksonUtil.fromString(options, DateTimeFormatOptions.class); + opt = JacksonUtil.fromString(optionsStr, DateTimeFormatOptions.class); } catch (IllegalArgumentException iae) { - opt = new DateTimeFormatOptions(options); + opt = new DateTimeFormatOptions(optionsStr); } } if (opt == null) { @@ -155,8 +221,251 @@ public class TbDate extends Date { return opt; } - public static long now() { - return System.currentTimeMillis(); + public long now() { + return Instant.now().toEpochMilli(); + } + + public long parseSecond() { + return instant.getEpochSecond(); + } + + public long parseSecondMilli() { + return instant.toEpochMilli(); + } + + public static long UTC(int year) { + return UTC(year, 0, 0, 0, 0, 0, 0); + } + public static long UTC(int year, int month) { + return UTC(year, month, 0, 0, 0, 0, 0); + } + public static long UTC(int year, int month, int date) { + return UTC(year, month, date, 0, 0, 0, 0); + } + public static long UTC(int year, int month, int date, int hrs) { + return UTC(year, month, date, hrs, 0, 0, 0); + } + public static long UTC(int year, int month, int date, int hrs, int min) { + return UTC(year, month, date, hrs, min, 0, 0); + } + public static long UTC(int year, int month, int date, int hrs, int min, int sec) { + return UTC(year, month, date, hrs, min, sec, 0); + } + public static long UTC(int year, int month, int date, int hrs, int min, int sec, int ms) { + year = year == 0 ? year = 1899 : year; + month = month == 0 ? month = 12 : month; + date = date == 0 ? date = 31 : date; + return parseInstant(year, month, date, hrs, min, sec, ms, zoneIdUTC).toEpochMilli(); + } + public int getUTCFullYear() { + return getUTCDateTime().getYear(); + } + + public int getUTCMonth() { + return getUTCDateTime().getMonthValue(); + } + // day in month + public int getUTCDate() { + return getUTCDateTime().getDayOfMonth(); + } + // day in week + public int getUTCDay() { + return getUTCDateTime().getDayOfWeek().getValue(); + } + + public int getUTCHours() { + return getUTCDateTime().getHour(); + } + + public int getUTCMinutes() { + return getZonedDateTime().getMinute(); + } + + public int getUTCSeconds() { + return getUTCDateTime().getSecond(); + } + public int getUTCMilliseconds() { + return getUTCDateTime().getNano()/1000000; + } + + public void setUTCFullYear(int year) { + if (getUTCDate() > 28) { + long time = getZonedDateTime().withYear(year).withDayOfMonth(1).toInstant().toEpochMilli() + (getUTCDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getZonedDateTime().withYear(year).toInstant(); + } + } + public void setUTCFullYear(int year, int month) { + if (getUTCDate() > 28) { + long time = getZonedDateTime().withYear(year).withMonth(month).withDayOfMonth(1).toInstant().toEpochMilli() + (getUTCDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getZonedDateTime().withYear(year).withMonth(month).toInstant(); + } + } + public void setUTCFullYear(int year, int month, int date) { + this.instant = getZonedDateTime().withYear(year).withMonth(month).withDayOfMonth(date).toInstant(); + } + public void setUTCMonth(int month) { + if (getUTCDate() > 28) { + long time = getZonedDateTime().withMonth(month).withDayOfMonth(1).toInstant().toEpochMilli() + (getUTCDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getZonedDateTime().withMonth(month).toInstant(); + } + } + public void setUTCMonth(int month, int date) { + this.instant = getZonedDateTime().withMonth(month).withDayOfMonth(date).toInstant(); + } + public void setUTCDate(int date) { + this.instant = getZonedDateTime().withDayOfMonth(date).toInstant(); + } + public void setUTCHours(int hrs) { + this.instant = getZonedDateTime().withHour(hrs).toInstant(); + } + public void setUTCHours(int hrs, int minutes) { + this.instant = getZonedDateTime().withHour(hrs).withMinute(minutes).toInstant(); + } + public void setUTCHours(int hrs, int minutes, int seconds) { + this.instant = getZonedDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).toInstant(); + } + public void setUTCHours(int hrs, int minutes, int seconds, int ms) { + this.instant = getZonedDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).withNano(ms*1000000).toInstant(); + } + public void setUTCMinutes(int minutes) { + this.instant = getZonedDateTime().withMinute(minutes).toInstant(); + } + public void setUTCMinutes(int minutes, int seconds) { + this.instant = getZonedDateTime().withMinute(minutes).withSecond(seconds).toInstant(); } + public void setUTCMinutes(int minutes, int seconds, int ms) { + this.instant = parseInstant(getUTCFullYear(), getUTCMonth(), getUTCDate(), getUTCHours(), minutes, seconds, ms, zoneIdUTC); + } + public void setUTCSeconds(int seconds) { + this.instant = getZonedDateTime().withSecond(seconds).toInstant(); + } + public void setUTCSeconds(int seconds, int ms) { + this.instant = getZonedDateTime().withSecond(seconds).withNano(ms*1000000).toInstant(); + } + public void setUTCMilliseconds(int ms) { + this.instant = getZonedDateTime().withNano(ms*1000000).toInstant(); + } + public int getFullYear() { + return getLocalDateTime().getYear(); + } + + public int getMonth() { + return getLocalDateTime().getMonthValue(); + } + // day in month + public int getDate() { + return getLocalDateTime().getDayOfMonth(); + } + // day in week + public int getDay() { + return getLocalDateTime().getDayOfWeek().getValue(); + } + + public int getHours() { + return getLocalDateTime().getHour(); + } + + public int getMinutes() { + return getLocalDateTime().getMinute(); + } + + public int getSeconds() { + return getLocalDateTime().getSecond(); + } + public int getMilliseconds() { + return getLocalDateTime().getNano()/1000000; + } + // Milliseconds since Jan 1, 1970, 00:00:00.000 GMT + public long getTime() { + return instant.toEpochMilli(); + } + public long valueOf(){ + return getTime() ; + } + public void setFullYear(int year) { + Instant instantEpochWithYear = getZonedDateTime().withYear(year).toInstant(); + if (getDate() > 28) { + long time = getLocalDateTime().withYear(year).withDayOfMonth(1).toInstant(getLocaleZoneOffset(instantEpochWithYear)).toEpochMilli() + (getDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getLocalDateTime().withYear(year).toInstant(getLocaleZoneOffset(instantEpochWithYear)); + } + } + public void setFullYear(int year, int month) { + Instant instantEpochWithYear = getZonedDateTime().withYear(year).withMonth(month).toInstant(); + if (getDate() > 28) { + long time = getLocalDateTime().withYear(year).withMonth(month).withDayOfMonth(1).toInstant(getLocaleZoneOffset(instantEpochWithYear)).toEpochMilli() + (getDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getLocalDateTime().withYear(year).withMonth(month).toInstant(getLocaleZoneOffset(instantEpochWithYear)); + } + } + public void setFullYear(int year, int month, int date) { + Instant instantEpochWithYearMonthDate = getZonedDateTime().withYear(year).withMonth(month).withDayOfMonth(date).toInstant(); + this.instant = getLocalDateTime().withYear(year).withMonth(month).withDayOfMonth(date).toInstant(getLocaleZoneOffset(instantEpochWithYearMonthDate)); + } + public void setMonth(int month) { + Instant instantEpochWithYear = getZonedDateTime().withMonth(month).toInstant(); + if (getDate() > 28) { + long time = getLocalDateTime().withMonth(month).withDayOfMonth(1).toInstant(getLocaleZoneOffset(instantEpochWithYear)).toEpochMilli() + (getDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getLocalDateTime().withMonth(month).toInstant(getLocaleZoneOffset(instantEpochWithYear)); + } + + } + public void setMonth(int month, int date) { + Instant instantEpochWithMonthDate = getZonedDateTime().withMonth(month).withDayOfMonth(date).toInstant(); + this.instant = getLocalDateTime().withMonth(month).withDayOfMonth(date).toInstant(getLocaleZoneOffset(instantEpochWithMonthDate)); + } + public void setDate(int date) { + Instant instantEpochWithDate = getZonedDateTime().withDayOfMonth(date).toInstant(); + this.instant = getLocalDateTime().withDayOfMonth(date).toInstant(getLocaleZoneOffset(instantEpochWithDate)); + } + public void setHours(int hrs) { + this.instant = getLocalDateTime().withHour(hrs).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setHours(int hrs, int minutes) { + this.instant = getLocalDateTime().withHour(hrs).withMinute(minutes).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setHours(int hrs, int minutes, int seconds) { + this.instant = getLocalDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setHours(int hrs, int minutes, int seconds, int ms) { + this.instant = getLocalDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setMinutes(int minutes) { + this.instant = getLocalDateTime().withMinute(minutes).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setMinutes(int minutes, int seconds) { + this.instant = getLocalDateTime().withMinute(minutes).withSecond(seconds).toInstant(getLocaleZoneOffset(this.instant)); + + } + public void setMinutes(int minutes, int seconds, int ms) { + this.instant = getLocalDateTime().withMinute(minutes).withSecond(seconds).withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setSeconds(int seconds) { + this.instant = getLocalDateTime().withSecond(seconds).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setSeconds(int seconds, int ms) { + this.instant = getLocalDateTime().withSecond(seconds).withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setMilliseconds(int ms) { + this.instant = getLocalDateTime().withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + + // Milliseconds since Jan 1, 1970, 00:00:00.000 GMT + public void setTime(long dateMilliSecond) { + instant = Instant.ofEpochMilli(dateMilliSecond); + } + + public ZoneOffset getLocaleZoneOffset(Instant... instants){ + return ZoneId.systemDefault().getRules().getOffset(instants.length > 0 ? instants[0] : this.instant); } public static long parse(String value, String format) { @@ -167,7 +476,6 @@ public class TbDate extends Date { return -1; } } - public static long parse(String value) { try { TemporalAccessor accessor = isoDateFormatter.parseBest(value, @@ -177,17 +485,35 @@ public class TbDate extends Date { Instant instant = Instant.from(accessor); return Instant.EPOCH.until(instant, ChronoUnit.MILLIS); } catch (Exception e) { - try { - return Date.parse(value); - } catch (IllegalArgumentException e2) { - return -1; - } + return -1; } } - public static long UTC(int year, int month, int date, - int hrs, int min, int sec) { - return Date.UTC(year - 1900, month, date, hrs, min, sec); + private static Instant parseInstant(String s) { + try{ + if (s.length() > 0 && Character.isDigit(s.charAt(0))) { + // assuming UTC instant "2007-12-03T10:15:30.00Z" + return OffsetDateTime.parse(s).toInstant(); + } + else { + // assuming RFC-1123 value "Tue, 3 Jun 2008 11:05:30 GMT-02:00" + return Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(s)); + } + } catch (final DateTimeParseException ex) { + final ConversionException exception = new ConversionException("Cannot parse value [" + s + "] as instant", ex); + throw exception; + } } + private static Instant parseInstant(int year, int month, int date, int hrs, int min, int second, int secondMilli, ZoneId zoneId) { + year = year < 70 ? 2000 + year : year <= 99 ? 1900 + year : year; + ZonedDateTime zonedDateTime = ZonedDateTime.of(year, month, date, hrs, min, second, secondMilli*1000000, zoneId); + return zonedDateTime.toInstant(); + } + private static Instant parseInstant(String s, String pattern, Locale locale, ZoneId zoneId) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, locale); + LocalDateTime localDateTime = LocalDateTime.parse(s, dateTimeFormatter); + ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId); + return zonedDateTime.toInstant(); + } } diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java index 87dd4f0ebf..1c2c5bde1c 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java @@ -24,21 +24,16 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import org.mvel2.ConversionException; import org.thingsboard.common.util.JacksonUtil; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.time.DateTimeException; import java.time.ZoneId; -import java.time.chrono.IsoChronology; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.time.format.FormatStyle; +import java.time.format.DateTimeParseException; import java.util.ArrayList; -import java.util.Calendar; import java.util.List; import java.util.Locale; -import java.util.TimeZone; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; @@ -46,6 +41,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; @Slf4j class TbDateTest { @@ -75,6 +72,11 @@ class TbDateTest { * at java.base/java.util.Calendar.setTimeInMillis(Calendar.java:1834) * at java.base/java.util.Calendar.setTime(Calendar.java:1800) * at java.base/java.text.SimpleDateFormat.format(SimpleDateFormat.java:974) + * Tests were checked with: + * -timezone Etc/GMT-14 + * -timezone Etc/GMT+12 + * -timezone America/New_York + * -timezone Europe/Kyiv */ @Test void testToISOStringConcurrently() throws ExecutionException, InterruptedException, TimeoutException { @@ -118,70 +120,106 @@ class TbDateTest { @Test void testToISOStringThreadLocalStaticFormatter() throws ExecutionException, InterruptedException, TimeoutException { executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1)); + int hrs = 14; + int date = 29; + int month = 2; + String pattern = "2024-%s-%sT%s:35:42.987Z"; + String tsStr = String.format(pattern, String.format("%02d", month), date, hrs); //Thu Feb 29 2024 14:35:42.987 GMT+0000 + TbDate tbDate = new TbDate(tsStr); long ts = 1709217342987L; //Thu Feb 29 2024 14:35:42.987 GMT+0000 - int offset = Calendar.getInstance().get(Calendar.ZONE_OFFSET); // for example 3600000 for GMT + 1 - TbDate tbDate = new TbDate(ts - offset); - String datePrefix = "2024-02-29T14:35:42.987"; //without time zone + Assert.assertEquals(ts, tbDate.parseSecondMilli()); + int offsetLocalSecond = tbDate.getLocaleZoneOffset().getTotalSeconds(); // for example 7200 for GMT + 2 + + String datePrefix = tsStr; //without time zone assertThat(tbDate.toISOString()) .as("format in main thread") .startsWith(datePrefix); assertThat(executor.submit(tbDate::toISOString).get(30, TimeUnit.SECONDS)) .as("format in executor thread") .startsWith(datePrefix); - assertThat(new TbDate(ts - offset).toISOString()) + TbDateTestEntity tbDateTest = new TbDateTestEntity(tbDate.getFullYear(), month, date,hrs + offsetLocalSecond/60/60); + String datePrefixLocal = String.format(pattern, tbDateTest.geMonthStr(), tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + long offsetLocalMilli = offsetLocalSecond*1000; + assertThat(new TbDate(ts + offsetLocalMilli).toISOString()) .as("new instance format in main thread") - .startsWith(datePrefix); - assertThat(executor.submit(() -> new TbDate(ts - offset).toISOString()).get(30, TimeUnit.SECONDS)) + .startsWith(datePrefixLocal); + assertThat(executor.submit(() -> new TbDate(ts + offsetLocalMilli).toISOString()).get(30, TimeUnit.SECONDS)) .as("new instance format in executor thread") - .startsWith(datePrefix); + .startsWith(datePrefixLocal); } @Test void testToLocaleDateString() { - TbDate d = new TbDate(1693962245000L); + String s = "09:15:30 PM, Sun 10/09/2022"; + String pattern = "hh:mm:ss a, EEE M/d/uuuu"; + TbDate d = new TbDate(s, pattern, Locale.US); + Assert.assertEquals("2022-10-09T21:15:30Z", d.toISOString()); + // tz = "-04:00" + d = new TbDate(s, pattern, Locale.US, "-04:00"); + Assert.assertEquals("2022-10-10T01:15:30Z", d.toISOString()); + d = new TbDate(s, pattern, Locale.US, "America/New_York"); + Assert.assertEquals("2022-10-10T01:15:30Z", d.toISOString()); + // tz = "+02:00" + /** + * For Java 11: + * String[2] { "vorm.", "nachm." } + * For Java 17: + * `{ "AM", "PM" }` + */ + s = "09:15:30 nachm., So. 10/09/2022"; + d = new TbDate(s, pattern, Locale.GERMAN, ZoneId.of("Europe/Berlin")); + Assert.assertEquals("2022-10-09T19:15:30Z", d.toISOString()); + + s = "09:15:30 пп, середа, 4 жовтня 2023 р."; + pattern = "hh:mm:ss a, EEEE, d MMMM y 'р.'"; + d = new TbDate(s, pattern, Locale.forLanguageTag("uk-UA")); + Assert.assertEquals("2023-10-04T21:15:30Z", d.toISOString()); + + d = new TbDate(1693962245000L); + Assert.assertEquals("2023-09-06T01:04:05Z", d.toISOString()); // Depends on time zone, so we just check it works; Assert.assertNotNull(d.toLocaleDateString()); Assert.assertNotNull(d.toLocaleDateString("en-US")); - Assert.assertEquals("9/5/23", d.toLocaleDateString("en-US", "America/New_York")); - Assert.assertEquals("23. 9. 5.", d.toLocaleDateString("ko-KR", "America/New_York")); - Assert.assertEquals("06.09.23", d.toLocaleDateString( "uk-UA", "Europe/Kiev")); - Assert.assertEquals("5\u200F/9\u200F/2023", d.toLocaleDateString( "ar-EG", "America/New_York")); + Assert.assertEquals("9/5/23", d.toLocaleDateString("en-US", "America/New_York")); + Assert.assertEquals("23. 9. 5.", d.toLocaleDateString("ko-KR", "America/New_York")); + Assert.assertEquals("06.09.23", d.toLocaleDateString( "uk-UA", "Europe/Kiev")); + Assert.assertEquals("5\u200F/9\u200F/2023", d.toLocaleDateString( "ar-EG", "America/New_York")); Assert.assertEquals("Tuesday, September 5, 2023", d.toLocaleDateString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("2023년 9월 5일 화요일", d.toLocaleDateString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("середа, 6 вересня 2023 р.", d.toLocaleDateString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("الثلاثاء، 5 سبتمبر 2023", d.toLocaleDateString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("Tuesday 9/5/2023", d.toLocaleDateString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); Assert.assertEquals("화요일 9/5/2023", d.toLocaleDateString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); Assert.assertEquals("середа 9/6/2023", d.toLocaleDateString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); Assert.assertEquals("الثلاثاء 9/5/2023", d.toLocaleDateString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); } @Test @@ -192,7 +230,6 @@ class TbDateTest { Assert.assertNotNull(d.toLocaleTimeString()); Assert.assertNotNull(d.toLocaleTimeString("en-US")); - Assert.assertEquals("9:04:05 PM", d.toLocaleTimeString("en-US", "America/New_York")); Assert.assertEquals("오후 9:04:05", d.toLocaleTimeString("ko-KR", "America/New_York")); Assert.assertEquals("04:04:05", d.toLocaleTimeString( "uk-UA", "Europe/Kiev")); @@ -201,36 +238,36 @@ class TbDateTest { Assert.assertEquals("9:04:05 PM Eastern Daylight Time", d.toLocaleTimeString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("오후 9시 4분 5초 미 동부 하계 표준시", d.toLocaleTimeString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("04:04:05 за східноєвропейським літнім часом", d.toLocaleTimeString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("9:04:05 م التوقيت الصيفي الشرقي لأمريكا الشمالية", d.toLocaleTimeString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("9:04:05 PM", d.toLocaleTimeString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); Assert.assertEquals("9:04:05 오후", d.toLocaleTimeString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); Assert.assertEquals("4:04:05 дп", d.toLocaleTimeString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); Assert.assertEquals("9:04:05 م", d.toLocaleTimeString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); } @Test @@ -241,16 +278,16 @@ class TbDateTest { Assert.assertNotNull(d.toLocaleString()); Assert.assertNotNull(d.toLocaleString("en-US")); - Assert.assertEquals("9/5/23, 9:04:05 PM", d.toLocaleString("en-US", "America/New_York")); - Assert.assertEquals("23. 9. 5. 오후 9:04:05", d.toLocaleString("ko-KR", "America/New_York")); - Assert.assertEquals("06.09.23, 04:04:05", d.toLocaleString( "uk-UA", "Europe/Kiev")); - Assert.assertEquals("5\u200F/9\u200F/2023 9:04:05 م", d.toLocaleString( "ar-EG", "America/New_York")); + Assert.assertEquals("9/5/23, 9:04:05 PM", d.toLocaleString("en-US", "America/New_York")); + Assert.assertEquals("23. 9. 5. 오후 9:04:05", d.toLocaleString("ko-KR", "America/New_York")); + Assert.assertEquals("06.09.23, 04:04:05", d.toLocaleString( "uk-UA", "Europe/Kiev")); + Assert.assertEquals("5\u200F/9\u200F/2023 9:04:05 م", d.toLocaleString( "ar-EG", "America/New_York")); Assert.assertEquals("Tuesday, September 5, 2023 at 9:04:05 PM Eastern Daylight Time", d.toLocaleString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("2023년 9월 5일 화요일 오후 9시 4분 5초 미 동부 하계 표준시", d.toLocaleString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") @@ -285,25 +322,479 @@ class TbDateTest { .toString())); } - private static String toLocalString(TbDate d, Locale locale, ZoneId tz) { - LocalDateTime ldt = d.toInstant().atZone(tz).toLocalDateTime(); + @Test + void TestFromString () { + String stringDateUTC = "2023-09-06T01:04:05.00Z"; + TbDate d = new TbDate(stringDateUTC); + Assert.assertEquals("2023-09-06T01:04:05Z", d.toISOString()); + String stringDateTZ = "2023-09-06T01:04:05.00+04:00:00"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-05T21:04:05Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00+04"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-05T21:04:05Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00-04:00"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-06T05:04:05Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00+04:30:56"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-05T20:33:09Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00-02:00"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-06T03:04:05Z", d.toISOString()); + String stringDateRFC_1123 = "Sat, 3 Jun 2023 11:05:30 GMT"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2023-06-03T11:05:30Z", d.toISOString()); + stringDateRFC_1123 = "Sat, 3 Jun 2023 01:04:05 +043056"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2023-06-02T20:33:09Z", d.toISOString()); + stringDateRFC_1123 = "Sat, 3 Jun 2023 11:05:30 +0400"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2023-06-03T07:05:30Z", d.toISOString()); + stringDateRFC_1123 = "Thu, 29 Feb 2024 11:05:30 -03"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2024-02-29T14:05:30Z", d.toISOString()); + + String stringDateZ_error = "2023-09-06T01:04:05.00+045"; + Exception actual = assertThrows(ConversionException.class, () -> { + new TbDate(stringDateZ_error); + }); + String expectedMessage = "Cannot parse value"; + assertTrue(actual.getMessage().contains(expectedMessage)); + + String stringDateRFC_1123_error = "Tue, 3 Jun 2023 11:05:30 GMT"; + actual = assertThrows(ConversionException.class, () -> { + new TbDate(stringDateRFC_1123_error); + }); + assertTrue(actual.getMessage().contains(expectedMessage)); + } + + @Test + void TestDateTimeFormatterToString () { + TbDate d1 = new TbDate(23, 9, 7, 8, 4, 5, "+04:00"); + TbDate d2 = new TbDate(23, 9, 7, 8, 4, 5, "-03:00"); + + Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toISOZonedDateTimeString()); + Assert.assertEquals("2023-09-07T04:04:05Z", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + Assert.assertEquals("Thu, 7 Sep 2023 04:04:05 GMT", d1.toISOZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05Z", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + + Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toISOZonedDateTimeString()); + Assert.assertEquals("2023-09-07T11:04:05Z", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + Assert.assertEquals("Thu, 7 Sep 2023 11:04:05 GMT", d2.toISOZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05Z", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + } + + @Test + void TestParse () { + String stringDateUTC = "2023-09-06T01:04:05.345Z"; + TbDate d = new TbDate(stringDateUTC); + Assert.assertEquals(1693962245345L, d.parseSecondMilli()); + Assert.assertEquals(1693962245L, d.parseSecond()); + String stringDateStart = "1970-01-01T00:00:00Z"; + d = new TbDate(stringDateStart); + long actualMillis = TbDate.parse("1970-01-01 T00:00:00"); + Assert.assertEquals(-d.getLocaleZoneOffset().getTotalSeconds() * 1000, actualMillis); + String pattern = "yyyy-MM-dd HH:mm:ss.SSS"; + String stringDate = "1995-12-04 00:12:00.000"; + Assert.assertNotEquals(-1L, TbDate.parse(stringDate, pattern)); + } + + @Test + void TestMethodGetAsDateTimeLocal() { + TbDate d = new TbDate(1975, 12, 31, 23,15,30, 560); + TbDate d0 = new TbDate(1975, 12, 31, 23,15,30, 560,"UTC"); + TbDate d1 = new TbDate(1975, 12, 31, 23,15,30, 561,"+03:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23,15,30, 562,"-02:00"); + TbDate dLocal = new TbDate(d.parseSecondMilli() + d.getLocaleZoneOffset().getTotalSeconds()*1000); + TbDate dLocal0 = new TbDate(d0.parseSecondMilli() + d0.getLocaleZoneOffset().getTotalSeconds()*1000); + TbDate dLocal1 = new TbDate(d1.parseSecondMilli() + d1.getLocaleZoneOffset().getTotalSeconds()*1000); + TbDate dLocal2 = new TbDate(d2.parseSecondMilli() + d2.getLocaleZoneOffset().getTotalSeconds()*1000); + + Assert.assertEquals(dLocal.getUTCFullYear(), d.getFullYear()); + Assert.assertEquals(dLocal0.getUTCFullYear(), d0.getFullYear()); + Assert.assertEquals(dLocal1.getUTCFullYear(), d1.getFullYear()); + Assert.assertEquals(dLocal2.getUTCFullYear(), d2.getFullYear()); + + Assert.assertEquals(dLocal.getUTCMonth(), d.getMonth()); + Assert.assertEquals(dLocal0.getUTCMonth(), d0.getMonth()); + Assert.assertEquals(dLocal1.getUTCMonth(), d1.getMonth()); + Assert.assertEquals(dLocal2.getUTCMonth(), d2.getMonth()); + + Assert.assertEquals(dLocal.getUTCDate(), d.getDate()); + Assert.assertEquals(dLocal0.getUTCDate(), d0.getDate()); + Assert.assertEquals(dLocal1.getUTCDate(), d1.getDate()); + Assert.assertEquals(dLocal2.getUTCDate(), d2.getDate()); + + Assert.assertEquals(dLocal.getUTCDay(), d.getDay()); + Assert.assertEquals(dLocal0.getUTCDay(), d0.getDay()); + Assert.assertEquals(dLocal1.getUTCDay(), d1.getDay()); + Assert.assertEquals(dLocal2.getUTCDay(), d2.getDay()); + + Assert.assertEquals(dLocal.getUTCHours(), d.getHours()); + Assert.assertEquals(dLocal0.getUTCHours(), d0.getHours()); + Assert.assertEquals(dLocal1.getUTCHours(), d1.getHours()); + Assert.assertEquals(dLocal2.getUTCHours(), d2.getHours()); + + Assert.assertEquals(dLocal.getUTCMinutes(), d.getMinutes()); + Assert.assertEquals(dLocal0.getUTCMinutes(), d0.getMinutes()); + Assert.assertEquals(dLocal1.getUTCMinutes(), d1.getMinutes()); + Assert.assertEquals(dLocal2.getUTCMinutes(), d2.getMinutes()); + + Assert.assertEquals(dLocal.getUTCSeconds(), d.getSeconds()); + Assert.assertEquals(dLocal0.getUTCSeconds(), d0.getSeconds()); + Assert.assertEquals(dLocal1.getUTCSeconds(), d1.getSeconds()); + Assert.assertEquals(dLocal2.getUTCSeconds(), d2.getSeconds()); + + Assert.assertEquals(dLocal.getUTCMilliseconds(), d.getMilliseconds()); + Assert.assertEquals(dLocal0.getUTCMilliseconds(), d0.getMilliseconds()); + Assert.assertEquals(dLocal1.getUTCMilliseconds(), d1.getMilliseconds()); + Assert.assertEquals(dLocal2.getUTCMilliseconds(), d2.getMilliseconds()); + } + + @Test + void Test_Year_Moth_Date_Hours_Min_Sec_Without_TZ() { + TbDate d = new TbDate(2023, 8, 18); + Assert.assertEquals("2023-08-18 00:00:00", d.toLocaleString()); + d = new TbDate(2023, 9, 17, 17, 34); + Assert.assertEquals("2023-09-17 17:34:00", d.toLocaleString()); + d = new TbDate(23, 9, 7, 8, 4); + Assert.assertEquals("2023-09-07 08:04:00", d.toLocaleString()); + d = new TbDate(23, 9, 7, 8, 4, 5); + Assert.assertEquals("2023-09-07 08:04:05", d.toLocaleString()); + d = new TbDate(23, 9, 7, 8, 4, 5, 567); + Assert.assertEquals("2023-09-07 08:04:05", d.toLocaleString()); + } + + @Test + void Test_Get_LocalDateTime_With_TZ() { + int hrs = 8; + int date = 7; + int tz = 0; + String pattern = "2023-09-%s %s:04:05"; + String tzStr = "UTC"; + TbDate d = new TbDate(23, 9, date, hrs, 4, 5); + int localOffsetHrs = 0; + TbDateTestEntity tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + String expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); + + d = new TbDate(23, 9, date, hrs, 4, 5, tzStr); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); -// new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter(locale) + tz = 3; + tzStr = "+03:00"; + d = new TbDate(23, 9, date, hrs, 4, 5, tzStr); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); - String formatPattern = - DateTimeFormatterBuilder.getLocalizedDateTimePattern( - FormatStyle.SHORT, - FormatStyle.MEDIUM, - IsoChronology.INSTANCE, - locale); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern, locale); - return formatter.format(ldt); + tz = -4; + tzStr = "-04:00"; + d = new TbDate(23, 9, date, hrs, 4, 5, tzStr); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); } - private static String toLocalString2(TbDate d, Locale locale, ZoneId tz) { - DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale); - dateFormat.setTimeZone(TimeZone.getTimeZone(tz)); - return dateFormat.format(d); + @Test + public void TestToUTC() { + Assert.assertEquals(-2209075200000L, TbDate.UTC(0)); + Assert.assertEquals("1899-12-31T00:00:00Z", new TbDate(TbDate.UTC(0)).toJSON()); + Assert.assertEquals("1996-02-02T03:04:05Z", new TbDate(TbDate.UTC(96, 2, 2, 3, 4, 5)).toJSON()); + Assert.assertEquals("2022-12-31T03:04:05.678Z", new TbDate(TbDate.UTC(22, 0, 0, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("0903-12-31T03:04:05.678Z", new TbDate(TbDate.UTC(903, 0, 0, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("1958-12-31T03:04:05.678Z", new TbDate(TbDate.UTC(1958, 0, 0, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("2032-04-05T03:04:05.678Z", new TbDate(TbDate.UTC(2032, 4, 5, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("2024-02-29T03:04:05.678Z", new TbDate(TbDate.UTC(2024, 2, 29, 3, 4, 5, 678)).toJSON()); + Exception actual = assertThrows(DateTimeException.class, () -> { + TbDate.UTC(2023, 2, 29, 3, 4, 5, 678); + }); + String expectedMessage = "Invalid date 'February 29' as '2023' is not a leap year"; + assertTrue(actual.getMessage().contains(expectedMessage)); } + @Test + void TestMethodGetTimeUTC() { + TbDate ddUTC = new TbDate(TbDate.UTC(1996, 1, 2, 3, 4, 5)); + Assert.assertEquals(820551845000L, ddUTC.valueOf()); + TbDate dd = new TbDate(1996, 1, 2, 3, 4, 5); + int localOffsetMilli = ZoneId.systemDefault().getRules().getOffset(dd.getInstant()).getTotalSeconds()*1000; + Assert.assertEquals((dd.valueOf() + localOffsetMilli), ddUTC.valueOf()); + + ddUTC = new TbDate(TbDate.UTC(1969, 7, 20, 20, 17, 40)); + Assert.assertEquals(-14182940000L, ddUTC.valueOf()); + TbDate beforeStartUTC = new TbDate(1969, 7, 20, 20, 17, 40); + localOffsetMilli = ZoneId.systemDefault().getRules().getOffset(beforeStartUTC.getInstant()).getTotalSeconds()*1000; + Assert.assertEquals((beforeStartUTC.valueOf() + localOffsetMilli), ddUTC.valueOf()); + } + + @Test + void TestMethodSetUTCFullYearMonthDate() { + TbDate d1 = new TbDate(1975, 12, 31, 23,15,30, 567,"-04:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23,15,30, 567,"+04:00"); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCFullYear(1969); + d2.setUTCFullYear(1969); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCFullYear(1975, 5); + d2.setUTCFullYear(2023, 11); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCFullYear(2023, 2, 28); + d2.setUTCFullYear(2023, 12, 31); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMonth(11); + d2.setUTCMonth(2); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMonth(5, 20); + d2.setUTCMonth(2, 8); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCDate(6); + d2.setUTCDate(15); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + } + + @Test + void TestMethodSetUTCHoursMinutesSecondsMilliSec() { + TbDate d1 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "+02:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "-02:00"); + + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(5); + d2.setUTCHours(23); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(23, 45); + d2.setUTCHours(1, 5); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(0, 12, 59); + d2.setUTCHours(4, 45, 01); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(2, 32, 49, 123); + d2.setUTCHours(8, 45, 12, 234); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMinutes(5); + d2.setUTCMinutes(15); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMinutes(5, 34); + d2.setUTCMinutes(25, 43); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMinutes(25, 14, 567); + d2.setUTCMinutes(45, 3, 876); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCSeconds(5); + d2.setUTCSeconds(23); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCSeconds(45, 987); + d2.setUTCSeconds(54, 842); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMilliseconds(675); + d1.setUTCMilliseconds(923); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + } + @Test + void TestMethodSetTime() { + TbDate d1 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "-03:00"); + long dateMilliSecond = d1.getTime(); + int fiveMinutesInMillis = 5 * 60 * 1000; + Assert.assertEquals(15, d1.getUTCMinutes()); + Assert.assertEquals(4, d1.getUTCDay()); + d1.setTime(dateMilliSecond + fiveMinutesInMillis); + Assert.assertEquals(20, d1.getUTCMinutes()); + Assert.assertEquals(4, d1.getUTCDay()); + d1.setTime(-378682769433L); + Assert.assertEquals(1958, d1.getUTCFullYear()); + Assert.assertEquals(1, d1.getUTCMonth()); + Assert.assertEquals(1, d1.getUTCDate()); + Assert.assertEquals(2, d1.getUTCHours()); + Assert.assertEquals(20, d1.getUTCMinutes()); + Assert.assertEquals(30, d1.getUTCSeconds()); + Assert.assertEquals(567, d1.getUTCMilliseconds()); + Assert.assertEquals(3, d1.getUTCDay()); + } + @Test + void TestMethodSeFullYearMonthDate() { + TbDate d = new TbDate(2024, 1, 1, 1, 15, 30, 567); + testResultChangeDateTime(d); + + d = new TbDate(2023, 12, 31, 22, 15, 30, 567); + testResultChangeDateTime(d); + + d = new TbDate(1975, 12, 31, 1, 15, 30, 567); + testResultChangeDateTime(d); + + d.setFullYear(1969); + testResultChangeDateTime(d); + + d.setFullYear(1975, 2); + testResultChangeDateTime(d); + + d.setFullYear(2023, 6, 30); + testResultChangeDateTime(d); + + d.setMonth(2); + testResultChangeDateTime(d); + + d.setMonth(1, 24); + testResultChangeDateTime(d); + + d.setDate(6); + testResultChangeDateTime(d); + } + @Test + void TestMethodSeHoursMinutesSecondsMilliSec() { + TbDate d1 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "+02:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "-02:00"); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(5); + d2.setHours(23); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(23, 45); + d2.setHours(1, 5); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(0, 12, 59); + d2.setHours(4, 45, 1); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(2, 32, 49, 123); + d2.setHours(8, 45, 12, 234); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setMinutes(5); + d2.setMinutes(15); + Assert.assertEquals(5, d1.getMinutes()); + Assert.assertEquals(15, d2.getMinutes()); + + d1.setMinutes(5, 34); + d2.setMinutes(25, 43); + Assert.assertEquals(5, d1.getMinutes()); + Assert.assertEquals(34, d1.getSeconds()); + Assert.assertEquals(25, d2.getMinutes()); + Assert.assertEquals(43, d2.getSeconds()); + + d1.setMinutes(25, 14, 567); + d2.setMinutes(45, 3, 876); + Assert.assertEquals(25, d1.getMinutes()); + Assert.assertEquals(14, d1.getSeconds()); + Assert.assertEquals(567, d1.getMilliseconds()); + Assert.assertEquals(45, d2.getMinutes()); + Assert.assertEquals(3, d2.getSeconds()); + Assert.assertEquals(876, d2.getMilliseconds()); + + d1.setSeconds(5); + d2.setSeconds(23); + Assert.assertEquals(5, d1.getSeconds()); + Assert.assertEquals(23, d2.getSeconds()); + + d1.setSeconds(45, 987); + d2.setSeconds(54, 842); + Assert.assertEquals(45, d1.getSeconds()); + Assert.assertEquals(987, d1.getMilliseconds()); + Assert.assertEquals(54, d2.getSeconds()); + Assert.assertEquals(842, d2.getMilliseconds()); + + d1.setMilliseconds(675); + d2.setMilliseconds(923); + Assert.assertEquals(675, d1.getMilliseconds()); + Assert.assertEquals(923, d2.getMilliseconds()); + } + @Test + public void toStringAsJs() { + TbDate d1 = new TbDate(1975, 12, 31, 23,15,30, 567,"-04:00"); + Assert.assertEquals("четвер, 1 січня 1976 р. о 06:15:30 за східноєвропейським стандартним часом", d1.toString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("Thursday, January 1, 1976 at 6:15:30 AM Eastern European Standard Time", d1.toString("en-US", "Europe/Kyiv")); + Assert.assertEquals("1976 Jan 1, Thu 06:15:30 Eastern European Time", d1.toString("UTC", "Europe/Kyiv")); + Assert.assertEquals("Wednesday, December 31, 1975 at 10:15:30 PM Eastern Standard Time", d1.toString("en-US", "America/New_York")); + Assert.assertEquals("1975 Dec 31, Wed 22:15:30 Eastern Standard Time", d1.toString("GMT", "America/New_York")); + Assert.assertEquals("1975 Dec 31, Wed 22:15:30 Eastern Standard Time", d1.toString("UTC", "America/New_York")); + + Assert.assertEquals(d1.toUTCString("UTC"), d1.toUTCString()); + Assert.assertEquals("четвер, 1 січня 1976 р., 03:15:30", d1.toUTCString("uk-UA")); + Assert.assertEquals("Thursday, January 1, 1976, 3:15:30 AM", d1.toUTCString("en-US")); + + Assert.assertEquals("1976-01-01T03:15:30.567Z", d1.toJSON()); + Assert.assertEquals("1976-01-01T03:15:30.567Z", d1.toISOString()); + + Assert.assertEquals("1976-01-01 06:15:30", d1.toLocaleString("UTC", "Europe/Kyiv")); + Assert.assertEquals("01.01.76, 06:15:30", d1.toLocaleString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("1975-12-31 22:15:30", d1.toLocaleString("UTC", "America/New_York")); + Assert.assertEquals("12/31/75, 10:15:30 PM", d1.toLocaleString("en-US", "America/New_York")); + + Assert.assertEquals("1976 Jan 1, Thu", d1.toDateString("UTC", "Europe/Kyiv")); + Assert.assertEquals("четвер, 1 січня 1976 р.", d1.toDateString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("1975 Dec 31, Wed", d1.toDateString("UTC", "America/New_York")); + Assert.assertEquals("Wednesday, December 31, 1975", d1.toDateString("en-US", "America/New_York")); + + Assert.assertEquals("06:15:30", d1.toLocaleTimeString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("06:15:30", d1.toLocaleTimeString("UTC", "Europe/Kyiv")); + Assert.assertEquals("10:15:30 PM", d1.toLocaleTimeString("en-US", "America/New_York")); + Assert.assertEquals("22:15:30", d1.toLocaleTimeString("UTC", "America/New_York")); + + Assert.assertEquals("06:15:30 за східноєвропейським стандартним часом", d1.toTimeString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("06:15:30 Eastern European Time", d1.toTimeString("UTC", "Europe/Kyiv")); + Assert.assertEquals("10:15:30 PM Eastern Standard Time", d1.toTimeString("en-US", "America/New_York")); + Assert.assertEquals("22:15:30 Eastern Standard Time", d1.toTimeString("UTC", "America/New_York")); + } + + private void testResultChangeDateTime(TbDate d) { + int localOffset = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds(); + TbDateTestEntity tbDateTestEntity = new TbDateTestEntity(d.getFullYear(), d.getMonth(), d.getDate(), (d.getHours() - (localOffset/60/60))); + Assert.assertEquals(tbDateTestEntity.getYear(), d.getUTCFullYear()); + Assert.assertEquals(tbDateTestEntity.getMonth(), d.getUTCMonth()); + Assert.assertEquals(tbDateTestEntity.getDate(), d.getUTCDate()); + Assert.assertEquals(tbDateTestEntity.getHours(), d.getUTCHours()); + Assert.assertEquals(d.getMinutes(), d.getUTCMinutes()); + Assert.assertEquals(d.getSeconds(), d.getUTCSeconds()); + Assert.assertEquals(d.getMilliseconds(), d.getUTCMilliseconds()); + } } diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java new file mode 100644 index 0000000000..3c6c5f56ff --- /dev/null +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java @@ -0,0 +1,92 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.script.api.tbel; + +import lombok.Data; + +import java.time.chrono.IsoChronology; + +@Data +public class TbDateTestEntity { + private int year; + private int month; + private int date; + private int hours; + public TbDateTestEntity(int year, int month, int date, int hours) { + this.year = year; + this.month = month; + this.date = date; + this.hours = hours; + if (hours > 23) { + if (date == 31) { + this.year++; + this.month = 1; + this.date = 1; + } else { + this.date++; + } + this.hours = hours - 24; + } else if (hours < 0) { + if (month== 1 && date == 1) { + this.year--; + this.month = 12; + this.date = 31; + } else { + this.date--; + } + this.hours = hours + 24; + } + + if (this.date > 28) { + int dom = 31; + switch (month) { + case 2: + dom = IsoChronology.INSTANCE.isLeapYear((long) year) ? 29 : 28; + case 3: + case 5: + case 7: + case 8: + case 10: + default: + break; + case 4: + case 6: + case 9: + case 11: + dom = 30; + } + if (this.date > dom) { + this.date = this.date - dom; + this.month++; + } + } + } + public int getYear(){ + return year < 70 ? 2000 + year : year <= 99 ? 1900 + year : year; + } + + public String geMonthStr(){ + return String.format("%02d", month); + } + + public String geDateStr(){ + return String.format("%02d", date); + } + + public String geHoursStr(){ + return String.format("%02d", hours); + } +} From 1e53280ca8703a843c8be94dcb81db24ef67c6c0 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 26 Oct 2023 17:04:25 +0300 Subject: [PATCH 16/39] added api request parameter to retrieve all tenant bundles without system --- .../controller/WidgetsBundleController.java | 9 +++++++- .../dao/widget/WidgetsBundleService.java | 2 ++ .../dao/sql/widget/JpaWidgetsBundleDao.java | 19 ++++++++++++++++ .../sql/widget/WidgetsBundleRepository.java | 22 +++++++++++++++++++ .../server/dao/widget/WidgetsBundleDao.java | 9 ++++++++ .../dao/widget/WidgetsBundleServiceImpl.java | 8 +++++++ 6 files changed, 68 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java b/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java index b07467b94b..f62d1b7b05 100644 --- a/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java @@ -69,6 +69,7 @@ public class WidgetsBundleController extends BaseController { private static final String WIDGET_BUNDLE_DESCRIPTION = "Widget Bundle represents a group(bundle) of widgets. Widgets are grouped into bundle by type or use case. "; private static final String FULL_SEARCH_PARAM_DESCRIPTION = "Optional boolean parameter indicating extended search of widget bundles by description and by name / description of related widget types"; + private static final String TENANT_BUNDLES_ONLY_DESCRIPTION = "Optional boolean parameter to include only tenant-level bundles without system"; @ApiOperation(value = "Get Widget Bundle (getWidgetsBundleById)", notes = "Get the Widget Bundle based on the provided Widget Bundle Id. " + WIDGET_BUNDLE_DESCRIPTION + AVAILABLE_FOR_ANY_AUTHORIZED_USER) @@ -185,6 +186,8 @@ public class WidgetsBundleController extends BaseController { @RequestParam(required = false) String sortProperty, @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES) @RequestParam(required = false) String sortOrder, + @ApiParam(value = TENANT_BUNDLES_ONLY_DESCRIPTION) + @RequestParam(required = false) Boolean tenantOnly, @ApiParam(value = FULL_SEARCH_PARAM_DESCRIPTION) @RequestParam(required = false) Boolean fullSearch) throws ThingsboardException { PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); @@ -192,7 +195,11 @@ public class WidgetsBundleController extends BaseController { return checkNotNull(widgetsBundleService.findSystemWidgetsBundlesByPageLink(getTenantId(), fullSearch != null && fullSearch, pageLink)); } else { TenantId tenantId = getCurrentUser().getTenantId(); - return checkNotNull(widgetsBundleService.findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, fullSearch != null && fullSearch, pageLink)); + if (tenantOnly != null && tenantOnly) { + return checkNotNull(widgetsBundleService.findTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, fullSearch != null && fullSearch, pageLink)); + } else { + return checkNotNull(widgetsBundleService.findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, fullSearch != null && fullSearch, pageLink)); + } } } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java index 15fd4838dd..a836fb893d 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java @@ -42,6 +42,8 @@ public interface WidgetsBundleService extends EntityDaoService { PageData findAllTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); + PageData findTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); + List findAllTenantWidgetsBundlesByTenantId(TenantId tenantId); void deleteWidgetsBundlesByTenantId(TenantId tenantId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java index e9c972c7a3..783f7db0f6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java @@ -111,6 +111,25 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao findTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { + if (fullSearch) { + return DaoUtil.toPageData( + widgetsBundleRepository + .findTenantWidgetsBundlesByTenantIdFullSearch( + tenantId, + Objects.toString(pageLink.getTextSearch(), ""), + DaoUtil.toPageable(pageLink))); + } else { + return DaoUtil.toPageData( + widgetsBundleRepository + .findTenantWidgetsBundlesByTenantId( + tenantId, + Objects.toString(pageLink.getTextSearch(), ""), + DaoUtil.toPageable(pageLink))); + } + } + @Override public WidgetsBundle findByTenantIdAndExternalId(UUID tenantId, UUID externalId) { return DaoUtil.getData(widgetsBundleRepository.findByTenantIdAndExternalId(tenantId, externalId)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 25053bbbe6..e082f4d396 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -96,6 +96,28 @@ public interface WidgetsBundleRepository extends JpaRepository findTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantId") UUID tenantId, + @Param("textSearch") String textSearch, + Pageable pageable); + WidgetsBundleEntity findFirstByTenantIdAndTitle(UUID tenantId, String title); @Query("SELECT externalId FROM WidgetsBundleEntity WHERE id = :id") diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java index b5486b61b1..9e0d70dcd8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java @@ -74,5 +74,14 @@ public interface WidgetsBundleDao extends Dao, ExportableEntityDa */ PageData findAllTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink); + /** + * Find all tenant widgets bundles (does not include system) by tenantId and page link. + * + * @param tenantId the tenantId + * @param pageLink the page link + * @return the list of widgets bundles objects + */ + PageData findTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java index 998cbb6e31..87a507873d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java @@ -142,6 +142,14 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService { return widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId.getId(), fullSearch, pageLink); } + @Override + public PageData findTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink) { + log.trace("Executing findTenantWidgetsBundlesByTenantIdAndPageLink, tenantId [{}], fullSearch [{}], pageLink [{}]", tenantId, fullSearch, pageLink); + Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); + Validator.validatePageLink(pageLink); + return widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId.getId(), fullSearch, pageLink); + } + @Override public List findAllTenantWidgetsBundlesByTenantId(TenantId tenantId) { log.trace("Executing findAllTenantWidgetsBundlesByTenantId, tenantId [{}]", tenantId); From 694b6bf85169ca7e1dbe87a5a282c8ee9bfb2721 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Thu, 19 Oct 2023 19:04:35 +0300 Subject: [PATCH 17/39] Refactoring: new data structures and message flow Local Subscription Service refactoring Refactoring of the proto structures Bug fixing after refactoring Minor improvements and bug fixes Improvements to avoid additional DB calls Bug fixes after refactoring Cluster mode improvements --- .../InMemoryHouseKeeperServiceService.java | 3 +- .../partition/TbCoreStartupService.java | 52 ++ .../queue/DefaultTbClusterService.java | 14 + .../queue/DefaultTbCoreConsumerService.java | 66 +- .../DefaultSubscriptionManagerService.java | 640 ++++++------------ ...efaultTbEntityDataSubscriptionService.java | 2 +- .../DefaultTbLocalSubscriptionService.java | 514 ++++++++++---- .../SubscriptionManagerService.java | 9 +- .../SubscriptionSchedulerComponent.java | 52 ++ .../subscription/TbAbstractDataSubCtx.java | 8 +- .../subscription/TbAbstractSubCtx.java | 4 + .../subscription/TbAttributeSubscription.java | 4 +- .../subscription/TbEntityLocalSubsInfo.java | 245 +++++++ .../subscription/TbEntityRemoteSubsInfo.java | 79 +++ .../subscription/TbEntitySubEvent.java | 42 ++ .../subscription/TbEntityUpdatesInfo.java | 30 + .../TbLocalSubscriptionService.java | 36 +- .../service/subscription/TbSubscription.java | 2 +- .../subscription/TbSubscriptionUtils.java | 358 +++++----- .../subscription/TbSubscriptionsInfo.java | 56 ++ ...ion.java => TbTimeSeriesSubscription.java} | 9 +- .../service/ws/DefaultWebSocketService.java | 36 +- .../DefaultNotificationCommandsHandler.java | 7 +- .../sub/NotificationsCountSubscription.java | 2 +- .../sub/NotificationsSubscription.java | 2 +- .../sub/AlarmSubscriptionUpdate.java | 23 +- .../sub/TelemetrySubscriptionUpdate.java | 14 +- .../src/test/resources/logback-test.xml | 2 + .../server/cluster/TbClusterService.java | 4 + common/cluster-api/src/main/proto/queue.proto | 105 ++- .../queue/discovery/HashPartitionService.java | 5 + .../queue/discovery/PartitionService.java | 2 + .../queue/discovery/ZkDiscoveryService.java | 12 +- .../event/OtherServiceShutdownEvent.java | 41 ++ .../server/queue/util/AfterStartUp.java | 1 + .../discovery/ZkDiscoveryServiceTest.java | 5 +- .../query/DefaultEntityQueryRepository.java | 1 - 37 files changed, 1668 insertions(+), 819 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java create mode 100644 application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionSchedulerComponent.java create mode 100644 application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java create mode 100644 application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java create mode 100644 application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java create mode 100644 application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java create mode 100644 application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java rename application/src/main/java/org/thingsboard/server/service/subscription/{TbTimeseriesSubscription.java => TbTimeSeriesSubscription.java} (84%) create mode 100644 common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java index 4e83aa0060..9edc81f9fd 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java @@ -22,7 +22,6 @@ import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionalEventListener; import org.thingsboard.common.util.ThingsBoardThreadFactory; @@ -91,7 +90,7 @@ public class InMemoryHouseKeeperServiceService implements HouseKeeperService { } @Override - public void onFailure(@NotNull Throwable throwable) { + public void onFailure(Throwable throwable) { queueSize.decrementAndGet(); totalProcessedCounter.incrementAndGet(); log.error("[{}][{}] unassignDeletedUserAlarms failed, pending queue size: {}, total processed count: {}", diff --git a/application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java b/application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java new file mode 100644 index 0000000000..3139ff256e --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java @@ -0,0 +1,52 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.partition; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.stereotype.Service; +import org.thingsboard.server.cluster.TbClusterService; +import org.thingsboard.server.common.msg.queue.ServiceType; +import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.discovery.PartitionService; +import org.thingsboard.server.queue.discovery.QueueKey; +import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.util.AfterStartUp; +import org.thingsboard.server.queue.util.TbCoreComponent; + +@Slf4j +@TbCoreComponent +@Service +@RequiredArgsConstructor +public class TbCoreStartupService { + + private final PartitionService partitionService; + private final TbServiceInfoProvider serviceInfoProvider; + private final TbClusterService clusterService; + + @AfterStartUp(order = AfterStartUp.STARTUP_SERVICE) + public void onApplicationEvent(ApplicationReadyEvent event) { + var myPartitions = partitionService.getMyPartitions(new QueueKey(ServiceType.TB_CORE)); + if (myPartitions != null && !myPartitions.isEmpty()) { + TransportProtos.ToCoreNotificationMsg toCoreMsg = TransportProtos.ToCoreNotificationMsg.newBuilder() + .setCoreStartupMsg(TransportProtos.CoreStartupMsg.newBuilder() + .setServiceId(serviceInfoProvider.getServiceId()).addAllPartitions(myPartitions).build()).build(); + clusterService.broadcastToCore(toCoreMsg); + } + } + +} diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java index 53ef38d96a..308d3b2f43 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java @@ -77,6 +77,7 @@ import org.thingsboard.server.service.ota.OtaPackageStateService; import org.thingsboard.server.service.profile.TbAssetProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache; +import java.util.List; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -138,6 +139,18 @@ public class DefaultTbClusterService implements TbClusterService { toCoreMsgs.incrementAndGet(); } + @Override + public void broadcastToCore(ToCoreNotificationMsg toCoreMsg) { + UUID msgId = UUID.randomUUID(); + TbQueueProducer> toCoreNfProducer = producerProvider.getTbCoreNotificationsMsgProducer(); + Set tbCoreServices = partitionService.getAllServiceIds(ServiceType.TB_CORE); + for (String serviceId : tbCoreServices) { + TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + toCoreNfProducer.send(tpi, new TbProtoQueueMsg<>(msgId, toCoreMsg), null); + toCoreNfs.incrementAndGet(); + } + } + @Override public void pushMsgToVersionControl(TenantId tenantId, TransportProtos.ToVersionControlServiceMsg msg, TbQueueCallback callback) { TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_VC_EXECUTOR, tenantId, tenantId); @@ -203,6 +216,7 @@ public class DefaultTbClusterService implements TbClusterService { } return null; } + private TbMsg transformMsg(TbMsg tbMsg, HasRuleEngineProfile ruleEngineProfile) { if (ruleEngineProfile != null) { RuleChainId targetRuleChainId = ruleEngineProfile.getDefaultRuleChainId(); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index fd5a252cc5..3494125d5e 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -58,7 +58,6 @@ import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionCloseProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; @@ -66,6 +65,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMs import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToUsageStatsServiceMsg; import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; +import org.thingsboard.server.gen.transport.TransportProtos.TbEntitySubEventProto; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.PartitionService; @@ -93,7 +93,6 @@ import org.thingsboard.server.service.sync.vc.GitVersionControlQueueService; import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; -import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @@ -343,10 +342,13 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService Do NOTHING. + callback.onSuccess(); } else { throwNotHandled(msg, callback); } } + private void forwardCoreStartupMsg(TransportProtos.CoreStartupMsg coreStartupMsg, TbCallback callback) { + log.info("[{}] Processing core startup with partitions: {}", coreStartupMsg.getServiceId(), coreStartupMsg.getPartitionsList()); + localSubscriptionService.onCoreStartupMsg(coreStartupMsg); + callback.onSuccess(); + } + private void forwardToSubMgrService(SubscriptionMgrMsgProto msg, TbCallback callback) { - if (msg.hasAttributeSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getAttributeSub()), callback); + if (msg.hasSubEvent()) { + TbEntitySubEventProto subEvent = msg.getSubEvent(); + subscriptionManagerService.onSubEvent(subEvent.getServiceId(), TbSubscriptionUtils.fromProto(subEvent), callback); } else if (msg.hasTelemetrySub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getTelemetrySub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasAlarmSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getAlarmSub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasNotificationsSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getNotificationsSub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasNotificationsCountSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getNotificationsCountSub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasSubClose()) { - TbSubscriptionCloseProto closeProto = msg.getSubClose(); - subscriptionManagerService.cancelSubscription(closeProto.getSessionId(), closeProto.getSubscriptionId(), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasTsUpdate()) { TbTimeSeriesUpdateProto proto = msg.getTsUpdate(); long tenantIdMSB = proto.getTenantIdMSB(); @@ -576,7 +586,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService implements SubscriptionManagerService { - private final AttributesService attrService; - private final TimeseriesService tsService; private final NotificationsTopicService notificationsTopicService; private final PartitionService partitionService; private final TbServiceInfoProvider serviceInfoProvider; @@ -97,126 +78,89 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene private final TbLocalSubscriptionService localSubscriptionService; private final DeviceStateService deviceStateService; private final TbClusterService clusterService; + private final SubscriptionSchedulerComponent scheduler; - private final Map> subscriptionsByEntityId = new ConcurrentHashMap<>(); - private final Map> subscriptionsByWsSessionId = new ConcurrentHashMap<>(); - private final ConcurrentMap> partitionedSubscriptions = new ConcurrentHashMap<>(); - private final Set currentPartitions = ConcurrentHashMap.newKeySet(); + private final Lock subsLock = new ReentrantLock(); + private final ConcurrentMap entitySubscriptions = new ConcurrentHashMap<>(); + + private final ConcurrentMap entityUpdates = new ConcurrentHashMap<>(); - private ExecutorService tsCallBackExecutor; private String serviceId; private TbQueueProducer> toCoreNotificationsProducer; + private long initTs; + @PostConstruct public void initExecutor() { - tsCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("ts-sub-callback")); serviceId = serviceInfoProvider.getServiceId(); + initTs = System.currentTimeMillis(); toCoreNotificationsProducer = producerProvider.getTbCoreNotificationsMsgProducer(); - } - - @PreDestroy - public void shutdownExecutor() { - if (tsCallBackExecutor != null) { - tsCallBackExecutor.shutdownNow(); - } + scheduler.scheduleWithFixedDelay(this::cleanupEntityUpdates, 1, 1, TimeUnit.HOURS); } @Override - public void addSubscription(TbSubscription subscription, TbCallback callback) { - log.trace("[{}][{}][{}] Registering subscription for entity [{}]", - subscription.getServiceId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, subscription.getTenantId(), subscription.getEntityId()); - if (currentPartitions.contains(tpi)) { - partitionedSubscriptions.computeIfAbsent(tpi, k -> ConcurrentHashMap.newKeySet()).add(subscription); + public void onSubEvent(String serviceId, TbEntitySubEvent event, TbCallback callback) { + var tenantId = event.getTenantId(); + var entityId = event.getEntityId(); + log.trace("[{}][{}][{}] Processing subscription event {}", tenantId, entityId, serviceId, event); + TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, tenantId, entityId); + if (tpi.isMyPartition()) { + subsLock.lock(); + try { + var entitySubs = entitySubscriptions.computeIfAbsent(entityId, id -> new TbEntityRemoteSubsInfo(tenantId, entityId)); + boolean empty = entitySubs.updateAndCheckIsEmpty(serviceId, event); + if (empty) { + entitySubscriptions.remove(entityId); + } + } finally { + subsLock.unlock(); + } callback.onSuccess(); + if (event.hasTsOrAttrSub()) { + sendSubEventCallback(serviceId, entityId, event.getSeqNumber()); + } } else { - log.warn("[{}][{}] Entity belongs to external partition. Probably rebalancing is in progress. Topic: {}" - , subscription.getTenantId(), subscription.getEntityId(), tpi.getFullTopicName()); + log.warn("[{}][{}][{}] Event belongs to external partition. Probably re-balancing is in progress. Topic: {}" + , tenantId, entityId, serviceId, tpi.getFullTopicName()); callback.onFailure(new RuntimeException("Entity belongs to external partition " + tpi.getFullTopicName() + "!")); } - boolean newSubscription = subscriptionsByEntityId - .computeIfAbsent(subscription.getEntityId(), k -> ConcurrentHashMap.newKeySet()).add(subscription); - subscriptionsByWsSessionId.computeIfAbsent(subscription.getSessionId(), k -> new ConcurrentHashMap<>()).put(subscription.getSubscriptionId(), subscription); - if (newSubscription) { - switch (subscription.getType()) { - case TIMESERIES: - handleNewTelemetrySubscription((TbTimeseriesSubscription) subscription); - break; - case ATTRIBUTES: - handleNewAttributeSubscription((TbAttributeSubscription) subscription); - break; - case ALARMS: - handleNewAlarmsSubscription((TbAlarmsSubscription) subscription); - break; - } - } } @Override - public void cancelSubscription(String sessionId, int subscriptionId, TbCallback callback) { - log.debug("[{}][{}] Going to remove subscription.", sessionId, subscriptionId); - Map sessionSubscriptions = subscriptionsByWsSessionId.get(sessionId); - if (sessionSubscriptions != null) { - TbSubscription subscription = sessionSubscriptions.remove(subscriptionId); - if (subscription != null) { - removeSubscriptionFromEntityMap(subscription); - removeSubscriptionFromPartitionMap(subscription); - if (sessionSubscriptions.isEmpty()) { - subscriptionsByWsSessionId.remove(sessionId); - } - } else { - log.debug("[{}][{}] Subscription not found!", sessionId, subscriptionId); + @EventListener(OtherServiceShutdownEvent.class) + public void onApplicationEvent(OtherServiceShutdownEvent event) { + if (event.getServiceTypes() != null && event.getServiceTypes().contains(ServiceType.TB_CORE)) { + subsLock.lock(); + try { + int sizeBeforeCleanup = entitySubscriptions.size(); + entitySubscriptions.entrySet().removeIf(kv -> kv.getValue().removeAndCheckIsEmpty(event.getServiceId())); + log.info("[{}][{}] Removed {} entity subscription records due to server shutdown.", serviceId, event.getServiceId(), entitySubscriptions.size() - sizeBeforeCleanup); + } finally { + subsLock.unlock(); } + } + } + + private void sendSubEventCallback(String targetId, EntityId entityId, int seqNumber) { + var update = getEntityUpdatesInfo(entityId); + if (serviceId.equals(targetId)) { + localSubscriptionService.onSubEventCallback(entityId, seqNumber, update, TbCallback.EMPTY); } else { - log.debug("[{}] No session subscriptions found!", sessionId); + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(entityId.getId(), seqNumber, update)); } - callback.onSuccess(); } @Override protected void onTbApplicationEvent(PartitionChangeEvent partitionChangeEvent) { if (ServiceType.TB_CORE.equals(partitionChangeEvent.getServiceType())) { - Set removedPartitions = new HashSet<>(currentPartitions); - removedPartitions.removeAll(partitionChangeEvent.getPartitions()); - - currentPartitions.clear(); - currentPartitions.addAll(partitionChangeEvent.getPartitions()); - - // We no longer manage current partition of devices; - removedPartitions.forEach(partition -> { - Set subs = partitionedSubscriptions.remove(partition); - if (subs != null) { - subs.forEach(sub -> { - if (!serviceId.equals(sub.getServiceId())) { - removeSubscriptionFromEntityMap(sub); - } - }); - } - }); + entitySubscriptions.values().removeIf(sub -> + !partitionService.resolve(ServiceType.TB_CORE, sub.getTenantId(), sub.getEntityId()).isMyPartition()); } } @Override public void onTimeSeriesUpdate(TenantId tenantId, EntityId entityId, List ts, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.TIMESERIES.equals(s.getType())) { - return (TbTimeseriesSubscription) s; - } else { - return null; - } - }, s -> true, s -> { - List subscriptionUpdate = null; - for (TsKvEntry kv : ts) { - if ((s.isAllKeys() || s.getKeyStates().containsKey((kv.getKey())))) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(kv); - } - } - return subscriptionUpdate; - }, true); + onTimeSeriesUpdate(entityId, ts); if (entityId.getEntityType() == EntityType.DEVICE) { updateDeviceInactivityTimeout(tenantId, entityId, ts); } @@ -224,168 +168,68 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } @Override - public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, TbCallback callback) { - onAttributesUpdate(tenantId, entityId, scope, attributes, true, callback); - } - - @Override - public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, boolean notifyDevice, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.ATTRIBUTES.equals(s.getType())) { - return (TbAttributeSubscription) s; - } else { - return null; - } - }, - s -> (TbAttributeSubscriptionScope.ANY_SCOPE.equals(s.getScope()) || scope.equals(s.getScope().name())), - s -> { - List subscriptionUpdate = null; - for (AttributeKvEntry kv : attributes) { - if (s.isAllKeys() || s.getKeyStates().containsKey(kv.getKey())) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(new BasicTsKvEntry(kv.getLastUpdateTs(), kv)); - } - } - return subscriptionUpdate; - }, true); + public void onTimeSeriesDelete(TenantId tenantId, EntityId entityId, List keys, TbCallback callback) { + onTimeSeriesUpdate(entityId, + keys.stream().map(key -> new BasicTsKvEntry(0, new StringDataEntry(key, ""))).collect(Collectors.toList())); if (entityId.getEntityType() == EntityType.DEVICE) { - if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope)) { - updateDeviceInactivityTimeout(tenantId, entityId, attributes); - } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope) && notifyDevice) { - clusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onUpdate(tenantId, - new DeviceId(entityId.getId()), DataConstants.SHARED_SCOPE, new ArrayList<>(attributes)) - , null); - } + deleteDeviceInactivityTimeout(tenantId, entityId, keys); } callback.onSuccess(); } - private void updateDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List kvEntries) { - for (KvEntry kvEntry : kvEntries) { - if (kvEntry.getKey().equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { - deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), getLongValue(kvEntry)); - } + public void onTimeSeriesUpdate(EntityId entityId, List update) { + getEntityUpdatesInfo(entityId).timeSeriesUpdateTs = System.currentTimeMillis(); + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + log.trace("[{}] Handling time-series update: {}", entityId, update); + subInfo.getSubs().forEach((serviceId, sub) -> { + if (sub.tsAllKeys) { + onTimeSeriesUpdate(serviceId, entityId, update); + } else if (sub.tsKeys != null) { + List tmp = getSubList(update, sub.tsKeys); + if (tmp != null) { + onTimeSeriesUpdate(serviceId, entityId, tmp); + } + } + }); + } else { + log.trace("[{}] No time-series subscriptions for entity.", entityId); } } - private void deleteDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List keys) { - for (String key : keys) { - if (key.equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { - deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), 0); - } + private void onTimeSeriesUpdate(String targetId, EntityId entityId, List update) { + if (serviceId.equals(targetId)) { + localSubscriptionService.onTimeSeriesUpdate(entityId, update, TbCallback.EMPTY); + } else { + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(true, entityId, update)); } } @Override - public void onAlarmUpdate(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { - onLocalAlarmSubUpdate(entityId, - s -> { - if (TbSubscriptionType.ALARMS.equals(s.getType())) { - return (TbAlarmsSubscription) s; - } else { - return null; - } - }, - s -> alarm.getCreatedTime() >= s.getTs() || alarm.getAssignTs() >= s.getTs(), - alarm, false - ); - callback.onSuccess(); - } - - @Override - public void onAlarmDeleted(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { - onLocalAlarmSubUpdate(entityId, - s -> { - if (TbSubscriptionType.ALARMS.equals(s.getType())) { - return (TbAlarmsSubscription) s; - } else { - return null; - } - }, - s -> alarm.getCreatedTime() >= s.getTs(), - alarm, true - ); - callback.onSuccess(); - } - - @Override - public void onNotificationUpdate(TenantId tenantId, UserId recipientId, NotificationUpdate notificationUpdate, TbCallback callback) { - Set subscriptions = subscriptionsByEntityId.get(recipientId); - if (subscriptions != null) { - NotificationsSubscriptionUpdate subscriptionUpdate = new NotificationsSubscriptionUpdate(notificationUpdate); - log.trace("Handling notificationUpdate for user {}: {}", recipientId, notificationUpdate); - subscriptions.stream() - .filter(subscription -> subscription.getType() == TbSubscriptionType.NOTIFICATIONS - || subscription.getType() == TbSubscriptionType.NOTIFICATIONS_COUNT) - .forEach(subscription -> onNotificationsSubUpdate(subscriptionUpdate, subscription)); - } - callback.onSuccess(); + public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, TbCallback callback) { + onAttributesUpdate(tenantId, entityId, scope, attributes, true, callback); } @Override - public void onNotificationRequestUpdate(TenantId tenantId, NotificationRequestUpdate notificationRequestUpdate, TbCallback callback) { - NotificationsSubscriptionUpdate subscriptionUpdate = new NotificationsSubscriptionUpdate(notificationRequestUpdate); - subscriptionsByEntityId.forEach((entityId, subscriptions) -> { - if (entityId.getEntityType() != EntityType.USER) { - return; + public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, boolean notifyDevice, TbCallback callback) { + getEntityUpdatesInfo(entityId).attributesUpdateTs = System.currentTimeMillis(); + processAttributesUpdate(entityId, attributes); + if (entityId.getEntityType() == EntityType.DEVICE) { + if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope)) { + updateDeviceInactivityTimeout(tenantId, entityId, attributes); + } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope) && notifyDevice) { + clusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onUpdate(tenantId, + new DeviceId(entityId.getId()), DataConstants.SHARED_SCOPE, new ArrayList<>(attributes)) + , null); } - log.trace("Handling notificationRequestUpdate for user {}: {}", entityId, notificationRequestUpdate); - subscriptions.forEach(subscription -> { - if (subscription.getType() != TbSubscriptionType.NOTIFICATIONS && - subscription.getType() != TbSubscriptionType.NOTIFICATIONS_COUNT) { - return; - } - if (!subscription.getTenantId().equals(tenantId)) { - return; - } - onNotificationsSubUpdate(subscriptionUpdate, subscription); - }); - }); - callback.onSuccess(); - } - - private void onNotificationsSubUpdate(NotificationsSubscriptionUpdate subscriptionUpdate, TbSubscription subscription) { - if (serviceId.equals(subscription.getServiceId())) { - log.trace("[{}][{}][{}] Subscription session is managed by current service, forwarding to localSubscriptionService (update: {})", - subscription.getServiceId(), subscription.getEntityId(), subscription.getSessionId(), subscriptionUpdate); - localSubscriptionService.onSubscriptionUpdate(subscription.getSessionId(), - subscription.getSubscriptionId(), subscriptionUpdate, TbCallback.EMPTY); - } else { - log.trace("[{}][{}][{}] Subscription session is not managed by current service (update: {})", - subscription.getServiceId(), subscription.getEntityId(), subscription.getSessionId(), subscriptionUpdate); - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - ToCoreNotificationMsg updateProto = TbSubscriptionUtils.notificationsSubUpdateToProto(subscription, subscriptionUpdate); - TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(subscription.getEntityId().getId(), updateProto); - toCoreNotificationsProducer.send(tpi, queueMsg, null); } + callback.onSuccess(); } @Override public void onAttributesDelete(TenantId tenantId, EntityId entityId, String scope, List keys, boolean notifyDevice, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.ATTRIBUTES.equals(s.getType())) { - return (TbAttributeSubscription) s; - } else { - return null; - } - }, - s -> (TbAttributeSubscriptionScope.ANY_SCOPE.equals(s.getScope()) || scope.equals(s.getScope().name())), - s -> { - List subscriptionUpdate = null; - for (String key : keys) { - if (s.isAllKeys() || s.getKeyStates().containsKey(key)) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(new BasicTsKvEntry(0, new StringDataEntry(key, ""))); - } - } - return subscriptionUpdate; - }, false); + processAttributesUpdate(entityId, + keys.stream().map(key -> new BaseAttributeKvEntry(0, new StringDataEntry(key, ""))).collect(Collectors.toList())); if (entityId.getEntityType() == EntityType.DEVICE) { if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope) || TbAttributeSubscriptionScope.ANY_SCOPE.name().equalsIgnoreCase(scope)) { @@ -398,222 +242,117 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene callback.onSuccess(); } - @Override - public void onTimeSeriesDelete(TenantId tenantId, EntityId entityId, List keys, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.TIMESERIES.equals(s.getType())) { - return (TbTimeseriesSubscription) s; - } else { - return null; - } - }, s -> true, s -> { - List subscriptionUpdate = null; - for (String key : keys) { - if (s.isAllKeys() || s.getKeyStates().containsKey(key)) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(new BasicTsKvEntry(0, new StringDataEntry(key, ""))); - } - } - return subscriptionUpdate; - }, false); - if (entityId.getEntityType() == EntityType.DEVICE) { - deleteDeviceInactivityTimeout(tenantId, entityId, keys); - } - callback.onSuccess(); - } - - private void onLocalTelemetrySubUpdate(EntityId entityId, - Function castFunction, - Predicate filterFunction, - Function> processFunction, - boolean ignoreEmptyUpdates) { - Set entitySubscriptions = subscriptionsByEntityId.get(entityId); - if (entitySubscriptions != null) { - entitySubscriptions.stream().map(castFunction).filter(Objects::nonNull).filter(filterFunction).forEach(s -> { - List subscriptionUpdate = processFunction.apply(s); - if (subscriptionUpdate != null && !subscriptionUpdate.isEmpty()) { - if (serviceId.equals(s.getServiceId())) { - TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(s.getSubscriptionId(), subscriptionUpdate); - localSubscriptionService.onSubscriptionUpdate(s.getSessionId(), update, TbCallback.EMPTY); - } else { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(s, subscriptionUpdate, ignoreEmptyUpdates), null); + public void processAttributesUpdate(EntityId entityId, List update) { + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + log.trace("[{}] Handling attributes update: {}", entityId, update); + subInfo.getSubs().forEach((serviceId, sub) -> { + if (sub.attrAllKeys) { + processAttributesUpdate(serviceId, entityId, update); + } else if (sub.attrKeys != null) { + List tmp = getSubList(update, sub.attrKeys); + if (tmp != null) { + processAttributesUpdate(serviceId, entityId, tmp); } } }); } else { - log.debug("[{}] No device subscriptions to process!", entityId); + log.trace("[{}] No attributes subscriptions for entity.", entityId); } } - private void onLocalAlarmSubUpdate(EntityId entityId, - Function castFunction, - Predicate filterFunction, - AlarmInfo alarm, boolean deleted) { - Set entitySubscriptions = subscriptionsByEntityId.get(entityId); - if (alarm == null) { - log.warn("[{}] empty alarm update!", entityId); - return; - } - if (entitySubscriptions != null) { - entitySubscriptions.stream().map(castFunction).filter(Objects::nonNull).filter(filterFunction).forEach(s -> { - if (serviceId.equals(s.getServiceId())) { - AlarmSubscriptionUpdate update = new AlarmSubscriptionUpdate(s.getSubscriptionId(), alarm, deleted); - localSubscriptionService.onSubscriptionUpdate(s.getSessionId(), update, TbCallback.EMPTY); - } else { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(s, alarm, deleted), null); - } - }); + private void processAttributesUpdate(String targetId, EntityId entityId, List update) { + List tsKvEntryList = update.stream().map(attr -> new BasicTsKvEntry(attr.getLastUpdateTs(), attr)).collect(Collectors.toList()); + if (serviceId.equals(targetId)) { + localSubscriptionService.onAttributesUpdate(entityId, tsKvEntryList, TbCallback.EMPTY); } else { - log.debug("[{}] No device subscriptions to process!", entityId); + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(false, entityId, tsKvEntryList)); } } - private void removeSubscriptionFromEntityMap(TbSubscription sub) { - Set entitySubSet = subscriptionsByEntityId.get(sub.getEntityId()); - if (entitySubSet != null) { - entitySubSet.remove(sub); - if (entitySubSet.isEmpty()) { - subscriptionsByEntityId.remove(sub.getEntityId()); + private void updateDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List kvEntries) { + for (KvEntry kvEntry : kvEntries) { + if (kvEntry.getKey().equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { + deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), getLongValue(kvEntry)); } } } - private void removeSubscriptionFromPartitionMap(TbSubscription sub) { - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, sub.getTenantId(), sub.getEntityId()); - Set subs = partitionedSubscriptions.get(tpi); - if (subs != null) { - subs.remove(sub); + private void deleteDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List keys) { + for (String key : keys) { + if (key.equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { + deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), 0); + } } } - private void handleNewAttributeSubscription(TbAttributeSubscription subscription) { - log.trace("[{}][{}][{}] Processing remote attribute subscription for entity [{}]", - serviceId, subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - - final Map keyStates = subscription.getKeyStates(); - DonAsynchron.withCallback(attrService.find(subscription.getTenantId(), subscription.getEntityId(), DataConstants.CLIENT_SCOPE, keyStates.keySet()), values -> { - List missedUpdates = new ArrayList<>(); - values.forEach(latestEntry -> { - if (latestEntry.getLastUpdateTs() > keyStates.get(latestEntry.getKey())) { - missedUpdates.add(new BasicTsKvEntry(latestEntry.getLastUpdateTs(), latestEntry)); - } - }); - if (!missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); - } - }, - e -> log.error("Failed to fetch missed updates.", e), tsCallBackExecutor); + @Override + public void onAlarmUpdate(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { + onAlarmSubUpdate(tenantId, entityId, alarm, false, callback); } - private void handleNewAlarmsSubscription(TbAlarmsSubscription subscription) { - log.trace("[{}][{}][{}] Processing remote alarm subscription for entity [{}]", - serviceId, subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - //TODO: @dlandiak search all new alarms for this entity. + @Override + public void onAlarmDeleted(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { + onAlarmSubUpdate(tenantId, entityId, alarm, true, callback); } - private void handleNewTelemetrySubscription(TbTimeseriesSubscription subscription) { - log.trace("[{}][{}][{}] Processing remote telemetry subscription for entity [{}]", - serviceId, subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - - long curTs = System.currentTimeMillis(); - - if (subscription.isLatestValues()) { - DonAsynchron.withCallback(tsService.findLatest(subscription.getTenantId(), subscription.getEntityId(), subscription.getKeyStates().keySet()), - missedUpdates -> { - if (missedUpdates != null && !missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); - } - }, - e -> log.error("Failed to fetch missed updates.", e), - tsCallBackExecutor); - } else { - List queries = new ArrayList<>(); - subscription.getKeyStates().forEach((key, value) -> { - if (curTs > value) { - long startTs = subscription.getStartTime() > 0 ? Math.max(subscription.getStartTime(), value + 1L) : (value + 1L); - long endTs = subscription.getEndTime() > 0 ? Math.min(subscription.getEndTime(), curTs) : curTs; - queries.add(new BaseReadTsKvQuery(key, startTs, endTs, 0, 1000, Aggregation.NONE)); + private void onAlarmSubUpdate(TenantId tenantId, EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback) { + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + log.trace("[{}][{}] Handling alarm update {}: {}", tenantId, entityId, alarm, deleted); + for (Map.Entry entry : subInfo.getSubs().entrySet()) { + if (entry.getValue().notifications) { + onAlarmSubUpdate(entry.getKey(), entityId, alarm, deleted); } - }); - if (!queries.isEmpty()) { - DonAsynchron.withCallback(tsService.findAll(subscription.getTenantId(), subscription.getEntityId(), queries), - missedUpdates -> { - if (missedUpdates != null && !missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); - } - }, - e -> log.error("Failed to fetch missed updates.", e), - tsCallBackExecutor); } } + callback.onSuccess(); } - private TbProtoQueueMsg toProto(TbSubscription subscription, List updates) { - return toProto(subscription, updates, true); + private void onAlarmSubUpdate(String targetServiceId, EntityId entityId, AlarmInfo alarm, boolean deleted) { + if (alarm == null) { + log.warn("[{}] empty alarm update!", entityId); + return; + } + if (serviceId.equals(targetServiceId)) { + log.trace("[{}] Forwarding to local service: {} deleted: {}", entityId, alarm, deleted); + localSubscriptionService.onAlarmUpdate(entityId, alarm, deleted, TbCallback.EMPTY); + } else { + sendCoreNotification(targetServiceId, entityId, + TbSubscriptionUtils.toAlarmSubUpdateToProto(entityId, alarm, deleted)); + } } - private TbProtoQueueMsg toProto(TbSubscription subscription, List updates, boolean ignoreEmptyUpdates) { - TbSubscriptionUpdateProto.Builder builder = TbSubscriptionUpdateProto.newBuilder(); - - builder.setSessionId(subscription.getSessionId()); - builder.setSubscriptionId(subscription.getSubscriptionId()); - - Map> data = new TreeMap<>(); - for (TsKvEntry tsEntry : updates) { - List values = data.computeIfAbsent(tsEntry.getKey(), k -> new ArrayList<>()); - Object[] value = new Object[2]; - value[0] = tsEntry.getTs(); - value[1] = tsEntry.getValueAsString(); - values.add(value); - } + private void sendCoreNotification(String targetServiceId, EntityId entityId, ToCoreNotificationMsg msg) { + log.trace("[{}] Forwarding to remote service [{}]: {}", entityId, targetServiceId, msg); + TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, targetServiceId); + TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(entityId.getId(), msg); + toCoreNotificationsProducer.send(tpi, queueMsg, null); + } - data.forEach((key, value) -> { - TbSubscriptionUpdateValueListProto.Builder dataBuilder = TbSubscriptionUpdateValueListProto.newBuilder(); - dataBuilder.setKey(key); - boolean hasData = false; - for (Object v : value) { - Object[] array = (Object[]) v; - TbSubscriptionUpdateTsValue.Builder tsValueBuilder = TbSubscriptionUpdateTsValue.newBuilder(); - tsValueBuilder.setTs((long) array[0]); - String strVal = (String) array[1]; - if (strVal != null) { - hasData = true; - tsValueBuilder.setValue(strVal); + @Override + public void onNotificationUpdate(TenantId tenantId, UserId entityId, NotificationUpdate notificationUpdate, TbCallback callback) { + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + NotificationsSubscriptionUpdate subscriptionUpdate = new NotificationsSubscriptionUpdate(notificationUpdate); + log.trace("[{}][{}] Handling notificationUpdate for user {}", tenantId, entityId, notificationUpdate); + for (Map.Entry entry : subInfo.getSubs().entrySet()) { + if (entry.getValue().notifications) { + onNotificationsSubUpdate(entry.getKey(), entityId, subscriptionUpdate); } - dataBuilder.addTsValue(tsValueBuilder.build()); - } - if (!ignoreEmptyUpdates || hasData) { - builder.addData(dataBuilder.build()); } - }); - - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg( - LocalSubscriptionServiceMsgProto.newBuilder().setSubUpdate(builder.build()).build()) - .build(); - return new TbProtoQueueMsg<>(subscription.getEntityId().getId(), toCoreMsg); + } + callback.onSuccess(); } - private TbProtoQueueMsg toProto(TbSubscription subscription, AlarmInfo alarm, boolean deleted) { - TbAlarmSubscriptionUpdateProto.Builder builder = TbAlarmSubscriptionUpdateProto.newBuilder(); - - builder.setSessionId(subscription.getSessionId()); - builder.setSubscriptionId(subscription.getSubscriptionId()); - builder.setAlarm(JacksonUtil.toString(alarm)); - builder.setDeleted(deleted); - - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg( - LocalSubscriptionServiceMsgProto.newBuilder() - .setAlarmSubUpdate(builder.build()).build()) - .build(); - return new TbProtoQueueMsg<>(subscription.getEntityId().getId(), toCoreMsg); + private void onNotificationsSubUpdate(String targetServiceId, EntityId entityId, NotificationsSubscriptionUpdate subscriptionUpdate) { + if (serviceId.equals(targetServiceId)) { + log.trace("[{}] Forwarding to local service: {}", entityId, subscriptionUpdate); + localSubscriptionService.onNotificationUpdate(entityId, subscriptionUpdate, TbCallback.EMPTY); + } else { + sendCoreNotification(targetServiceId, entityId, + TbSubscriptionUtils.notificationsSubUpdateToProto(entityId, subscriptionUpdate)); + } } private static long getLongValue(KvEntry kve) { @@ -639,4 +378,31 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } } + private static List getSubList(List ts, Set keys) { + List update = null; + for (T entry : ts) { + if (keys.contains(entry.getKey())) { + if (update == null) { + update = new ArrayList<>(ts.size()); + } + update.add(entry); + } + } + return update; + } + + private TbEntityUpdatesInfo getEntityUpdatesInfo(EntityId entityId) { + return entityUpdates.computeIfAbsent(entityId, id -> new TbEntityUpdatesInfo(initTs)); + } + + private void cleanupEntityUpdates() { + initTs = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1); + int sizeBeforeCleanup = entityUpdates.size(); + entityUpdates.entrySet().removeIf(kv -> { + var v = kv.getValue(); + return initTs > v.attributesUpdateTs && initTs > v.timeSeriesUpdateTs; + }); + log.info("Removed {} old entity update records.", entityUpdates.size() - sizeBeforeCleanup); + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java index 4b37ba26b5..b45450cec8 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java @@ -641,7 +641,7 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc private void handleLatestCmd(TbEntityDataSubCtx ctx, LatestValueCmd latestCmd) { log.trace("[{}][{}] Going to process latest command: {}", ctx.getSessionId(), ctx.getCmdId(), latestCmd); - //Fetch the latest values for telemetry keys (in case they are not copied from NoSQL to SQL DB in hybrid mode. + //Fetch the latest values for telemetry keys in case they are not copied from NoSQL to SQL DB in hybrid mode. if (!tsInSqlDB) { log.trace("[{}][{}] Going to fetch missing latest values: {}", ctx.getSessionId(), ctx.getCmdId(), latestCmd); List allTsKeys = latestCmd.getKeys().stream() diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java index 64f1de8662..f15a25fe4d 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java @@ -16,85 +16,97 @@ package org.thingsboard.server.service.subscription; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; +import org.thingsboard.common.util.DonAsynchron; import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.cluster.TbClusterService; +import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.alarm.AlarmInfo; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.kv.Aggregation; +import org.thingsboard.server.common.data.kv.BaseReadTsKvQuery; +import org.thingsboard.server.common.data.kv.BasicTsKvEntry; +import org.thingsboard.server.common.data.kv.ReadTsKvQuery; +import org.thingsboard.server.common.data.kv.TsKvEntry; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; +import org.thingsboard.server.dao.attributes.AttributesService; +import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.discovery.PartitionService; -import org.thingsboard.server.queue.discovery.TbApplicationEventListener; +import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.discovery.event.ClusterTopologyChangeEvent; -import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.queue.util.TbCoreComponent; +import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import java.util.Collections; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; @Slf4j @TbCoreComponent @Service public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionService { - private final Set currentPartitions = ConcurrentHashMap.newKeySet(); - private final Map> subscriptionsBySessionId = new ConcurrentHashMap<>(); + private final ConcurrentMap>> subscriptionsBySessionId = new ConcurrentHashMap<>(); + private final ConcurrentMap subscriptionsByEntityId = new ConcurrentHashMap<>(); + private final ConcurrentMap entityUpdates = new ConcurrentHashMap<>(); - @Autowired - private PartitionService partitionService; + private final AttributesService attrService; + private final TimeseriesService tsService; + private final TbServiceInfoProvider serviceInfoProvider; + private final PartitionService partitionService; + private final TbClusterService clusterService; + private final SubscriptionManagerService subscriptionManagerService; - @Autowired - private TbClusterService clusterService; + private ExecutorService tsCallBackExecutor; - @Autowired - @Lazy - private SubscriptionManagerService subscriptionManagerService; + public DefaultTbLocalSubscriptionService(AttributesService attrService, TimeseriesService tsService, TbServiceInfoProvider serviceInfoProvider, + PartitionService partitionService, TbClusterService clusterService, + @Lazy SubscriptionManagerService subscriptionManagerService) { + this.attrService = attrService; + this.tsService = tsService; + this.serviceInfoProvider = serviceInfoProvider; + this.partitionService = partitionService; + this.clusterService = clusterService; + this.subscriptionManagerService = subscriptionManagerService; + } + private String serviceId; private ExecutorService subscriptionUpdateExecutor; - private TbApplicationEventListener partitionChangeListener = new TbApplicationEventListener<>() { - @Override - protected void onTbApplicationEvent(PartitionChangeEvent event) { - if (ServiceType.TB_CORE.equals(event.getServiceType())) { - currentPartitions.clear(); - currentPartitions.addAll(event.getPartitions()); - } - } - }; - - private TbApplicationEventListener clusterTopologyChangeListener = new TbApplicationEventListener<>() { - @Override - protected void onTbApplicationEvent(ClusterTopologyChangeEvent event) { - if (event.getQueueKeys().stream().anyMatch(key -> ServiceType.TB_CORE.equals(key.getType()))) { - /* - * If the cluster topology has changed, we need to push all current subscriptions to SubscriptionManagerService again. - * Otherwise, the SubscriptionManagerService may "forget" those subscriptions in case of restart. - * Although this is resource consuming operation, it is cheaper than sending ping/pong commands periodically - * It is also cheaper then caching the subscriptions by entity id and then lookup of those caches every time we have new telemetry in SubscriptionManagerService. - * Even if we cache locally the list of active subscriptions by entity id, it is still time consuming operation to get them from cache - * Since number of subscriptions is usually much less then number of devices that are pushing data. - */ - subscriptionsBySessionId.values().forEach(map -> map.values() - .forEach(sub -> pushSubscriptionToManagerService(sub, true))); - } - } - }; + private final Lock subsLock = new ReentrantLock(); @PostConstruct public void initExecutor() { subscriptionUpdateExecutor = ThingsBoardExecutors.newWorkStealingPool(20, getClass()); + tsCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("ts-sub-callback")); + serviceId = serviceInfoProvider.getServiceId(); } @PreDestroy @@ -102,79 +114,78 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer if (subscriptionUpdateExecutor != null) { subscriptionUpdateExecutor.shutdownNow(); } - } - - @Override - @EventListener(PartitionChangeEvent.class) - public void onApplicationEvent(PartitionChangeEvent event) { - partitionChangeListener.onApplicationEvent(event); + if (tsCallBackExecutor != null) { + tsCallBackExecutor.shutdownNow(); + } } @Override @EventListener(ClusterTopologyChangeEvent.class) public void onApplicationEvent(ClusterTopologyChangeEvent event) { - clusterTopologyChangeListener.onApplicationEvent(event); + if (event.getQueueKeys().stream().anyMatch(key -> ServiceType.TB_CORE.equals(key.getType()))) { + /* + * If the cluster topology has changed, we need to push all current subscriptions to SubscriptionManagerService again. + * Otherwise, the SubscriptionManagerService may "forget" those subscriptions in case of restart. + * Although this is resource consuming operation, it is cheaper than sending ping/pong commands periodically + * It is also cheaper than caching the subscriptions by entity id and then lookup of those caches every time we have new telemetry in SubscriptionManagerService. + * Even if we cache locally the list of active subscriptions by entity id, it is still time-consuming operation to get them from cache + * Since number of subscriptions is usually much less than number of devices that are pushing data. + */ + subscriptionsByEntityId.values().forEach(sub -> pushSubEventToManagerService(sub.getTenantId(), sub.getEntityId(), sub.toEvent(ComponentLifecycleEvent.UPDATED))); + } } - //TODO 3.1: replace null callbacks with callbacks from websocket service. @Override - public void addSubscription(TbSubscription subscription) { - pushSubscriptionToManagerService(subscription, true); - registerSubscription(subscription); + public void onCoreStartupMsg(TransportProtos.CoreStartupMsg coreStartupMsg) { + subscriptionUpdateExecutor.submit(() -> { + Set partitions = new HashSet<>(coreStartupMsg.getPartitionsList()); + AtomicInteger counter = new AtomicInteger(); + subscriptionsByEntityId.values().forEach(sub -> { + var tpi = partitionService.resolve(ServiceType.TB_CORE, sub.getTenantId(), sub.getEntityId()); + if (!tpi.isMyPartition() && partitions.contains(tpi.getPartition().orElse(Integer.MAX_VALUE))) { + pushToQueue(sub.getEntityId(), sub.toEvent(ComponentLifecycleEvent.UPDATED), tpi); + counter.incrementAndGet(); + } + }); + log.info("[{}] Pushed {} subscriptions to [{}]", serviceId, counter.get(), coreStartupMsg.getServiceId()); + }); } - private void pushSubscriptionToManagerService(TbSubscription subscription, boolean pushToLocalService) { - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, subscription.getTenantId(), subscription.getEntityId()); - if (currentPartitions.contains(tpi)) { - // Subscription is managed on the same server; - if (pushToLocalService) { - subscriptionManagerService.addSubscription(subscription, TbCallback.EMPTY); - } - } else { - // Push to the queue; - TransportProtos.ToCoreMsg toCoreMsg = TbSubscriptionUtils.toNewSubscriptionProto(subscription); - clusterService.pushMsgToCore(tpi, subscription.getEntityId().getId(), toCoreMsg, null); - } + @Override + public void addSubscription(TbSubscription subscription) { + TenantId tenantId = subscription.getTenantId(); + EntityId entityId = subscription.getEntityId(); + log.debug("[{}][{}] Register subscription: {}", tenantId, entityId, subscription); + Map> sessionSubscriptions = subscriptionsBySessionId.computeIfAbsent(subscription.getSessionId(), k -> new ConcurrentHashMap<>()); + sessionSubscriptions.put(subscription.getSubscriptionId(), subscription); + modifySubscription(tenantId, entityId, subscription, true); } @Override - @SuppressWarnings("unchecked") - public void onSubscriptionUpdate(String sessionId, TelemetrySubscriptionUpdate update, TbCallback callback) { - TbSubscription subscription = subscriptionsBySessionId - .getOrDefault(sessionId, Collections.emptyMap()).get(update.getSubscriptionId()); - if (subscription != null) { - switch (subscription.getType()) { - case TIMESERIES: - TbTimeseriesSubscription tsSub = (TbTimeseriesSubscription) subscription; - update.getLatestValues().forEach((key, value) -> tsSub.getKeyStates().put(key, value)); - break; - case ATTRIBUTES: - TbAttributeSubscription attrSub = (TbAttributeSubscription) subscription; - update.getLatestValues().forEach((key, value) -> attrSub.getKeyStates().put(key, value)); - break; - } - subscriptionUpdateExecutor.submit(() -> subscription.getUpdateProcessor().accept(subscription, update)); - } - callback.onSuccess(); + public void onSubEventCallback(TransportProtos.TbEntitySubEventCallbackProto subEventCallback, TbCallback callback) { + UUID entityId = new UUID(subEventCallback.getEntityIdMSB(), subEventCallback.getEntityIdLSB()); + onSubEventCallback(entityId, subEventCallback.getSeqNumber(), new TbEntityUpdatesInfo(subEventCallback.getAttributesUpdateTs(), subEventCallback.getTimeSeriesUpdateTs()), callback); } @Override - @SuppressWarnings("unchecked") - public void onSubscriptionUpdate(String sessionId, AlarmSubscriptionUpdate update, TbCallback callback) { - TbSubscription subscription = subscriptionsBySessionId - .getOrDefault(sessionId, Collections.emptyMap()).get(update.getSubscriptionId()); - if (subscription != null && subscription.getType() == TbSubscriptionType.ALARMS) { - subscriptionUpdateExecutor.submit(() -> subscription.getUpdateProcessor().accept(subscription, update)); - } - callback.onSuccess(); + public void onSubEventCallback(EntityId entityId, int seqNumber, TbEntityUpdatesInfo entityUpdatesInfo, TbCallback callback) { + onSubEventCallback(entityId.getId(), seqNumber, entityUpdatesInfo, callback); } - @Override - public void onSubscriptionUpdate(String sessionId, int subscriptionId, NotificationsSubscriptionUpdate update, TbCallback callback) { - TbSubscription subscription = subscriptionsBySessionId.getOrDefault(sessionId, Collections.emptyMap()).get(subscriptionId); - if (subscription != null && (subscription.getType() == TbSubscriptionType.NOTIFICATIONS - || subscription.getType() == TbSubscriptionType.NOTIFICATIONS_COUNT)) { - subscriptionUpdateExecutor.submit(() -> subscription.getUpdateProcessor().accept(subscription, update)); + public void onSubEventCallback(UUID entityId, int seqNumber, TbEntityUpdatesInfo entityUpdatesInfo, TbCallback callback) { + entityUpdates.put(entityId, entityUpdatesInfo); + Set> pendingSubs = null; + subsLock.lock(); + try { + TbEntityLocalSubsInfo entitySubs = subscriptionsByEntityId.get(entityId); + if (entitySubs != null) { + pendingSubs = entitySubs.clearPendingSubscriptions(seqNumber); + } + } finally { + subsLock.unlock(); + } + if (pendingSubs != null) { + pendingSubs.forEach(this::checkMissedUpdates); } callback.onSuccess(); } @@ -182,22 +193,14 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer @Override public void cancelSubscription(String sessionId, int subscriptionId) { log.debug("[{}][{}] Going to remove subscription.", sessionId, subscriptionId); - Map sessionSubscriptions = subscriptionsBySessionId.get(sessionId); + Map> sessionSubscriptions = subscriptionsBySessionId.get(sessionId); if (sessionSubscriptions != null) { - TbSubscription subscription = sessionSubscriptions.remove(subscriptionId); + TbSubscription subscription = sessionSubscriptions.remove(subscriptionId); if (subscription != null) { if (sessionSubscriptions.isEmpty()) { subscriptionsBySessionId.remove(sessionId); } - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, subscription.getTenantId(), subscription.getEntityId()); - if (currentPartitions.contains(tpi)) { - // Subscription is managed on the same server; - subscriptionManagerService.cancelSubscription(sessionId, subscriptionId, TbCallback.EMPTY); - } else { - // Push to the queue; - TransportProtos.ToCoreMsg toCoreMsg = TbSubscriptionUtils.toCloseSubscriptionProto(subscription); - clusterService.pushMsgToCore(tpi, subscription.getEntityId().getId(), toCoreMsg, null); - } + modifySubscription(subscription.getTenantId(), subscription.getEntityId(), subscription, false); } else { log.debug("[{}][{}] Subscription not found!", sessionId, subscriptionId); } @@ -208,16 +211,301 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer @Override public void cancelAllSessionSubscriptions(String sessionId) { - Map subscriptions = subscriptionsBySessionId.get(sessionId); - if (subscriptions != null) { - Set toRemove = new HashSet<>(subscriptions.keySet()); - toRemove.forEach(id -> cancelSubscription(sessionId, id)); + log.debug("[{}] Going to remove session subscriptions.", sessionId); + Map> sessionSubscriptions = subscriptionsBySessionId.remove(sessionId); + if (sessionSubscriptions != null) { + for (TbSubscription subscription : sessionSubscriptions.values()) { + modifySubscription(subscription.getTenantId(), subscription.getEntityId(), subscription, false); + } + } else { + log.debug("[{}] No session subscriptions found!", sessionId); } } - private void registerSubscription(TbSubscription subscription) { - Map sessionSubscriptions = subscriptionsBySessionId.computeIfAbsent(subscription.getSessionId(), k -> new ConcurrentHashMap<>()); - sessionSubscriptions.put(subscription.getSubscriptionId(), subscription); + @Override + public void onTimeSeriesUpdate(TransportProtos.TbSubUpdateProto proto, TbCallback callback) { + //TODO: optimize to avoid re-wrapping from TsValueListProto -> List -> Map>. Low priority. + onTimeSeriesUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onTimeSeriesUpdate(EntityId entityId, List data, TbCallback callback) { + onTimeSeriesUpdate(entityId.getId(), data, callback); + } + + private void onTimeSeriesUpdate(UUID entityId, List data, TbCallback callback) { + entityUpdates.get(entityId).timeSeriesUpdateTs = System.currentTimeMillis(); + processSubscriptionData(entityId, + sub -> TbSubscriptionType.TIMESERIES.equals(sub.getType()), + s -> { + TbTimeSeriesSubscription sub = (TbTimeSeriesSubscription) s; + List updateData = null; + if (sub.isAllKeys()) { + updateData = data; + } else { + for (TsKvEntry kv : data) { + if (sub.getKeyStates().containsKey((kv.getKey()))) { + if (updateData == null) { + updateData = new ArrayList<>(); + } + updateData.add(kv); + } + } + } + if (updateData != null) { + TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(sub.getSubscriptionId(), updateData); + update.getLatestValues().forEach((key, value) -> sub.getKeyStates().put(key, value)); + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, update)); + } + }, callback); + } + + @Override + public void onAttributesUpdate(TransportProtos.TbSubUpdateProto proto, TbCallback callback) { + onAttributesUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onAttributesUpdate(EntityId entityId, List data, TbCallback callback) { + onAttributesUpdate(entityId.getId(), data, callback); + } + + private void onAttributesUpdate(UUID entityId, List data, TbCallback callback) { + entityUpdates.get(entityId).attributesUpdateTs = System.currentTimeMillis(); + processSubscriptionData(entityId, + sub -> TbSubscriptionType.ATTRIBUTES.equals(sub.getType()), + s -> { + TbAttributeSubscription sub = (TbAttributeSubscription) s; + List updateData = null; + if (sub.isAllKeys()) { + updateData = data; + } else { + for (TsKvEntry kv : data) { + if (sub.getKeyStates().containsKey((kv.getKey()))) { + if (updateData == null) { + updateData = new ArrayList<>(); + } + updateData.add(kv); + } + } + } + if (updateData != null) { + TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(sub.getSubscriptionId(), updateData); + update.getLatestValues().forEach((key, value) -> sub.getKeyStates().put(key, value)); + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, update)); + } + }, callback); + } + + @Override + public void onAlarmUpdate(TransportProtos.TbAlarmSubUpdateProto proto, TbCallback callback) { + onAlarmUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onAlarmUpdate(EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback) { + onAlarmUpdate(entityId.getId(), new AlarmSubscriptionUpdate(alarm, deleted), callback); + } + + private void onAlarmUpdate(UUID entityId, AlarmSubscriptionUpdate update, TbCallback callback) { + processSubscriptionData(entityId, + sub -> TbSubscriptionType.ALARMS.equals(sub.getType()), + update, callback); + } + + @Override + public void onNotificationUpdate(TransportProtos.NotificationsSubUpdateProto proto, TbCallback callback) { + onNotificationUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onNotificationUpdate(EntityId entityId, NotificationsSubscriptionUpdate update, TbCallback callback) { + onNotificationUpdate(entityId.getId(), update, callback); + } + + private void onNotificationUpdate(UUID entityId, NotificationsSubscriptionUpdate update, TbCallback callback) { + processSubscriptionData(entityId, + sub -> TbSubscriptionType.NOTIFICATIONS.equals(sub.getType()) || TbSubscriptionType.NOTIFICATIONS_COUNT.equals(sub.getType()), + update, callback); + } + + @Override + @SuppressWarnings("unchecked") + public void onNotificationRequestUpdate(TenantId tenantId, NotificationRequestUpdate update, TbCallback callback) { + log.trace("[{}] Received notification request update: {}", tenantId, update); + NotificationsSubscriptionUpdate theUpdate = new NotificationsSubscriptionUpdate(update); + subscriptionsByEntityId.values().forEach(subInfo -> { + if (subInfo.isNf() && tenantId.equals(subInfo.getTenantId()) && EntityType.USER.equals(subInfo.getEntityId().getEntityType())) { + subInfo.getSubs().forEach(s -> { + TbSubscription sub = (TbSubscription) s; + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, theUpdate)); + }); + } + }); + callback.onSuccess(); + } + + @SuppressWarnings("unchecked") + private void processSubscriptionData(UUID entityId, + Predicate> filter, + T data, + TbCallback callback) { + log.trace("[{}] Received subscription data: {}", entityId, data); + var subs = subscriptionsByEntityId.get(entityId); + if (subs != null) { + subs.getSubs().forEach(s -> { + if (filter.test(s)) { + subscriptionUpdateExecutor.submit(() -> { + TbSubscription sub = (TbSubscription) s; + sub.getUpdateProcessor().accept(sub, data); + }); + } + }); + } + callback.onSuccess(); + } + + private void processSubscriptionData(UUID entityId, + Predicate> filter, + Consumer> processor, + TbCallback callback) { + var subs = subscriptionsByEntityId.get(entityId); + if (subs != null) { + subs.getSubs().forEach(s -> { + if (filter.test(s)) { + processor.accept(s); + } + }); + } + callback.onSuccess(); + } + + private void modifySubscription(TenantId tenantId, EntityId entityId, TbSubscription subscription, boolean add) { + TbSubscription missedUpdatesCandidate = null; + TbEntitySubEvent event; + subsLock.lock(); + try { + TbEntityLocalSubsInfo entitySubs = subscriptionsByEntityId.computeIfAbsent(entityId.getId(), id -> new TbEntityLocalSubsInfo(tenantId, entityId)); + event = add ? entitySubs.add(subscription) : entitySubs.remove(subscription); + if (entitySubs.isEmpty()) { + subscriptionsByEntityId.remove(entityId.getId()); + entityUpdates.remove(entityId.getId()); + } else if (add) { + missedUpdatesCandidate = entitySubs.registerPendingSubscription(subscription, event); + } + } finally { + subsLock.unlock(); + } + if (event != null) { + log.trace("[{}][{}][{}] Event: {}", tenantId, entityId, subscription.getSubscriptionId(), event); + pushSubEventToManagerService(tenantId, entityId, event); + if (missedUpdatesCandidate != null) { + checkMissedUpdates(missedUpdatesCandidate); + } + } else { + log.trace("[{}][{}][{}] No changes detected.", tenantId, entityId, subscription.getSubscriptionId()); + } + } + + private void pushSubEventToManagerService(TenantId tenantId, EntityId entityId, TbEntitySubEvent event) { + TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, tenantId, entityId); + if (tpi.isMyPartition()) { + // Subscription is managed on the same server; + subscriptionManagerService.onSubEvent(serviceId, event, TbCallback.EMPTY); + } else { + pushToQueue(entityId, event, tpi); + } + } + + private void pushToQueue(EntityId entityId, TbEntitySubEvent event, TopicPartitionInfo tpi) { + clusterService.pushMsgToCore(tpi, entityId.getId(), TbSubscriptionUtils.toSubEventProto(serviceId, event), null); + } + + private void checkMissedUpdates(TbSubscription subscription) { + log.trace("[{}][{}][{}] Check missed updates for subscription: {}", + subscription.getTenantId(), subscription.getEntityId(), subscription.getSubscriptionId(), subscription); + switch (subscription.getType()) { + case TIMESERIES: + handleNewTelemetrySubscription((TbTimeSeriesSubscription) subscription); + break; + case ATTRIBUTES: + handleNewAttributeSubscription((TbAttributeSubscription) subscription); + break; + } + } + + private void handleNewAttributeSubscription(TbAttributeSubscription subscription) { + log.trace("[{}][{}][{}] Processing attribute subscription for entity [{}]", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); + var entityUpdateInfo = entityUpdates.get(subscription.getEntityId().getId()); + if (entityUpdateInfo != null && entityUpdateInfo.attributesUpdateTs > 0 && subscription.getQueryTs() > entityUpdateInfo.attributesUpdateTs) { + log.trace("[{}][{}][{}] No need to check for missed updates [{}]", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); + return; + } + final Map keyStates = subscription.getKeyStates(); + DonAsynchron.withCallback(attrService.find(subscription.getTenantId(), subscription.getEntityId(), DataConstants.CLIENT_SCOPE, keyStates.keySet()), values -> { + List updates = new ArrayList<>(); + values.forEach(latestEntry -> { + if (latestEntry.getLastUpdateTs() > keyStates.get(latestEntry.getKey())) { + updates.add(new BasicTsKvEntry(latestEntry.getLastUpdateTs(), latestEntry)); + } + }); + var missedUpdates = updates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); + if (!missedUpdates.isEmpty()) { + onAttributesUpdate(subscription.getEntityId(), missedUpdates, TbCallback.EMPTY); + } + }, + e -> log.error("Failed to fetch missed updates.", e), tsCallBackExecutor); + } + + private void handleNewTelemetrySubscription(TbTimeSeriesSubscription subscription) { + log.trace("[{}][{}][{}] Processing telemetry subscription for entity [{}]", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); + var entityUpdateInfo = entityUpdates.get(subscription.getEntityId().getId()); + if (entityUpdateInfo != null && entityUpdateInfo.timeSeriesUpdateTs > 0 && subscription.getQueryTs() > entityUpdateInfo.timeSeriesUpdateTs) { + log.trace("[{}][{}][{}] No need to check for missed updates. time [{}][{}] diff: {}ms", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getQueryTs(), entityUpdateInfo.timeSeriesUpdateTs, subscription.getQueryTs() - entityUpdateInfo.timeSeriesUpdateTs); + return; + } + + long curTs = System.currentTimeMillis(); + + if (subscription.isLatestValues()) { + DonAsynchron.withCallback(tsService.findLatest(subscription.getTenantId(), subscription.getEntityId(), subscription.getKeyStates().keySet()), + missedUpdates -> { + if (missedUpdates != null && !missedUpdates.isEmpty()) { + missedUpdates = missedUpdates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); + if (!missedUpdates.isEmpty()) { + onTimeSeriesUpdate(subscription.getEntityId(), missedUpdates, TbCallback.EMPTY); + } + } + }, + e -> log.error("Failed to fetch missed updates.", e), + tsCallBackExecutor); + } else { + List queries = new ArrayList<>(); + subscription.getKeyStates().forEach((key, value) -> { + if (curTs > value) { + long startTs = subscription.getStartTime() > 0 ? Math.max(subscription.getStartTime(), value + 1L) : (value + 1L); + long endTs = subscription.getEndTime() > 0 ? Math.min(subscription.getEndTime(), curTs) : curTs; + queries.add(new BaseReadTsKvQuery(key, startTs, endTs, 0, 1000, Aggregation.NONE)); + } + }); + if (!queries.isEmpty()) { + DonAsynchron.withCallback(tsService.findAll(subscription.getTenantId(), subscription.getEntityId(), queries), + missedUpdates -> { + if (missedUpdates != null && !missedUpdates.isEmpty()) { + missedUpdates = missedUpdates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); + if (!missedUpdates.isEmpty()) { + onTimeSeriesUpdate(subscription.getEntityId(), missedUpdates, TbCallback.EMPTY); + } + } + }, + e -> log.error("Failed to fetch missed updates.", e), + tsCallBackExecutor); + } + } } } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java b/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java index 736a251dff..4f6d16e6c2 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java @@ -16,6 +16,7 @@ package org.thingsboard.server.service.subscription; import org.springframework.context.ApplicationListener; +import org.springframework.context.event.EventListener; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; @@ -23,6 +24,8 @@ import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.msg.queue.TbCallback; +import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.discovery.event.OtherServiceShutdownEvent; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; @@ -31,9 +34,9 @@ import java.util.List; public interface SubscriptionManagerService extends ApplicationListener { - void addSubscription(TbSubscription subscription, TbCallback callback); + void onSubEvent(String serviceId, TbEntitySubEvent event, TbCallback empty); - void cancelSubscription(String sessionId, int subscriptionId, TbCallback callback); + void onApplicationEvent(OtherServiceShutdownEvent event); void onTimeSeriesUpdate(TenantId tenantId, EntityId entityId, List ts, TbCallback callback); @@ -51,6 +54,4 @@ public interface SubscriptionManagerService extends ApplicationListener scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { + return scheduler.scheduleWithFixedDelay(command, initialDelay, delay, unit); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java index 3f11679849..f02a466994 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java @@ -186,6 +186,7 @@ public abstract class TbAbstractDataSubCtx sendWsMsg(sub.getSessionId(), subscriptionUpdate, keysType)) + .queryTs(createdTime) .allKeys(false) .keyStates(keyStates) .scope(scope) @@ -207,19 +208,20 @@ public abstract class TbAbstractDataSubCtx keyStates) { + private TbTimeSeriesSubscription createTsSub(EntityData entityData, int subIdx, boolean latestValues, long startTs, long endTs, Map keyStates) { return createTsSub(entityData, subIdx, latestValues, startTs, endTs, keyStates, latestValues); } - private TbTimeseriesSubscription createTsSub(EntityData entityData, int subIdx, boolean latestValues, long startTs, long endTs, Map keyStates, boolean resultToLatestValues) { + private TbTimeSeriesSubscription createTsSub(EntityData entityData, int subIdx, boolean latestValues, long startTs, long endTs, Map keyStates, boolean resultToLatestValues) { log.trace("[{}][{}][{}] Creating time-series subscription for [{}] with keys: {}", serviceId, cmdId, subIdx, entityData.getEntityId(), keyStates); - return TbTimeseriesSubscription.builder() + return TbTimeSeriesSubscription.builder() .serviceId(serviceId) .sessionId(sessionRef.getSessionId()) .subscriptionId(subIdx) .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityData.getEntityId()) .updateProcessor((sub, subscriptionUpdate) -> sendWsMsg(sub.getSessionId(), subscriptionUpdate, EntityKeyType.TIME_SERIES, resultToLatestValues)) + .queryTs(createdTime) .allKeys(false) .keyStates(keyStates) .latestValues(latestValues) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java index 7eba28bccd..102431f63b 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java @@ -78,11 +78,14 @@ public abstract class TbAbstractSubCtx { @Setter protected volatile ScheduledFuture refreshTask; protected volatile boolean stopped; + @Getter + protected long createdTime; public TbAbstractSubCtx(String serviceId, WebSocketService wsService, EntityService entityService, TbLocalSubscriptionService localSubscriptionService, AttributesService attributesService, SubscriptionServiceStatistics stats, WebSocketSessionRef sessionRef, int cmdId) { + this.createdTime = System.currentTimeMillis(); this.serviceId = serviceId; this.wsService = wsService; this.entityService = entityService; @@ -142,6 +145,7 @@ public abstract class TbAbstractSubCtx { .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityId) .updateProcessor((subscription, subscriptionUpdate) -> dynamicValueSubUpdate(subscription.getSessionId(), subscriptionUpdate, dynamicValueKeySubMap)) + .queryTs(createdTime) .allKeys(false) .keyStates(keyStates) .scope(TbAttributeSubscriptionScope.SERVER_SCOPE) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java index 3746758caa..2392899dc7 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java @@ -26,6 +26,7 @@ import java.util.function.BiConsumer; public class TbAttributeSubscription extends TbSubscription { + @Getter private final long queryTs; @Getter private final boolean allKeys; @Getter private final Map keyStates; @Getter private final TbAttributeSubscriptionScope scope; @@ -33,8 +34,9 @@ public class TbAttributeSubscription extends TbSubscription, TelemetrySubscriptionUpdate> updateProcessor, - boolean allKeys, Map keyStates, TbAttributeSubscriptionScope scope) { + long queryTs, boolean allKeys, Map keyStates, TbAttributeSubscriptionScope scope) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.ATTRIBUTES, updateProcessor); + this.queryTs = queryTs; this.allKeys = allKeys; this.keyStates = keyStates; this.scope = scope; diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java new file mode 100644 index 0000000000..96ea628de2 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java @@ -0,0 +1,245 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Information about the local websocket subscriptions. + */ +@Slf4j +@RequiredArgsConstructor +public class TbEntityLocalSubsInfo { + + @Getter + private final TenantId tenantId; + @Getter + private final EntityId entityId; + @Getter + private final Lock lock = new ReentrantLock(); + @Getter + private final Set> subs = ConcurrentHashMap.newKeySet(); + private volatile TbSubscriptionsInfo state = new TbSubscriptionsInfo(); + + private final Map>> pendingSubs = new ConcurrentHashMap<>(); + @Getter + @Setter + private int pendingTimeSeriesEvent; + @Getter + @Setter + private long pendingTimeSeriesEventTs; + @Getter + @Setter + private int pendingAttributesEvent; + @Getter + @Setter + private long pendingAttributesEventTs; + + private int seqNumber = 0; + + public TbEntitySubEvent add(TbSubscription subscription) { + log.trace("[{}][{}][{}] Adding: {}", tenantId, entityId, subscription.getSubscriptionId(), subscription); + boolean created = subs.isEmpty(); + subs.add(subscription); + TbSubscriptionsInfo newState = created ? state : state.copy(); + boolean stateChanged = false; + switch (subscription.getType()) { + case NOTIFICATIONS: + case NOTIFICATIONS_COUNT: + if (!newState.notifications) { + newState.notifications = true; + stateChanged = true; + } + break; + case ALARMS: + if (!newState.alarms) { + newState.alarms = true; + stateChanged = true; + } + break; + case ATTRIBUTES: + var attrSub = (TbAttributeSubscription) subscription; + if (!newState.attrAllKeys) { + if (attrSub.isAllKeys()) { + newState.attrAllKeys = true; + stateChanged = true; + } else { + if (newState.attrKeys == null) { + newState.attrKeys = new HashSet<>(attrSub.getKeyStates().keySet()); + stateChanged = true; + } else if (newState.attrKeys.addAll(attrSub.getKeyStates().keySet())) { + stateChanged = true; + } + } + } + break; + case TIMESERIES: + var tsSub = (TbTimeSeriesSubscription) subscription; + if (!newState.tsAllKeys) { + if (tsSub.isAllKeys()) { + newState.tsAllKeys = true; + stateChanged = true; + } else { + if (newState.tsKeys == null) { + newState.tsKeys = new HashSet<>(tsSub.getKeyStates().keySet()); + stateChanged = true; + } else if (newState.tsKeys.addAll(tsSub.getKeyStates().keySet())) { + stateChanged = true; + } + } + } + break; + } + if (stateChanged) { + state = newState; + } + if (created) { + return toEvent(ComponentLifecycleEvent.CREATED); + } else if (stateChanged) { + return toEvent(ComponentLifecycleEvent.UPDATED); + } else { + return null; + } + } + + public TbEntitySubEvent remove(TbSubscription sub) { + log.trace("[{}][{}][{}] Removing: {}", tenantId, entityId, sub.getSubscriptionId(), sub); + if (!subs.remove(sub)) { + return null; + } + if (subs.isEmpty()) { + return toEvent(ComponentLifecycleEvent.DELETED); + } + TbSubscriptionsInfo oldState = state.copy(); + TbSubscriptionsInfo newState = new TbSubscriptionsInfo(); + for (TbSubscription subscription : subs) { + switch (subscription.getType()) { + case NOTIFICATIONS: + case NOTIFICATIONS_COUNT: + if (!newState.notifications) { + newState.notifications = true; + } + break; + case ALARMS: + if (!newState.alarms) { + newState.alarms = true; + } + break; + case ATTRIBUTES: + var attrSub = (TbAttributeSubscription) subscription; + if (!newState.attrAllKeys && attrSub.isAllKeys()) { + newState.attrAllKeys = true; + continue; + } + if (newState.attrKeys == null) { + newState.attrKeys = new HashSet<>(attrSub.getKeyStates().keySet()); + } else { + newState.attrKeys.addAll(attrSub.getKeyStates().keySet()); + } + break; + case TIMESERIES: + var tsSub = (TbTimeSeriesSubscription) subscription; + if (!newState.tsAllKeys && tsSub.isAllKeys()) { + newState.tsAllKeys = true; + continue; + } + if (newState.tsKeys == null) { + newState.tsKeys = new HashSet<>(tsSub.getKeyStates().keySet()); + } else { + newState.tsKeys.addAll(tsSub.getKeyStates().keySet()); + } + break; + } + } + if (newState.equals(oldState)) { + return null; + } else { + this.state = newState; + return toEvent(ComponentLifecycleEvent.UPDATED); + } + } + + public TbEntitySubEvent toEvent(ComponentLifecycleEvent type) { + seqNumber++; + var result = TbEntitySubEvent.builder().tenantId(tenantId).entityId(entityId).type(type).seqNumber(seqNumber); + if (!ComponentLifecycleEvent.DELETED.equals(type)) { + result.info(state.copy(seqNumber)); + } + return result.build(); + } + + public boolean isNf() { + return state.notifications; + } + + + public boolean isEmpty() { + return state.isEmpty(); + } + + public TbSubscription registerPendingSubscription(TbSubscription subscription, TbEntitySubEvent event) { + if (TbSubscriptionType.ATTRIBUTES.equals(subscription.getType())) { + if (event != null) { + log.trace("[{}][{}] Registering new pending attributes subscription event: {} for subscription: {}", tenantId, entityId, event.getSeqNumber(), subscription.getSubscriptionId()); + pendingAttributesEvent = event.getSeqNumber(); + pendingAttributesEventTs = System.currentTimeMillis(); + pendingSubs.computeIfAbsent(pendingAttributesEvent, e -> new HashSet<>()).add(subscription); + } else if (pendingAttributesEvent > 0) { + log.trace("[{}][{}] Registering pending attributes subscription {} for event: {} ", tenantId, entityId, subscription.getSubscriptionId(), pendingAttributesEvent); + pendingSubs.computeIfAbsent(pendingAttributesEvent, e -> new HashSet<>()).add(subscription); + } else { + return subscription; + } + } else if (subscription instanceof TbTimeSeriesSubscription) { + if (event != null) { + log.trace("[{}][{}] Registering new pending time-series subscription event: {} for subscription: {}", tenantId, entityId, event.getSeqNumber(), subscription.getSubscriptionId()); + pendingTimeSeriesEvent = event.getSeqNumber(); + pendingTimeSeriesEventTs = System.currentTimeMillis(); + pendingSubs.computeIfAbsent(pendingTimeSeriesEvent, e -> new HashSet<>()).add(subscription); + } else if (pendingTimeSeriesEvent > 0) { + log.trace("[{}][{}] Registering pending time-series subscription {} for event: {} ", tenantId, entityId, subscription.getSubscriptionId(), pendingTimeSeriesEvent); + pendingSubs.computeIfAbsent(pendingTimeSeriesEvent, e -> new HashSet<>()).add(subscription); + } else { + return subscription; + } + } + return null; + } + + public Set> clearPendingSubscriptions(int seqNumber) { + if (pendingTimeSeriesEvent == seqNumber) { + pendingTimeSeriesEvent = 0; + pendingTimeSeriesEventTs = 0L; + } else if (pendingAttributesEvent == seqNumber) { + pendingAttributesEvent = 0; + pendingAttributesEventTs = 0L; + } + return pendingSubs.remove(seqNumber); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java new file mode 100644 index 0000000000..df66b060da --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java @@ -0,0 +1,79 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.util.Pair; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Information about the local websocket subscriptions. + */ +@RequiredArgsConstructor +@Slf4j +public class TbEntityRemoteSubsInfo { + @Getter + private final TenantId tenantId; + @Getter + private final EntityId entityId; + @Getter + private final Map subs = new ConcurrentHashMap<>(); // By service ID + + public boolean updateAndCheckIsEmpty(String serviceId, TbEntitySubEvent event) { + var current = subs.get(serviceId); + if (current != null && current.seqNumber > event.getSeqNumber()) { + log.warn("[{}][{}] Duplicate subscription event received. Current: {}, Event: {}", + tenantId, entityId, current, event.getInfo()); + return false; + } + switch (event.getType()) { + case CREATED: + subs.put(serviceId, event.getInfo()); + break; + case UPDATED: + var newSubInfo = event.getInfo(); + if (newSubInfo.isEmpty()) { + subs.remove(serviceId); + return isEmpty(); + } else { + subs.put(serviceId, newSubInfo); + } + break; + case DELETED: + subs.remove(serviceId); + return isEmpty(); + } + return false; + } + + public boolean removeAndCheckIsEmpty(String serviceId) { + if (subs.remove(serviceId) != null) { + return subs.isEmpty(); + } else { + return false; + } + } + + public boolean isEmpty() { + return subs.isEmpty(); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java new file mode 100644 index 0000000000..7e2956b5f0 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java @@ -0,0 +1,42 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.Builder; +import lombok.Data; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; + +import java.util.Set; + +/** + * Information about the local websocket subscriptions. + */ +@Builder +@Data +public class TbEntitySubEvent { + + private final TenantId tenantId; + private final EntityId entityId; + private final ComponentLifecycleEvent type; + private final TbSubscriptionsInfo info; + private final int seqNumber; + + public boolean hasTsOrAttrSub() { + return info != null && (info.tsAllKeys || info.attrAllKeys || info.tsKeys != null || info.attrKeys != null); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java new file mode 100644 index 0000000000..a09da220d5 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java @@ -0,0 +1,30 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TbEntityUpdatesInfo { + + volatile long attributesUpdateTs; + volatile long timeSeriesUpdateTs; + + public TbEntityUpdatesInfo(long ts) { + this.attributesUpdateTs = ts; + this.timeSeriesUpdateTs = ts; + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java index 7685c8fbed..d9fc87f51b 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java @@ -15,28 +15,54 @@ */ package org.thingsboard.server.service.subscription; +import org.thingsboard.server.common.data.alarm.AlarmInfo; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.kv.AttributeKvEntry; +import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.msg.queue.TbCallback; +import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.discovery.event.ClusterTopologyChangeEvent; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; +import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; +import java.util.List; + public interface TbLocalSubscriptionService { - void addSubscription(TbSubscription subscription); + void addSubscription(TbSubscription subscription); + + void onSubEventCallback(TransportProtos.TbEntitySubEventCallbackProto subEventCallback, TbCallback callback); + + void onSubEventCallback(EntityId entityId, int seqNumber, TbEntityUpdatesInfo entityUpdatesInfo, TbCallback empty); void cancelSubscription(String sessionId, int subscriptionId); void cancelAllSessionSubscriptions(String sessionId); - void onSubscriptionUpdate(String sessionId, TelemetrySubscriptionUpdate update, TbCallback callback); + void onTimeSeriesUpdate(TransportProtos.TbSubUpdateProto tsUpdate, TbCallback callback); + + void onTimeSeriesUpdate(EntityId entityId, List update, TbCallback callback); + + void onAttributesUpdate(TransportProtos.TbSubUpdateProto attrUpdate, TbCallback callback); - void onSubscriptionUpdate(String sessionId, AlarmSubscriptionUpdate update, TbCallback callback); + void onAttributesUpdate(EntityId entityId, List update, TbCallback callback); - void onSubscriptionUpdate(String sessionId, int subscriptionId, NotificationsSubscriptionUpdate update, TbCallback callback); + void onAlarmUpdate(EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback); - void onApplicationEvent(PartitionChangeEvent event); + void onAlarmUpdate(TransportProtos.TbAlarmSubUpdateProto update, TbCallback callback); + + void onNotificationUpdate(EntityId entityId, NotificationsSubscriptionUpdate subscriptionUpdate, TbCallback callback); void onApplicationEvent(ClusterTopologyChangeEvent event); + + void onCoreStartupMsg(TransportProtos.CoreStartupMsg coreStartupMsg); + + void onNotificationRequestUpdate(TenantId tenantId, NotificationRequestUpdate update, TbCallback callback); + + void onNotificationUpdate(TransportProtos.NotificationsSubUpdateProto notificationsUpdate, TbCallback callback); + } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java index dfad6a41de..1cda590a1f 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java @@ -33,7 +33,7 @@ public abstract class TbSubscription { private final TenantId tenantId; private final EntityId entityId; private final TbSubscriptionType type; - private final BiConsumer, T> updateProcessor; + private final BiConsumer, T> updateProcessor; @Override public boolean equals(Object o) { diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java index 8905b1b3ad..2fd49f0645 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.service.subscription; +import org.apache.commons.lang3.StringUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.id.EntityId; @@ -32,6 +33,7 @@ import org.thingsboard.server.common.data.kv.KvEntry; import org.thingsboard.server.common.data.kv.LongDataEntry; import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.KeyValueProto; import org.thingsboard.server.gen.transport.TransportProtos.KeyValueType; @@ -39,29 +41,20 @@ import org.thingsboard.server.gen.transport.TransportProtos.SubscriptionMgrMsgPr import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeDeleteProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeSubscriptionProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionCloseProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionKetStateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateTsValue; +import org.thingsboard.server.gen.transport.TransportProtos.TbEntitySubEventProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesDeleteProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesSubscriptionProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; -import org.thingsboard.server.service.ws.notification.sub.NotificationsCountSubscription; -import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscription; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; import java.util.ArrayList; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -69,172 +62,118 @@ import java.util.UUID; public class TbSubscriptionUtils { - public static ToCoreMsg toNewSubscriptionProto(TbSubscription subscription) { + public static ToCoreMsg toSubEventProto(String serviceId, TbEntitySubEvent event) { SubscriptionMgrMsgProto.Builder msgBuilder = SubscriptionMgrMsgProto.newBuilder(); - TbSubscriptionProto subscriptionProto = TbSubscriptionProto.newBuilder() - .setServiceId(subscription.getServiceId()) - .setSessionId(subscription.getSessionId()) - .setSubscriptionId(subscription.getSubscriptionId()) - .setTenantIdMSB(subscription.getTenantId().getId().getMostSignificantBits()) - .setTenantIdLSB(subscription.getTenantId().getId().getLeastSignificantBits()) - .setEntityType(subscription.getEntityId().getEntityType().name()) - .setEntityIdMSB(subscription.getEntityId().getId().getMostSignificantBits()) - .setEntityIdLSB(subscription.getEntityId().getId().getLeastSignificantBits()).build(); - - switch (subscription.getType()) { - case TIMESERIES: - TbTimeseriesSubscription tSub = (TbTimeseriesSubscription) subscription; - TbTimeSeriesSubscriptionProto.Builder tSubProto = TbTimeSeriesSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setAllKeys(tSub.isAllKeys()); - tSub.getKeyStates().forEach((key, value) -> tSubProto.addKeyStates( - TbSubscriptionKetStateProto.newBuilder().setKey(key).setTs(value).build())); - tSubProto.setStartTime(tSub.getStartTime()); - tSubProto.setEndTime(tSub.getEndTime()); - tSubProto.setLatestValues(tSub.isLatestValues()); - msgBuilder.setTelemetrySub(tSubProto.build()); - break; - case ATTRIBUTES: - TbAttributeSubscription aSub = (TbAttributeSubscription) subscription; - TbAttributeSubscriptionProto.Builder aSubProto = TbAttributeSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setAllKeys(aSub.isAllKeys()) - .setScope(aSub.getScope().name()); - aSub.getKeyStates().forEach((key, value) -> aSubProto.addKeyStates( - TbSubscriptionKetStateProto.newBuilder().setKey(key).setTs(value).build())); - msgBuilder.setAttributeSub(aSubProto.build()); - break; - case ALARMS: - TbAlarmsSubscription alarmSub = (TbAlarmsSubscription) subscription; - TransportProtos.TbAlarmSubscriptionProto.Builder alarmSubProto = TransportProtos.TbAlarmSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setTs(alarmSub.getTs()); - msgBuilder.setAlarmSub(alarmSubProto.build()); - break; - case NOTIFICATIONS: - NotificationsSubscription notificationsSub = (NotificationsSubscription) subscription; - msgBuilder.setNotificationsSub(TransportProtos.NotificationsSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setLimit(notificationsSub.getLimit())); - break; - case NOTIFICATIONS_COUNT: - NotificationsCountSubscription notificationsCountSub = (NotificationsCountSubscription) subscription; - msgBuilder.setNotificationsCountSub(TransportProtos.NotificationsCountSubscriptionProto.newBuilder() - .setSub(subscriptionProto)); - break; + var builder = TbEntitySubEventProto.newBuilder() + .setServiceId(serviceId) + .setSeqNumber(event.getSeqNumber()) + .setTenantIdMSB(event.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(event.getTenantId().getId().getLeastSignificantBits()) + .setEntityType(event.getEntityId().getEntityType().name()) + .setEntityIdMSB(event.getEntityId().getId().getMostSignificantBits()) + .setEntityIdLSB(event.getEntityId().getId().getLeastSignificantBits()) + .setType(event.getType().name()); + TbSubscriptionsInfo info = event.getInfo(); + if (info != null) { + builder.setNotifications(info.notifications) + .setAlarms(info.alarms) + .setTsAllKeys(info.tsAllKeys) + .setAttrAllKeys(info.attrAllKeys); + if (info.tsKeys != null) { + builder.addAllTsKeys(info.tsKeys); + } + if (info.attrKeys != null) { + builder.addAllAttrKeys(info.attrKeys); + } } - return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder.build()).build(); + msgBuilder.setSubEvent(builder); + return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder).build(); } - public static ToCoreMsg toCloseSubscriptionProto(TbSubscription subscription) { - SubscriptionMgrMsgProto.Builder msgBuilder = SubscriptionMgrMsgProto.newBuilder(); - TbSubscriptionCloseProto closeProto = TbSubscriptionCloseProto.newBuilder() - .setSessionId(subscription.getSessionId()) - .setSubscriptionId(subscription.getSubscriptionId()).build(); - msgBuilder.setSubClose(closeProto); - return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder.build()).build(); + public static ToCoreNotificationMsg toProto(UUID id, int seqNumber, TbEntityUpdatesInfo update) { + TransportProtos.TbEntitySubEventCallbackProto.Builder updateProto = TransportProtos.TbEntitySubEventCallbackProto.newBuilder() + .setEntityIdMSB(id.getMostSignificantBits()) + .setEntityIdLSB(id.getLeastSignificantBits()) + .setSeqNumber(seqNumber) + .setAttributesUpdateTs(update.attributesUpdateTs) + .setTimeSeriesUpdateTs(update.timeSeriesUpdateTs); + return ToCoreNotificationMsg.newBuilder() + .setToLocalSubscriptionServiceMsg( + TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() + .setSubEventCallback(updateProto) + .build()) + .build(); } - public static TbSubscription fromProto(TbAttributeSubscriptionProto attributeSub) { - TbSubscriptionProto subProto = attributeSub.getSub(); - TbAttributeSubscription.TbAttributeSubscriptionBuilder builder = TbAttributeSubscription.builder() - .serviceId(subProto.getServiceId()) - .sessionId(subProto.getSessionId()) - .subscriptionId(subProto.getSubscriptionId()) - .entityId(EntityIdFactory.getByTypeAndUuid(subProto.getEntityType(), new UUID(subProto.getEntityIdMSB(), subProto.getEntityIdLSB()))) - .tenantId(TenantId.fromUUID(new UUID(subProto.getTenantIdMSB(), subProto.getTenantIdLSB()))); - - builder.scope(TbAttributeSubscriptionScope.valueOf(attributeSub.getScope())); - builder.allKeys(attributeSub.getAllKeys()); - Map keyStates = new HashMap<>(); - attributeSub.getKeyStatesList().forEach(ksProto -> keyStates.put(ksProto.getKey(), ksProto.getTs())); - builder.keyStates(keyStates); - return builder.build(); - } - public static TbSubscription fromProto(TbTimeSeriesSubscriptionProto telemetrySub) { - TbSubscriptionProto subProto = telemetrySub.getSub(); - TbTimeseriesSubscription.TbTimeseriesSubscriptionBuilder builder = TbTimeseriesSubscription.builder() - .serviceId(subProto.getServiceId()) - .sessionId(subProto.getSessionId()) - .subscriptionId(subProto.getSubscriptionId()) - .entityId(EntityIdFactory.getByTypeAndUuid(subProto.getEntityType(), new UUID(subProto.getEntityIdMSB(), subProto.getEntityIdLSB()))) - .tenantId(TenantId.fromUUID(new UUID(subProto.getTenantIdMSB(), subProto.getTenantIdLSB()))); - - builder.allKeys(telemetrySub.getAllKeys()); - Map keyStates = new HashMap<>(); - telemetrySub.getKeyStatesList().forEach(ksProto -> keyStates.put(ksProto.getKey(), ksProto.getTs())); - builder.startTime(telemetrySub.getStartTime()); - builder.endTime(telemetrySub.getEndTime()); - builder.latestValues(telemetrySub.getLatestValues()); - builder.keyStates(keyStates); + public static TbEntitySubEvent fromProto(TbEntitySubEventProto proto) { + ComponentLifecycleEvent event = ComponentLifecycleEvent.valueOf(proto.getType()); + var builder = TbEntitySubEvent.builder() + .tenantId(TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB()))) + .seqNumber(proto.getSeqNumber()) + .entityId(EntityIdFactory.getByTypeAndUuid(proto.getEntityType(), new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()))) + .type(event); + if (!ComponentLifecycleEvent.DELETED.equals(event)) { + builder.info(new TbSubscriptionsInfo(proto.getNotifications(), proto.getAlarms(), + proto.getTsAllKeys(), proto.getTsKeysCount() > 0 ? new HashSet<>(proto.getTsKeysList()) : null, + proto.getAttrAllKeys(), proto.getAttrKeysCount() > 0 ? new HashSet<>(proto.getAttrKeysList()) : null, + proto.getSeqNumber())); + } return builder.build(); } - public static TbSubscription fromProto(TransportProtos.TbAlarmSubscriptionProto alarmSub) { - TbSubscriptionProto subProto = alarmSub.getSub(); - TbAlarmsSubscription.TbAlarmsSubscriptionBuilder builder = TbAlarmsSubscription.builder() - .serviceId(subProto.getServiceId()) - .sessionId(subProto.getSessionId()) - .subscriptionId(subProto.getSubscriptionId()) - .entityId(EntityIdFactory.getByTypeAndUuid(subProto.getEntityType(), new UUID(subProto.getEntityIdMSB(), subProto.getEntityIdLSB()))) - .tenantId(TenantId.fromUUID(new UUID(subProto.getTenantIdMSB(), subProto.getTenantIdLSB()))); - builder.ts(alarmSub.getTs()); - return builder.build(); + public static AlarmSubscriptionUpdate fromProto(TransportProtos.TbAlarmSubUpdateProto proto) { + if (proto.getErrorCode() > 0) { + return new AlarmSubscriptionUpdate(SubscriptionErrorCode.forCode(proto.getErrorCode()), proto.getErrorMsg()); + } else { + AlarmInfo alarm = JacksonUtil.fromString(proto.getAlarm(), AlarmInfo.class); + return new AlarmSubscriptionUpdate(alarm, proto.getDeleted()); + } } - public static NotificationsSubscription fromProto(TransportProtos.NotificationsSubscriptionProto notificationsSub) { - TbSubscriptionProto sub = notificationsSub.getSub(); - return NotificationsSubscription.builder() - .serviceId(sub.getServiceId()) - .sessionId(sub.getSessionId()) - .subscriptionId(sub.getSubscriptionId()) - .tenantId(TenantId.fromUUID(new UUID(sub.getTenantIdMSB(), sub.getTenantIdLSB()))) - .entityId(EntityIdFactory.getByTypeAndUuid(sub.getEntityType(), new UUID(sub.getEntityIdMSB(), sub.getEntityIdLSB()))) - .limit(notificationsSub.getLimit()) - .build(); + public static NotificationsSubscriptionUpdate fromProto(TransportProtos.NotificationsSubUpdateProto proto) { + NotificationsSubscriptionUpdate update; + if (StringUtils.isNotEmpty(proto.getNotificationUpdate())) { + NotificationUpdate notificationUpdate = JacksonUtil.fromString(proto.getNotificationUpdate(), NotificationUpdate.class); + update = new NotificationsSubscriptionUpdate(notificationUpdate); + } else { + NotificationRequestUpdate notificationRequestUpdate = JacksonUtil.fromString(proto.getNotificationRequestUpdate(), NotificationRequestUpdate.class); + update = new NotificationsSubscriptionUpdate(notificationRequestUpdate); + } + return update; } - public static NotificationsCountSubscription fromProto(TransportProtos.NotificationsCountSubscriptionProto notificationsCountSub) { - TbSubscriptionProto sub = notificationsCountSub.getSub(); - return NotificationsCountSubscription.builder() - .serviceId(sub.getServiceId()) - .sessionId(sub.getSessionId()) - .subscriptionId(sub.getSubscriptionId()) - .tenantId(TenantId.fromUUID(new UUID(sub.getTenantIdMSB(), sub.getTenantIdLSB()))) - .entityId(EntityIdFactory.getByTypeAndUuid(sub.getEntityType(), new UUID(sub.getEntityIdMSB(), sub.getEntityIdLSB()))) + public static ToCoreNotificationMsg toAlarmSubUpdateToProto(EntityId entityId, AlarmInfo alarmInfo, boolean deleted) { + TransportProtos.TbAlarmSubUpdateProto.Builder updateProto = TransportProtos.TbAlarmSubUpdateProto.newBuilder() + .setEntityIdMSB(entityId.getId().getMostSignificantBits()) + .setEntityIdLSB(entityId.getId().getLeastSignificantBits()) + .setAlarm(JacksonUtil.toString(alarmInfo)) + .setDeleted(deleted); + return ToCoreNotificationMsg.newBuilder() + .setToLocalSubscriptionServiceMsg( + TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() + .setAlarmUpdate(updateProto) + .build()) .build(); } - public static TelemetrySubscriptionUpdate fromProto(TbSubscriptionUpdateProto proto) { - if (proto.getErrorCode() > 0) { - return new TelemetrySubscriptionUpdate(proto.getSubscriptionId(), SubscriptionErrorCode.forCode(proto.getErrorCode()), proto.getErrorMsg()); - } else { - Map> data = new TreeMap<>(); - proto.getDataList().forEach(v -> { - List values = data.computeIfAbsent(v.getKey(), k -> new ArrayList<>()); - for (int i = 0; i < v.getTsValueCount(); i++) { - Object[] value = new Object[2]; - TbSubscriptionUpdateTsValue tsValue = v.getTsValue(i); - value[0] = tsValue.getTs(); - value[1] = tsValue.hasValue() ? tsValue.getValue() : null; - values.add(value); - } - }); - return new TelemetrySubscriptionUpdate(proto.getSubscriptionId(), data); + public static ToCoreNotificationMsg notificationsSubUpdateToProto(EntityId entityId, NotificationsSubscriptionUpdate update) { + TransportProtos.NotificationsSubUpdateProto.Builder updateProto = TransportProtos.NotificationsSubUpdateProto.newBuilder() + .setEntityIdMSB(entityId.getId().getMostSignificantBits()) + .setEntityIdLSB(entityId.getId().getLeastSignificantBits()); + if (update.getNotificationUpdate() != null) { + updateProto.setNotificationUpdate(JacksonUtil.toString(update.getNotificationUpdate())); } - } - - public static AlarmSubscriptionUpdate fromProto(TransportProtos.TbAlarmSubscriptionUpdateProto proto) { - if (proto.getErrorCode() > 0) { - return new AlarmSubscriptionUpdate(proto.getSubscriptionId(), SubscriptionErrorCode.forCode(proto.getErrorCode()), proto.getErrorMsg()); - } else { - AlarmInfo alarm = JacksonUtil.fromString(proto.getAlarm(), AlarmInfo.class); - return new AlarmSubscriptionUpdate(proto.getSubscriptionId(), alarm, proto.getDeleted()); + if (update.getNotificationRequestUpdate() != null) { + updateProto.setNotificationRequestUpdate(JacksonUtil.toString(update.getNotificationRequestUpdate())); } + return ToCoreNotificationMsg.newBuilder() + .setToLocalSubscriptionServiceMsg(TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() + .setNotificationsUpdate(updateProto) + .build()) + .build(); } - public static ToCoreMsg toTimeseriesUpdateProto(TenantId tenantId, EntityId entityId, List ts) { TbTimeSeriesUpdateProto.Builder builder = TbTimeSeriesUpdateProto.newBuilder(); builder.setEntityType(entityId.getEntityType().name()); @@ -317,6 +256,31 @@ public class TbSubscriptionUtils { return TsKvProto.newBuilder().setTs(ts).setKv(dataBuilder); } + private static TransportProtos.TsValueProto toTsValueProto(long ts, KvEntry attr) { + TransportProtos.TsValueProto.Builder dataBuilder = TransportProtos.TsValueProto.newBuilder(); + dataBuilder.setTs(ts); + dataBuilder.setType(KeyValueType.forNumber(attr.getDataType().ordinal())); + switch (attr.getDataType()) { + case BOOLEAN: + attr.getBooleanValue().ifPresent(dataBuilder::setBoolV); + break; + case LONG: + attr.getLongValue().ifPresent(dataBuilder::setLongV); + break; + case DOUBLE: + attr.getDoubleValue().ifPresent(dataBuilder::setDoubleV); + break; + case JSON: + attr.getJsonValue().ifPresent(dataBuilder::setJsonV); + break; + case STRING: + attr.getStrValue().ifPresent(dataBuilder::setStringV); + break; + } + return dataBuilder.build(); + } + + public static EntityId toEntityId(String entityType, long entityIdMSB, long entityIdLSB) { return EntityIdFactory.getByTypeAndUuid(entityType, new UUID(entityIdMSB, entityIdLSB)); } @@ -356,6 +320,35 @@ public class TbSubscriptionUtils { return entry; } + public static List toTsKvEntityList(String key, List dataList) { + List result = new ArrayList<>(dataList.size()); + dataList.forEach(proto -> result.add(new BasicTsKvEntry(proto.getTs(), getKvEntry(key, proto)))); + return result; + } + + private static KvEntry getKvEntry(String key, TransportProtos.TsValueProto proto) { + KvEntry entry = null; + DataType type = DataType.values()[proto.getType().getNumber()]; + switch (type) { + case BOOLEAN: + entry = new BooleanDataEntry(key, proto.getBoolV()); + break; + case LONG: + entry = new LongDataEntry(key, proto.getLongV()); + break; + case DOUBLE: + entry = new DoubleDataEntry(key, proto.getDoubleV()); + break; + case STRING: + entry = new StringDataEntry(key, proto.getStringV()); + break; + case JSON: + entry = new JsonDataEntry(key, proto.getJsonV()); + break; + } + return entry; + } + public static ToCoreMsg toAlarmUpdateProto(TenantId tenantId, EntityId entityId, AlarmInfo alarm) { TbAlarmUpdateProto.Builder builder = TbAlarmUpdateProto.newBuilder(); builder.setEntityType(entityId.getEntityType().name()); @@ -382,23 +375,6 @@ public class TbSubscriptionUtils { return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder.build()).build(); } - public static ToCoreNotificationMsg notificationsSubUpdateToProto(TbSubscription subscription, NotificationsSubscriptionUpdate update) { - TransportProtos.NotificationsSubscriptionUpdateProto.Builder updateProto = TransportProtos.NotificationsSubscriptionUpdateProto.newBuilder() - .setSessionId(subscription.getSessionId()) - .setSubscriptionId(subscription.getSubscriptionId()); - if (update.getNotificationUpdate() != null) { - updateProto.setNotificationUpdate(JacksonUtil.toString(update.getNotificationUpdate())); - } - if (update.getNotificationRequestUpdate() != null) { - updateProto.setNotificationRequestUpdate(JacksonUtil.toString(update.getNotificationRequestUpdate())); - } - return ToCoreNotificationMsg.newBuilder() - .setToLocalSubscriptionServiceMsg(TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() - .setNotificationsSubUpdate(updateProto) - .build()) - .build(); - } - public static ToCoreMsg notificationUpdateToProto(TenantId tenantId, UserId recipientId, NotificationUpdate notificationUpdate) { TransportProtos.NotificationUpdateProto updateProto = TransportProtos.NotificationUpdateProto.newBuilder() .setTenantIdMSB(tenantId.getId().getMostSignificantBits()) @@ -427,4 +403,40 @@ public class TbSubscriptionUtils { .build(); } + public static List fromProto(TransportProtos.TbSubUpdateProto proto) { + List result = new ArrayList<>(); + for (var p : proto.getDataList()) { + result.addAll(toTsKvEntityList(p.getKey(), p.getTsValueList())); + } + return result; + } + + static ToCoreNotificationMsg toProto(boolean timeSeries, EntityId entityId, List updates) { + TransportProtos.TbSubUpdateProto.Builder builder = TransportProtos.TbSubUpdateProto.newBuilder(); + + builder.setEntityIdMSB(entityId.getId().getMostSignificantBits()); + builder.setEntityIdLSB(entityId.getId().getLeastSignificantBits()); + + Map> data = new TreeMap<>(); + + for (TsKvEntry tsEntry : updates) { + data.computeIfAbsent(tsEntry.getKey(), k -> new ArrayList<>()).add(toTsValueProto(tsEntry.getTs(), tsEntry)); + } + + data.forEach((key, value) -> { + TransportProtos.TsValueListProto.Builder dataBuilder = TransportProtos.TsValueListProto.newBuilder(); + dataBuilder.setKey(key); + dataBuilder.addAllTsValue(value); + builder.addData(dataBuilder.build()); + }); + + var result = TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder(); + if (timeSeries) { + result.setTsUpdate(builder); + } else { + result.setAttrUpdate(builder); + } + return ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg(result).build(); + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java new file mode 100644 index 0000000000..93b1fb0857 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java @@ -0,0 +1,56 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Information about the local websocket subscriptions. + */ +@RequiredArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(exclude = {"seqNumber"}) +@ToString +public class TbSubscriptionsInfo { + + protected boolean notifications; + protected boolean alarms; + protected boolean tsAllKeys; + protected Set tsKeys; + protected boolean attrAllKeys; + protected Set attrKeys; + protected int seqNumber; + + public boolean isEmpty() { + return !notifications && !alarms && !tsAllKeys && !attrAllKeys && tsKeys == null && attrKeys == null; + } + + protected TbSubscriptionsInfo copy() { + return copy(0); + } + + protected TbSubscriptionsInfo copy(int seqNumber) { + return new TbSubscriptionsInfo(notifications, alarms, tsAllKeys, tsKeys, attrAllKeys, attrKeys, seqNumber); + } + +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeseriesSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeSeriesSubscription.java similarity index 84% rename from application/src/main/java/org/thingsboard/server/service/subscription/TbTimeseriesSubscription.java rename to application/src/main/java/org/thingsboard/server/service/subscription/TbTimeSeriesSubscription.java index 400cf07e7e..d3ebe4cd3f 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeseriesSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeSeriesSubscription.java @@ -24,8 +24,10 @@ import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpda import java.util.Map; import java.util.function.BiConsumer; -public class TbTimeseriesSubscription extends TbSubscription { +public class TbTimeSeriesSubscription extends TbSubscription { + @Getter + private final long queryTs; @Getter private final boolean allKeys; @Getter @@ -38,10 +40,11 @@ public class TbTimeseriesSubscription extends TbSubscription, TelemetrySubscriptionUpdate> updateProcessor, - boolean allKeys, Map keyStates, long startTime, long endTime, boolean latestValues) { + long queryTs, boolean allKeys, Map keyStates, long startTime, long endTime, boolean latestValues) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.TIMESERIES, updateProcessor); + this.queryTs = queryTs; this.allKeys = allKeys; this.keyStates = keyStates; this.startTime = startTime; diff --git a/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java b/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java index 21d69d6b42..d0334f90b6 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java @@ -62,7 +62,7 @@ import org.thingsboard.server.service.subscription.TbAttributeSubscription; import org.thingsboard.server.service.subscription.TbAttributeSubscriptionScope; import org.thingsboard.server.service.subscription.TbEntityDataSubscriptionService; import org.thingsboard.server.service.subscription.TbLocalSubscriptionService; -import org.thingsboard.server.service.subscription.TbTimeseriesSubscription; +import org.thingsboard.server.service.subscription.TbTimeSeriesSubscription; import org.thingsboard.server.service.ws.notification.NotificationCommandsHandler; import org.thingsboard.server.service.ws.notification.cmd.NotificationCmdsWrapper; import org.thingsboard.server.service.ws.notification.cmd.WsCmd; @@ -443,7 +443,7 @@ public class DefaultWebSocketService implements WebSocketService { } } } catch (IOException e) { - log.warn("[{}] Failed to send session close: {}", sessionRef.getSessionId(), e); + log.warn("[{}] Failed to send session close:", sessionRef.getSessionId(), e); return false; } return true; @@ -477,6 +477,7 @@ public class DefaultWebSocketService implements WebSocketService { private void handleWsAttributesSubscriptionByKeys(WebSocketSessionRef sessionRef, AttributesSubscriptionCmd cmd, String sessionId, EntityId entityId, List keys) { + long queryTs = System.currentTimeMillis(); FutureCallback> callback = new FutureCallback<>() { @Override public void onSuccess(List data) { @@ -495,6 +496,7 @@ public class DefaultWebSocketService implements WebSocketService { .subscriptionId(cmd.getCmdId()) .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityId) + .queryTs(queryTs) .allKeys(false) .keyStates(subState) .scope(scope) @@ -591,7 +593,10 @@ public class DefaultWebSocketService implements WebSocketService { } private void handleWsAttributesSubscription(WebSocketSessionRef sessionRef, - AttributesSubscriptionCmd cmd, String sessionId, EntityId entityId) { + AttributesSubscriptionCmd cmd, + String sessionId, + EntityId entityId) { + long queryTs = System.currentTimeMillis(); FutureCallback> callback = new FutureCallback<>() { @Override public void onSuccess(List data) { @@ -609,6 +614,7 @@ public class DefaultWebSocketService implements WebSocketService { .subscriptionId(cmd.getCmdId()) .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityId) + .queryTs(queryTs) .allKeys(true) .keyStates(subState) .updateProcessor((subscription, update) -> { @@ -664,17 +670,18 @@ public class DefaultWebSocketService implements WebSocketService { Optional> keysOptional = getKeys(cmd); if (keysOptional.isPresent()) { - handleWsTimeseriesSubscriptionByKeys(sessionRef, cmd, sessionId, entityId); + handleWsTimeSeriesSubscriptionByKeys(sessionRef, cmd, sessionId, entityId); } else { - handleWsTimeseriesSubscription(sessionRef, cmd, sessionId, entityId); + handleWsTimeSeriesSubscription(sessionRef, cmd, sessionId, entityId); } } } } - private void handleWsTimeseriesSubscriptionByKeys(WebSocketSessionRef sessionRef, + private void handleWsTimeSeriesSubscriptionByKeys(WebSocketSessionRef sessionRef, TimeseriesSubscriptionCmd cmd, String sessionId, EntityId entityId) { long startTs; + long queryTs = System.currentTimeMillis(); if (cmd.getTimeWindow() > 0) { List keys = new ArrayList<>(getKeys(cmd).orElse(Collections.emptySet())); log.debug("[{}] fetching timeseries data for last {} ms for keys: ({}) for device : {}", sessionId, cmd.getTimeWindow(), cmd.getKeys(), entityId); @@ -682,22 +689,22 @@ public class DefaultWebSocketService implements WebSocketService { long endTs = cmd.getStartTs() + cmd.getTimeWindow(); List queries = keys.stream().map(key -> new BaseReadTsKvQuery(key, startTs, endTs, cmd.getInterval(), getLimit(cmd.getLimit()), getAggregation(cmd.getAgg()))).collect(Collectors.toList()); - - final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, startTs, keys); + final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, queryTs, startTs, keys); accessValidator.validate(sessionRef.getSecurityCtx(), Operation.READ_TELEMETRY, entityId, on(r -> Futures.addCallback(tsService.findAll(sessionRef.getSecurityCtx().getTenantId(), entityId, queries), callback, executor), callback::onFailure)); } else { List keys = new ArrayList<>(getKeys(cmd).orElse(Collections.emptySet())); startTs = System.currentTimeMillis(); log.debug("[{}] fetching latest timeseries data for keys: ({}) for device : {}", sessionId, cmd.getKeys(), entityId); - final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, startTs, keys); + final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, queryTs, startTs, keys); accessValidator.validate(sessionRef.getSecurityCtx(), Operation.READ_TELEMETRY, entityId, on(r -> Futures.addCallback(tsService.findLatest(sessionRef.getSecurityCtx().getTenantId(), entityId, keys), callback, executor), callback::onFailure)); } } - private void handleWsTimeseriesSubscription(WebSocketSessionRef sessionRef, + private void handleWsTimeSeriesSubscription(WebSocketSessionRef sessionRef, TimeseriesSubscriptionCmd cmd, String sessionId, EntityId entityId) { + long queryTs = System.currentTimeMillis(); FutureCallback> callback = new FutureCallback>() { @Override public void onSuccess(List data) { @@ -705,7 +712,7 @@ public class DefaultWebSocketService implements WebSocketService { data.forEach(v -> subState.put(v.getKey(), v.getTs())); Lock subLock = new ReentrantLock(); - TbTimeseriesSubscription sub = TbTimeseriesSubscription.builder() + TbTimeSeriesSubscription sub = TbTimeSeriesSubscription.builder() .serviceId(serviceId) .sessionId(sessionId) .subscriptionId(cmd.getCmdId()) @@ -719,6 +726,7 @@ public class DefaultWebSocketService implements WebSocketService { subLock.unlock(); } }) + .queryTs(queryTs) .allKeys(true) .keyStates(subState) .build(); @@ -749,7 +757,8 @@ public class DefaultWebSocketService implements WebSocketService { on(r -> Futures.addCallback(tsService.findAllLatest(sessionRef.getSecurityCtx().getTenantId(), entityId), callback, executor), callback::onFailure)); } - private FutureCallback> getSubscriptionCallback(final WebSocketSessionRef sessionRef, final TimeseriesSubscriptionCmd cmd, final String sessionId, final EntityId entityId, final long startTs, final List keys) { + private FutureCallback> getSubscriptionCallback(final WebSocketSessionRef sessionRef, final TimeseriesSubscriptionCmd cmd, + final String sessionId, final EntityId entityId, final long queryTs, final long startTs, final List keys) { return new FutureCallback<>() { @Override public void onSuccess(List data) { @@ -758,7 +767,7 @@ public class DefaultWebSocketService implements WebSocketService { data.forEach(v -> subState.put(v.getKey(), v.getTs())); Lock subLock = new ReentrantLock(); - TbTimeseriesSubscription sub = TbTimeseriesSubscription.builder() + TbTimeSeriesSubscription sub = TbTimeSeriesSubscription.builder() .serviceId(serviceId) .sessionId(sessionId) .subscriptionId(cmd.getCmdId()) @@ -772,6 +781,7 @@ public class DefaultWebSocketService implements WebSocketService { subLock.unlock(); } }) + .queryTs(queryTs) .allKeys(false) .keyStates(subState) .build(); diff --git a/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java b/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java index 012808b253..0937275a0d 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java @@ -32,6 +32,7 @@ import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.subscription.TbLocalSubscriptionService; +import org.thingsboard.server.service.subscription.TbSubscription; import org.thingsboard.server.service.ws.WebSocketService; import org.thingsboard.server.service.ws.WebSocketSessionRef; import org.thingsboard.server.service.ws.notification.cmd.MarkAllNotificationsAsReadCmd; @@ -119,7 +120,8 @@ public class DefaultNotificationCommandsHandler implements NotificationCommandsH /* Notifications subscription update handling */ - private void handleNotificationsSubscriptionUpdate(NotificationsSubscription subscription, NotificationsSubscriptionUpdate subscriptionUpdate) { + private void handleNotificationsSubscriptionUpdate(TbSubscription sub, NotificationsSubscriptionUpdate subscriptionUpdate) { + NotificationsSubscription subscription = (NotificationsSubscription) sub; try { if (subscriptionUpdate.getNotificationUpdate() != null) { handleNotificationUpdate(subscription, subscriptionUpdate.getNotificationUpdate()); @@ -178,7 +180,8 @@ public class DefaultNotificationCommandsHandler implements NotificationCommandsH /* Notifications count subscription update handling */ - private void handleNotificationsCountSubscriptionUpdate(NotificationsCountSubscription subscription, NotificationsSubscriptionUpdate subscriptionUpdate) { + private void handleNotificationsCountSubscriptionUpdate(TbSubscription sub, NotificationsSubscriptionUpdate subscriptionUpdate) { + NotificationsCountSubscription subscription = (NotificationsCountSubscription) sub; try { if (subscriptionUpdate.getNotificationUpdate() != null) { handleNotificationUpdate(subscription, subscriptionUpdate.getNotificationUpdate()); diff --git a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java index cb5d140d21..5263f9d651 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java @@ -33,7 +33,7 @@ public class NotificationsCountSubscription extends TbSubscription updateProcessor) { + BiConsumer, NotificationsSubscriptionUpdate> updateProcessor) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.NOTIFICATIONS_COUNT, updateProcessor); } diff --git a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java index 591781a5f6..ede82f9ff7 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java @@ -43,7 +43,7 @@ public class NotificationsSubscription extends TbSubscription updateProcessor, + BiConsumer, NotificationsSubscriptionUpdate> updateProcessor, int limit) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.NOTIFICATIONS, updateProcessor); this.limit = limit; diff --git a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java index 90041ffa13..66d18b24b2 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java @@ -16,13 +16,13 @@ package org.thingsboard.server.service.ws.telemetry.sub; import lombok.Getter; +import lombok.ToString; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.service.subscription.SubscriptionErrorCode; +@ToString public class AlarmSubscriptionUpdate { - @Getter - private int subscriptionId; @Getter private int errorCode; @Getter @@ -32,31 +32,24 @@ public class AlarmSubscriptionUpdate { @Getter private boolean alarmDeleted; - public AlarmSubscriptionUpdate(int subscriptionId, AlarmInfo alarm) { - this(subscriptionId, alarm, false); + public AlarmSubscriptionUpdate(AlarmInfo alarm) { + this(alarm, false); } - public AlarmSubscriptionUpdate(int subscriptionId, AlarmInfo alarm, boolean alarmDeleted) { + public AlarmSubscriptionUpdate(AlarmInfo alarm, boolean alarmDeleted) { super(); - this.subscriptionId = subscriptionId; this.alarm = alarm; this.alarmDeleted = alarmDeleted; } - public AlarmSubscriptionUpdate(int subscriptionId, SubscriptionErrorCode errorCode) { - this(subscriptionId, errorCode, null); + public AlarmSubscriptionUpdate(SubscriptionErrorCode errorCode) { + this(errorCode, null); } - public AlarmSubscriptionUpdate(int subscriptionId, SubscriptionErrorCode errorCode, String errorMsg) { + public AlarmSubscriptionUpdate(SubscriptionErrorCode errorCode, String errorMsg) { super(); - this.subscriptionId = subscriptionId; this.errorCode = errorCode.getCode(); this.errorMsg = errorMsg != null ? errorMsg : errorCode.getDefaultMsg(); } - @Override - public String toString() { - return "AlarmUpdate [subscriptionId=" + subscriptionId + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + - ", alarm=" + alarm + "]"; - } } \ No newline at end of file diff --git a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java index 108c5cf1d4..cea1731a31 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java @@ -19,6 +19,7 @@ import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.service.subscription.SubscriptionErrorCode; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -27,7 +28,7 @@ import java.util.stream.Collectors; public class TelemetrySubscriptionUpdate { - private int subscriptionId; + private final int subscriptionId; private int errorCode; private String errorMsg; private Map> data; @@ -94,7 +95,14 @@ public class TelemetrySubscriptionUpdate { @Override public String toString() { - return "TsSubscriptionUpdate [subscriptionId=" + subscriptionId + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + ", data=" - + data + "]"; + StringBuilder result = new StringBuilder("TelemetrySubscriptionUpdate [subscriptionId=" + subscriptionId + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + ", data="); + data.forEach((k, v) -> { + result.append(k).append("=["); + for(Object a : v){ + result.append(Arrays.toString((Object[])a)).append("|"); + } + result.append("]"); + }); + return result.toString(); } } diff --git a/application/src/test/resources/logback-test.xml b/application/src/test/resources/logback-test.xml index 981bcab132..3d0ce3f933 100644 --- a/application/src/test/resources/logback-test.xml +++ b/application/src/test/resources/logback-test.xml @@ -38,6 +38,8 @@ + + diff --git a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java index e81aaed39d..d2cbde34e4 100644 --- a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java +++ b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java @@ -33,6 +33,7 @@ import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse; import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; +import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; @@ -40,6 +41,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToVersionControlServ import org.thingsboard.server.queue.TbQueueCallback; import org.thingsboard.server.queue.TbQueueClusterService; +import java.util.List; import java.util.UUID; public interface TbClusterService extends TbQueueClusterService { @@ -50,6 +52,8 @@ public interface TbClusterService extends TbQueueClusterService { void pushMsgToCore(ToDeviceActorNotificationMsg msg, TbQueueCallback callback); + void broadcastToCore(TransportProtos.ToCoreNotificationMsg msg); + void pushMsgToVersionControl(TenantId tenantId, ToVersionControlServiceMsg msg, TbQueueCallback callback); void pushNotificationToCore(String targetServiceId, FromDeviceRpcResponse response, TbQueueCallback callback); diff --git a/common/cluster-api/src/main/proto/queue.proto b/common/cluster-api/src/main/proto/queue.proto index 60dfcae1de..db9528897f 100644 --- a/common/cluster-api/src/main/proto/queue.proto +++ b/common/cluster-api/src/main/proto/queue.proto @@ -246,6 +246,12 @@ message QueueDeleteMsg { string queueName = 5; } +message CoreStartupMsg { + string serviceId = 1; + repeated int32 partitions = 2; + int64 ts = 3; +} + message LwM2MRegistrationRequestMsg { string tenantId = 1; string endpoint = 2; @@ -531,6 +537,71 @@ message TransportToRuleEngineMsg { * TB Core Data Structures */ +message TbEntitySubEventProto { + string serviceId = 1; + int32 seqNumber = 2; + int64 tenantIdMSB = 3; + int64 tenantIdLSB = 4; + string entityType = 5; + int64 entityIdMSB = 6; + int64 entityIdLSB = 7; + string type = 8; + bool notifications = 9; + bool alarms = 10; + bool tsAllKeys = 11; + repeated string tsKeys = 12; + bool attrAllKeys = 13; + repeated string attrKeys = 14; +} + +message TbEntitySubEventCallbackProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + int32 seqNumber = 3; + int64 attributesUpdateTs = 4; + int64 timeSeriesUpdateTs = 5; +} + +message TsValueProto { + int64 ts = 1; + KeyValueType type = 2; + bool bool_v = 3; + int64 long_v = 4; + double double_v = 5; + string string_v = 6; + string json_v = 7; +} + +message TsValueListProto { + string key = 1; + repeated TsValueProto tsValue = 2; +} + +message TbSubUpdateProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + int32 errorCode = 3; + string errorMsg = 4; + repeated TsValueListProto data = 5; +} + +message TbAlarmSubUpdateProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + int32 errorCode = 3; + string errorMsg = 4; + string alarm = 5; + bool deleted = 6; +} + +message NotificationsSubUpdateProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + string notificationUpdate = 3; + string notificationRequestUpdate = 4; +} + +// DEPRECATED. FOR REMOVAL message TbSubscriptionProto { string serviceId = 1; string sessionId = 2; @@ -542,6 +613,7 @@ message TbSubscriptionProto { int64 entityIdLSB = 8; } +// DEPRECATED. FOR REMOVAL message TbTimeSeriesSubscriptionProto { TbSubscriptionProto sub = 1; bool allKeys = 2; @@ -551,6 +623,7 @@ message TbTimeSeriesSubscriptionProto { bool latestValues = 6; } +// DEPRECATED. FOR REMOVAL message TbAttributeSubscriptionProto { TbSubscriptionProto sub = 1; bool allKeys = 2; @@ -558,20 +631,24 @@ message TbAttributeSubscriptionProto { string scope = 4; } +// DEPRECATED. FOR REMOVAL message TbAlarmSubscriptionProto { TbSubscriptionProto sub = 1; int64 ts = 2; } +// DEPRECATED. FOR REMOVAL message NotificationsSubscriptionProto { TbSubscriptionProto sub = 1; int32 limit = 2; } +// DEPRECATED. FOR REMOVAL message NotificationsCountSubscriptionProto { TbSubscriptionProto sub = 1; } +// DEPRECATED. FOR REMOVAL message TbSubscriptionUpdateProto { string sessionId = 1; int32 subscriptionId = 2; @@ -580,6 +657,7 @@ message TbSubscriptionUpdateProto { repeated TbSubscriptionUpdateValueListProto data = 5; } +// DEPRECATED. FOR REMOVAL message TbAlarmSubscriptionUpdateProto { string sessionId = 1; int32 subscriptionId = 2; @@ -589,6 +667,7 @@ message TbAlarmSubscriptionUpdateProto { bool deleted = 6; } +// DEPRECATED. FOR REMOVAL message NotificationsSubscriptionUpdateProto { string sessionId = 1; int32 subscriptionId = 2; @@ -667,6 +746,7 @@ message TbTimeSeriesUpdateProto { repeated TsKvProto data = 6; } +// DEPRECATED. FOR REMOVAL message TbSubscriptionCloseProto { string sessionId = 1; int32 subscriptionId = 2; @@ -702,26 +782,32 @@ message DeviceStateServiceMsgProto { } message SubscriptionMgrMsgProto { - TbTimeSeriesSubscriptionProto telemetrySub = 1; - TbAttributeSubscriptionProto attributeSub = 2; - TbSubscriptionCloseProto subClose = 3; + TbTimeSeriesSubscriptionProto telemetrySub = 1; // DEPRECATED. FOR REMOVAL + TbAttributeSubscriptionProto attributeSub = 2; // DEPRECATED. FOR REMOVAL + TbSubscriptionCloseProto subClose = 3; // DEPRECATED. FOR REMOVAL TbTimeSeriesUpdateProto tsUpdate = 4; TbAttributeUpdateProto attrUpdate = 5; TbAttributeDeleteProto attrDelete = 6; - TbAlarmSubscriptionProto alarmSub = 7; + TbAlarmSubscriptionProto alarmSub = 7; // DEPRECATED. FOR REMOVAL TbAlarmUpdateProto alarmUpdate = 8; TbAlarmDeleteProto alarmDelete = 9; TbTimeSeriesDeleteProto tsDelete = 10; - NotificationsSubscriptionProto notificationsSub = 11; - NotificationsCountSubscriptionProto notificationsCountSub = 12; + NotificationsSubscriptionProto notificationsSub = 11; // DEPRECATED. FOR REMOVAL + NotificationsCountSubscriptionProto notificationsCountSub = 12; // DEPRECATED. FOR REMOVAL NotificationUpdateProto notificationUpdate = 13; NotificationRequestUpdateProto notificationRequestUpdate = 14; + TbEntitySubEventProto subEvent = 15; } message LocalSubscriptionServiceMsgProto { - TbSubscriptionUpdateProto subUpdate = 1; - TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2; - NotificationsSubscriptionUpdateProto notificationsSubUpdate = 3; + TbSubscriptionUpdateProto subUpdate = 1; // DEPRECATED. FOR REMOVAL + TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2; // DEPRECATED. FOR REMOVAL + NotificationsSubscriptionUpdateProto notificationsSubUpdate = 3; // DEPRECATED. FOR REMOVAL + TbEntitySubEventCallbackProto subEventCallback = 4; + TbSubUpdateProto tsUpdate = 5; + TbSubUpdateProto attrUpdate = 6; + TbAlarmSubUpdateProto alarmUpdate = 7; + NotificationsSubUpdateProto notificationsUpdate = 8; } message FromDeviceRPCResponseProto { @@ -992,6 +1078,7 @@ message ToCoreNotificationMsg { bytes fromEdgeSyncResponseMsg = 9; SubscriptionMgrMsgProto toSubscriptionMgrMsg = 10; NotificationRuleProcessorMsg notificationRuleProcessorMsg = 11; + CoreStartupMsg coreStartupMsg = 12; } /* Messages that are handled by ThingsBoard RuleEngine Service */ diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index 5be5caf6ff..7afc40f2c2 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -118,6 +118,11 @@ public class HashPartitionService implements PartitionService { } } + @Override + public List getMyPartitions(QueueKey queueKey) { + return myPartitions.get(queueKey); + } + private void doInitRuleEnginePartitions() { List queueRoutingInfoList = getQueueRoutingInfos(); queueRoutingInfoList.forEach(queue -> { diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java index b55ba79f67..fe06db789b 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java @@ -37,6 +37,8 @@ public interface PartitionService { boolean isMyPartition(ServiceType serviceType, TenantId tenantId, EntityId entityId); + List getMyPartitions(QueueKey queueKey); + /** * Received from the Discovery service when network topology is changed. * @param currentService - current service information {@link org.thingsboard.server.gen.transport.TransportProtos.ServiceInfo} diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java index e99817de17..d94ff082d1 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java @@ -35,10 +35,12 @@ import org.apache.zookeeper.KeeperException; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.discovery.event.OtherServiceShutdownEvent; import org.thingsboard.server.queue.util.AfterStartUp; import javax.annotation.PostConstruct; @@ -74,6 +76,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi protected final ConcurrentHashMap> delayedTasks; + private final ApplicationEventPublisher applicationEventPublisher; private final TbServiceInfoProvider serviceInfoProvider; private final PartitionService partitionService; @@ -85,8 +88,10 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi private volatile boolean stopped = true; - public ZkDiscoveryService(TbServiceInfoProvider serviceInfoProvider, + public ZkDiscoveryService(ApplicationEventPublisher applicationEventPublisher, + TbServiceInfoProvider serviceInfoProvider, PartitionService partitionService) { + this.applicationEventPublisher = applicationEventPublisher; this.serviceInfoProvider = serviceInfoProvider; this.partitionService = partitionService; delayedTasks = new ConcurrentHashMap<>(); @@ -141,9 +146,11 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi return; } log.info("Going to publish current server..."); - zkExecutorService.scheduleAtFixedRate(this::publishCurrentServer, 0, 1, TimeUnit.MINUTES); + publishCurrentServer(); log.info("Going to recalculate partitions..."); recalculatePartitions(); + + zkExecutorService.scheduleAtFixedRate(this::publishCurrentServer, 1, 1, TimeUnit.MINUTES); } @SneakyThrows @@ -319,6 +326,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi } break; case CHILD_REMOVED: + zkExecutorService.submit(() -> applicationEventPublisher.publishEvent(new OtherServiceShutdownEvent(this, serviceId, serviceTypesList))); ScheduledFuture future = zkExecutorService.schedule(() -> { log.debug("[{}] Going to recalculate partitions due to removed node [{}]", serviceId, serviceTypesList); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java new file mode 100644 index 0000000000..5de09696c6 --- /dev/null +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java @@ -0,0 +1,41 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.queue.discovery.event; + +import com.google.protobuf.ProtocolStringList; +import lombok.Getter; +import org.thingsboard.server.common.msg.queue.ServiceType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class OtherServiceShutdownEvent extends TbApplicationEvent { + + private static final long serialVersionUID = -2441739930040282254L; + + @Getter + private final String serviceId; + @Getter + private final Set serviceTypes; + + public OtherServiceShutdownEvent(Object source, String serviceId, List serviceTypes) { + super(source); + this.serviceId = serviceId; + this.serviceTypes = serviceTypes.stream().map(ServiceType::valueOf).collect(Collectors.toSet()); + } +} diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java b/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java index e000735fba..d235acb4fa 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java @@ -34,6 +34,7 @@ public @interface AfterStartUp { int QUEUE_INFO_INITIALIZATION = 1; int DISCOVERY_SERVICE = 2; + int STARTUP_SERVICE = 8; int ACTOR_SYSTEM = 9; int REGULAR_SERVICE = 10; diff --git a/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java b/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java index a8810efd0e..3af4683ab3 100644 --- a/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java +++ b/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java @@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.util.ReflectionTestUtils; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.gen.transport.TransportProtos; @@ -51,6 +52,8 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ZkDiscoveryServiceTest { + @Mock + private ApplicationEventPublisher applicationEventPublisher; @Mock private TbServiceInfoProvider serviceInfoProvider; @@ -77,7 +80,7 @@ public class ZkDiscoveryServiceTest { @Before public void setup() { - zkDiscoveryService = Mockito.spy(new ZkDiscoveryService(serviceInfoProvider, partitionService)); + zkDiscoveryService = Mockito.spy(new ZkDiscoveryService(applicationEventPublisher, serviceInfoProvider, partitionService)); ScheduledExecutorService zkExecutorService = Executors.newSingleThreadScheduledExecutor(ThingsBoardThreadFactory.forName("zk-discovery")); when(client.getState()).thenReturn(CuratorFrameworkState.STARTED); ReflectionTestUtils.setField(zkDiscoveryService, "stopped", false); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index 4cf6db0fc1..fdf537a817 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.sql.query; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; From 5c58241a123ba28bd17b5751d6f8be408f92e54b Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 26 Oct 2023 17:29:29 +0300 Subject: [PATCH 18/39] UI: Indoor Environment: Illuminance widgets. --- .../widget_bundles/indoor_environment.json | 12 ++++++- .../indoor_horizontal_illuminance_card.json | 28 +++++++++++++++++ ...ntal_illuminance_card_with_background.json | 28 +++++++++++++++++ .../widget_types/indoor_illuminance_card.json | 28 +++++++++++++++++ ...door_illuminance_card_with_background.json | 28 +++++++++++++++++ .../indoor_illuminance_chart_card.json | 31 +++++++++++++++++++ ...lluminance_chart_card_with_background.json | 31 +++++++++++++++++++ .../indoor_illuminance_progress_bar.json | 29 +++++++++++++++++ ...uminance_progress_bar_with_background.json | 29 +++++++++++++++++ .../indoor_simple_illuminance_chart_card.json | 31 +++++++++++++++++++ ...lluminance_chart_card_with_background.json | 31 +++++++++++++++++++ 11 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_illuminance_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 78ed32295d..019d1cf3f5 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -35,6 +35,16 @@ "indoor_co2_chart_card", "indoor_co2_chart_card_with_background", "indoor_simple_co2_chart_card", - "indoor_simple_co2_chart_card_with_background" + "indoor_simple_co2_chart_card_with_background", + "indoor_illuminance_card", + "indoor_illuminance_card_with_background", + "indoor_horizontal_illuminance_card", + "indoor_horizontal_illuminance_card_with_background", + "indoor_illuminance_chart_card", + "indoor_illuminance_chart_card_with_background", + "indoor_simple_illuminance_chart_card", + "indoor_simple_illuminance_chart_card_with_background", + "indoor_illuminance_progress_bar", + "indoor_illuminance_progress_bar_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json new file mode 100644 index 0000000000..b0fb560e4a --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_horizontal_illuminance_card", + "name": "Indoor horizontal illuminance card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADg4ODf39/g4ODg4OD////g4ODzaQD7x6D2jkD82r/x8fH+7N+srKz+9u/Ozs6QkJD0fCDIyMg9PT35tIDz8/P5+fnb29u3t7d0dHTj4+PCwsL3oWD0chC8vLz4q3Dn5+f0eyD9489mZmbV1dX9/f31hTD70K/U1NRYWFj3l1D6vZCdnZ1LS0s8PDwvLy8hISH6vpCCgoLwemShAAAABXRSTlMA7yC/r1EOHTEAAANOSURBVHja7dqLbqJAGIZhtf38OSMIogIi6mrVdk/3f3E7DN1l27V1jcag+R4bMgxJM28GqYntEBEREREREREREREREREREREREREREdHJeg/d/q177KmOrv0FN+6L3e11Hm3cAfuh07/5/ah86Xb6uAt9hrQMQ9qGIW3DkLY5HFIEuDWHQzLB38ZT1w1dNOwB2uZ9iJd56mhkUPYL1CbhYOAObBtTTPURrh7AttWPOsW0PrmMjeGo48LQquVYP6INXlli/leIIWsPtUjMv0PUC0N8m3xdLpf1IHzeLl33ZTnEz+V2Oth+DXEJhoih7wrNqRaiBN5pIYgieNFunS2wML1/Q75j4E6HqF4TdzpYTtwJhvYQq+mL+3OCC3CCOsSUfb0jlpTWYifFiSH6N1UiKJ+HbGfPTchwHE5xAYUEOmQtqGXVqSd5E+I5XrVO50hIIDXrXcjqZfntbcjzdqtDMFi+TJ+HSxfnc6QwdYjk8ABdZOlVOX9CLMk9GFJ6n4YYUjuwhfaHE3Z9uICgdMzXLchFdo5O0CFWc2sVEqHatw9DfpgFCvkNlmniyiIxoEMcybOilOBgiJfnkWT4OCRSIVkTsrl6iCMZ6hB4TrVgsQ6FYF8/z064ta4skMgw1pJtUMskOhji5LLGkRCvlJqBq/PkVQDLcFC/GUypsnLxmhAVmIt19PFbvn/8xjggtt9PxDibVVlLscBedq/7EEkBLKREE+JIaUjgHQnBRpQdGuM6JoadQBuNMOr71UQfIwBzd45RktQX1MR5SfVTq5QsMqvle7kaBWquCanOdhIdC1mIkr0NWa38JAx9NUqRJulsNE791Sr0Z7Y/GwH+PJ7NEsS+vuCHs7ND4JgiYupPXaVIvkcTEkmp3yaLIyHYGIbhvA15ehrHoT/365D5U6LGam6e+GmoQ/pJokLC2TyMVW4a43z6D7jm6NHpH+Mt0yzwF9dPUn+8CtO42hF/lqTjeBz6as5WC/dRhYyqHZnP3OrCKk1xDcdD1kGBTyRzfOwpTHB9OuRko9FnF2P8j1aEtBFD2oYhbcOQtrmjkO59fBna7zzcx9fTj/fzDwOd3mP/1nUfeh0iIiIiIiIiIiIiIiIiIiIiIiIiIiIiOtUvJ7/Ykm8IwzsAAAAASUVORK5CYII=", + "description": "Displays a latest indoor illuminance telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'illuminance', label: 'Illuminance', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:lightbulb-on\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor horizontal illuminance card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"lx\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json new file mode 100644 index 0000000000..a13e99ccf2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_horizontal_illuminance_card_with_background", + "name": "Indoor horizontal illuminance card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC91BMVEUAAADR0dTPz8/67+uzt7zS09b37+ezs7v67+vS0tbPz9K0uLv27ui2ub/Pz9f+//7+/vz++vjw8PD//Pn08fD3dBDz8PD+/Pv//frv8fL28vH18vL18/T/+/j8/fn8+ffu7/H8+PX39fT69/b39PP08/Tz8vP9+fXIyMj8/Pft7vD8/f7x8vTx8fL29vf59PL89/T38/H9+PP69vT59fS9vL/w7u62ur78/fv79fLz7+3v7e36+fn7+Pf28e6/ub35+Pf8+/rU1Nby7+/++/bLwL/W1di7u74XFxnKwsXCu77Y19nGvb7+8+i6vcG5ur65tbrNxMe8t7vh3dz19fXNztLLysvPzMr+9u7t6ejS0tXJyc3Xzszs7e346+HUzMu0s7f49vf+9Oz57+vX1dTKycjNw8LDvr/y9PXk4d/j393o3trc19X09ffq5uTs4Nv8+/X68u/07Ono5OLT0dHMyci+vsD4hSzj2tjd2djRzsz8+/T99+zv6+r77eLm4uHNzM25u7+2tbnd293Ky8/Gx8v37unCxMizt72wtbz9+vHy6efc19ra1dg9Ojn++PH26eDQ0dPGxci/wsb//vzr6Obn5OXf29rIzdTHyczh3+Hg2NXY09H617zl4OK8wMQeHh/v5+X05972k0j57eba2dvN1NvGwMG6trWJiYnW1tmko6P4xZ78+fns4+S8urrywJv5lUn3fB39+vTw49xycG/77+bn4t/55dbX0NHFy9HUyMfIxcTBvLuppaT2pGXk6OrU2+Hs49/2rHNISUr++ffg3OD97tvc1c/6toJjYmL54s782b/quJJXU1Lx3c7o1sqvrazzs4KCfXz2girm29Pg0MS2tLK0r66ynJT3jDorLS7b4unw5+D86Nnz49m/x87JvbfCsqmQi4psa22Jh4b3nFZBQ0U5OTvWxb7z07vaw7L3zK2al5b3vI/wnmCHbmBhW1kvJiPx2ceMd2u3pZudhXryj0NQOjDoybKmnpzvrHnGrZrE1aY2AAAAD3RSTlMA7yDv768gIL+/v7+wryBdcwczAAARbElEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJg9OlZpGIjjOK6iOIi+zXHjQSC55gy5JGMotIPk3iB7sxiht2Ry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", + "description": "Displays a latest indoor illuminance telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'illuminance', label: 'Illuminance', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:lightbulb-on\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor horizontal illuminance card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"lx\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json new file mode 100644 index 0000000000..6f9c866f4a --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_illuminance_card", + "name": "Indoor illuminance card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor illuminance telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'illuminance', label: 'Illuminance', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\\n\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:lightbulb-on\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":52,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Illuminance card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"lx\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json new file mode 100644 index 0000000000..7e215b854c --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json @@ -0,0 +1,28 @@ +{ + "fqn": "indoor_illuminance_card_with_background", + "name": "Indoor illuminance card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor illuminance telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'illuminance', label: 'Illuminance', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\\n\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:lightbulb-on\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":52,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Illuminance card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"lx\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json new file mode 100644 index 0000000000..10faf304eb --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_illuminance_chart_card", + "name": "Indoor illuminance chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor illuminance data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'illuminance', label: 'Illuminance', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'lx', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'illuminance', 'lx', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"lx\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"lx\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 12 - 6;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"lx\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Illuminance\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:lightbulb-on\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json new file mode 100644 index 0000000000..cd4941c66b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_illuminance_chart_card_with_background", + "name": "Indoor illuminance chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor illuminance data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'illuminance', label: 'Illuminance', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'lx', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'illuminance', 'lx', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"lx\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"lx\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 12 - 6;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"lx\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Illuminance\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:lightbulb-on\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar.json new file mode 100644 index 0000000000..d281cc864e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar.json @@ -0,0 +1,29 @@ +{ + "fqn": "indoor_illuminance_progress_bar", + "name": "Indoor illuminance progress bar", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAqFBMVEXg4ODf39/g4ODg4OAAAAD////g4ODzaQD19fUhISHk5OT+7N/0fCBYWFirq6uQkJA9PT3x8fHv7++6urp0dHQvLy/Hx8eGhob82r/+9u+Xl5f7x6Cenp75tICBgYH3oWD0chD2jj/6xqD39/f948/Ly8vV1dX6vZCOjo74qm/70LBKSkr1hC/CwsL3oV/c3NyxsbF1dXX3l0/2j0CgoKD149ZmZmb94s+rdVHIAAAABXRSTlPvIL+vAC9A4IoAAARhSURBVHja7NjdauMwEIZhZ9uvYeRY0tSSSUGbpcuSE5/3/i9tR45NvJTWCz3INMwLFvpJDh4Sm5DmcfejefruPewem13zjG8fC+OBcQc9y9cKd1FzL5AngyjLINoyiLYMoi2DaMsg2jKItgyirU8gvWc46oCOHD4qFejoE0hHwybkTCN09EUIBi1/XfwvpA+CGcK5Xn06OUwDOHggFA7JQ3IlhYouhctlh0t9neRCKg7XbgVJskAgL1fMmXKqg7ucU46R6AT0OY9EPRBzzEQJcJHkqNQjkulKogDyxrKKjBOVGSLbLmdgJIeh7sR6lAlI0yQzR0H4il1SAAmAn4cFAiASJHaO4ryoLBIefOKeEoAcsUoxxHUkLRB5Wz2eCnQJ1zRDIg2MNYSXp3OhN1/DtZtBeuC0AakGXkMQM4u/c9OdA8aqG0EKRR/yBiRT8OM/kEKjDxTrIvkSFdzsSER56xM5R6IUia8QCJ46B3Aimdzg8fs+dtjO8YdbLJP32a9fg2jPINoyiLYMoi2DaMsg2jKItgyiLYNoyyDaMoi2DKItg2jLINoyiLYMoi2DaMsg2jKItgyiLYNoaxvSti1qL+3cy7x/PP6BnjYhv/f7A2o/93OvE+O1Tg9HaGkL0h4WyK81RLYvqZFsQf6yXwerEcJQFIZXhyPc+wCGIomOIIrMQil9/zerziSDLWVEiyTD+C9d+WFyL14ZICNddau7P24NGlKRSCuQjnT+ZXuWCBkvuKbzSVYgSqse4jgglJOFdzZIo+eQgioBQrYII6shPzAlpEUaPYUIWcFDhOwdSSsz8BekiT+In0KUFgGS06eygPhhrB+I1zqkIOUBkdG1grony1eDCFkgQELGkeYvSFcDdYUIrUIGOplSqggeWbJeQgYPaZyBtojQGqTjoh/nLX9MrS/SegjGtlCDDUWCtNZibpghOdmGPRIg4iItx/U7MhWOlgdMKWlg3GKzewjUGURoBRJajl/NIZa0d0EhpiEVAVLo2GJDsSAoFnsERnnLSYAIK9l0tqJBUClJZwVzcuVUWSNA1AIRb/sSsl6d1wYhk+cG6fRG/+wv0glJrROSWicktU5Iap2Q1DohqfUGECm5t/4zO6ztkJ77K7PDumyG8D9lx7UZMnJ/fXZQe76I9Nxbedwdubzx1HqxTkhqnZDv9u5YxUEgCMCwJvmDWAg3WyxMYSPKNqIB3//ZzgSEqw72rtiJmR+22G4+WNhyrOUQa/0CmZMGijXMHSCqKsco+2Vr8iESBV0oVBPXCHQzo7LEQXpBJ9Y1HzJtEALFkghEoemZV+hGHiApHzJ2BiCP1wnhCZEIEh1SrONp0TO/IPTQpnyI9A3bRJkOiC5MyqIQ2+dl7PIhhJiUQh2QNuouYE0pQKua5A8QhoHyyc9R5LN/9vfKIdZyiLUcYi2HWMsh1nKItRxiLYdYyyHWcoi1TgSpOEX36nKC1dPwda3qysoGp38kO+NWX+/vXnWpb99gbrYRFl0QWwAAAABJRU5ErkJggg==", + "description": "Displays indoor illuminance reading as a horizontal progress bar. Allows to configure value range, bar colors, and other settings.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 2, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.progressBarWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.progressBarWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '280px',\n previewHeight: '180px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'illuminance', label: 'Illuminance', type: 'timeseries' }];\n }\n };\n};\n\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-progress-bar-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-progress-bar-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\\n\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"default\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"tickMin\":0,\"tickMax\":1000,\"showTicks\":true,\"ticksFont\":{\"family\":\"Roboto\",\"size\":11,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"ticksColor\":\"rgba(0,0,0,0.54)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"barColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}]},\"barBackground\":\"rgba(0, 0, 0, 0.04)\"},\"title\":\"Illuminance\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"lx\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"mdi:lightbulb-on\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" + }, + "externalId": null, + "tags": [ + "progress", + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar_with_background.json new file mode 100644 index 0000000000..2462922b20 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_progress_bar_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "indoor_illuminance_progress_bar_with_background", + "name": "Indoor illuminance progress bar with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC/VBMVEW+trYAAAC3ur3/59f859bEwcXDq6D55tjGwMXDqp////7//vz//fr//Pj++/r8+/rJysz/+vb++vj8+ff3dBD8+vjJycn69/b++fT18vHz8fH39fT79vP8+PX28/Lw8PDn5OL99/EdIyv8+PP59vXy8O/08e/49PEVFhj59fIgIB/y7+y6ur69vcD6+fjm4uDv7u3+7t7Mysm4trrKy821tLj89Ou8vL/879+4ubz79vD59O724tDYz8fu6ub28u8bISnf29rw7OoZGRvt6+rBu77Pzs7NzMv+9u3KwMDy7en47N7T0NDh3dvW09HGxMgfJS3Qzcrp5eTi4N7+9er969zk4d7g3d3MwsHr6Obc2Nf28e339/j17ur24czf2tbc19TZ1dT67uD75tL27OHKv728uLuysbb86tf86NXKwsX36dq/v8PSzs3Gvr/76trb2trf3+G+ubzV1NX549Di3Njs7e768+jZ1NLt0r/Tz8rNxMa6trr67uPDvb/r5eHPw8H88Ob97dr54Mnc0cf+8+bm4Nzj39z46Nbq5+RWVVXCwsX48evmwqn+8eHY19jd1c75+fnk4eDp4t7T0tPZ083l3tnLxsnW0czFvLzi1czOys3rz7rRs6Tv6eL66uDw4NU8Ozr+8uj05Nrov6D37+fQ0NLMr6CNionTycju1MFxb28wLSz25dP0177g2NDe08nmwaTGrKBJT1bz6+X2597PxsftzLNQR0P848zs5NzHwsTpyLH4hi7x59zk3NSdl5Tp4drYzMrlxK7rx6qVk5P0fiXq39Ts29Pn1tCnpaMaHSLw5NdFS0/iu5323MXAubzIsaWBa1/ez8vMtKaUjo37yKHy07jBsqr3pGaUhYB7dnXn3ND5tH6zoJiFgX71k0n92r+inJuBfHjUuamIhocyO0TRwre7tbI1MzLcvqutqql1YFZHPTnR09jr3M1fUUuXdmNiYGGupqWWlpkoJCLBmXwpKi3Pqo7l08aoh3b7wJPctJJcanj80bAiphZ2AAAACnRSTlMgALcgv7+/sK+vucF9fAAALvJJREFUeNqU1T9oE2EYx/EoCI5OQh20CK3SXDAYJWTSNklLpBBpwFwUB4ecEOpRU+iScNyqDoVQKMGpi1jqJgQh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", + "description": "Displays indoor illuminance reading as a horizontal progress bar with background. Allows to configure value range, bar colors, and other settings.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 2, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.progressBarWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.progressBarWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '280px',\n previewHeight: '180px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'illuminance', label: 'Illuminance', type: 'timeseries' }];\n }\n };\n};\n\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-progress-bar-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-progress-bar-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\\n\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"default\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"tickMin\":0,\"tickMax\":1000,\"showTicks\":true,\"ticksFont\":{\"family\":\"Roboto\",\"size\":11,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"ticksColor\":\"rgba(0,0,0,0.54)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"barColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}]},\"barBackground\":\"rgba(0, 0, 0, 0.04)\"},\"title\":\"Illuminance\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"lx\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"mdi:lightbulb-on\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" + }, + "externalId": null, + "tags": [ + "progress", + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card.json new file mode 100644 index 0000000000..b4208754ab --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_simple_illuminance_chart_card", + "name": "Indoor simple illuminance chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAApVBMVEUAAADg4ODf39/g4ODg4OD////g4ODzaQAhISHj4+NYWFg8PDx0dHSsrKzHx8eQkJDx8fH5tID+7N/0fCD3oWAvLy/+9u+6urr7x5+CgoJKSkrw8PDV1dX0chBlZWX2jkD2j0AWFhb3l0/82r+enp6dnZ3948/0cxChoaH6vZAICAj4q3AlJSX3oV9DQ0Pf39/Q0ND4qm/1hTD7z6+goKCSkpJCQkJ25ZykAAAABXRSTlMA7yC/r1EOHTEAAASuSURBVHja7M85AcAgEAAwjm9mx7/PVgYciYMUAAAAAACA59QW83a9/o/Y43oraulrJLBbmSOFyBKZIocROc3Hbt2stg4DYRhefWFGo7+NMLKMwZCCMSHt4pxz/5d2lLgUipUsHbnVi2E0ePVgG9wgtdUgtdUgtdUgtfULILHDkSpDEoDrn3WuDQ4gA6WxbTzj9ZUh17jevBh8ZugJpIZnV4acXIqX65withBrgc7my5oB1nDehnzdNuQ9o9iw6TzgjWHc1iJ0FwhwmYimvyhAtMJtqNALqV6Ch7h1s3BBi4IlUUEBEhSd0VEv4rFpH8g8UW5KTyB5BA2m7g4Z4ekMZ9ER20x6IxhiaIFoeDLYtANkXjq9Qj7G5RkkC5jMHaIBchi0yAoxhCjIeeqVIodNO0DSe3J3yJLS+xbSP4aI9vYbxLOnaK1lFNrj1UqX7Jhi6RuJgVnKEJ8t7guShx8VVM/evQyC00TTiBKEhUJfhmQFKbKfkNsmDBYi9ToIwrI4lGOPR3kubFxk7AU5zTOO1EPIxz+FI/UL/n4PVoPUVoPUVoPUVoPUVoPUVpUQZv8DIFYFIhLNx4Z4RSEa8zYSuSNDWMj59TSSOzBE0/B1jtQdFvKfHbPrVRQGwvDV5G2hfLVSkYga/MrJybnY3f//3xapdOthGzHmEEh4EuOMV/M4dKYasZOTBXk6V5EgJIeYnWYqwln0zWumIoJxemxJNBsRvo5TO3pzQY8EwUxE4oA1dLsvYdve4Y+nJ7KN4/6QCs9xLFjIzYMk6DthMDGRNMkZY7ngj2e7TO9bUESngJWc+qrrHxLRl6O2yYdSAz1KFkTx2nz3ll2XcZE3lklKfcqcvytyBFbUkMFgkmsT1ZIMGTB0HEXm8cpLskTuTOLcd2cJ+Zsi6l77ZydiYnVoXvo1kdhem9Zs7ZQ48PYltm1XT0HI8mDDXxTJuibUWMkbmkgCGdEFyF4TEbkNy8CzNLxwwZr6GwlWimQTmCE3XERCVUbkgMyeCUC3n+wdkVaRdPvmIRQ2PLPECYbBo10QiDM3SRIalYEiCoUyIhUKulPjt6m/ckQOqHQbSvKwdreBaMtIN6yk1/Gp+EWypuS7CLCq1f7DaUUBaKcjFTKSwC/ysQvJIWEsDxnbpERvqJTDROQV8i4iYVDaFZGdiGmQ/ILS/qugeMyjjTin9BZpOkykRkadSK0yecmAzCeiFa5AQT4itqUfxS9SQJERsRxQ+UToaAacB89lfAwR2SgURVFhX1z+uUE6Io/jtwKKgT8yLGOIFLBkpKW2Iiuo3tQyb6g0efCs5jFELquWCmr1pyv+C7B7pH7YI+3EqvDpOZVilIb494g9I0ezza+3RAOf7SeFK7KHukVH+g/b0rv3xhUxvbgqQMm2chOTI1K0Xgp76pOwMCYPo4tQpgDspY2rlXZEpEJtGvfRb8eTtTeKiIuUuhc/JR3Wjsn/Gx+HT9oxE5Hn7ZiJyO5pO2Yi8oxFZBGZC4vI1FhEpsYiMjUWkamxiPxt584JAIZhAAbazjN3L3+epZE6dwxEQKcRcpoduVrYMRqsg9Z6ZlQ2mAe9WRE199/lqAAAAAAAALjNB+/brAXegFpbAAAAAElFTkSuQmCC", + "description": "Displays historical indoor illuminance values as a simplified chart. Optionally may display the corresponding latest indoor illuminance value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'illuminance', label: 'Illuminance', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'illuminance', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#FFA600\"},{\"from\":300,\"to\":500,\"color\":\"#F36900\"},{\"from\":500,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Illuminance\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:lightbulb-on\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"lx\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card_with_background.json new file mode 100644 index 0000000000..f47216fe1e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_illuminance_chart_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_simple_illuminance_chart_card_with_background", + "name": "Indoor simple illuminance chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical indoor illuminance values as a simplified chart with background. Optionally may display the corresponding latest indoor illuminance value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'illuminance', label: 'Illuminance', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'illuminance', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Illuminance\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 400 - 200;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":100,\"color\":\"rgba(0, 0, 0, 0.76)\"},{\"from\":100,\"to\":300,\"color\":\"#F89E0D\"},{\"from\":300,\"to\":500,\"color\":\"#F77410\"},{\"from\":500,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Illuminance\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:lightbulb-on\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"lx\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "illuminance", + "indoor" + ] +} \ No newline at end of file From 203cd0fec165e63b818335029651575a1555e392 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 26 Oct 2023 17:43:28 +0300 Subject: [PATCH 19/39] added test --- .../WidgetsBundleControllerTest.java | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java index ee341fe284..80d70c1b8b 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java @@ -206,22 +206,32 @@ public class WidgetsBundleControllerTest extends AbstractControllerTest { @Test public void testFindTenantWidgetsBundlesByPageLink() throws Exception { + loginSysAdmin(); - login(tenantAdmin.getEmail(), "testPassword1"); + //upload some system bundles + int sysCntEntity = 10; + for (int i = 0; i < sysCntEntity; i++) { + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setTitle("Widgets bundle" + i); + doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class); + } List sysWidgetsBundles = doGetTyped("/api/widgetsBundles?", new TypeReference<>() { }); + login(tenantAdmin.getEmail(), "testPassword1"); + int cntEntity = 73; - List widgetsBundles = new ArrayList<>(); + List tenantWidgetsBundles = new ArrayList<>(); for (int i = 0; i < cntEntity; i++) { WidgetsBundle widgetsBundle = new WidgetsBundle(); widgetsBundle.setTitle("Widgets bundle" + i); - widgetsBundles.add(doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class)); + tenantWidgetsBundles.add(doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class)); } - widgetsBundles.addAll(sysWidgetsBundles); + List allWidgetsBundles = new ArrayList<>(tenantWidgetsBundles); + allWidgetsBundles.addAll(sysWidgetsBundles); List loadedWidgetsBundles = new ArrayList<>(); PageLink pageLink = new PageLink(14); @@ -236,10 +246,28 @@ public class WidgetsBundleControllerTest extends AbstractControllerTest { } } while (pageData.hasNext()); - Collections.sort(widgetsBundles, idComparator); + Collections.sort(allWidgetsBundles, idComparator); Collections.sort(loadedWidgetsBundles, idComparator); - Assert.assertEquals(widgetsBundles, loadedWidgetsBundles); + Assert.assertEquals(allWidgetsBundles, loadedWidgetsBundles); + + //retrieve tenant only bundles + List loadedWidgetsBundles2 = new ArrayList<>(); + PageLink pageLink2 = new PageLink(14); + do { + pageData = doGetTypedWithPageLink("/api/widgetsBundles?tenantOnly=true&", + new TypeReference<>() { + }, pageLink2); + loadedWidgetsBundles2.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink2 = pageLink2.nextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(tenantWidgetsBundles, idComparator); + Collections.sort(loadedWidgetsBundles2, idComparator); + + Assert.assertEquals(tenantWidgetsBundles, loadedWidgetsBundles2); } @Test From 9a9ffceb94e2a88a1870bf535c230abf63929d32 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 26 Oct 2023 18:26:59 +0300 Subject: [PATCH 20/39] UI: Indoor Environment: Noise level widgets. --- .../json/system/widget_bundles/indoor_environment.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 019d1cf3f5..94841e7293 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -45,6 +45,14 @@ "indoor_simple_illuminance_chart_card", "indoor_simple_illuminance_chart_card_with_background", "indoor_illuminance_progress_bar", - "indoor_illuminance_progress_bar_with_background" + "indoor_illuminance_progress_bar_with_background", + "noise_level_card", + "noise_level_card_with_background", + "horizontal_noise_level_card", + "horizontal_noise_level_card_with_background", + "noise_level_chart_card", + "noise_level_chart_card_with_background", + "simple_noise_level_chart_card", + "simple_noise_level_chart_card_with_background" ] } \ No newline at end of file From e20523b502f0c8937b4c563112c590990263483a Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Thu, 26 Oct 2023 19:02:56 +0300 Subject: [PATCH 21/39] Attribute scope check improvement --- .../DefaultSubscriptionManagerService.java | 18 +++---- .../DefaultTbLocalSubscriptionService.java | 48 +++++++++++-------- .../TbLocalSubscriptionService.java | 6 +-- .../subscription/TbSubscriptionUtils.java | 11 ++++- .../server/controller/WebsocketApiTest.java | 6 +++ common/cluster-api/src/main/proto/queue.proto | 1 + 6 files changed, 55 insertions(+), 35 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java index 97b30b4e92..7c66971d27 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java @@ -201,7 +201,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene if (serviceId.equals(targetId)) { localSubscriptionService.onTimeSeriesUpdate(entityId, update, TbCallback.EMPTY); } else { - sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(true, entityId, update)); + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(entityId, update)); } } @@ -213,7 +213,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene @Override public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, boolean notifyDevice, TbCallback callback) { getEntityUpdatesInfo(entityId).attributesUpdateTs = System.currentTimeMillis(); - processAttributesUpdate(entityId, attributes); + processAttributesUpdate(entityId, scope, attributes); if (entityId.getEntityType() == EntityType.DEVICE) { if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope)) { updateDeviceInactivityTimeout(tenantId, entityId, attributes); @@ -228,7 +228,7 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene @Override public void onAttributesDelete(TenantId tenantId, EntityId entityId, String scope, List keys, boolean notifyDevice, TbCallback callback) { - processAttributesUpdate(entityId, + processAttributesUpdate(entityId, scope, keys.stream().map(key -> new BaseAttributeKvEntry(0, new StringDataEntry(key, ""))).collect(Collectors.toList())); if (entityId.getEntityType() == EntityType.DEVICE) { if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope) @@ -242,17 +242,17 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene callback.onSuccess(); } - public void processAttributesUpdate(EntityId entityId, List update) { + public void processAttributesUpdate(EntityId entityId, String scope, List update) { TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); if (subInfo != null) { log.trace("[{}] Handling attributes update: {}", entityId, update); subInfo.getSubs().forEach((serviceId, sub) -> { if (sub.attrAllKeys) { - processAttributesUpdate(serviceId, entityId, update); + processAttributesUpdate(serviceId, entityId, scope, update); } else if (sub.attrKeys != null) { List tmp = getSubList(update, sub.attrKeys); if (tmp != null) { - processAttributesUpdate(serviceId, entityId, tmp); + processAttributesUpdate(serviceId, entityId, scope, tmp); } } }); @@ -261,12 +261,12 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } } - private void processAttributesUpdate(String targetId, EntityId entityId, List update) { + private void processAttributesUpdate(String targetId, EntityId entityId, String scope, List update) { List tsKvEntryList = update.stream().map(attr -> new BasicTsKvEntry(attr.getLastUpdateTs(), attr)).collect(Collectors.toList()); if (serviceId.equals(targetId)) { - localSubscriptionService.onAttributesUpdate(entityId, tsKvEntryList, TbCallback.EMPTY); + localSubscriptionService.onAttributesUpdate(entityId, scope, tsKvEntryList, TbCallback.EMPTY); } else { - sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(false, entityId, tsKvEntryList)); + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(scope, entityId, tsKvEntryList)); } } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java index f15a25fe4d..1bb452f4a9 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java @@ -262,37 +262,39 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer @Override public void onAttributesUpdate(TransportProtos.TbSubUpdateProto proto, TbCallback callback) { - onAttributesUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + onAttributesUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), proto.getScope(), TbSubscriptionUtils.fromProto(proto), callback); } @Override - public void onAttributesUpdate(EntityId entityId, List data, TbCallback callback) { - onAttributesUpdate(entityId.getId(), data, callback); + public void onAttributesUpdate(EntityId entityId, String scope, List data, TbCallback callback) { + onAttributesUpdate(entityId.getId(), scope, data, callback); } - private void onAttributesUpdate(UUID entityId, List data, TbCallback callback) { + private void onAttributesUpdate(UUID entityId, String scope, List data, TbCallback callback) { entityUpdates.get(entityId).attributesUpdateTs = System.currentTimeMillis(); processSubscriptionData(entityId, sub -> TbSubscriptionType.ATTRIBUTES.equals(sub.getType()), s -> { TbAttributeSubscription sub = (TbAttributeSubscription) s; - List updateData = null; - if (sub.isAllKeys()) { - updateData = data; - } else { - for (TsKvEntry kv : data) { - if (sub.getKeyStates().containsKey((kv.getKey()))) { - if (updateData == null) { - updateData = new ArrayList<>(); + if (sub.getScope() == null || TbAttributeSubscriptionScope.ANY_SCOPE.equals(sub.getScope()) || sub.getScope().name().equals(scope)) { + List updateData = null; + if (sub.isAllKeys()) { + updateData = data; + } else { + for (TsKvEntry kv : data) { + if (sub.getKeyStates().containsKey((kv.getKey()))) { + if (updateData == null) { + updateData = new ArrayList<>(); + } + updateData.add(kv); } - updateData.add(kv); } } - } - if (updateData != null) { - TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(sub.getSubscriptionId(), updateData); - update.getLatestValues().forEach((key, value) -> sub.getKeyStates().put(key, value)); - subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, update)); + if (updateData != null) { + TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(sub.getSubscriptionId(), updateData); + update.getLatestValues().forEach((key, value) -> sub.getKeyStates().put(key, value)); + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, update)); + } } }, callback); } @@ -444,7 +446,13 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer return; } final Map keyStates = subscription.getKeyStates(); - DonAsynchron.withCallback(attrService.find(subscription.getTenantId(), subscription.getEntityId(), DataConstants.CLIENT_SCOPE, keyStates.keySet()), values -> { + String scope; + if (subscription.getScope() != null && !TbAttributeSubscriptionScope.ANY_SCOPE.equals(subscription.getScope())) { + scope = subscription.getScope().name(); + } else { + scope = DataConstants.CLIENT_SCOPE; + } + DonAsynchron.withCallback(attrService.find(subscription.getTenantId(), subscription.getEntityId(), scope, keyStates.keySet()), values -> { List updates = new ArrayList<>(); values.forEach(latestEntry -> { if (latestEntry.getLastUpdateTs() > keyStates.get(latestEntry.getKey())) { @@ -453,7 +461,7 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer }); var missedUpdates = updates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); if (!missedUpdates.isEmpty()) { - onAttributesUpdate(subscription.getEntityId(), missedUpdates, TbCallback.EMPTY); + onAttributesUpdate(subscription.getEntityId(), scope, missedUpdates, TbCallback.EMPTY); } }, e -> log.error("Failed to fetch missed updates.", e), tsCallBackExecutor); diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java index d9fc87f51b..d968bd515f 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java @@ -18,16 +18,12 @@ package org.thingsboard.server.service.subscription; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.discovery.event.ClusterTopologyChangeEvent; -import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; import java.util.List; @@ -49,7 +45,7 @@ public interface TbLocalSubscriptionService { void onAttributesUpdate(TransportProtos.TbSubUpdateProto attrUpdate, TbCallback callback); - void onAttributesUpdate(EntityId entityId, List update, TbCallback callback); + void onAttributesUpdate(EntityId entityId, String scope, List update, TbCallback callback); void onAlarmUpdate(EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback); diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java index 2fd49f0645..1163e13077 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java @@ -411,7 +411,15 @@ public class TbSubscriptionUtils { return result; } - static ToCoreNotificationMsg toProto(boolean timeSeries, EntityId entityId, List updates) { + static ToCoreNotificationMsg toProto(EntityId entityId, List updates) { + return toProto(true, null, entityId, updates); + } + + static ToCoreNotificationMsg toProto(String scope, EntityId entityId, List updates) { + return toProto(false, scope, entityId, updates); + } + + static ToCoreNotificationMsg toProto(boolean timeSeries, String scope, EntityId entityId, List updates) { TransportProtos.TbSubUpdateProto.Builder builder = TransportProtos.TbSubUpdateProto.newBuilder(); builder.setEntityIdMSB(entityId.getId().getMostSignificantBits()); @@ -434,6 +442,7 @@ public class TbSubscriptionUtils { if (timeSeries) { result.setTsUpdate(builder); } else { + builder.setScope(scope); result.setAttrUpdate(builder); } return ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg(result).build(); diff --git a/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java b/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java index a8334fc959..73ee8f9252 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java @@ -454,6 +454,12 @@ public class WebsocketApiTest extends AbstractControllerTest { getWsClient().registerWaitForUpdate(); + // Pushing update with wrong scope and make sure it will not arrive. + AttributeKvEntry invalidDataPoint = new BaseAttributeKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("serverAttributeKey", 55L)); + sendAttributes(device, TbAttributeSubscriptionScope.CLIENT_SCOPE, Arrays.asList(invalidDataPoint)); + + Assert.assertNull(getWsClient().waitForUpdate(3000)); + AttributeKvEntry dataPoint1 = new BaseAttributeKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("serverAttributeKey", 42L)); List tsData = Arrays.asList(dataPoint1); sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, tsData); diff --git a/common/cluster-api/src/main/proto/queue.proto b/common/cluster-api/src/main/proto/queue.proto index 95288c541c..ac373df510 100644 --- a/common/cluster-api/src/main/proto/queue.proto +++ b/common/cluster-api/src/main/proto/queue.proto @@ -619,6 +619,7 @@ message TbSubUpdateProto { int32 errorCode = 3; string errorMsg = 4; repeated TsValueListProto data = 5; + string scope = 6; } message TbAlarmSubUpdateProto { From 884f1513450d81ae03623c832d8c6e088b5a21c6 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 13:00:28 +0300 Subject: [PATCH 22/39] UI: Indoor Environment: PM2.5 widgets. --- .../widget_bundles/indoor_environment.json | 10 +++++- .../indoor_horizontal_pm2_5_card.json | 31 +++++++++++++++++ ...horizontal_pm2_5_card_with_background.json | 31 +++++++++++++++++ .../widget_types/indoor_pm2_5_card.json | 31 +++++++++++++++++ .../indoor_pm2_5_card_with_background.json | 31 +++++++++++++++++ .../widget_types/indoor_pm2_5_chart_card.json | 34 +++++++++++++++++++ ...door_pm2_5_chart_card_with_background.json | 34 +++++++++++++++++++ .../indoor_simple_pm2_5_chart_card.json | 34 +++++++++++++++++++ ...mple_pm2_5_chart_card_with_background.json | 34 +++++++++++++++++++ 9 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 94841e7293..1e8712e0f6 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -53,6 +53,14 @@ "noise_level_chart_card", "noise_level_chart_card_with_background", "simple_noise_level_chart_card", - "simple_noise_level_chart_card_with_background" + "simple_noise_level_chart_card_with_background", + "indoor_pm2_5_card", + "indoor_pm2_5_card_with_background", + "indoor_horizontal_pm2_5_card", + "indoor_horizontal_pm2_5_card_with_background", + "indoor_pm2_5_chart_card", + "indoor_pm2_5_chart_card_with_background", + "indoor_simple_pm2_5_chart_card", + "indoor_simple_pm2_5_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json new file mode 100644 index 0000000000..1d05a49308 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_horizontal_pm2_5_card", + "name": "Indoor horizontal PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAq1BMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4ODf8Mrv9+Wg0mHQ6bCQy0b3+/Lz8/POzs6/4ZXIyMiv2Xv5+fm7u7vCwsK2trZYWFja2trH5aPA4Zbn5+eYzlPY7L2tra2w2Xvj4+PV1dWQykbn9Ni43Yg9PT2QkJBLS0uIxzq33Yh0dHTt7e2enp5mZmaIxznU1NTb29uCgoKn1m6o1m6dnZ2o1m0vLy9qOap8AAAABnRSTlMAIEDfv1C6kOEmAAADhElEQVR42u3ai27aMBiG4W7tvv6NsZOQEyTjPKAUeti60/1f2WzDykbbVAMxAfoeqZVxIjWvHEMRnBERERERERERERERERERERERERERERH9T++Ons94f3557IbnH2zHZYajF12+P7uIcAKyi7MrnIQrhhwYhhwahhwahhwahhyaupBQYal/fT1EPwdGdxhe95+mDklNSNg1Ibz2XTIdtX8CixlmyeLOTeVJhB0EVVMrrGgdopZ6fkKoe6o+ZN0hH7EKSXCft++TYXuKIRZuSaaPfeygKZYZw6tEAtQaGGzoiTEP442Q+g4XMmu30b5e9PtTIJnByof3ObamxQTjphg4yrwZcpM+C2lCSfOtkGqi1x1+Rfyv+2k0xWjmbqnoDtd32FpDeu7yRMEayM1TiFJ+b4awgp6CG7nuwE36GSgdwJk0jKoNCbRfeNexEfJ9gSmms/ZjvsDj/WyIrfW08iGhv8qP5neIkk/+vkvtsCsiA2nA+maAQLpu5qO7Nr93q1SCmpCgYU92JV3Ui7Ar7f+GMgYvhQykqyvjQ5SkLkQmvbmNqHrGXmE1ByR9PaQSx5cE2C9lZOxvrPFLIUpEAT0fot2JgR8a0e7xV/tjHqT3ekggTyUaexUaf/OOJcVLIf66V78b3fXQnandUFU6rHv6bTyVKOzP+knRSFPrG5kEGyF6HaJEvxDi1e0R+V2yXwOZLK98pbER0pPVMriHaosQNGUpeGtjR7ebE/+w/yfyFU4YOEaqMVZdoYtMEd6IWl2yaWCbEMzFMcBaaxkT4baEl2XIrmI3cYUMQKffQVaWywOZO7NeJfIjtTSsv/aImOZE3L6Zu9GDNGyB3ipktSZ6I2Q0isskie2oQFEWedYq4tEoifPbOM+AuBPleYko9gfiJEetVJbS5yE38tDw83ORB/c6MpBwyxCoVERthHyOW1ESd+JlSOfzFzu2c50yLhIfclWWNiRpdZLI5hYRtuD2iH9Z9+zIPdGadIf/flWAP/XjL0XcGiVF5FYkzsuiFbWS2M7d5p0khgvJ3Ip08r47MCoKbBuCleqbQmBE7/WNVdnB6z4nX+DsGiLOAHsNybK6gxG2FjardVQznQd8q3u8GHJoGHJoGHJoTijk4gQ+ZgeiC/uFgRP4oD2zXxg4+3A+vDx25+9P6Us1RERERERERERERERERERERERERERERP/JL+y8/ulGq8beAAAAAElFTkSuQmCC", + "description": "Displays a latest indoor fine particulate matter (PM2.5) telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json new file mode 100644 index 0000000000..15e2dd67a6 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_horizontal_pm2_5_card_with_background", + "name": "Indoor horizontal PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACalBMVEUAAAAAAAAEBATAwMD5+fnv7+8qKiquq6ual5dBPT7l5ORZVVZZV1hzcHAvKyuLh4cyLS+BfoFvbGzRzs8AAADl5eWSj4/p6enBvL/n5+f19fXy8vLY2Njy8vL6+vr8/Pz19PTz8/Pq6el8wyL5+Pny8fLr6+vV1NXp6Ojw7/Do5+fT0tL4+Pjk5OTW1dX39vfm5eXx8PD29vbv7u/X1tfh4eHg39/S0dHa2drm5ubU09Pe3d3c29vj4uPW1tbZ2Njs7Ozf3t7b2tvu7e7j4+PU1NTd3Nzg4ODi4uLt7O3R0NFAPD2YlJX29fY3MzSTj5BDP0DLycmsqaqHxTjZ2dnEwcFaVldKR0ippqeBfn5RTU6loaIzLzDPzs6in6ChnZ5WUlPTz9Cvq6yem5tuamuTyU/Qz8/PzM3Hw8SQjY07NzjKx8i/vL24tbaalpeFgYJycHBnZGVGQkPD1a2bl5hfW1xNSks9OTovKyzNy8y7t7igzWecyWJiXl/IxsbExMSzsLGnpKWqzX12cnNlYWJXV1fO1sKzs7O1sbKVkZKNiouLh4h5dnaNyUC9ubqdmZq20JVrZ2hcWFmxr6+WylJTT1BHQ0SJxznV0dLL07+IhIV7eHlJRUZIREbr9ODb7cXL5qm8349+enub0ViBxC3W283H2LA8PDzN0Ma/v7/Bvr/S6LfB0arF36OTzUrLy8uzzZG734+mzHcsKCnz9+7l7tjR2cPG07TD45yy0Yqq1nGiyW8nIyTHz7vM3La+1aC734203IHy9uzR1Mu+z6e9zqa815isy4OExi/09+7E2ae22omq0njf4tjeZHX1AAAAHnRSTlMABQYmICEGJiYgICAmJiAnJiYgIAdCIMAh4N/AVFA5JnX9AAAVU0lEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJg98nlRG4jieA/mkARyiKzIlkKyMLKK1vzooYUWbHtZGZlND0222bBkqWARbWuoJhQWFvTSdiloUaTopcdevfrH9c04K3T/gD3NZ17e92VmmPk+RiAQCAQCgUAgEAjuE4mSo5EDJJ657CoWChdJkSTlljwdhYKuMjRNljVd01RZl6HWdVnW4UcFVWVNVlUIENgEVUHWIcMOpVCEI6R8sQjn5ZUcu4UZ2Jvam2BW+QybosLaODg0TIMG4gqA8A+gBeTb1XITGaiBGm7DsionR5b1vLa8Pr9ZL9qDwOtGySbabkkUzNNNRiYXUzzyprNp7BFMCElCgkfrIE7WsYeHrbAdXM3j8PT7+18fW3++tPp/3zy97By5BgWZzAhiNTe1c4OoAI7j1KvVat1xDh9BH+Zu/X8QMhxjz34ZQQUD2WWz3HQvK6WT5nHlSaf39uLdJB0MsAckZLPtbomXpYvM732Y4CgISEZwGmXE87tpjNM5SYOV155c+f5oOIvHpz/P+2P/x7ev/d7j5fLVi5oNVyLHLrvMPk93xGHU69AHODp48BDMIZP3Th2zRJVn3qVJX6wJdckwbWQbtvv62Cq9rNWeLTtnnz7fnP1eJbMkieNFEOEoS7JsFODhdX8cEtrGCock+kd5eTYpDYVReP+F3yIhEkyQLJAQA4QWmrhixV1ZHXtdG1iwrh372sa29r6ObXTsfrD38p88701EUcdywCQEMvs+97zn3uvq08tWnjpV75my+sjK2T29s1d2r+w9uHJb5eSuys5K7cLUa5MWztAWzZgXZiCsJA/edMKw4k1yrkN423KhIGlQGyjIKqdykscxoclH13TB3CBuSVKLmaKaHqrLkbB/3qJRYzYtmTSp1n1qbM/Yeu+2sR2rp3Qs6+no7VzZubTW3XN3yuj66I7ujinor66OendPT0dnL74/daS3c3p1W6W6bfqsSRMnr722c+3E+el58zes0T30t9u/1RHk+ZAzrECwGdpxcEl2qbAu2MYMwXP0Qzxhl8o61MHjHa/YUeWDmUwmpRbdkigNDchmMjlj58K1M/R9m/bM3jq9e9nRo9O7xh5FjZ0Y9u4TXb217u5VdztWddXHnp7S0XOop7O+qr6sc8qqlb21ztr02t7Ze2uVpXsmLVq4dtG1hfMWzl+7durkfTN0MeNBHFFSM64QmWN/ooYiNoKQghLUxjyg2qnXHFritY/tTbnoHo8f8BJgVA+vBotSwDweO57XzHhA2TB+wdLdY8acOLn0wkm8xlS2HqxWd1ZO7pk26uDBk3v3VvZWt26tXqhUlp6sXpi9t7q0MnXJnlHT9o/aPGvJ+J2LZm6YOH7+OG3DjHFrZihe0y/zQVc7oky2tLNKQsNQPS5xmx82ZMgQlnJ0OMRAPOh4gAwb/A/iWjUkFBTdKUkVZdntjhQMJefVDMPQFG/CMA3FN3y4L+pNKDmfLxqN+oaPhIZHvV5vLurz0TdJI58uZP1QNpuNx+PZiFssZlQJBfGhdhTLcb8toaWcEAxhIKDAg3/n4PAcDi0gJQaSGYrER/y6lchRdcmEN5ewYqYGEJDkcgQE4dNIXOVyXtzCffzUyqfDcX8gEIkE/P543C8PFcUUI+FLcONXElZDyzWRSEGoDRTQP9nBKFpBUvjDYiQ+Ip4Npy2NClQUJRdNWHqs7HUI2Iko6By1BQ5FM8yYTiAReagcCLCzW4QnDCTUDk/s4cehaQCOzie87BseYEhqmyeIl+v3pf9M8hPKsFIwk0qJcragQzFL86JWkKC1rHTaSnijAIAYC9rK5xB4IUXRyJBCeETWH5BlORIIAMPtdixBpoHCSH4wgWutwWFxSeAACHWWi/ufxkLS7DOCnxGH+guxvGmaeTOJWPi8WjmpaUYMXIoXKKy9KCF2nxGCgkNCS5IhBSgcR07gB/oKHCApqhJmH0Kh7mJqOtAEwMu55ikkmTaJjHFx3J8saU2GLbpqdwURED1vGeVk2TCSSjSnJPPptGlY+bylJRSWa5iQ8zl9xUASis2RT+t6Ogal9XCYku6GHFMo8HzTlRZLfnaEp5kLICDx8M22w/EXFq6VYxgJJAwkJYfzZU3TEqgt4QVHLOyPF2LwxwAHco3aoSgjgTBrJRL0YwMgYMAgJJMGpR5RJ8mUFIYCFlrfbJRmRFussR2RwKG2SehIlW9JQkvAfvGDpm8aKFwRSCRsatQt1DWYfq1CQA7EdRgCf2yIJgih0B1gwBDDMiELk5yX8hILZ/2kLBotwlAyaiaD5Htc7Q4J93tHsKpho9FGDRbkHT9apth7ZxyU8QsWFLjxiznOt59L754UKrlKm3fvTsMQLI1ufyypUKkUABgSl4dG4mgucND4Qwq+a6aeNRcwygCxDLQjTQlRPEiNhg5Dr6XDWQSGwiK6QZSR+BCRNB1pFWYtcgStReIJoslsn+7d6vtg0zX2bxzwNaZwXLXOdU2sriiVSo0dE8VhJey6sIowS7xsqBHyERHZH45hVUQuqGwo52OrIUgYGfXV8sdbDmwvJ5MarZe3b1+NJsqWBYtieZxihThI3G60WYTMUe+fewmUFt07d/2Mc0lzVrHYFlQJhDhamMEhnHeuGxu52uJGbaPeGODSQ6qbQ6XSQGUSdm0eCUoFdCtJ+UWAMaPqcT8M0TDOUJRCwlZ1EoEoLOhbBOjYQ02jHL0ThDdRuKSh4cCGxMT0Ef4ITclMsvjkWMheH5u6LvT1vb/vgGSgInNE5VkwfgzSB+Jw1Kg3Glxjwdbx4wc4bmIXhWSHuW0HOFQKmJgFiYbyqFlAUtDzhmJvQ6LsBI65c4nE50PSAXxAOLb84RZhgkYk/RMAQjsCTNegxNdlM5amxCAtWCcRmfdPEPoSkkk4Nshz7ozw/AeQFEBUONLSe49enLP9aDrCDrWB4gA3skvE5s29orR7CU8gWE6LchythJ0TomvQxGuWEzCCKcdSDhDYQfsTck1LzhGeIR2XhP4EQNYLl4TXeLoMkP5+tN6r7ZfRY/qVj5cLl78g/PG3wlNRvu8OXr9+n3fdP3eWI7242HfGASkWiymxTbUdaebj7DnujgCddzC+g+zfyg1wA/VGZUc1VNnWZQCErVySiH0WHDEsgNCBcs42h14CIRKWFkQa9ZKeHdhuEcgrNNptYcsE4QaNgqH1CxPw2BZhnWlt70MN64TD8XA4vP6YP/JUuHULdz59wqHvJY32EwFEJIlA4AhConpY0YRxEQhEcuuHCa5VbP/skl3sf7xBgHgycsHUiIOt7+QHTbMKSCAwASKhkZL4TYxtA8BxQOhD1f0TJngBYmFNMY3twgQsMQSSXCf0HXh8TDis64XLwrrwiCuC8PnjZwTr7fVjwnM0DccJTzgmFRgiQL47AkzwOiRnHYjfkACkBBGJh0Ak94i8YaCx07RU5w0kPUo7ERjC5jK2iufz9A+bEvwELAai8RCk64WHygRheT6NuyZAEBGAWP2C0J80nglzsOy/FR4U0ldgTjx7THgmBm8K67hzQt974brjiA3ylRLz+U0aDOM4fwkZfaVQJgQthdXSrYWMAomHgktMTGeioRzcvHBCG5gc5DQlGYm3ucRtGYmGhYM6yYxGjf+W3+dtUxE10W8KbcKlH55f3+eVZSyt16K+XrKQ5CiMCK4/zkR0XxhPWgPEtFmsYAjoOio0X0QPw+tTRAiCe0NdVywLWVLV8UTvfNJkA7C+Y956DiAadysAQbUDJPeVtZCGHdYC+3gf/06HB2fMPqbKb9iraPTw/RESjEs2aOJEZJQ8QAK9CklQSX+JCIUEovZLVQKSmqqYeZ0bv1RW0bjLImVo5fB7qZr1hdENEPNknw1Q9jngjEbHbHYK+5gnEPgygCTOWSuTI5Bi8S0bYbp0eHDG7DQtEsiiZEEwRDFCHGWAhCEJSJZqZMltBSDXZCr3uCykaRqnyC2pVbQwigbfOCq0cPAxLSSTuAAEEE17zGaYfCiKQGOEyyIQtIYZ8wpUQByktDZgT9HRXhNTBSB68jcQERIitRpQQhCqDq6XCxDybyCQmL0Z9F8YFUNNZzWNWz4MlRy5XnKHa3CQhAfjhAYJCSkVltLU8K6VInTSIb1gFx+RdUoFXGd112Oee4benMG8ad3aaLZo3LwmpmKLdazUT5ArQWoZYs2IlA2QSNFQnxlpP7qgIT5luoR1HyQWvxpf662kpEpBMnBiUbq7qlYf2EJKySu3ErmEDY5N4qhmKRjgQCUahgEQHpALxrzH0AgsSL0X7JSKh4M0Z3P82HbmrDmYH7MWQnGeg10OQfIEAgJcgSRuyyLUhGsACfWJQUdLIK47Xe/3p3iaXNlJ7OzG93Z6U/vZ5MDsD6WV+Nam1rhni5VHTzbu32k0ntxfpc0EvksgBpl/IALRrTwSy9djcKATAASnD2kOcsyOW8zrOu4czx5K3mNf4F54apUIRBEIZNGuSPiLEBHiqFFqhTr8wNjhEkjdHpb706odvUIglrtpW71uv5Hrbj3aklZiWxnHtqdiZbjda9iNh6vbNhx9UckKhixhb4MIpSYmKSCmL61C0tCQq6CAquZb1jy7PHO63W7bcfF0zsaZpof2tXGLDAOGkGlljTh2iF9rxMBWGeE4QURCFFTIgu5N1yf20O1PykOA2LuJnT1jr//gWe+eNSxNetdvxvobqYODrrF6+37h+e3GwfY2FYiZToIjDoEFJBSQNAJCJPRFqyEEED3NQfIASdwouE672/4+vqx/a7IR3ChA+CAFiFlVRZx3BfEIUwtJi9RCpSC1/lkokYRyFaK2FYtxM+cPeaksYBPZvb1LeZUrabqKXYImJidBkYipbJrmSR6yCAj3cGfXqxZFJHOjUHfabec7I3m+p15DQGiKaopqgOPqEkhNBANAKCL/wYFaj/kgGIs3gcGJ6ExGNrDAJ7qbVB8lU1eRWGRhiIRAeKnraLP8/XEnCNw5CB+TJ4MLDuI4bv1y5s2/JjgGbSoIHuWVKK3QicRSaokUEYNu8n+BQBwkFJIrDuFI5QdlZrTaIBBE0f6KQ7KYBWmIaCu0BaMY8/8/1HNn14X60OA8RCEP7nFmduder/0nZwh6r5+jqbAyiCekHjTLAuKr/147BRdcMe3Jy116UTM/HC7wSazGM7cniK6xqbrx6D8kJ3at0cKbPBhrD2DsQbghJXrrAhkBEUcTw7RxkK4EchWIMgGGu6QrV/0icRm/pEg2MZm9SGH0gl67x9rUqbCyxtpgWvkunpGnTcc4ACEcQjcF5GkzAp7+SH3upnJqEW1Z3iJ56JrnzWhwnkePyvdz9INwDBfOOmV8ZtAraIbQKiFwbOEsUyotI4KdjnEUEKKQ0CMR/c4CvroYaA/n4I/c6ubLYdnqChm+skndv+aMXHArinjxqvpxjhGOaFbLHbbpTEIySUF5N40MBohIzvslvwCBpARpAUSDVxhwsqmskWfCURFJtqjVHcQrahVIVAzKESDjck92ihvFCrU50kAgbkEyjQ7WVnzc2INcADGB1Ka7y2234n8xiD1IVQGCD/HLldn8JA6EYdx/YuN5eyCzYyCTXb7GblwlXWjshAIRKBQoXxEqyleKKAkGogdAAgGDMagXj173un/cvlN62jlMnx6avL+8z3Qyz8ASCfoJb8hXG8TpCDgLURuEGx6Sa4wAhKPJ4KwdCD/k7xLvHQjfBiFRARCbBLu+Qbb9X0u+/xB2sdEeEnYDuezWOK+YaxefQGMkHCNEBSpJCAtEpjw89xCZyDz7oYSG5WCg5K3XF2ax957NrLTBXanU8HpEOF+VGqXkbX1QLutLtTmbqdvHraqaFmsahebSqMweWWZr6veddmoIl7yxfmzznIsqN10l180WN+n0/HVqVcqJq6vJpO7x+vGZ5McUIdlFKUZQzs5YjrUQgnL57OAghwXccAxPDhMhfBcgbox8mGBECBFgvYohmUbkE0JOwp5ScqFXn4upoXk//ry9rEGYHQoFXvKNWvyu/jnSKrrOgMCEeypmsGahbBlsMptXZ5aZMPV5xnxtFzcK3Pu+3dz8jUYvut3YW2rdKw6ZVh4lGo3FZ712SBp+DCQIn0g+LBHZzovtM8IeQmiHAANzQZwGgeQMLtAEUSogwACFqIwxJPBuDK2QZDcJyj7iFoNivq61Out1rLiqavV4PP8Ljh2eg3jyMplsXCY0zWJsqppb1XpkS9ZUdXV8NS4XCi1LZVPDWM5aurbqZdLVVLqf+5PrX/SVmLJ5X6d6H/P79nQ0WSzOj87C4UAkEhKDvlMCRbiR4yYEIPt8hpJtDMol3jVEgomDYIGCgM9kt4yR6POFKHBhAVP4dxJJkkOS3xcWD06f9FZn2LvOdpaDUu3l51Eg5H1J3t4lwVsDTdd1gzHWUs2n8riiWrphWYbOCqqq6iOrMC0s1QT7mLcfVr2eouSisWhfUS6y79nidXX9UGXG0ySZP/Se+c+93vPfsl90C1SUHAqoeX/vC8KUa4CgGGO7QrsNgEMJBhA3NyOAEPqPMytYaRgIok2FZg8NMaAHwZMXJSJ4sLX1IAg15lAaE2y0FRO7GzBVk4iIomBpaA+NhYItFKn4r75tpYcefRl2ZydhM2HmZZcdHbmZzxXz+HGWkGn8XBMr1aau6hrqOoNy/+H6vd6N2ncN39/TCqbZeL1DnbYaUEpdhnxCTMLQDZMmcy9ZsxwHbaPvsrgX07j/we5ZLYrsd3s8vAVLKreVyunPsNvt1GuT7/jCag/M0Q3fvry9Fko7eP/JxuE0AEU4vpoS1tdAXh4GdZZlO1OKwEmECWMV2YMKIeKo5nJgdwmfcVLcxZXPcdJDtCMdx71Vv2UMvU+P0SBofW1rZ4UD86axf+XT+1GvbTm9xHkKjTIIbsUWvWCJc2lRp5lYzSenb7CkY4RuLZp4tl0/P0Ut+7EyfjkfP9te5EWdmjEZuW+0emX6QbVweLyp6qWipm7Bbe792qqQEoT00n8gLhqIKErZbFYRiUgIf2AGmDGWCSGKrMhElrgOkwINNklWFIVIEpEUaYosx/IU6NBwiwzBtPJ8ygUXVtIpQEgDmfQCMhkuApS/u/OG97/sjcEJACAMA82nE7j/rIZ4iAVHMKKpTY+qJgSxNX3xLjCeygiUfPytzchpEgEV9CZlY6DlBjUie46UygWl69PNX6SEurC3BgMoBEaA30vBWI43kgbo19IoGAWjYBQANApGwSgYBaNgFIwCQHtwQAIAAAAg6P/rfoQKAAAAAAAAAHMBXCnzl8gV+M8AAAAASUVORK5CYII=", + "description": "Displays a latest indoor fine particulate matter (PM2.5) telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaAAAABcCAMAAAAfz5G9AAABF1BMVEXr6+vu7u7x8fHo6Ojm5ubk5OTi4uLh4OCSjo+WkpPd3d1dWVo/OzxlYWJgXF1TT1CloaJqZmeFgYKOiotwbG1WUlOCfn9zb3B6dndLR0h/e3yuqqudmZqalpegnJ1taWpQTE1GQkOKhoe7t7hDP0Cxra60sLHBvb6+urvPy8w8ODlnY2Q1MTJ3dHVNSUpYVFVIREXf39/Kx8g5NTZiXl+Ig4V1cXJaVleno6Ta2tp8eHmMiIminp/Z2NjHxMW4tLW2srOrp6jMyMnEwMHU1NSppabV0dLX1tbTz9DRzc709PTa1tfe29wyLi/GwsPR0dEvKyzJxcbX09TDv8DPzs4rJyjd2drMyssoJCXk4eIjHyAcGBnn5OWrTAZcAABbIUlEQVR42nxaCXvCRBClQktwN7vkIgdHNhCu3G0CqVBLD4sg4If1ay3a//87nNAIKOqm2Ww2gYV5mTdvhha+OWs/5Yf98SIfZIf8CHMn7eIC5mH2qx3fo3ABly6g+zrCjYVvC8UCrFf4hGv72fLl7nXQqf9yv+h072rSnTS6bUpuSngz5NWmoRGbYetty4Jg83sc+ylV0hp2YozUm4f22OdJFGNLYWFiB673x+9eEkYRUSqE4tj+4wO7jhUQpCt2YGNiMktQUoGpHNkqiZWGeqAokcsjueaPato0VWtIFCumXJkNqw+DwT2HeJFvtyv9akV8fnjgXpaDWbPX+3nw0HlfPb081VeL3ftqsJ4/rUulwq5cuihkhikU4dsXimCL64NZvoz2UwluKVxkt0EP57BltszG2QbtH6bNLuUAnaN0xAje6Ijb6ejieH6KIEwDGnuAYHJ/hAbgXBYK0F8Ufl4Uij9mw1Lp2/eb2dNqOO93qm1uQto9blILqGYoqsk1RoaW6Phtw5gSU2zxY1eWkR5bFDNpqqo14qJQoUFALRvr+PeP2GLMTgiPbcyUjYUjK8KOF2FSc1MT2VEiJMkE27LujhnlQxoz2TQ1lzcqXONOkyaGVGu3iSTNmtW76pTzJ9K40r+969cH3UGnuuw/Pr/83On3H7n+fNmZ9xevw+Vi/bma766v1u87ePZ+uvgB7Lm3+xcsJ5aBqWLpongJBthbpAi3fOGyBxYG5xjlAOUGPgMQ3jd/8+zviEPe56cX+RwMoD95Z+jzZQGci4tSoVgqAUKr4sXVt4XCdeGiBDet338eLofLn3v19qSmBQk3GbssRNirmTWtpooqszwHW5FtOSFpT0QZ2YrO7GDMh4hXSMqTFKHQtjDb2qGaWsiiGos9HNkpi/mNZ1uGHnBG4Fih7lAmiIbqxZESKRYT6oz6vmqOpnVxInJilVNboxfREGvtZquhsW5V5Hqzp19fuFaj1+hMF4unh8lA6g1bXPmXl/mwtxjeL1ad18/hsrzbrS6/Hj4wewYAmOJIN4V8BKBAlz26+y5nmNxKR9PnpLMfwO2HC2cI/f0hOGW+/fiM744Ed+JI8KlgnT2dFb4pXRYuPveLwl6Aq1frb5fr9X3/YQaEZgKFmcBbASNOLDaF0DXNBAe6Y1lKqDClxkmiScMJsvTUdU2BhTU+lWWBpLqDAxzJegCMZqkRs1Qch9gJYuzRKJB8HFs4xDpPbEdWMXU9rJgm9Qmt1YjJT422qGpqnxsTv8VVzUghhoEi7mXaee7/8vzLz4PqTbdTHzwvlt1ea1Kf9RuvrZunm5vl/HXVv38v36zWq3Kh9Hm5d6ILMMTX30VuotysMJFRyN7qpdzwGVCF/DHOoTpFKbv1dDJ/x3+3+Dmvnb7mANZF/va55xQK5WKGx1UJHq/d7uISoAKuy0CCy8XS1fty2Kt3W5LhywLSEyF1KSU6dquCRQw+1UPLIi5f0chYnEy7tyON0IC0K9xUTlNCFV0hJmXxWxBRJWZ6o+1QHDH88fZhp85W1z3M3mKgSV6nMjWJuY1je/OG4jbSVSU0H2tcbUwMDa5Umqk11mhgh3aaBAnvjyfNUXfwNJs17h6qHCfd1Jvj9q+3/Un15ef6Y/3Xwf3P8/rspnPz83zwvC7Py7vL74u5RTM0AKyc82EMG5xlBj+G5uwSdKUvhM4MvW8A32k7DzX5a09ZMIfjFJv8eglWvbzIAcp5rrgAaEqfZYCq9PlZLH8W15eXl9m3KBbgwm55M7zpSVpNkGXepGlIlUSgQRy7SFFUFOgBxkqYaqOX5q83y0arxWkuEe5mVdFENNJdPkoQtb0NcWxs2RbCDqEuw1sISxjIkQve0o9tnG71YMNsh01ZKBuqoka6rvKE+ipx/ak58YUxQQwil5S6QJzERJwomgkx2verXx+mo2Z12nypT7tS7aW+rnONZktqPd9XG4vBsv/8/vT0ulvPBvPlw+euWC5+U7jKQ/whih/M9mX0PUrgPZ/Z4SgQ8u4UHwD0MHFA5RStv9Pjf7pWLuBySXLs4SEqfGaus74qXl59+z5fr1e763IBwMkYuXD5+T4c3j9VZVVNUYo3jm6FhBcie7uNFJoqytZJ8Ca2FEN85AaLntSscGN+klRemtxYsTDFToRQymNCsMNTO7WZB6JOCaN4IniOpY/p2ybCumPbFmhB7IF00NsQqoQAuUlg+okpTFUBCX5DTBwDM8cZBbZlqq7iIiZrvlS97d9V76QmV+Oq3UqnXW/ct2udYb3ZHdzWO/37X1/6y99+nf0yaNwNh3er1S5TAaUvhQSiIHOfU7MXcmN/kf8KwtYRlnN48kiwnz7zsvPTE3L7F4AO9wDmuWQo7ofZIqVvd5/X78P5fF0GqApXF5fABQBTcbUcDnt3FdUghossMKmH+VS1Nm8fjqNHFDwh3ToQMkSwVKfRqrRaDZ/ZtjBpu6K5cXCMGbWclM90nmvylAeIEhu0ga5vMRZYoDMSOzqJ3dDSGRU9NiKM10PbJkRAvMkbrlAboVRuNuqpQLHlqRbIQm4GN4fieCJOGn2j0tU4467ZrvLcXaMNkbDy3BBa7Zv7auW2Ve28dl7v+52mL/0yfLp5X13/8nmSowAkwHZf3pNbGmxeyOPwJfRHxjsafT+RI3SK3tHyx+ExqhROpnM8TsA6TOTOk+2lbH1wIHiqyq+r9WIBPL1bX15fAWSguq8uCtdPg8VDt9Jo1XxdCTdbGzs2HSH88RF5mYJm2HJ0gecrjelL9fHnUaPZb4hE12SFHxm8ByrAQpTyPEoomJRSOI+CSLFVFOsWRTrTsa3gGG6kGws5nmcJCLHQIGkiqCppq9kwDANkaGNXJF60pcjjsZJalh5O3Jo41iZqraZxUlUjzYZqCqNwWr2b3sqi+vww2CP06+C1P+w0pcpLr9OdVW+GZXj6DnkM9IBHJh4Oeq34w94uMHF5wAf2XCgcZnI2PHGe8yh0HO/vPmvHq7mQPMi6fTYGW+Y/ANRl+f399Zfl6335df4J4OzTouti8fLhZf762ujd9CWVWBYIZNC/phBuPmyMwrEN+YxHfEMTK7N+79eHu16zB2pLJ4FQE1i0ATntODjkFd6WCQlkk9mYAVCKgLfgJCy2MY5ErDiWw9KRvbGDSCe+KyrjgIiugAhKTQRMilLDIPGEAR06bxsL8LQtOn5xTXVck9W6r05GlV9qd1JI9IquNUWpp435ilj5tdO/7XRfOnVRmkij7qzeHTS7iyFweOnLT3LL5kQCxtnH/R/AJtBKGdPnuvuoteEkb2cqLof4jMBO/ehf6e9LrecBr7jPT/9iUNgvwYPey6vVfLFcDkCs7j5X2TRIzet5efjr0+v16+K++9AYhUBwumIlBCnexvNs5kQpcrAsTZu1yuPL87D/XCPyy2ji6lGImB68Af15W0uQwVF0jFURscixeWwp3tazMIotK/ojDtIojoliyJbnURap47QmCCk16kGYtAUXIVdt0QTQMS0v2jjxm+1h7Hl8VZQYESbpWJ5OtMdKV2IGIXhEm9yI0wa/Nhr13mAwrd/cDG6lBLV/EVuDSrf60h2WP9ff7skjM+WhmlIsZVUUaPvvDjP7UQ5Qvh0aWPKU4s6V9jk6R2iKxXNRCCvlngQFnWyUxZivjwDwrFc/lBc3w/ny187yfV1+X3zCxy2Vi9fL9XC4fF6VV4t+vdvgWcB4qtOEBhDWI4s6MIEDbSrI5mNn8DxcNlTGkrbmBtiKWEQzigPZ7GAH21vPN6KIZxboBLx9w5HuKN4bXIsYhCPLMseItwKb6QlJRV1XovbETchEdsFNTN+2Hc/WKLbB197edB12G+kjYNm2MOWZ1uBVVbEsQWITnID0I9P7au/uzmgO+qD9ux1DfuT8Wr9dbXGidPs+fL0sFMulb744JDvsGwSjDBwYZVntF2CHpPS0HZKgowedIJCPjk51yJtygI60+A80c8LM4f/rAVmv199d7t7Xc2C45RJyusW6WABRV/q8vn/qzX79efi6frrp3DUMPbKCCIUEBwJiih7ZekgcS0GKMOp2e/XOiy9SmhKBB1EWAkqevtGtiOKAMMuyTdsOzYA5sQNBZ1PJ6nTYcbxNrGwtPUBh6I45pvs6VUxeIdRNlBRMHaoTPULAp56XRS9H5h2A/e0N08mE8BTUHNAgcVPEWJDI6kdUIbUm4aZV7abCuffdjjSpgMyrNEzfr1a5SctvNGed10vABwgMcMqdAygvS4xyhQcGyDgu95YDKMfBKcXlhv9vAZcb/OxirhTOhN5F8bBOhlCpuCsVf1xfl9/Xq/X7e/m9XCheF6++/SxDjfSx3qv2+q/Dm0WvZSgIKUilCgZqEygKI0ISi/hIMGV4TF9EftT2bWqQMMMG1AOGx15PUQSv4WVKAVBmCibGoDFw7GxjHxAGla4nsZ3QKFN4ljBOfTa944UEJQH8yWGYZu6KMx2BrUqEgTk9U/mILOQ6bVefRgrTQVv6qm2mtr91oapaqY1A2tU7AMzsZdaBr9B9fOGq4vDXvl/jOenll/W3P36CEMpyvTwNvcyjwD5RzeQ1tOsjPMd2OpOR0FmOdFau+epzWM9vOp071I+KX/OF7PNdFa6vS+VVGZABeMrLT5gsla++XS1/lWb1frNZ79wPB8POA8hkTZTNJIporPOQogQySkkyHocRJaNuU+V6DwYTJD4JcRxZlpXlpmSC7Bg7OkQfGny8ERssHX9s7A/sZQ6WAQUJrALxBfGMpEokyKTtQ7pqjlmkUAI5D8PCmCmWY1mulCk+J3RShwqC4SrxFm8Uq23q1GIhTfWJbE8ERTNqvMqNRo+3nc7sVmoblcfHx4dK56XRlFtt7bHZX73Pd5elKyijXIFg+LZ0sQ8+WeTJi1z7EHWKx3nLA9TRsGcFnMOVM9ROx0elvpdwxzW/xEnx4rIENdzP9WU509iQCBWhwlMul1+hhjDrdWet6qy3XCxulvfcKDFrAp9AqLBIBUYCj8zJRCVEtwgacxLUEaY+eFlKdc+2kzS2dVshqg6qgGIbNOCbo23fsi0wY2+7id+UEegNEV4u6+B0OEBRqoRKao7lfZkVUdhlypCcKGYqO9Na1LZ1Z7NtRDTSBRsLdgJKEWNFJ0ptIytie4uIkNCaljDZ16azyqou8aYs1mqP2owzDENUjXr9sdcZLsrfvr6vIO8DQ+R1ky8Nl8ehL413xmqFf6IEVw5h4x8gHBKavGxxXlPYL30QiX+phcNSudwvZWX2cnFdXr0P38uXxdVv5W+v17v5033n1063+/B83xncDHcLSTXRdGoC62Dqd0VX9du1tjFRhSQMUi1Raw1f5NqGwkdIj3EwYmyf4aQgtE2GgBid2HN029nEH5htYvyx8QLAyeb1hM8ENobkV2eUKIQ33YQPiUYRoRSH41ogjJsIVL3rihD7PIwgCcaG66gG9bwNOKpsIoO5CGtvjg4cLFArNA1IWcVucyw3q5yEHhtGw9AMURakR9B5s+FiNX8tr3bfl6+KgMie1fb2AZPngMDZ/zhQbsNzFznicqiIn+JwcLSjh56SXb4s7Bn6+75YLEBWCrnQej5fgRv1n9dP88Xr+/ppeN+rtn7+efYM6vt91zdUs9VQZZlnCpoISDUq0lRNQ0WGuK7yqiAJskEsijCDoIF1BmjICoID0W03cPCbY5uyt1Hcjw3Y1XrbbELHtu2YGoQyoDOeWjbwozsVTVMggqmmCoqQRVOX57Uku6xZDNu67m1CprgVHtUm1P1d9xzDjpiNZXX7u+MHWsX37VTipUdVa414JqDKU73W7Fb6dW48rfDaOOO82dNwMVz0ho3nxXp9udvNX3fXWf53mQN0Jg/OHaiQbSdlhmPF++A2B8SOeB148IvFcvAO8epUWYJjZxNZK5WK1++fn4Vr+AWyW549v15DsX741OOajxB+VrufG51yX5qgSts3kzDagGMkpqZxU5FP9DANU14YCyIvE+CyN13YhLqiBBQCzltI6XiCHQKp0waPXOfjA1IZuCkOYwsjkBEbKwgYYmYiI00VUJiakib4yOTRGIH8i/RQ8ZVIYsiFoEYFRWE05c0IIS1WEgrxSNjYrpJa2yhmnkVuw8QRXFVWkDGW2zMohqvC7cuk/dKROh1Oa9U1rT2pNBuNwWz2fDO4r896w933Pw8hDVytQS6VIE3JkcgNehZ5DsOs5abNuxM4DtCeiu8zQZB1OUDHH+fy6VwnwOQV9Fev5d33pavSYlHeQfWgPPwZflJpVeuDzmo+3A0H6/WvjYqgCWBEM9gEIJJRSFRDJEqEEnNs8MTlE4S9jb21rJDqih6aemxHYkR0CsEojjcbS2URdraeA71X0yGWeRBMGEUkTQWBpK6P+IRyrquqrp9wquoHCrOJ4Cr6WKG6s3VwYjHBpZGhUFnWFFew3IpcU95s+e3tw4L0Gas2DSuSoDFiJiY3r/FUbdca0qTBibcPhss1jYY04jhw/zr8GDFcdZrdx+G807+ZdW7v559gkatcbP3DWc7PAJ5scKKlj4dsP2S0Jz55Qn//mIHuOJmXYfcrwVkJxMzVVbH8VFqs3ss7SFkX7/f94c0vve7z83C9hlS1D7Wg56qZCqKQEMtJMYQTfpykCYPsRJVHtcREjKdvH5sI24oceLoSEBYRi48Si1IL4xRLlgWJK946FqZUT1Q5YjENI/ADYCEuGRkoZX6aNE1BNfmUajWRBiYF7zNCG4jOsn/3YhS6bRLSRHfEMeczL5ACV2Ox4H1Yjkl/R9CJiai0a66gO4Im+gSF0mNF0x7EScU3pfFYbbeNUFQTqTq7bb2vq63K9GFZ73YrI5EbfmYWv/oHOudeBA26/fHEH44slu/5+BTwMw2XD/eQHCHOi4GF4v6Yx6GraqdYnoPcXsxf4XfU5XDQaXQGdzCz+/z8/tfVvNfjxiEKE2Q5DDRwmPh8QKPUQhMDCAmRsWvTzRs4CHNTJwp1XQlTkgbYHutmjMPAQZvNNlZYHGyoEJKUKlGqjgI3hIjThrK1ycuapvAIokYgKNgLkWJokWNRPUhcxvT07QMTta26VOF9akiGLzFZo5ZuEgUikO0pjuLrlqmN1LHrRhtMSUDUgCK+Qvkub1RbUrshi5ovTTjES6Pbamt587PhCuJI4lq+KFc734OmLQCh5Cb6Z8tBgf7QDhY9+MopOCcp6pHJjqLghOXy5fI3PC4NyFx+rVcsd34EMXPztFyBz6xWw6f6bfOh01vByWdpNy8v+oPHiovQOKS2gnx/LAiKi6jKU18UaJRAAFFCG8fYtsOswsngxCKExJhGvKIQJ6vseBumIzjhfQHHFCPBoKCszUQ1TZ/nVXcCG+INl0d8kNo2C3XwwdiywVM8Fm9sD42Jovm1mjxtcpIWtjkiM90CQvWrhgrJr+xqhlZpU4s6kUdcl1lxHHEGaiNqcty0aTRbLcn0ZWNkGC9G7fFu1BIqzYeJJt61HxaLdSYU/jfzgS13of3h1BUO7nISW05G/5B8OVYweyLXof/7A7H/fxFYEijuTz6uRDtZMwq2jQuIIJtsgijuIuIGGjCu1ZqjSU3+xqax7/8cHVKrtGlrE0TUnFOGe7+5M8OfTPQxuH3bNNfp39Ov6d1p3VzWBqvTbvWy/e23/u+n/e5bQQtKKoOxQ5Z8yZdVT6SdoCQ5Ck1xvbGKHFburey2eyWKVkSqPKzmq2qnDK9irJY7x2E1qgaKY0TREuRxle4yGHgoMdC8gJRgkjqKJi+lIFSiiqR6PRXj7fCYq3aHUrY6PL4fq6XI1iU9wREVsSjJ4tilOJXjGVrt8pLZGYdVc1MjlrL/fixJT+NlbtjJ99ScEfolV2YoS7aMQhEVFFq8KToiKU2nFZvXK0TgKZvmYnZAK4lGjwdsLhrOTbaMHtcmh9/osze+fGN9N5CwvWGH73wJCH3pifjQtXZvl8p3CeDT76dTqf4r1ktY31iFDuv1avDYeBk0QL4Ph9/2L7PCRPb97rhb9kMp0EKHg7LAWZh+wmBElzHndMEIsMCAi8GdUxD2aQ+HZVh7EOx6EAxKXZvqmq6oWFNCGJuwtCWZQ/VwJk8SlqTJpCjqms2LgUirajWHuA9TfhKreM5yPeqp6vTUkW87dhAoFk8Gip/r2USOsdyRSpXFka1SyOARQl2EanEcZSmx191QlDquKY7LEBodyMXAEjaaJmkcfOKebxvFmp0TGkHoSRbLG3olmcTJwlX797q5YHID69rt/gMgvIhDFZfB/67e/SWXX8SDCHOUDfY/29vlMLSEaJNcJVNoaNtUMpX+tXXYHva7PepnMNu2Vunt9mWlFwnBp7C4hHowRVLDMzhZK9Y2E1EcMTlfzeK/UilS67qiA+477rUxfQ7LWKfyGGfIfJc2NcIi56yBzJaIHgVUNEcSFYjMRUSHwqIveaEEro31a6hyJZ7rdUqgJMMjk+V408tyQcnP8xyUHo9VNEfjA2nESXS+NKbM3MhUQ4sKgnDUPR5BJ7UsZUo0DCglLDjQUgNZUfwpHc7rTgAW4zE5l5gvedepLPHXDJ4Iv613/d9xim6LwgWUyyMGDR7XM/jd/4+zMRspVjQxK+/6yU+4YpUUwQXUoi4X2ai7fjp92PeT98nkoY9g5uP29NKozOfNl2Z6MGs265OiT4/zJZ+w+CI5qZOCHBLLeb0SehhUNZpS2hhhRswIK3xe6rbbZUgKZawgJbDpvCtStEhMNwVhYViBRmvEtGiENYkgPcsgQ4jNHq8EjiZ5rm+7JUYtjaheFV+ltbJapXtIXAW9nAJtCe/DYLXE0KKJpSSrY5Nrd6m82qbFgCqVR+SIOkZmR5YKXMoSRUI0RDMHDWpsFjjkF4rPOl8+dijNpck6KXcpclmvUUwe6a5Go5WG5/8PznZtaV8e/8H0voud8i90MB7buR5HQ8PzFetLgjJWxCkMQZlMf7XtJxKp5HepzG+HbRPhssaSnS7X69dDa13QC6TpdqML0jM8n/d0XTCm7POsyUqWLjiyyCFmZdqmyCD3m+cYFZa2iBRQLvK8VVPzEVuoYwCpTyxJ9gmSxHRCkoIuoBhryxq7pAXO1ZpkiWbKKLruSKPwNVflRJqqZns9Vs6W7ICRpnrAe7YjKLRZJ/WR38nmhqjbkStCeHBHHD8sv0PyVst2XhvRluTRBKxzws6PFC6nBIzMFqzxseyTsOsd23OzklEhsp2xaVvG6iGZScSUgljF3HbvrtuvBXMrgK8i+G0h+u6Cz+0LF059XeX+PHjFJ6pXQPTQ2CbuM98Bo59Ou0Fh2do1aoZXaFRWvx+QwJoVRKR1mHBiGKJFWEuCIBvLeaPJChapmYqDq5CO0gcltV2CPZ6rUggk0hwGWY2gIQ1NCb1GTEms0R5JbliyMCX56UQgWJJkF4QUEr4sTSR+rMCLE1Xa5Vw0TXVUwsWdp7qu2WuXXFe0PN6XyFoR+d+p5ofwoOguB7kBQe8h5tKIsj0NvY8Pqgx+viSi+LCguY6A9JZvBoLkB57eBUEskXwoch0kKgVlOVVU25FZ8nR6SEJMuFG1GzS3x62a/ofw3Wagrxje+PiNB1yRiNCBrYftjS7AorpPJZLJ+/Tv36WS0DsOr/vH/eBlN1hVBKLQaO1/2zX3p0pNolBAZHNRECA5zliDXTdmi2WhKFU8z6fyNjOuMi4j5rvqcIjLH4hximaFJORvh9ebOsmytXqjUCCbtUqdKBQNolD7VquzhEGCvkF5BtUONQ12qjIOcoFaraKQXFIONcaUJgxaHm1LoqmFfiAFY74YvIQ2BxBzefmpc+y6yLr2yBDZheHHe4fquTlCZlxnLXhdhWMYWqLRIEeiIcCPKvmcw1oaypxB8tx0GHNKLIzZfntZfCBRfsHjC1pfu9uXAoq9fVVIY6VzHXguVXOH7V8cMtIGo6PJe+z1k4lkOpnC6gNwQOsOu8fBrPU8Q/Dsef38+Lrbv84q602gwLNkFyyJNlerFZdNSFpsoUCAqTolxEj8qtotYc3oHCEsj7OI59CibKBCNJll6zW9WK81m4h+VqaL2mRObqb1+mJikMhLhXXBVAo4iYJm8PTYMzCzijIEUc4w89jlCR2rmC/nJVmQxrJmCYQuG0suW+12kHKAsHfuDo/HUtaHCPgO75bMl6tDVHPOJEWZC5BxVWS7bOdcXzBA34cW6WEVRPOkLSS8wUsIZTJbHX5LffafG0C3hnZ5Haumf1PpgF/iyh7iFCBO5/5dHL9w61Tmr8qJAlbI/6a/T6b6EHuSyXQ//dvr6YSdV0QR6pVmc6ML68GifzpA/p09F0jfZ/VFsw66ytY2wqaiN7ZsJfLFOLpbPaJy1F4WMjSEMyQUbX9EAyEDuSwSIXdjiXppNRZ6cVGYsNNFo1ZkgXJxOiliWSrytC8gWgoRTfFoWoJxG0qeSXMColzdfFc0ivZItu3A9ylJdnBSeb5GjgDK21h8+/jonc9Pb2rwht3cByQncUzCm+iwyFH4GHoYlXBNWuW61RzDZW1QCJ+26nauU6UUwvKKTFk2pUXj8bfPsxrH5J/7/w8QHgDo/7oenr9gel3wPi+OfvK7K42E84tIC7Dpn4DWHSaizMMhk+6DZG9bzWZlUay39n3YRavWCTngKSwgKPeLaVEgmg1Bb5CFSgXxbZsR4Wlmc9XcuFQV1V4JBlCewlRq8oJGshNDx9UqsIvJ7HHdqqybgERvVJZLlp0jgIPALmYT0aeLok3nbYm0saJzlCLZEiMrtD3iSrYmEyTHBYEWuFLo8YZFLqXpRu8w5/ePfOndens6u9QZNyvhUf54K6u24mVReiPRZCz0XQYzEnKU4B9ZhqqSMHQV2yTyx7fqWFLIwCPKTzmbbOx/j4SvP9t+BMAFnLsv+NxefG1m38XqJM4OLkX1SdjikF6Mn4vbfml0kVH1OZNd3n14SCWg+GSSfWg7iQxSJNt1rfbcWiHqk/jlAIi2jy81NrSUsM42XhqGt14YxQlbL1iWIHVhO1DI12fbiFPB04MR1OmKHC87ElGvFYzorp7Jcs4umzvc0PL4Mtno5HKFZD5Z+KZvSGICO9YnbZPnke5GT2I4DuBaPFJ0gUO5iONxJIiiRpOG6AUCa9U1olCveUHv7fjxXqaOyvvHGT9u5/h2PjPlD7XHTRQku8ocHbFIdF5NpWhcNZjNuFEPLLyU5/OOg1LjxvTUc0Q32w70egOmw90VEJyZW4e7DavxCsLmNjLduPk/qV1MhLhmiuPwwnO/+6y9SwHjXbyKdvGMw1BL04lE8gFxxcT2t3QqedruK6ReW85eD6dMOrPfH+CDz2q6HvI8Ehn1WcEY1FiBWBoW71CRH+rmeyWJQjZKHZaoHt1Gvt5C6lMwmt9qG4RPmkINTXO9H8zX8wVI2HIxQNrTYItF0gt4M8B4P4Z9I4WcIvkKKINsK6ZphrICeGjEIJyAIA1B4hUN2g1PsBplymrPNkcfb5DXzwDofD6+V88fbzb/9tQZjrhhNYdggwK9qS1ySAv1cmoZXC/PdWHwjlE/DAmD3jLtQHTzjNqV9MbpcEEEFYTe8o+p50sB4dD1YKwasLn84K04QNj5O23A8dg3UUWXdgeAYi4HCBz0nt+TiQilw+vr6mW1274UCJCr+n57OP2UyPz42H/eDtbIlnnWejufP9Y3y4DzNYEQBeiYSL4jypOFpgmxu83lEZPK5zQ9XE42xTqm3WWl8Q1ZwkW99VwpLKeDOZpeY1Vp1jEWAWZN8eZeQLvwLmhQAbmgkNKINhTZL0LWo+kxrYWiY0ElIjc1K0BOX7YWLE/DSyox70620zt/tPNPb+f2e+eYxR0vHZRyuwsjqmzThoxQXSSs5+BLHcciBQVK7dEKazLdkH5q8yR0QKQic3ZQXGXS6ai3JC5VA5wue/Haue7F6gXb+AQTk4S+Lkb/wPN2OPFnO/tLXLqy+bv7n9N3ye0hkXpI/rbdbivzwaJZIRyL1Ocvs/5v6XQysz2sTvv1VJADYzmH2l2bhApFw5+mKAQKq9lIeC7TZbecLeHybbv5QPPRheqgAmAS69nLChNtAYW0xqEdbttbPze+DVh2ahQQCVLYCe/AT1dMTaYVDlqmLSJ95XGUaTGU7TMibJ25oEiGIEiSbkkI1G/qkuMrx/es+/HOdfnz8Qhf6PhxjnrdsXvEfS9PHWSFTZvCbIYcyxApl1IvFExrDHsvPyKnoIT8sSNu9JAbIdzAmbVDElMGSG0miS0et3YXB+YqAd3O9hWJK0B/kxEun/xcZq55kKhMvtKFi46duqxFSIx8h+rJoL21EOdLp1P9NMyf1cusQlpTvbje7iDQ/ZTOHE7bFQwiUpIIfTqfrSebqcSHnkKr5Wpu2C5DykZ4F/tlBBWjuKKJkXRTAU9bNTfrVWvw+Pituai1HmfgGOtWq4K0Q6OygE2Dv+krvAFKwEuQUDmXN2nTEuE4+KUujYAVk4vO5NSzZM5WdN5DefGE7IWsvhHMarv09DE6v1XR4bJncDisQZ2SirHILEEzHcp1rtvuIlLny13TyY6fEbcPcKslZYvozqI4fBtpBV1ow2TUrMbrA9bfBIJniQiZODWIgRMnCH+hdcXgb85RHKArcFcI764Fl7gMx1eAsPxED9C5u8yP0Suw/j6C8+h1yGEdDmAB+8aGXfLTynqXPhy2P/Vf7x+a9RrBBr5UnEf37hYKG8IQHBqpgny2CtWageJWbfcYADTM07ZC6iRuSylM163nFnzaQbPVWjTm80arUWwC/8q350JzsZlMCzqETFQMthqtQ23TRFNhRdt1bGRHZIorKrKL7BSWNOhJSw1za5FAswun/BLBa7ndecu+H+Gwf5zP3PuZBkJH5u39XRm+Q5MrOzClVBh7yHSrMpW3uDqXlYd5JZgtBFZX89Vc0fWsnJIv8Y3HUz/xewaiSupzDcJvvHKuZx6bGExxgG443CrqZiHcFCIEdT6fLyQkFWF1efcGaDodhY76CVR0VFL399EeVO3UfWTanZqLxpqYsI0VMqevD/hw5nHVnLCGJ9Rnzddv7GRSJGsGoUFcyFVLvXIW2Teqy4x6VaqXHWrIeBqTybwxf25WWtv9/rn1Mlt92xXmq8EC08/s+aUwRx8tFCeC7mgQSmW4QKGjWw4zkjw9GEXMTQhoEau86QdIQ0w1kitMHeh+OkQJdll8FiTat3LZKBqZX3Zg/pwBzjn79P5Rct/egNET9HXHdlXEJNxuXs1C5aNGAo9Eckk2agY3IrrDHO9BoZI1wyFh2d1/t698NrcEGMIFIJy3xAWIGypxnP5u5Nwwui03txOPjoVnrHLx/niX/OHvffGTJaQ/OUr67i6TAECZhwdEsiNJ7i6FQXV/GOCWh9m3evO0qj+kUlGAe7eftXbocoP142lQqBNWYEDvVDgYqFXkoXq9IXK+mIFkeG2mIxhGsV5fP1cWIBovu/WqsW48ttjZ/Bl2eqXeegH4mylBEKIMCVsRg7xmmnKoa2Le85HvCiV4NrSEAjC5acjrksUpRMXj2GV9RxQNb67PebJss1LOHyEKOVZzpd7Hu3r+KGffzjT10flAgg6sGnOP6DlmVQU6sIPLnkHkJVUccZafM81uu4f8z5iCMiivf7tLPXyX/vUOjeXW4bD9k/7GsbkRt9v+1dz7qmVfGV+Exe1PxVrnFSAIGH999+5iM3zKCdAR0pkHzEHQ4oBPCnPP7pBuvTQb2/1s3b9PHR4P699eW6+N2hK5v+2gsTYkRDd4idfGJZBXOrqU1U4OuhiDSBt4mVDY1Na4jXf2/Ao/Fnckzhp7gF7H31zU14OX2mbNYilRHC1kCUV0PEJh4A0FSHv4FulbZuAzkE/HYw0mBKIkMqfUBUXwJW0p1Iqb2kDSad6Tiiws9qePqsshfKe+Dc/R4+PjmAW3e+pko8x+N6fQuITarlut0o7jMBri+s6UlRFHRbiE5CTbmzRrg10qXcAQiBPyCVDibxrC37nZ7cClA95a2q0MbiVxE9mudXhbk+7iNXftghd+kkSt4YuQshOA5e7XXSKJ7G8/81P/MFs9vwKKxmN69dughT7XSJ+2p8fBbtHYr5rrpUASSog8Y0CPEW0v03locE+dchW+JyTN6F80ALl+fty31tvH1v5x0Bi8bsE5FoPZS2PQ/LaDAgHnQHBIQfKwXluKLXhwbnhHBhOQ4LYKJHI5E8UiZIu0eM7xQRAMaSoRGzJAQB7FhZwOL2rciMuW/HZWfDo+feTen87Vt49zVWy/vXdAzRDypnKIovRk6EWqSHEcNRyPyg4R1AjEtELIsKKjber7h2Trp3v83ydv5OCreBBTZa6H40Xy97N/gSXuTsTlhwQO41qIDbyXiv2so0vxYgOYMpn0XRrF9+M9BFOUEWbT9H5We8UU9HD6/bGfeTghSYKXJ3jg+GlUmgZfBAXjJUWxqfwQvaPXjsLxcDddmrMIkiguavN1vQVXdvdtvt1DOBp8az4/NyeNwapVqXvsYjMlBSIg5zwfyPDRfULnTU7xfVFZeAHjW8jgmEaFFyxR4C0aVrXDFuZLqVjDS3Ih+bYiCoxGG8aoLJbJrN/ORzLPEIsPBlbcqDlE3BgBks8MSnfEi9kSJSGLAh0o5zOWRDoIhnEqL1IyRKv0/f1DP4UWBEfo7oZLvJHdkPoKWLxt3d6Nzv61xO4ulXfZQ5FcAImNS3iNt6EXXKC5fKU1i3IJUU3dp7GDJgdCB0gOWxDsTOoeq9L+dd3q71fPhdVp9fiIYWkAO2fCVkgJQ76Z6+LWN9wn0qUliuc13woby3oTLK2O/jZA/ezSrRW42xq38a0rlWahvmE3zQlBFifh0sPnFScaVxXZ4SC6SQGpcYFUlDw/DDc8zwaOyDpFz1OISQ3KGeGZyGObIyRHijJqY5QvCcjlMW+d9/Oxw6iddwl2rjOi3jrlYanqKuOSqirUKCtCNKqOeq6r2QHYieTyCMH4lBk2l0Y/kfzxrxkVssuXk/21qL5WV2z7iUh8rboJD18K72qfX2hdIoUNnm6VnMx8l/7pU9m+zyTR7A77JC6k+34yIm+pxP0M5Ds5O71uD8/Tx9YMXQ/FVCmgCBqk5+fK41yp2mnjt4yBEA5pIOiLOfrbutFstoDq9vRjZr/druAAIouyxmTUqC83bBFGxNKyQo1DDbEkjB6a4yGUi5h6FK0okJaA65zXDMGTeWICbi2HEkkWp5JFI0jncyJfAD9BhBupOeSL36rZ8zu4W37YZoYd+k1VVdwqO1QpKDxQ4rJDi5s6yMUqjMbQ/BTWuV0acYQpThEEfD18rsaph+i2j0zsrN+QuvsPmK4UOTYyXQ79g9dd6+T2c2Hf13vqEp/lg8fnP8sT9cE/Wcpn0dxhQsMWQ+sfhF2JWupmEO0ikATFkLDEbGBiNhCUCJiwhT3wiSigt+1t3/85ev4kNta2X3NZsmlv/8nMnDmzXD9DoALTYTrj8OfdAef/2IFL+G1uTOYee9odQXHbOnqHUQR9hxrqZ0Qa3NXNXb1ZBf2jGYTKsSyANePkHixnw3Q2m+3GWTsT3WKDycoGCSQrCgUhUKpQqQxpQ0DQo2io+EYZCfiC4YCrUHyvV+VB/3BNTlWEAZiDmmUqSqVV1EbFfg9srDi4KV/3qze/Prw+o13id/TGfu82G8+oz7ut06/f0X95W+AumiiDredFdKK0ykiFtAANYEFLSBMOeHHGeetdxyem7YwhVgkcZbqlCC41OZ2zf2K6VARfzqRXUlQeRz8Rb5pSfNFNKajH6wPpA/KDhoNnIlBhvYMe+bkO7BrKFPbMMpMdj/1ONrsZM7k54W4887hZA3QDhJvoSyEt+YiF8jWkP6v9FuABUgjQoNkqsFzDOkzcMFyDxbY39to1JN3Wv9nKamaqKlcRKU3UPJmjsQ82dDDoq2KPFyiK44HQBpwwFPqlPgccoakoDtfY6qBGBjdxWPQChVyROmxfPhRR+o2ek9fb799/baB/+abWRkFEDZm855t3QIf7Ur5MV2uoLq6aXP/xuV9DKCwDgWqA62jhRDzubGEtMlgclKBhRVKV+dfthfnHqcSpp0JMXRheXw1mNovlTj1cwvxFr8RNJS2Q0bkzAq6ZDHaRuPM3vyDuWYZZEEDZXahnYfRwlSHWjvlt483QzHqwJDSpuI6uqmKlBHRQv0Ll20XholmjeUWVJduV2P1hOrf3682b/9uuAy7Bco5Ta38K9OBk6J6OUFeSFVgsZPIEUeZLoAlaFZYbFgc0ateqktTjiv07YahVSjSUDdKS60O70isqnCS2L8WLplwoXt4V6o12Y3hdv2qiG/L793ekV5+v6k1ggcb3X+sVUtdw8dDtXqGD5QGFCBIq4zz6Js+bHpi9/oAPHEoxt2/hN9h2PLvZ5foXPNoZYnNSX/95+b4K7vN9//RZKYL4LDTEq/AayTGRA3jsFC+kAIEcZCGdaCOgj8C3bzsmAxzHgNvuPK0hGOC6TI7cNWZ+c1QbtXLWYb2xV3ZgU/yg0rwj5cCFPBahKAjekFrJqrufepYzX6OVxWGW09127jxZcwRDjrNYGO5qMrVYmWVB2XDQFloRaQkNC/2eyHMIrXhKEQcKcgsqXRNbw2FPEwK5KozoogrbR9WGntgulHugZu9q1+eACI2op/I8X35/aL+WkXxo3D/XX9FufJsvNKqNWv4a1UhUHeWNCjUTg5mcbwkjaFAPyq6xI2qxdplxhsTrCDh0tIATM5NuMXEam5v/Bwe4/1/u+Irdf46hSCbVuOTnkoQhEWJ8zISZCDjACUGBGEgKJu0bLF3uLMf4GcA7/CYf2A6HnRxjz935fGYfNjqp/0A5SLN/WUdjyf1l8bHepDTVW01N6aRb+tN8vpsej9bTfjb+xd0AZ29dwL/p1HT1wB55LEupGk+WSOOQ3xFEURyKWH1B68G6UZAboHeVncm0qHIyC4FxPY5blahLJISuS+hfbt/dtK/RzlLAHKEH1Blc19/PX0k32G3+HHzpdaMJGruNtsxzNDuUKpgKlW9RrGewBsbdqSvMQBnJhmzY7mY9JwFhhnjhzIe2ECgViyU6E2//LaBUSZLbPmsEiTuTtU+EkyCDs5Rx/cAaZ8mPE4aH7GImAgmdIw0ClX0GN4QmYiZz7JyFuWwEGrKwfx1ESJ0Oik/n4ZNuz0/AZ7ZlqFq/WUAFKZq3ytflbkugPVtHnb3jOpPjnKRPXQf4qBMeUaW6n09QiaKD4/NMXWJliRI5jaNKFHx3RRE4FBWK+BzyAsvzLGuoIkezvCbJVa7S53lpUOJEuoJe5u5IQG9x8/5SfEVmo/hcfAfT9PprSRSe368H9WarHs2pAZCrQS8FbsXZ/ZrEy7ZL93R276wojptpXu2eq2mrmX5w9i5pHfiJzB/4YTKGpGCrooWKc3aRZJLXVxP29cQ/kuSpZUPmINEU+PqvlHjKgWO542tIARHYQqg3yCSbgfIQvxPxhIBwODWGacOpDCmUGxN+YdwZPx1zR9ZyEePYE9sY9VD/fnH10L1EbWL9okKbK30CyR13x6m+NvTt0bHd3TFcjhlnb05cyyExahCohm7JnqpoPV7jFV4eAL2JqBFpcgDpsiJpCi2zKqRF9So8N5RHPZwXKqbngfWp5MWugM7ju0Lx6mHQQAQGAIfu//JDoYY2ctJfXm6fK/nqdSlfE0B9ewo9pfu8RKmsOZrNj8GI5USLFqqlYZ+3HO/4C3GyYLDfCIvAZCdZ8qjHUiFnsCCp/vyHfNJd3PYPEJcYqxwEn9z0GTZk0rAnFkw8IyALOeQY/AUgFJg47ILmIIbujMmdoQD4j9+YMQOtGWewIYCFOjHheL3N+vpiPlksZElilVbtQqgjH3SOsZZ5rqLNjNHEQvH9fBLok2lgTVwXAW/IvO0t09SRpJtPpqY+kxeBslJQB6wMkRZXqQpvCoB03AD8ES+pBkkWWoqijEb8cKawMi9WZYpSDywF2qCax+OQr+WLSLLfwvvcNC6uzp9f0T5294zkO1SncI75qDdirXTBUeJI5FHyOzM0b2WoW5M1dpbH0fahUqmxrOjtTJdkUcPMmNSegd7/uRP6ZJFxAPFgA3jAGx9fJZMWLCTvxBamngvvFF1EevOFAophQET/4f0Z6hE1ycbME6KfH3DARHwcfmdn7Gex9/IEmeC7Q0RDRInPzsb51kHAOp8vpioKdQYITAYkT3eOqvkmQLOk6wfbwQ3Obru1Ttv5dr07uiETnCR7EqjIDE2m3tQcWcFQUjxpiLkTnAbloSmR73GDFtomZJXlZUWlVYVlZ6wBK8dCOII84miRRz9Eu9YeiOg9qp9jOkz7DjMU7ovoHbr9/vpwi5bl15ur+/59oXZ3U2yikqfUL4kt7aHAK5oi8fSMdEbrU66izI1ahcNfANNUnrKEO/klN8aikBkkAEjE/EcQNzoV7ZM/KaLGKxVG8pmc/BvcS8WVWr60SQK6ggMihkT+iU8ihg7aQowbCYEiKREYgCiAQOosQ2KC5Th+cBAO5bCXgT5Bisc1s8YYhcMpCKYeLVwUunkYN6Bc9GXxnqlMLIxgcnRniWa9DTihA3JB2+M320X6NABEnxtQEIm29JFKrzTEtFqP4iv0SOxRoMdbaBXiJ5QYqMiWSkB5hgpFVbVhi5MqECG4hEoNXXHIsgo3V7BnoAce2t2b58b353fMDayi0fLxoYEi7ZKs3XRv7u+uhceK+Ni4qvJg+rTBSGHFGRKOkmSvRipHU5y6W7vjHzp+7i37AzIuITq9SY6MIN9MRKuQNcCfGMp90aGzL54p1ZtYdz6p01l6Ok4lpFxd8jsIdoseEKgLFHgcwWucIpASQsQWpYOyOSgPA7SAu4jXhMyWkBBy4oAIOX+7GB+3jjOfIClqsBpaqW5QhEGGlZZIIRRrEeZte9h2wqcd/ji7zTcQ2oTl2Z4mE2vvSAbLKitdMlVNojRwOEON5lVSsK0ANKiiSLPg+NSZMtJmqiKtOElGATwgmCCglnTRq4ntfpC/eLxGCVX9dnDfqN5d5O+e36li45VqAmFfvqI45KbOCo36FYK08k0ebXwYrznSMBuLXa1OtGGq+jyY8UFgUlLPtTZhZxG+QRzLDuZ4dFBEs/whB9B05i+jJPOHB/osn+REWlWSIr00GxtJNbmOg2T7GmAB4iWwIc7+AKTgIHI/ifoS1Ul0E+l4gIXwCHXC5Vz0CRn5fpYhkOHoIIO3Punf5u6JlSRaLHdFNLE1mnf5qsAaujFFG8TEBKHqv7hjxvednX/cP00QBjnj3MY5AnvbBsp+DYX2EDSKgqZwqKUHbKtR9LCiToe0Smva1IXe0MFUkUwODqiFvBBfkfhBrcrVOKEv9vLVuzIU5Pq2fl8HvNZeb4qYvSA0b99RGdE+L93eVOGd2t36JUrjri5ajyLmKgiCJOnyxDOd6cyyp8qQVUcHex0ymRf/DGY9wkN4al+IoV8SaNuJnly8v+C3RBVSKaVBTHLmLL3yce0sSQSm+PtD+3IZIoT4VmJtIR5APv8sqpQHC4frkZciT0tnTWp4UMVIFBwCinA2Mo0Z5g1KhcmMk83+tFjPFydzqvO1ersG+3ZduOgXBHo1sRdzuJ3F5OiMl044ZsJNx4dY5ounJ3fpYJu6e9ucjiiaZVeUzCuiiq4GlBtwM1FCkIrQlGJXvDZjTak3VAwqWLCyCHwnlJR+FSUq0K9+szvs167BTV812uVK8fb99RLR0GX7+f35HX3kKEC4x0yTPBl0cl64K1+gR7Zcr6FlrCmr1GpG6Ypk7U3rSMuGrkqu+1vYCbEEqHt+yUJYhNjHSvmE94cWRc8wdlIxpA9/ohHJVaIHaciUqEMsjxhrZD6iqpQVii4DSOPmRIq4MVIoeP4YQ8LH5HLE4EJYhPFxoEFABRHyjh8ofBBtGuM+lPYcntxvm/0B/l83kZnMl9oAts1Ks9uTZkFA6IPjWnefxjsk+JnNBqYOUzFOEJlJMrE6aB7aMFh1RWtDSvE4Bc0PQxpouwUbV6FlnvOAEHorucJS2EM0OwPWnlbhi1rgN2llX0GBSZkqoGGvjqYTTEx/uCfDtx/QdIlyhAbGMwAsNDAu5vW8oV0j5QOuECPXi71az6MoTRlZqhqYUrCxTgi1QYpklnggOz8wPp7iKOaAWABlMwiFsIuVIYdphcKHoqQgAV+x0sTHZDeSWXLj5w/i0+Pz2IjSxAfxTmTAkoKIbIesemzUCFyIFZloOYO/XpS/g4pFuAFvwAnIi1AJftjprHcb2wJTqlPNwgWmwZCxoop2MTR1pOLc9dPmuByHTIdETkuM6H/6tnEOGyyHi5KGKaD3yjRnoHlUlqaoijYEpw0no1U4WYYvYmVNoQyepmnHVsH2BCC8xR6YU1qulCom4iNV5DFEo1psaQUMl0Pt6OU1hppc3D/+WuqiKvvm9f39AYkHlJXWgSBInxJa/h/KmLHErWjWMPAf1yXPDVjP1adQdgzB6cBo/EwUJxJPRLN0mCzplfKxSlFwmHr1ZNmxfRzG7iUVVGLePqO41DFBQJDeX7Cb6F8q91ynEz0SEbzOZolYIgFBOkRykBMEQZxSZBSX2TETMwtxWogQvWGY9Q/rrb5Y4P9T7F5fozUH1Z00zdf6qi0dthZK3+Zgv5dvYcf3d7s9gQjuAVOFwcfpFnlLqrpSKJkFWIDDobFsxLhxvMzTCoUcUa9nsXQwUqFgsrGZiRqHYTNDTrVZemrQLQ8hZh+EndK8QGX9HdrFbhvt1/wFakrLt9/fST71CsO0MOnxDmqE9sv2EF0w9asiBjzTeDhMY2Gb670Jd7rRJ4vJt4mzPMsFsMfkf/wsC80hMlqeISA6ix7a3MuXGDXRhg9NSEFE6oA+adNf8vkLjiegOjnMRJciQI9oEyexQ6wWtAjf5AD3Q7WiTBCmxxEBQlJEw9DmkMHOwf8ZJF3kQcdQLqy1i8L6gGoVMXAcD/ANSpd6pRZ1OOnzBYsGhnDJLJfLMPSRTfJR020fXOkAA7dd2PpMmrI29MAwPDDfyCuMWFGhVgqhRBUKQpqCP10ZM5VCC54MlCCrtFwTo9GwNbB3ioE4V6ORyUMuiS3VS4Xzx/YlpkO30Vf++n77/uv7O9QHzUEYqHX3gIGA7VrhsYTRwvm8xssjnqf5omw5+/XEOEgn13F3L7DqUzcHwrEzzp58hvmRgX/2o/4pLEa63GlEGkUg0deHWJKzibGLI6rIsX8GdYkkCFv+1y+LL0TxDJEKDolEoMyxoIg/ItKJcfZ4jCMICudxPxEoYX2WfnQLXFV2SRjT8cJB2ownXfSPhXz79qGM9qBmi9VdPJCLtbMJfZJKYpjd2y9hOF+7umGftpPT8WSfdAkEgqfAVClYfgrYWuM4GqsmVGL9QUJbpNXVELdNTBIEqSOaRR5CAscAr1RBmCuTIqmqOpK8k5AvPj6aF/f1ZhETHNC3hSQDaeg6BxN3S2JYzPvG7JhrAXFA8bJE1YAHW8JARKJKX9l2sB7vN/7beJkBqt1n8UQyiFL1M/fHn/UXPOhA3ITzik3YWYK/UtD9yfekQAGLR17Rm6xuKt/Y/efIfqqSyY8Tx5dJQEEW9hUCiq5EhiubxXVyiBiVxKrkHL5J1iF2mj6sXHQfs2T8pR/qJztguX4TkygwiAX1Ihi+2FSl0cEJOy+I+2DiiLPygar3+mRrBaetftjqpmsuTHMkgyPwKGVEg4yTabpHw8ypqkYrI8pDEKTKqixro+HKMyWUJ5pqQCsDWdFoSWQX6GKRIVVV0qqDFTpbiyVUNmKuQp4r1kEHNh6Qnnu+JQPXn+vnUCQySL3efii324XCdfdx0GpiGFBR08Clm+xmEVhvL8wLDLj/wmztMWGzmDAMofc/dA4EH0X4IC4ETriFTKwsZOFjzJUGOKn24JXAilhaafB0BusUc22phHAyVidyJ2SFpEEkkSxefhYOhugN7iJbltwV0XNk9giRTxYffgf2LcoQLXPj5S9hoOumypUuis1msVyvI9jo4okPFsgnbDZPu6y/njP+mFk6TxMiH8jFBtKeB3PDns1AY8uejE3lKZoeDhHOK5rhoruLpQDgOJAxrCyvkKeBl4JKzTxjKCsyT2FJTZ6lQUEYlOdxlGyZfE8cVvPdEuYCYdxWKX9+fw0RPSD5jUZ7BK0PdXTZoeOie9++bKOYp4WKkW4TJQ/4BTpr6ft96Kx34S9MmMutX14Yfzdi3pZvMOUZxs3EMjnEVT6pxiQwLVGWv0G4WBMSUJ3wdx8qlniuTHKUcneRUpDDxHLmIhcT5siPM29+DnYMagzNwhfRMbyzcD0ZqBwB2eQ6aGwABOg/RLuEFjlwETLLk39+pnYBy3JXv4QXsTYoDHGIgfPHm8Uy99ZxkAUiSaCDg3L5pz2gRRAt+8gzZp6ignAbUQL4OJKa44MZC7IMKgUR6IZMsYB3OtyQJCrIFtmaZgcWQhfJ6M88Vq5RHpgglUZWvAbnhAlyACuP50Bvt413MpDrFUgbCvR881xG6TymEyNtBWq3VhIRO3kmrbKSMVlYYeiM/bUfjjPh0mfe5q4fvjE+eYixZtHznsvh+2P9o73klYnXPtKXBAtALHhDeYhHITJKhEa+f/yUX4oE8VGAF5EViRSzEd1GNgY/jP2xP/ZxhNJRXITMyA0ZvCKETZwZ8qkgEQ64DtqUSIg4lyfbpBC+oDMXs/dAk5bRXjpFTe/kyUHp22Q3BjqYTFBstcVwMwupVCfQXZKGsA1okLci7oemkB6Fx6E1OBeF92gwovSIHgLeYdwFCzRNU54he1ZgKhoLo6RI0gggbOp6JjtDSSo705yTpqp9oWoI3fLVZSWP2ZqP589Xz/BB5N1AvfYD0hBX6P4u9jFgjue61xWxJms9cBYwtZbkOSivUNH098vbxh37Lz/b8nr/MsZTjZqaqACNgTPwrcwHio4dNy5E4RLZsPPJvH1s8QHuiZQpFkQK74h4M0SWMS0a/dyHecxGADsmmLCbQQCKgyxSIJE/jPWwk02cHBxWFAHhTSA4EQ/0w9nqU/BoHAa+lJoI0wWKloOjM3HWNtDAtx04u3C5QW4B47gD5wTmbhKYewvxB2sgRFypINlgzfBS4IV4GWBO8mD5eBZi80YqS3SE4kUaBm5vT5F6FTQbFYurqc52VaTeoHxVakXaXOlZq1STlX4Xg2jLKH+jSPb7HOm621tU1d9DRK/RP+tVKhVrhcFFt06R6U89Cp3MsvlNoab2xJxNNk5ou+F6u5+Yp7kDh0TYygSVMYAKCRCLXX/iYzIJAohFhI9EMvGpRJjRbgKkY98eX4VcPtQxQ/wH2bCLw6j6Ohtld4hqkdoqJgpHmUgCUfAK4P9nVVfCpKwRRJNKsgLGCxEIIH6RcBjDGokHHggqLLuVRMqVCv//n+TNEZOwLseI1tY03f36dffs8p9HglpSmi1C1p7IC3fW/iX9uMbwy6OO3m13u4JXFGM0l8yitw//dynZlaWU5CAVkFm9V0nSoBuof727XuaamW1ax74LFYnHQt9GBvUoQp9cOP7YNr0YjN4RGHsYeBYJlTz3fMRtU9GzZMC58VkVTKSrz8O2ItuCaaLBXAunujEHJfra/fVHmLiffv35dQ4F2v4MkA1JvfZ+Rr/SHGUma9Qg6eONGo6nNhTXBCBxzOx09373q/vn3QP4/tjl5a40l1+RZ5diJRrQs0Q0J7axUXn8e80U61814B6KGSOKFfgwvut/QRPsG5EC1VUKF7mc4XaQUoDoCJrGAShNYl8NuIn7E4nYX8bS4SPQtBLhATwTMc+1hxgiesRrKM9+OteBr0zveo6QaHE+l2W1A9LL4Xw+7zBxed00YL8fXgxQ6wWum0E4aLUTBA/qQtWIpOJsEDtm5rjwMVAx9xga7hrVAw6yfMgKGEd7nSEegq2LLb3YH70DSBvlOD2Au9tPUfKjo+T65x7WekKXLJZVB+fzy0+/ASb8ikVkXr+HnF4XI6yrpQy0eTfUujJ4vTUqINNxcD6m16BOb5+RWzyyS5NAf6SobH1dviBU/yqRqv/MPOOOuTRgc5juMBaTj3OhPS9oLQFXM/7D8ACHDxiGx0PiGjLgegfhkEQH5eBwZPwTfpmA6oaIE1/CaA8OGyk/t0OCtSqT5oSCq8cDPmgxUAWIxz1FweUzeT/dZ8AT0J4qL0+f0ezynn1W1dvtDaU8j1nk3xw/O5tHt++dTcSMyJSOD/Y4Fixwp+AJzAAJi8B/PJzD0RXOsHkeCiBBqh5VqBgka4cG/NZYUAxDFWKk9oiAjBDJCEPfb9q9rd5DPxfpNP8C4fzyJ4qzf8PydUAOP/3cnQ96yMWiux/WThGxPrMj9tMID4wTX8o/kFz83UMcgMrK92QJLTLxcAM6oUlHooE8dsz/swNrO2CSo4P8wOTDXzTGfdo/bvcw+t8qFDr7kkT9P7Ac4xPg7f9FGbifi53+EQh1YDE53YpBqpRMlQi7Jn28SVJzuYPF6q8VjazSI6BDK/EdVApXyQ4OKsFNTQkNunyWb295+U7qtNzg43YP4mscB55ro9JpLYhEg0jNFXKnoLGdfWEWjn8MoiDwnGycuU6QnmUTZJAdDgGznWMKTH5Qwc2p2nBt26Q7yekfjPVaMMjSMD+8aqSM58uX39Dz9/2fgNj4txxoKUbpDxYc6aG4FGX0P25CfaPJC2g9/gLwPkXQ99By+xfsc+Be3h4fs2uz3LlSwjNBOCyJm2dFt1QV6HSzRAA94wpED/wx54J6WkP2BpcJp7pxRulRBDQMB8CrsZuoauBFEwl4i+JAiq2BKDD4JPlwIy0aAdm7BHKQAOTQyrpEmON4qT2ElUDkX/iBI53e36qyhvaUdYQQqE6QSr1c3k4wcgAPt4tzjYLbw4OnOZt4UtE6DLtGoiEBxm19FI/m+WxaXupYZh9QLe3342PfsY5HwAREsOMhyFXrbJIlLFA8h+piSOUoqPrRVqcizJymq2jVD0EY4D+qYKFnLHiC//fZwQrDaD/vYXnn7baD0sXOWNno+kaVR4Iqu8LaD/xzcPb8jzPK9WLXi4u0PhEBVYh+GM2MGUAZByvKotPIZ50M4ZpLgbzJxMRjICpKLuB/BcvdE38XRxSDMLIaQqDOjt6yBIyDX2LqRL+E8joSzgDjGFvHeAbWbsefJXwTwlqYOcQLcA+miUmD6Tl9/O6itNf3IqJhyeya7KJdfrrC83xEn5dbdLvNUC/iXAH9vENhF/0gA1iIBRHI7WwfvXBoAyacLc/MUqfIXNfxwbfFZt+DmOz1ETbxCI+enQs3sw7xVLdkUVZl9LhY4Voe2q5oKAaajecdY4UO2d52S3q2Rt/38F9eAbN/mGBgs11txtpqFNpaZ62MQyjRWTgIsyEqZaFFx3N6nJ1inDj56QG83WpabAKpntCYCPPHdYEcuQ/iG9cpFoY+QTP9Bi42wDF6CyPn+CU1cUQ4T1NFBAODih30AKYMI/SLaF0ClTNTHW4/KfBmrB1elJxLmt3uIr0haYzqUD+1Uxi4PEjy/PKWQ/AEH5QJYvJoliO78Lg7zgnS8X3Hucwyx+sfj/ExNs8FwpC+ZyG2sWNIOc5MEwCvAMhNkRAIHPfYP5uua/YFsXCdvqXjaEFfrWlmyVBb9bCZWsJYgSrJlmigpVgPB93F6+sWy5piSdtVF+s3d7A8wBZNQVij05gMUD8RDgbrdVsPkX3SbDMTzoGuWw4KkMApFUh/C7FiOyh+vSffPWoSiJJWX1h9Qp9xj8Dmge2IicMgN09UZvS9p0z+i/moLaOXjOlEJEM2oihknBBARGsY7sBe2kEkFAkwaTJ7iz3TLEZAIVqjERC55Nq0u1d/+He0E99PRfqIvMdsFiXE87xHOe6Fe80rwmO/fZQI/VC5cL8HlzRNr+7tkjqpeE7dYhy75lm0CcYuCs91Uq9/dSGq7GbGSBi5OOsHQRbD68RHN0Pkah6G/bVpnwVkVwVRUFHC0NnY8IDDoSzrOloYXUz6RO4uOh0kqUab9Xz1ujVQVko6y7rft9tfRvpCCfeaNtVWejjdaIIwPBpqf71GyUoKoGK6qr8fHg5D83aaRfkuwbNJI8xWQ5E2M2HkB5aE4mcsfMgGuWpQG8gu+RzS8yeao7E/FxdVASZwyjRQkeDrODuOS2BrOv5Cdww84oRh8X8UhrBwDKZDUjRMRUdKuatuPqKZ0yPzHnVZlyXJQUhJnUs3qQRGzSGk3f29uj7qz4/LyYd5m109M4IQHNNJnSMWaixcUKJHAYQoKLGrVdx9qMvjPT5EGW41/SAN3LiIA9dHY/kBoWlqG/0pwLWgh/IQ/CpavmwhtA5uX0CtgY4K1TWav3RkEBE9L7CGjIpCkR/gjBbEH/2oj3rKpCOLOpjVxUaWjclhStZ3Mg0DHUlkZQxESDhda/qwED+uD+Ao8L0kRET9Zk3rsp7z8oTPVCD/+hiuTtizS5BsHCA/N+aJ6BBgNf0oL4XANXbcuWC0Rb3RM0yCSMnJEqeMcgI5Byli5jHSWuJsR9qFlhjZlTPMW+Cis9G8fTanWqqS+m0n5Yh/pCghdHDVXN7emrtff741QeakUDPTz5DJiU2TZMzOVoz9WD56BZA3khdFdnGyIojOSAMEnjiDGgWXoXd2EBWNARWmtilO7T4BCIKmIDNuDtd7dHhBUIdYVAYbHXU/gM9rLJPeHnXUDQjuVXuikHJXrJzaHaHwp6eMtPl03QYHr6y1gegdoTbhWBVUtaNqbTQ/d61Bv61DOVO/eanTBFlhTKCUt4gvx3RAc55Wiuds2CPObB7rTeQ30AE6xjWMQwaqZUzzKBKgO26+nvDwv6Eu+2KcsVtofMujKaq1pJ5+CRYBApIkMHd5XaN51X9cg6iZVeV7dvqExE4+KFIJ4qvuOcxddUFPUHS5ooc48j983z+BiAvMwEzNswcmHJ2m4OQQKcYiRIEsnj8Db3m9eAFuTB3bI0uVpYVpmXZhi6bljosgE93YSsM9LQIqzpmgovKeUHdeYRhTZB0GHehGZ9JZdPehrnVGCgZ6XzoLLF9PFkb7lby3mc4n84OmyYamwjb2D0NZG2LpwAma+9pbsuytrojoM/dJ7dly+VKS6VuyR3hH431ulMjGgR12HGpje0II4g/oC76C3cI3IpIWKyHAD+GgXzg4p9EpzyVxGhUjVHBU56BDTwqCls/RuxgOl8BQlxUAQP24XtElF5jZFSOfl6hKWrBpVVMnOEHa+EZcUA3Ll0efqISLovsJgoqCuwOpBp4feJkHTD0WzGNs2R6xeA6G/BtK62fOe2p5wRXwDaD7bJGl/hwQcMjwoeZeBAVhGnvZ2COMiq2hbqggVlX9MJ7I+85mNV8pbVgxDSuZKaAM9K68Vxe9bvg6Qs3IqEcWVFcGRjecEJx9QGueuBa8B1peBliMUNe/jL5vr/Sxe0SEZL43EIhUfkt5S0wMeBc2/dznEMWADyIC4PrBZfXcmAzpbZARhxUwbkw+ZJzqDzN0uIAg6FIiTLxMQqz0mMmZQgE6CvqWldFhx7WsRb4zIf6lbq53/4HKK8xoLpX1tQa0BiFekkyeRLYa3E4NOisB0L5c3qMHihV9J8hOwAJRmkGHAh+MzhAkWGofC+iSc/NdUOFog/CBxD3TTT3XRFCSBhZwnG0Ca8fjm1mIY0AGYa+GG7GIERcJogE2da3Ke2MSrjRF28x73Y4RIreKPFU4WIw7yrbXHuDXALjroDJ5oIXt9Wqta2QpBiTN+2ffApsH/VJeJ+jJ3wDouZPAvkd5ieQ/7DssCKHBckwQ9RRcEExcX/FLIg5m6jjAoy8mA37AMA+j2BiZUcK28Ru46nCamzsxTushUCIf4orIO4WYznHH+LIjPFFFuhui2wkEaLO73wDWZlFkNsSsSS1wCBJEKJFb8rJCTu+dZO8QA80u1cftArVAriECIkiBubPMc90YKgSs4Dlvj0fgo0klOmfR9eGkWeZDyRyrePhx4dnwWiLRNxuIzZBJRm9su8IQDEQ8lBUZLUWGpu91IxTkQWega4QoaHcVddXZTwiim0xWi+5qBIc0nG8O+l5VOqKiGdpUNWJ7mELOcUeZ7r/ISJn/2Ba0TLdTkFVlDtuDVytZEktE0BHlkhmrz1SCgYQXJia+x8b0gzsbnLM4lAuKC60F1LUkAuLMNRUKzwgyyrrF1I16OcoOMTjPk044p9b3G4YjqLDBiyPaqS4fNTDAe1VGp+iPU7VMEpoGb+2WANfYqpIoVnWD64/qi3+NgMmDAGQ29Mg53YJrlJ4fpucX4JHB7TSnu/+OBVGDa3OdfZ4++kGB+AhxCRjVC5J2lkky46AaphDTxjqYJEk+lV1VR/yjbuTpZCOHqmFr2jBcKYplDCb7g9bVwi6ogx4UawCWdNX+slGUzkrTJxOwqnrYnaw0Td1OgeRRQalpOuq+hPb3Iz1YGdrRrZflEhmT3Y4UqSetrzBFjSSRR5c98jmbeAiIY1xu+biiYAAj5Eh+GQagTodfYQe6bYl6cKqJHFIzoufJ4bVwILaQsXlcLixFhyM+SV6MHcITlOQ7ghfghCr4lfrjrQpyBAuADSSF1+Sl1MqTpoagpLyCBlU5Kd++RdUtSLOb7weBe/XNE6LVa/oB4+Yi/xBk4E+Rwbw8oDvX6FI1zbcVcrV9x9XHyDMIVnCGLUTiE/HP0Rtb9uEwlkHxyJvDZjwUZBEefrJWJpuBpo7bShiGIorrO10FPRCd7Wo1GIwGxmC7am8A4dpaWxktIL0BarBCRRtAdF0dsRBSgFNZUwUjfN2u1kJXdgP/nldVC9ojldS4wapQV9/is8v1g5fRYYybNmws6Od2jLIE5MBRNRcmUYwWNVxM3PST3J0wio4iDeaeOCf0LC4hsemSEFAQEgSLQSZz6tledqCyEwkwrazqWiIPGIC5tINkICoYvV0CFA4Td8FslzNkKaFsVVQ3t5P7CE5O5DgfUBnXvURkFX4nuF/zBrjwal5PWQOwfrtHAYl+jsXZhHTcyMmAE3z34RYe6YkUTfTpI4OE7Ct4HmF46OyhQoYiawpcT9jRlL2xHXTRCd7tAZJNBsp+su2t1A5k9EN33u60J7hRmUOxOhMsUt9Zrw1CC8qGdcy0ItQOQ9F2H5cmr70KhQk52PsdVQeJkpLs9dy+4laM2Rvs+TiZ+yV7i0qS6xJGsWGECQg/OMNHqQB5ePq/xCwTHk+tUi2i+aEdTUu0GIinuinhW8kOsoBUCCio63qHK1RXoRIGYlkSRSpr8rZU16cZKuPy6OHXpyhH5qGqGye4As6Bgmiim48NvflAeFWd3/Mkb5UP1No3+ODbh3e9odjAT2NgckjHGnuxZ159G8yQcARgGNoHsN9ThPwFKAVd3Q81dbqfKO0OFrYAsDbm4T7ctOdYx1zBQFtffFm02ys4oW2nh+Qi8LimTHSlO+/ijc4kFBW9kE19I8xjURZPgm35Wd68pzVxQA9Sx4QIo4xy5B0SMhVUIsxpQ0A4+RfdkSsqgRZNiD4RBR3FnnX8kB0sHF5LBunYvdzn8zQph9tUiyi5zVg4iuVAaJPSV3wbryVuYaMZviShWb7WjtAGUB2JKAy+HO/tCD7IEwzkAHHJHbw2TipIAbrWRDmoOfSnvkdlHXwWQV3lUI7Zpa6jvKpBrlK7uMtnpyC73lEp4mVWCrLHBi9kimTRRqcQ0U3srQt7rU4FGwhbtDQRVfVjawPVUQ6dwUTbbxQN0U+oYSFnBVh7DsEoiI628/ai22mDohvsux0IS1m1sRbwnPyfwp62WojFUO+iYQIZ3mFxTm3HN4MADEmTV8mSoNMlcFCL+3ls3FC1vsKRvv7dmHkju+d7L2xjqsfH8fnlkqIziX2AIXFO9DALR1WG2T9iyTjFymQOPaJGkjEPL5CJBKe5ywGqdy36R1SgdCh0IAQS9qVE60hzbDB1eCWY+QqgIvqokyqo61kFZuGSV86j8asKNuQ+853Kr5OmrJxblOZRJeUf1zotUtPKzMAF7svMDGnvcwDkjXReH+zqw0N+72Bbqoiarb2xGR/EoaYY6O1CF3c42aAYWEexHqiFEK5mAKl1upMv8EDdxUTZ/gAY/tp97S50FNRPVpPuCNeaoUyGY9uBHTQE63A8en0Y18P5UZ6aHAZhWVKPIt1ZCMOyAyBUkHZmAnpSA3iPuQLyQJMxasSoyWOWkX5Riyghy2gz1aKaRT7Ml3nkcdULZ63J5ZPG5jpJ9YY6RQq2icqQvwo0AewbZI9vJ5QPjY+YQ8QloRngo2qErtUpqYl4IKD6er3jUOKsuQRRdL00TYmfpsnv+D1Bc8rgVN7qew1v5Ad1VhROcMPLtVEaN0YuvJ/1j1467otDz3nMppblitQHCeuhYY0NtbMx9Ik8CPcgbDYqWIQB1qbXSI1IuAJ+G8y3qLfqdVAv8mu7Oxp1F+1ed9v9YfWK3NF8tOj1QuQDL8LE2BygQSYa75DMlc/nvLlFDcFxO8CEF9JizedxyR0PyFKG1nisiSPepg6IzjxXJyIUDq9fmGSogJhHYhACeyJMXsXFhPJMwL7wDC3Z6AmVGuXAlwSEkK8iJxhA5TIF8GDo+JNChI+TZEloVAgITiXHVCPh0ECHSIX26VIR+3WqmqQJ6tvpA+/WTZNeKzDGuK8kOpdkJbAF4KBzvyGxGVyizHc8x43j41iIz8jigVgdg9uOnbGI9BBaww1IyUJvhKKsNrI2DzVNU0QVgdFmou/Dgb6ZIHydDAAR5gDZ294APSuv21FvtFiMtqsRVnrGUkttYSu/zuWpGkdrSy2wiMkaQMRCi597C/KoaQLSRw0DzrQGzytFtzzWhIBwzqWFMT4nS/xy+8bOmKd6qtATMICPZX6Kg3VW+MOt2rOYi3OoZJSJDkP4YloKhB23nkS4vDQBokh2GCGVwdhaLTRIUpggYYbrqspd6FCUYPZzbMS9EGNH3rie3k6Xe32v6gfGqmuEURPiwVNaSzgsYSaxfPMNpEJ0J7zQ0bJg165eZtso1hZRlIDahdiMY0E1dFLPjaZJ4Ddg6YGuyuphKocTYROGGzDWhO/p9AbtTg+Fe4sFlulRFl9G2263O0AV8K/4v0Q/4d+Hax1Uz722O0PTnYkPO5TJYnXytDDN+7VKm+r2kkSnJPEhG0wK5VQkhhHI9jfY40CxHt93lAAAAABJRU5ErkJggg==\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor horizontal PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json new file mode 100644 index 0000000000..f1a2e99e2a --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_pm2_5_card", + "name": "Indoor PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor fine particulate matter (PM2.5) telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "matter", + "air", + "particulate" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json new file mode 100644 index 0000000000..56de801a4f --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_pm2_5_card_with_background", + "name": "Indoor PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor fine particulate matter (PM2.5) telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMwAAADMCAMAAAAI/LzAAAACfFBMVEX4+Pj19fXz8/P6+vry8fH8/Pzv7u7h4eHf39/j4+Pd3d1WUlPq6upiXl9HQ0RoZGXs7OxBPT5ZVVbl5eXb29tlYWLw8PDZ2dlzb3DX19dLR0hFQUFPS0xJRUZRTU5fW1xTT1BdWVrV1dVwbG1bV1g+OjtNSUro6Og8ODk2MjOwrK06Njdvamt7d3hsaGmAfH11cXKJhYbT09NqZmeNiouXk5SSj5B5dXacmZqUkZKCfn84NDWGgoN+enuZlpePi4x3c3SkoKHR0NCfnJ2hnZ6moqO0sLEzLzBDP0C4tLXJxseppaarp6i/u7y8uLnDv8DBvb7n5+e6treyrq/Pz8/HwsMxLS4tKSq2srPSzs/Qzc2bl5iMiImRjY6Lh4jMzMzNysrMyMnU0NF9eXoqJieopKWEgIGjn6DS0tKYlJWIhIWtqqsvKyzb19iempvX1NTKysrJycmFgYLd2dmtqarIxMXi3t/p5ebt6uvn4+TFwcLPy8wmIiPZ1dVxaWdpYV9sZGLl4uLf29zGxsaIgH7h3d2lnZtjXFq+uruFfXu3t7duZmTr5+jAv7+WjoxmXl3FxMSqoqDk4OG8tbNMRELLxcNza2mzq6l3b27CwcGMhYNeVlTv7O25ubmCe3mTi4l5cXDW0tO5srC2rqx1bmxaUlDAubfFvru7u7uim5mQiYdhWVhVTUt+d3VXT05TS0q0tLSelpR7c3FcVFPOyMa9vb2Kg4HHwb+clJKurq6gmJaAeHawqaespaOOh4WwsLBQSUenoJ6YkI4jHyDVz87Dw8N9dXNgWFaak5HY09HSzMqup6XCu7lFPTujo6Ofn58gHB2oqKgcGBlUTk8W79+EAABlPUlEQVR42ryUgY6DMAxDzUX3/798zfqkp6BpQ7oxD5rgDhHXafP7FlVlvlKfZJtP6ttIsgOPr2Xs8IQFolV+DSrJHiFmQScMSyT7CoSTiPmEpryaihmAUEwxnAq3/Jp9559Cn6Emd4uZUlaUeN5fplTaULiyGWkzXEkq+ZwKoQei4jgkmFInLN3j9NlPgh+9E8EX0IxiXG3XmgQJLDci1VDc1t/pTQi/nH2RmZagYe6QELYSxTRWOJQi8q/94q4WCZZYPAlQzOwul73hjLOgsq7g1hrzEQNiPqSoRIhxmgG7rEOqjs0EVzya149PYtwKpJeKNpkHLNiq9KTvN0BHRSktMVVqwhiYeqSYt0v30Bu9Uu9Aq/hKhYJJ3CiXoDHulaSqYEb/pTeQUytj7PDzeE1jclw+mRSTvqCCObkMK6ZNXO9yCyzGLKHRIBP4IuqOkPIdl7+BFOHTVdSujOY5VIQCp60HQqRRf6xYwYrbMBCdN51VKfSwJ/1ZPyP0YIi9hxyyNAsLoZBASA+mhQbScyGwpaSXkkPT7UfVgye8aikENh7JljwO1jy/p5HiHNSe24pIFOopaAkwFxil0rVCisKPcpcSC2gMHrcgIoqUIxVcnZFVACEO5gLCeRZDRdYNTH6i+N15goG+H+nFfT6SIgMn75kZwikeDe1yZvrYOZpfBFX0UeNeyy2eiiY1gf8iBXLms+iXyZUR87EB8nKVMXJE9xQ2/hXzS24fXFoxOFTTdVaBRmwEInzxvH46fLi9XmYcLVQFd1AQFLYKiilL09y0uW4gFkmN7yNAMHEVQgq+6BoCDCcm+r56y5DRHabKC+oMBmvqroxbU78XfJ1iD0I4RDFhKLqBwZBt75UGTaYwwLsCiQgBtaaZTlbVdrU7VMkcaKEpSo6sEAxZC/SXGxfcF3hKOgCoh5jM1MmB5tfmkguM7Xx6OG4evy1+7N6Mcxai8DMDLYzZgxgGMqqBGQURiwds2hkggHpJt7XCxuJeu5lNfh9Wm83d/bu71WSaEOmBfwoCE2MmS3QMLTO+xahhyKZmmlQlW2ea53V107Qwa9vl6OFhvbhbrxYf99tjXaV+RklCZEYq6v9i8DqscTlAUOOHQqCAqnnJgOBaNVlKqanftpPlfLqsjtvdfrFY7+8/fP8yqudN/zx9xfzljfq5pCFuytBWfoBi6oVIBpLP/SyqgIgha9YOzXQ+ms3G1e3hz37/8/3jp89ff41mKWeYQNA/9spIepBQLpJDo6GgCQjhh6DHA1Gowf7SYm0rqlthuAmL9GYolg25mevSXfoIfYDetoVCu6/auZe5CJikm5wkRiSSoOYgKpqa0TAaFQ+oeMIZxBmd8Z26kh27GpDdm72Xist/5fB9+f7TkgQEy14xoMay6QzlmdRkVmjaD4+ue1dZ216KDmILxlOEMcSK+i+kTuzRfdIRV/z8YKG3B1SCfAwAGdT4BMMwJJnkMkU6n0pLKaqkNAt2YS7zD/tC7mHv3O/yNeiVkDGORwkEQ7KEL9TWfLaB9qaRd4U8PlQUQDLQsQj4nWelFJv+mztODpO1d9xNmq9N+1iali3/uWSp++GrlCLwGsjXbvL0WV2UumL7z883LgUiCKt9+JxxMoh/LF1jKXdivhZs1200myXb9dyprC03lbnY26/NoWkejxxH3aY51jSlsLxi53hEXf9nJxNVhthPAg/BwKoC9QFEAjDsbftlVbC95vzRND3FGvIVvssPdL3BC8pCu5/szOOuZP46S3Ecy2BYkNLx6Mr4fxuLz80Gi6p0uMUKIx8ECMLcDC1XgCQy6Yy5cgvevSPb9nrduc+Jj76x56uONnSbj7mFd5jNzJfXA5ehUjSTrzEMHXTRsUYMDzd1H0XyCYSJLgKi64UtDAbTEg4nCUDQXDG9817nVuV+cadq9kAX+SkvLMsDYbRXCvYC+tihqRRKzbn99zEp5aV8mrr9gwlraKhyMEFd+OceiA4yBEUmIFNLF28Ph5W9lru9fX0kP9cFw5pmjT7fypZ7U01xlSSX/HP2WHBzMJYmlMRQk8nrOzK8YNiknuMG5YRPJwuGXToZmfAP69+CoJUBeZbbHSRPed7Iy15uKlYqvNHdb7+r+q3qcixu7I26LnmzRc/uCPceTHWsxL4z21dYeKEEUwPk/4LGsI+hxf5HB+xyTsMingkIBAc4Rl7l82yRSx+PB22aG8q9RrYilrfiRswavK/rd6OcvWnU52tFyRXmlbvNa6nkehJdLBZJuJUmCQAkkpCCLB8VTwJ+EKkIyyUyyEGCz0eFQatoGhIIFzEQRD9Okng+/57NHGfNhVZ/XOp3lmP5o2VXHQjCIJvVB3p12Xh4WbkNZ6Rom/1CsRV3+HBDwYYHnh94KglIOHAQYkaNAMIK33DEWo84WDji9jiT6PSLdPFwPazjsC9OSNSuNDl67rMq69UulGIpZMeiMKiqS9VRjKowf3lWNpW1PFyV1ov6g2wtG0rhjxQgMgDDv8RwcEUAAioUtkQBo5gwIZUPXwggIgXNSJjYUXFlkRldPRrwpsEbEEQtNdkdSwW7ItyNy6pa7vGjbnY86PZU3nlWs/wpW1U3coNX6/qw+Wpr9eVUFfmHWZrFcQaCr8EMAqDcRILEICEsagiQLOcRAo0MCPp5CTuDRm4ZThDli5p+ECe4LU4yJMOmfs8cm6uFMh7oJ19T9e6dqna329aYL9vPU9/ghaFSrU6zT/q93blvVHKju97mZVZMha0DANDJGFBLAJxgGJAIgYVkEI/IR+K/zpES2ePeGEN+ph4tx0bkgwBiCcp+jfr9cFQeNb6r9k/bcuu633/yByfjWvRFuanwY2PsLLstp8HrQofv7YUe/7xetXdFlkwwBA5IKAkBmBpBJwimSIT7o3DHc1YBAT57SxQ+Z3aIBlo4A0VnYheZhEuBX5A1gBMSk37f9pS2sxTFrrP1jdbgWnirn6rba7+i2QunZWQdfzC6s+at3KK+lPV6btieNws/JYmElMp/mydpmgESVayReZoAPwdtDgHrKEJyURnEDr7irKJjI2HO7nkh5qKBQxo1lkkDIDHc6rVdUEat/li8tzr6wNj6J+HUenvycw3NkruGWjW2YtnaGqKjq1avN5zPSs2CcmDpVDGfyTNMSrpK/n24ldJSjQge0xVDhC1oHO4X8V+IBNIMQ6aQxvl9Zo9sZzsezAiSzudvihxLZ3bt5rDyIBuDgSY313rfOGXHT99kv/+hL2sinzXGRjmbfTuweH2q9R1dLzc8dzLzmjtqZ+52ySJ7mJmz9tE7UBwtEXCkbm7fYADF90VFUKggK3InlO3QsXFtzpkyaPihn5MEXWRpmjO91bJeafzw1Y9WSekI1bu32bFhnAbfVPdDK9vdXp/Esmhsn7LdxXpcb3TqHZd7nSRvKLPdPkisdNhRJe52cngnpdNcPg8mv3DMz8S/zhJ7YfGMhlAiWrFQQzTRxc5M8Kjnxz78CVPL7zxq4j285LTp9PTjd3WtMVX556fqwOev/ZZQl7tCLnv99RZS61c7T+pC2eRymrlLpzPvqInbNs0DdzjMtNLudrLbpdkUVWPo5C4lEWenAXFpEPg4NTQiK/KrM41oRHRSNJyQ4SYeMCQAKUlKmh50GbO0O47KgtEqaz1h0ZNVfenrrbElP8ijvbM1fvze6I4E9drplWXNnivtX29uKMo9rqB3KY/vm6uhckinjyYlZVI15pZm34D4U/3icqygGQoZRAetoUNQgcI/GHGSuIKiXBFviqzXnDWHBbed9OaOLgqtUV1+yu6XdxVr37N6j4teuT+6rva/8cWFP/K36mBUsKeLQvP1ljMPs8XMbB9X72dwZzpJ0Sk6KcFskGCkIiCiNhZBvwAsmF86AokWTdF58Wob6ELCeyXYqzd/pTI7znNznbX7Mp8LTmu7KHTK4smSc1PBmY7854qeEx3eGG+Nsb6tClujOmx3hvKi4A5fvPZmow1/PbZfCvcZe0YVi2xSgk5WYzIpAmr/BX4ZI2IR4LqoHTIgV0OTSJdgZwkIkMABIOFt6WL68MdM6Wjrl8qit+9+bwjycOSLvYqjdXpCS7D4suUMxa7VtwYn1X876PND2dXuVg+rjqwt+f19YXIstSfz+5VJ/f6nBKRa7YpmaXhpKVIGAb+ozOWYQRYkEpIIVSyAY2FLSKQYhs5wh9mxtFo/P2hTYWC8bfmq+txqOft9l6+3+lVe8AV+mVtWO1Ohb4kO3KY1lllL1irNeRtmNaVR+I1zS6XCy3wisZkarDiAZhiOyuMSwIJihjBeRh1fRUERM8SSH/pDHOoTdoT/EGotPmnccbxbDNkCnBwLxvASM1EY2nZxL8c6m2yrttvarosa3COrY1u26ZrMTWRd705zcrscgSDPHA1QPDC8AxgkvAK0ETY1WeY/tB+KXm9x2w+4/PzxC/f93Of7/il4KFgxWTcXvtj9w72969zZ9uKIj/C5XJFDIplBSBT4rmQkQPrt6VYCyeXrpZwNJ2rBpjOEkWTQUXTQpS1no+SIbjzaddhiu875pc1lnskEKiPwjEBxBFIBjpCccW4Q5Vr5fzEDKDmedLJ03kNRpy9uWllZWXuws7t7cO3JVhhnUAb1JFGXK02VbCBNzmT85VAo18LsDJIi0HSQpquYLdom0GRgxxtA2lGn11vc+nAB9HHCTsf8vY01k3nDahJtClbNuzvWHhABRCcOB7zOGZxFLjNPvc5j5gJwL8fW30ljeCKe1bxqAmism1s7MyVbI1rEfC2mtcfQQRfKpBCawoam9FgjhDIEmgvtBQO4pRFAijFLwZdP1KkYg1scVWe2/Ufl93W3GzyRHcPSo59BiWcA6ts38vMDHsilzyQGt+UiusBl5/+ZYSenp0Y9xz8LoJiApj00bSzvPLkHtKy676wEEzk70bQ4SwzWolz+fEQ3lQc2k8TyfhyTYXkmULPQtbIvGI97kr5Eu51zhtdjuOXRzqO1bW/JebD8x9LtLcPSk6jbsGw1g8SzRwRu3MVyBuo/yGGZ4My4Abb7Pkn6ecABgBrGKuD1mYHxe+fX7880vHTRUvDUHKl4rolHyIg/g/oj0+lEuo6gdXvaTvqZWgBvgtBPkJ6gN1Uo5Am8HK86Kw3vH7Ht3fDWTqePu/RF5bcn3nDQ9vvMxtrDEVGnu/ARjyN5VzAw5XLAmXFWz2Wm5zjJPDmKEVnNPJDMGLadVTNIeB9sO3LlPSoXjuEhpmBPysoIoT9MY0TEXktk/HlXiirmC5iNwtKeWopsEQFPmd7zkMFAvEhXYo24M3zgjDq3DI9uut1Fp8USDn/sNjwn6ITNrooBJTuL2Fw2OFNuqvNP9/wsN2h2B29zDagZz2xw/Cbo69t8ELUFPIEEFmBCAbxSQ5E9vOWfjvgTEZRyHXpAjEm0WvmMWoFgyZov50KhPEaHCu2gFweWVMlu7x5Et6Le3bAblN5Ob4PMWizRnfuguABqcKplZyAucBIwFuCF/3HX3KVu3AQ3sPLMgk5ZtbG8YTY9XN7dqnpxTwo4YTuSsiH+RRBbQuQeQ2AIiD2MS4d5kvmES5aOUJ4cheXTPizgKFiaeBArVeMhnHQcbG9VLVnn1kEjDCJOrQyqoIPG7+BUse+MGPA5z1a4JsUqIHcDWGD3sgkB2CbqA22/u6BPbDZbTUubawvR8Fa0Goxh/lTbk6QR/Zwn4EMxX35REsjXW/a6/BBL6mRqXeRIqJ9F7YiPIWm60GLixVQoRgdt5cK+oxhrlLKl/f1oqdJs22gEo7MvLWwAq+kI2h1chs683FOrnPyHa0BcM+o0lZ7teJhNA6/nIYgK1gcbqw8X7j/YcYZLpa1AgSAIVzJZoEhMnfZRkYx0Ss8QfntGA7XSaCDSyuepKQilEMyHN+lCLUjXvIinFnfYylVgbLZYoW2rNUvuH7K22IGvFPe13/lwteuUu6/O5VTss2fLMnPy5fH+CyzAs40c5/ZsFzjw/yaTwWTe3AS975mtasxisVXoRMTlT0VCRAQhNDKGskekjxf1yWlQZKoJ13TIk6qnda1IOpBooZHSXhDF2s1CqhAAgnvxmg3Bc5a4o5zLVp7cvhN1xrKBIHng3r/XiQVPMcMi6wJiLelkyglHrGqym9hc9Hj1OGc2Lazcu7/J461tb4dTuI20BAuOgqdAejx2u0vrOqy3ZJJftVJGf9TKHA6r1Z6ISilGEReBE7Jh/nuxGu1HiASFBC1Nptis2UKoLzTxGoo2m9Vw9O51gKZYmbxTW36mg4Ydp8hYClhJT6lhcZ5cuQx14fB4xz8MSjOQZlqtIIt6zmy+556PZeOkZ5+M4yhN5RAYBETKn1Sn0361Vr5nRw/TOpcrCeVVikTW5mcCLZjBCaJcPmxhfh++H0OE/aDyLBYa5TgZR2ze8Pb1WOzJrR1HvJa13BjpiMLSwgI7U7pTRWTXONu7PLIcdVl5QQTmx107YDPrID8zm5fdTnfYGS0n6AShUc9qFUKtNKSbdhHatD8DQieWRjH7MEq18AyBeWw+UOvIZBGfnSgjmUaTYvB9H0nFSSTnYz4mCz4cbzgcWxVQeza8tU8Mt6IrnVNsDi3gfQqBFZiV+MIJb13WOODPxvEuUV8nYIKxalq3rlhFQMm+cETd1ViQylC5iFIxmIRhY8J+ccDf8iMJ/14inUxSLlcdHUITrXq+RVJMKhS4WLeTPiziK+BMLmeLYOVQJGcpl19F6DiZpYMBet95zWmrxN+4eWvmoehENFZyFhILjx3sIrvjFBvr1zqpPw9wAjJZAc8MysH1hflN866Dtrj3s3iKqueToYH2HqWSKjPDuqEcUZfyy2l7/lCoVvum53SQUq6Xk1g97QdBBs0FyUNljoyDPk5vKBensFQIiVVuxLDqHolbgpV3bzexT9rXltZNp+kgV9XO//M8UCwrLBTgxjqU9IGPyAq6Whsrd6OWrYN4e2dn3xuwZWmFuq7iRxijvH8KFssG6/aEdFE+0MrwVboEodXrdPKC7wrCRFx2DCRpOQ8aSe+RwQRBvIOk44OYPZF6EZl48/VS7Gc8h+ABb+Pm+zevLZl6BM/0HSvVOVJynRzru/+B9qn64TRQdUoAK2+E10E0sr5mWPYWi+1syVJxVpq0hyni9WHp3Gj68ZxcRiTSHqFWpZ1dlDNvTQ3Uk5BCr9HBkFwiVyjlPspPMKCsprGhPEpclok9CCahULKYK9I4Tlq8ta9ekXwaLMTf+KXv+U6r4YUT2XpYMP/Bx9PKxS6wLrzr28A/lAiAlYAet3n9WnR7F2BoMsFYNlsMBBkd4/AtalT6yzLYfuTC7JR/UajU//omNZnfGzha1C7CUCaDUnY4ZQfGJZEP88d+OFLL9okU3BpF86j4c18zFnutHaeZbz67PPn5iyF6PnZ/ZbVH8FFf378YBTvlDi4zZy76wtMGdIHXNyISiUB6uXT3yQ4oDR1xS5xul5rFvUBmao8Qz6ql6ouj0x6COAp4emEJJJ0avijH7Gr9KF86LNYI92yXhTL7KBaBp5Ry/sD43DBGSBUePpoJaCSDfOa9658pkDtfTSITkh8uXX7p9v01cJwmAKrdla8rY8/p5Lz4cw5wNjlg8QP7EXTOlUYES25nY/9gO2rZ33cCavijr0NiioBA7jWa8F3Mp/izxiFYp4aNcwpxbzIDTEhIDEm1atXAFKQeVkOzsinhlXF4CHb5BwYJoRJN2VUqxbR47OLXg+Ivv4lbXpGMTX738u1bGyvmF54X9bEVbs/x9XwlA1v+HU5nPI0ZgDlpZKwu3HKDw9Vw9M4tR7aMS2DhUFo2MMpI9LMBajSYf11nnFKqVVo+3DssV5AQJJZpB5Wwdg4aVYtBumk0qhQaPgxJ0vlewFRidECokCkg+ZCUHB/vD9Re+bQ68ZKNfOeDX2ZmFsw/W1c78gNhumA4g104f+UsLHF923GSCZzzqnVlvuLcNdzcCVd9yv5UilTARn55+Kiu0evkP9oGrr4+DNRoWqZVZ/yWkHJ6alAJDfW+qdHMTetn1TrttEYDSfh8CFJKeuVjUAT6ZFA9LgQV3NVL8VEx/8uJl66/un7N4fitfWNtafv+wiY4gmIDPSszi+0ciD2sRz61G84AHaxOU3Z107Rxf2Z+phqrOvAQ2giOieceD/8IxNMaH8/JxMPaRYV6cEKsg/njrZDk4viw9pLGKJYsamCxXgzLFo18uRSG+GqVUKqAxVcHdUN8eHBSOHR0hFx+a+jKT3cGPzPcvflerer86v3ob03D+tL6WidIcMUF8Q5cWao4X3EdM3d0vUFnU8+ISGBeunHHYLCUXh+N+8YuBceG1LD6quQducYIwUCNjErF4qsvKhXw+BXFeK9YrvzzsXHur79kizL91CA8rZ9TwxCkgmEhXy0WayHtokwn6f9UJey9+uYV4eV3r384Ofbtq7cmv/PGJiY/DpLRxrUb1mdP2lycZ98V/N817ZnzcoFTZgR9PJ7gI97I5sL8F/duW5pfChHJFbJoG5pT9o9LJpQauUrSL9capYAVhXYKOurVKzQ6HX/28WOjcVr7GNZoxsWXFLJFCIK+HpfypXOqWaV+UC0U9vYqpL2yS/39L179Zuza9xNvCN9/+28+ruWnmSqKuyD4uMwd7pgh47ybzh3ndtpC05YCw6OExwyPFpR0Bsoj0G/0C9pCwkMEx4UkmG/hRo3RGGNEE41x5UbduFA2Lon+Q94+sFaNA3QuM0NyfvzO+Z1zz73tZu6HzccTP7/77fsf1l4c6mu5WQ8YerSH7ZDqQKAXe5npTaR/zXZoP3bg4r2Bi8Hr6mn162/Hc0bs82Thi1djbuh99z3POH9kVUZWdN/3ZcBFLgF+vV7noogEDAoQqYdWHGJEgXIsVTikuJ4oYZ1jWGYmLUn6+PBuYjuT2p5eH0/Fc3z6k6n87s4vv3y4dkn35bUsbDa621r7AKgrZQ8A22R1UfxnXqVgBt65Ob69um3c3K5/89O7J/OZ/A4/8mk+Zbjj6QkBAJWzNF61HPZO1kDEqZAGCHaiUIKS4WEoabaFoZ5UHZeRgEOIogLIcFpxPD588iiWfnX01dzE6NzMaSmeFXJFvjBXXl4aLX1Zvu5vvSGik8Jb3t7rYR1KOlD+R+C6zAx+cPlB7e1G7bhaWvrqq++/jaeO3k/+MTY9I7pKMWvW5alUEmpO3WPCIEA2DW+MQofYMQ+QyEeh5ilMICIEpUhRHE21cfYPKaPKq6+MsrEsmJwZPxrbmF7JjU0Nx3cmBVEfm3m1enCcqL3T35lEdlnp+lNfx8IumC5jPVh71eydWu2jWm25+tb6hz9+ufruh6uHo78mldiIHmIrnhIjMTkdI4qEHGgrOK5nNdtwggj7URRSz+PvsEHDhMiMhsi9j0RgypxWUJPceiYri48zI7u7Uytrm/MrK2f5nY3RyUlzZJddXb+uNC4GW9Z2M2M3fdJBU2W7MdTDVw+Wri40y5nG2sGH1asvF+mu3l9+PtqbPZzIWjpOJS07INCKia8OsxIQ4oLkObYrqhAzosvDCVOUiSJ6XmjrxOVlV7LrrqVLgR2qKcHQDaQxgsLndqYOdzKJxGzi5fIr+8eVjZm9XGZye/n2yfnWC8/2dbrOVNM6bPzduDYf7SqnrxfDf8s3BfNGdbO2Vlr8dTPx07ej6XhxirX8oK4xWLYiKYvFEZnKrib6imy7RPJSyFZiiuyFxFICASKiKTYyoS05VhQQBGxJZtK6YWhcii0wY6lH8wsLh4tHGxsLS4+3517LHOYKE5mps/PZ2sCL/f3UqBYrQy3rKKSu4X1dn/tPTv4L0VM319eniY9/+W1hOz+RNQpCkuN+v48cSY1j7BpImUd3NtRQgGJZFTtUxIjBqGaI6rYd3Nexoqc9X5IhdupAMSMS6iJWmLGikI7xSSAIZ4XU47PS4/HZvcMxE6zMTo9qw7HXNq+vqm/S6pYenRqrV5wfwqQ16PLRHXSeaf/SLTRvDhrVhb3Ma3mWNbjCa1NTcR0E7p2HgUmyUojM8P533w0jFzqABNB1fazLFJsvy1b9HmEOyLoo1l0nsr3QBzKjqDrOMoB7lOc0ZuTx3sTixvp8eUGLHe3FSvOF4dT2ykL58vpyYPBiYLAlvp11u4e00uZnqBP4/Tf9vYx0ILaf7M2aT92Wqis7+Yn4yaM0z+2MzKQEINqiadqybMdg4Nk4+l0OHa+OQoXxJUctQMuByHUgNEyr7nPFrG5IFhZlGGLo4hgAQOFYUxspFIVh/iT+6uPh6bGNx6/xeQaMbo0t3a4lyvu3b1SeffrFl4b6m1VudyrQtbhjNR0PDfVi+euBHro6YKrlhcOxRxMpzWRMhueaHi9ix7GJipARA25YD3USEImEdmBbmCh6VpT9CGIvGY/7vmR5wDIJUWzOJ0ZgOcSynZgK0pxAj4ndJHWz2fzSFCtxkBfGc3vricTW2v4xbWc9P0AdjQZ/k5Ohtq1dczvvLBjqlv+9SP8dTjT71l5OrB++tpcWuJQoP1I1VtFlQjVAZ0D4u45lx7l3gO/Ax8noPhAkEEbcdJIEPpblQtyULEUyRQ9CqNphEIWEOLYVc8Q9tsAOs1pMGAaFs6mTSX4kaWJsjk1nYqmxd85mz0+vazcDAy82q9yHSVaHih4f6uspk5sQhrox9Q8oFMz+k83zxO7MVJ4Hls+ZOV31ZK/umKLFSRGpE8X0wwgHSMbcfWQTTOOe4eo8QZ4aGwami+skHgMsjRQF3YuyJPm6yUDdNEGcMYb5bJxJxmjyTAJkcrKgjTCswRQzK/uNNy6eH6QyRuOmt+1E7e1V4Yf8+RBQD+LwH2DOy/tLZ9spoaABA9WJJCmqT11MUTB4pHiUAclSKCiJqtRd4NSpFoQ2Cu06Iaqe0nUFEh8ZQJUwsXlVJAzgRTPJpNUiiOnaSFbUNUOJqVSvoZIdnRgbPUxyynh+Ya189cZL/dQoaiadRrcTS+u7pbhdcroNjPZNquPtc+/RbtCWG9dPjuZ38kxxtwhch1V1OpNxgS7WxSxAjBn6okTTIYwZrutaOAzqvwdWYBNfKYpNn4TUBUVkWI7tI+jDpCmquMDG5WlRzXCmAqFuMxgYgDGNJL8yzW6uFLideDH/+krt+sXnqdNQFJ1+eSvR9NPzQwX6945tN1yG2sT0wmmvm229d1F5+WxxMzE5tQck1UtrelCXQZZXCJ+GYlPZCIwcBBSCfKTUiejeEUyiCFK/MTG0VNn3XNuRODGrSTT+EYAi1EFcGFF4E8giBzk9CyylmHr19fXEai4/WjhLFVdL+6dbNy89O0QR9NE2RPtfS+2kr70Nge6VbmXzMO/pYP1rqfmDFwZO9w+eVDe3c5Mmg8w0r5OIwTqGIKkoCm9ZyJb9OnAcxaB4RGQRF1mO75oQI9k0VQ4pNkISViUIiOR7igQVk6ShrKmsR9OOiUQTqfTp3NzK9UbiLJ9JrK5uvp5YWj5ee+/yxcGhZupvWd4sCNrG93U56a7dtO52xawbXN0Fzdtjuq200VhePDnKGUnIzfC6SKCNXQsqDtJt8c6BRAJZQurYsc2U6rhW0SWeJHEAMjowJMdyMZY1TjEAtEjoQOhT1kRd5NRkSgW8ImFdceP8bmlxuVSpjLInV6vTi+tPTreuGqfLH1y05azZh6Qk/eVQPdX9A6ShDil/v/v3bYCDL15cHn/wbO149CyXlpEsCLxqqj5xJBQGQRRFNi0hDZ1xAp/KgzGWL0gWtD2G1SdkL+36CNFnkeWJuuMQrMgmkkUs47hJLwmvFEFBU8UYB1RjZDZD801ibi6T3Nke36gsl8+v395ablzQxn1/a3bWjOve7lKbDXr+d0nTDZW/ba/vH7x4p3pxfFCtrOwOA9WWRzXPVqAiBzKObArmnvweuUAMfMWyQ32hsTjuWZYdS+qmhJBFIEZR4GITQ0mxdKRDB4HAtXWEsDARV0ygMIzBcSbkM3sLlbPV+fG4Nrw7PT1XqVbXLyvHjcs3XxocbBlG2aE/9LW1XNzDyn83Numwdx9w/9MvnjZOZzcqC7nsDMvbMc6wZI940JMY143cUApD1yGB6yHPCvXc/mlCdUTfkjxM7u6RC11852OCRd4ViRbZsUiERAFK0nJiQpzn9TQQeS3JACE3vX10uLQ5p6gTqbn1tbGlUuXm6uCtrdObZ+hU4C8q+ungofDvRg2lrkfYHgKpd9fWwPMvXd/elJYyj7LxiaMNwXQ9TjYtQ+Jlz4NB3cZBGCD33rVPJNtiNhOra0C23NCpW4jYIs0eEvadCMp1AWg0lKwgIKGkGyxA0lSSYUyOBTtG0pCncsWVlXG2sgrZ7PhJ4nh1+623jq/L+283jt8ZaMpyX6fkbApC+6VDTzertsetaUPvxsDO19sDz14fHMweTvGZ8XRpoSyIOitC4sicrDNp4Jt26ELJ9rGPVQZ47OHiBNUvNwooTpWzHMm0zdD1LIJOLBxDaVf3FQwNTdEUQgVNa1YDPJPmYpNpjR+ZHysfvLI3N780s7+/fn6zfHleKlVLx288P0Rtby8nd/2orz3R6awpPejWQye07V29S8+N916q7a9v5jJPzqupVyZXCzqACBHsOSrLN3vJdcd3JJUgqKc1bcpEAv+qqiL7jlb9mktsVxZDV7RsSUTIwhpybeLZOp9UbIgQlKHGa7whsJlhIQ5S6th4vrSRuC0/qWyMb718ttzYulqrlMq1Z4baqbMDhlLSWc37y7W6Xct/b3/oG2jXO0/Vrp/bXyzXFvYvT9/anFucLGYnJV1CMqqLwIC2KlkI2lJaDOtQBWDKwEaRlaEo10PJxkgFNgQoRC6SWAclReqkJsaMRf8oS+dnIjBB1hCEZDwlPEpldoqvrx4cbK0tL5fXtrZK+5XX19dpL21+c+OtNz4bGhxo761qpxw67qpWG1E79Tdh9PVuQn8oD55qNM6frO5vvXXw7OXV+lpikmUK6WSchdSlNKrUiuipcEQwxSDyIdY3WU4HMVoOkyCwJCRZquo1GUA2zCpIFU1VCmwDunVsGrqc4lMGyw4LRX5PEAT2JD+X2NxNXB3MzV8trR/UlpfXljbK1cpS5ep4+Y1nBvsohCYp7aB5WMDpyHVHClplHJWJv+2m6SAZop9H8CfVVtacNnuFM51OvciSIjlqFEloqYTMIiGpCARCbGXfCdQYbENtY+Mab1O8tLXji2YmM77o1Xfdm/yW/IFv2j/Ug+OmrWKzJTN5H53tOc85DOu9o8vt3u7hx/XRXa+4oLAdjGDwmBzmERSDiUYA4SgygrAIZGA2jXJ81Mg8gwR9rLJRhQkMGH8gGKgEBwpLSgpaJYK+yiDyiQgqTGLCSxEtrRXOrPHEtCOUNp5MzeL8zMiOu8/1frnWb7aP6r3hY3f76P5+Y+OHjPaL5YuPv35lzS8QXoPmu+uBkb4j+YEFVvPhOxNXw9blbvu0XN4e1Wu1PVdgwkQgjCcKJKpTJC74wR6UJqgYm/o5QEsCjU8jsSxVBcFWkQSmwrMp7OLbzs4A5QKkqOEBtTLgGRi3HVdFmaFkijYNz83PvESyL6fdCF3I4TRulzv9Yru13QEL7X5t1x4f7v92vwTzws7gbC8EdOlugOvVOMtPXrC8yLr/72CABa43saPR2k/5Ys45G7WK5SIuECIfJij0LEFqPIqndjCSSrpI2A/zS9CelKrKqibFYP6gJIgqRvAUIhJVYsAyEpR6iqBcdiCAhhvAeJWkEd3UZml337ISZ/l5OpmNFegMGlOj3ri39/z8eRRq1cpfeked57/9+X5j5e0v/vGrt68Kxy9fKcF/eecb8CUYur0FPK9w4NMXB/vVK5hi569//1L2BM7t1JJntiChKIJdYJxszh1T4AMDH+Xk204Q8wG1TGG+HcIPXFJkBzvgfxgEDFMNQ5MAfub3IZjoY2DqCYMAPw90U8JFlMo5nh0ztImczWesvYyRbugLWY8l9MRt/rlfK/QPDmutRmf08OWnja3LlU047/fogHP+YDewpPxiqJfpK8TWfzkPIHm9ljHz+fKng77OovTJ3RAUZsoxOX9QxBgWaoSSqnCSDzHqWYELA1muEGowAPMYhCAg26mIxLAYkyL4QFgJBAICS0yIalitpHgYcOT8Kqog0chct0JXsX6xdnVVSmdqpXopZlnjRaw0bJzmm/1a86n82Pvaqd+vffjr2uafrzfAi5bq4ItC8yOrAYRfApDvYJYYlqYB2PD2OxqI/1++6Vwe3uUzKA05pzG8migChYvczjFUdUJSGRAsoInZPurNEf8xdAE89qlSRS4EhvBhPIYhAYwNBnd4hglgxJWqElgQWhgCg3aNEXyUTEu0Pk0mvfhtq9wc9svlvH2eMGLzUD2RKcYfSv1Or3TYPSn1ujdPn0dHf/uyubWyBV0BrCUs4+U1Sl42YeAZDvwRsgQMk187tGUPAFBesYBlPl8elmPWODnJRGw75yERVISzfCMuPg0QCjjXYAfzjet1V2IYiVAtoPsk963CBgdQ9onBAFrscFT0gTVwGDMxbAr3RTFW1ThS9iFRXUibbmY2c+bGVSnTfzh66na9uOvmh63bUMscN8el1l388XnUvrz/y/X90+f7p6Vks7E869IEsCzwmgvAHPB+YwuQwA+8A6O9XZrl1z+gAJhRr5nNJu1iTCdRWcK9Ge1jsNSOig2O/TlElaRUipV7oSmtkEDqVRIa6E8/+1HWh+QAa/hbCvFXSQn8jkUVhkJIfi4HBEyBplUVFCpneot9xMCn1tQpHJZ67c6cMvVJIbSXeb7N9O5CpeF2c/sR8kDr6f768Ojz4583//7Tx1+9BQ+DKfgG3Hl4em0rwcXWfrUBc/5fA5zXxZL/eBiAAjc7avetbFRuOroq5BDai7ku5RtUOD6lYqhO0wqB8VXDwXMCKJ4cz0E3UxkwjMpKJBFgGH8Q6CiIgpLOUBwvgWcNEARFIQ/yKC1rhu2dZWwrndy35flVIjSejb15sh1qhkLn7avuc6vRa3eLz/X6qLN7ODq6ufzy0/3l/RYccvUl476qSnBUwAPn3fzV1tYGnP/tBjghQIA5+dL94Foa8k23lnQ0UkzTuCr5U3aUcjSBwUChhCuSTFM+WvFjOEqKFErR8ExAayYLPhSjtCrmI4SUBLMaNJfnARoBfHshVKUqJkk53JdA0VzBzVmFkKxnzuJ41HRdsRcLPWy3+v1iK9QYQTVozneTve7D3eHo63X98cvh05+/bG1ubsHtX3oWYHk56HIX7rWegGng4VdLCG+/G+X7I/y86Rc9XcM5XEJFUaxaMx9Fw9SPRdGJFl1MTk9ASVediTchUZEUBZzHdngf6VfTDuHjpONPKSYFYpQKsuGFFMZJKEzQXKfYnIhL1P4kq1NuTtKKOGDjeB8uCujMieV79WGj0Ctkz7dPcsNGM95snffrnbuD2kP3cNQdLb+7t7oBbgZwAM+LAgU2gB9IDLDoA4aBP2AW+Bdb8PlrzAA3sx0ZpxCE5BToPaBaSqRGLLt2UbcTtYNQLOPhdLZVSCscq4g8SvoJCdinj/GrosYHWNQfqFhMOBgMB0BwxsIoR0Y0TcSUKDAIKXKm0bhJItAFSDMsEqEMXRPkafOwk4lf2bH8STOdaLcL+Wa2UW/kHzudhy+Ho+te9zIEXxTbeLsGX32FAAE833MZvHiJfvgY4PwE9gGr/LggZmQHsAzCbICilKWkzIn8jo8ZBFU9WegWM4mEIfBUPDtFg8CfRQ5UWzGFKhSIFwoW4GCiyWKKD8oOwgiYxKGsykUljKriOI8LeiSXRvGTPIVj1aDJEFIWF1TdtK1mc9zMTu14KV1seA2jUM8nk61esdXsPHS3y8nJdnf35v5vK3D74ehv4fAv0b+M+KUBllDAw9Yg8b1a5fXpzWScJlH/oJqqKmYVGmSeETGiquLKOJ7Jl0/jzbwuUrQwXYhBfwrhEFTAVURUQH/iGA5ddgDQAGGE3w+oAkI46KMFFbp+lNYiBpkjSUmkLTrNEUF8aTWO8Tm4BbHjTN1CIWLt0XjaiTfiOTfZGe4lmrXa5WE3v7htDtvnh1/hsMssBYAA0jLiAdEy5lchbsBCW8uHVzzfwQy3QwbOBMOsilNSZRAQFVWEyYxrWMVe+y7UTHbHEYSno3zgAkul/FIEZShSpRECQxABDYerpJ8lBibLslUk66twLC8vGSqUGGjKKFQRInIWLMWCgBAAX/RrsYjsmJTt6W4+P/cEv4sU9zOlfWO/0Hto9Gq9gj1NZjvNUKP7ePNxeV6AAeddgnoLaW6Zy1Y3NgDKsn5CBL2Y5ZWbfb0rlyyEVaE2KEg4Bb0JMETCnMhOs9x9bDuqudARluFAriGCwSpYIRDgPEXxsTAs2Kn4QCGEGQYmgolyUS5AgJSBujwpJnByoaEURTsgR1NgODC7Hwv6TTSHoK4coa3kIqOSMuUi4I3j2ul57yrU6D/f7kcTp14tcRvb6/3taGVjY0nWlrkNYG1AxMMjlFUwDeDZgIB6+4OcAZibw3q+CMmYE0kSoxiEYVgECZACapwPh+14miOpHDT1FOcPAFLRD6GPSSyLw+QPTkg4KQJYWQqKDxRUMuJKQDTJKKmIuoJSsjBXSJEDiZf3ETobxAY7hODiFI/TCBrVJF4UnIBoOp58lk/mY065l0s2ivFMZFJIeHvOWeh5ZWsFjPNx6+X2w9khdF7qzAZ8uvUK4X/AHNR32yeKgisy4mM4CoH/CTQ7kxIie6F8zotRqqEAkfSFVRAvJAlDfYLEMSyBUwSbOg5XUj5SBf1PZFgUExQM4sWMFpwIhYqCGhUkLKVArhZ9OgImxPAgg2q8QZhVUQggNCqRJLiEO3cNu1lqnjZC7dtyo9UoFlq1+JxOxnZ/uv4rVEkwBFgBtmLA55aHB3+DZ3j3ymZ+gHnYPdweOriToySogVQ6KuEILtMoj6Fe0iqFHIGmBDbFwr31MZoEpJhjU77BILIDisYFGV5yf5wdcISPJgKQ4DmElHCcjkoIAy9y0HOLCIJwYwaYdEqheDIiiik1zEqIDyMRMjcPm7iMG1TO2M83dzO0bFydncRLMT1uJMq1+tHl5ruV1ZWPG5uAB5zr++HBx15AAZz/A9N6fvx8uI9TYxpHMD6exE1Dt4APSAwEcnbfTaYVhVf9rIks1wCh8URViCkI5UC4skPwA+KigsBbjY+yKgFzdUakgOThCk6CvMQjPJWjTEf3UZTBVSskAZWJRFwGVjzCEp0WI4y2E1BIRkA43bUzfduzx1m8YSX1tIt758l4aPfy6+Xl/eraFmDZ+gekgWVKgN8lDoiX/8PzptM5PPoJ/KKkg8jMUFFBHtsuJCFUlHHanOomB7wfAy8DNRbFEFXhMCiUA4Zmj9HwDlNZ8jh/1R+QNERFZZT04ULEdugIGtEEkffxqCbgFLQDHMhOsCzEKJaSk0XMV1UUjK2ioIFGKRALcdooyfmsgOK3ba+R6d1OvQxtevlmu3Nw+NA5eXi6X/3b9c1ydLgCmfq1dr56HTzDtYyZ+3brS9Gj5qaMI5UwRuKokZUlRkFxU9BwioE5GcmSIDNB9mIQUsFAxKgQEeEiOBhUAxUBWzYz4aXLKC/0TRQ0TTMlWaZN6HNIilJlHlI4AdxPRCgRpRFcQJA59BPRHUiPA+it1X08p2q4U7IpKhez9ObeSdmJJQzotvft8nmr89Q7714+1h8Pu0c3b3+19vb/HezFTi9gru/rN58fbuWoHpFA9075RRlFSQ6TNS8CWUnaGRCgI7N+DoeJuOID47AB4JdYMEBcBDAGA7HSF5QYEkHJeNTABRFHkhArKEqnUYwUCVoBz2OgxEiCiSMSJ0dt+JwWHRYhYPUjmEqhUUpbTBUqDImAVOzCmVNIZ3XXnM7GppOWr/onnS+l2H6tNRwmJ6c3yxT9msL+A+rV6d6++fLnnw6eurUsTio44xdVUpIFniFZPQ2f0DiGHF+kCIqHxsuHSILPL8JtlkDpq1zwHES8gAPxIi1KE2XKpFwhCg4mCCgfwQKSaFLARqsSQmL8cVhwaAWiKRqb2goug2jow1SJ4KoORup2NCoEAiIpyAxC56RkBDY6Sro3BR/Brb1C6C40VQwrmTC0Un3t41tIBgAGUP2wzffrzcGXzZv7g4OeLSNw76WcrkfEtJCWJIfiKUpgGD6osuBeEYmDok9WeIIn2cogjAWANYNcEfFhBIpCg2DIuuFAmGke6JeaBID8QHOWq8QKmQLRsyqTYtbT6bE9Q3NpGdo+BIlPSEInrzKxcWSQiqZORRhnIwtdZqSIO18087bjjj0zlt6PhXLxUGyqF3q7NxtvodRA/wbxD13ADyRLMKMv97A2f1BOQv1GmOlMN9K4jmuz+WSCRgmQADEIChERKI0k/ESYIHkS8QVADUcRjcplixMlApmKomTZtLMTV59H4rY7NWWexyDm1YGCEVCIsYqkKhGU1p20ns1NOV5Hc5LE87qo4AS+l5+pn3bghapQggo1FMiDlsva40R6X6flaMSMlc1oKb7YNxrZ2/omIFgDV/se+d+pwXcwoP3dHB3sFgtjqJpCws1nYvYkYjSKJw6FklRVrSKMxIL1KY5kUyDIKpgiSnOF15xk9jZvuLiRNOaGPk1Px4l8PJ3NOtN9QcFB3iUVA1adVX+QwfSIg2mSHIlETStjuo6TUegoKZJRPsLvSbQnM5VARQKD0AiJWlcCnobKV9Riz2mH8aUlJDOckHY5ll14i9rd179tLTvn70Z5MczGC7/ZeHNe7lyPnqFFMiWF19N2EqTH8X6i/9DJmpZOC1HFpHBwClETYQ8TxaH5V4FMUrNZP9Eo5w3HjO8lsnnL3pvE9/KlhEzjswQaUXgJRtYqC4QCGALkQo8RPMRL04akZc1IKY6TiBAAlQTFSR7TJeYYqRAIHtVmsWmCQlCJjxi0TvdrTjisRQVvTPORfM/wIXj2pLO+8hb42Q8PewGysbSMDV3sXw/qrZoBEt7+1V7O8kpja3jSrSWsWNrMQTsvQvXzYVWRx3iRBLpC6+hsPxELxYpXY8tL5s9KGe8qMy4WzvrZ+dyhk1ZEQ3wKJ+VIzCeKEQknfRQeQMhoZpa2z8Zx055nSZXCcASikBXoXFQeqAisRqO54tREIepjNGi443Q0nRElDLcMmRdVYXabZfFIvPh5fW3j199hABd4BbIB15tkvz76qXV91I4pirZX64NC1z2NtZ5bzf6kttBRRZJYUqAQLAhyq4JEjHkyMcPdRO8sAQreeaN83k+cFOPntXLoLJtxs7KW06yZESVNjcJ5AlzS0iyFLsIsnYLexXCchZm2Y1fwdyCbBi9UTq1ycSmwc7EDt4vMCkIinkMhJS6AqUp2EhQThy4kUYylY4as0ePmydHXj0ujbGxtApIf19LN9g5aj1+fru/q/aw2L4RC2cne7Um+XRs1+nsJS+YJFfKrn1lKMhyLLKMx4TUgXZ6AdPc8LAyHpfN+uXg6DDUSyWI2npHnBuVFLJPKLQRk6rnUHFdJVFt4UUGL0NOII8e9mNm0oTmqDAaBnU8XO5BPYBCH+MwIaAk4Qkei6RwZoU1VQTTd5w+Y1rygsSw9jseikmVs7/60uWQ1QAZecSyfl3T0Tf7o6POX68PLu17GcfceQmd7VrsR6yYeauU8MDQEkivpWxaFKoYoUUqemXvF/NltfFIu3dXrtedGsdQbNoqNUuG8mFm4umzuR1DU8FBSQ3QHuhcTF1DSzCXwiG5ENNeIZ5teqYFw/zxGGf64EuQ+CcfffmY/pTDNYkVVjkgGlAQiqkAHz3KoiAe5XDRJ7MCuuz0xCFUoHn6Bk0MX8GKOH5AAHUzO/vr+8/3l0W65kDWy/fJ2f9Jt7JWazUnWVX2IQsIMhmC4KsmEfbKTc+xQOZ/Il0rlfqg7Gm3vhkrJRqcfyjRDp2dxLyvvA8uK4PScwiPRqKUpy4kzTsljM21m57K7Nykap8W8jlxUvg2q1DfYwk9Vdr79U6hWGOMMY3lKU0gfxkURyUeCJK+p4SBnUrpEMDgVS0cpv1Z8vv4IAF4R/NfLIAHcvH+38m738/VBq7g3nzzc9h/y3Zg1uTJiKFQwTl02KQHWH4GbhuhuIrY3vBs2etuJfrt2BwOdxjABs5Z2rXFyllxMzfk0qqA5PaqlvbENBByixKQjJCVHPGM8SWbS47mbLSmSyAtRv69y8c+L459hEe8bq7LhFCjyBI/OgB0oNIJU2bAPT0EKwfCFQNGsPybDQo+PjBZ3v2wuDQIXWOW/WADM3f2XtbXry7ubet7WM8Pr3W4zHlUM0PuIAAE1n+AxheAG/gqHO+mTUKh1Xu637x7g/Lfb26FG/aHcb921eienp7HprFAy8CgVyUU13TRxiI+IiRtoBJcbZtHyCgXbSrg2GHGO74cryvEAJSup1M7Fp+Nvn6Aphx4jVcFMwUQwQmUh/9ET4L5BUc7nlAXLxoEOp8JSJPRuDcBsrgCU/wB6+wrm5svRzer65VG3djXWx/l+t5c/9UBMJTFuuV+uAgVgVRWDGSWa2c/XEo3tWvvgcPew22536g/D9sF2u9ep9U7OCvFp2p6mI/uyE0X1KL0P/qKBRktHRVxfjJO0bBaz05hlzyaFeJNSGd9x+Nj/7efgNxi8QQDt7PhzsEMQSfB+tcrqPBplQzGZ9oepaGbhyb4AHj+jUyxttEZrm6ubK2tLGK9h8x8683D/5frD+rv1Wiu2N523h63WaahwGtcRjvRxGCYFSEzlOR4Cxkwm8+Xbcm97NBo9bj92tmu1g9oJbPb37s47J81mIec4EZCOcnYap3NADVCTMmhZmk9lOq3rC6AInp0tWXvJhpukc9XAAAvQYdgzZP+JHf8zSBwPYB+/UsUFVsE4oE66Gs2VApJPO+vadtqHpKM5VJap9tH65v172MX4+N0wYJMfYL4eHKyurdy/O4IW6CpzeHfzDMOgs2LGpKCeQQ4LY6bkw1CWMPVCMXR+2Oq1ng6+du7uDg4a210wzfDo/Lx9XkhOdcOaaTgOvPgqInhTWbaiDsDDZTkfH2cc43ksF/qtQnEv0d2nlYIAWkPKSSHkp8E/d7CdT+7xzjH0RSDbRc0oz1OspFa9MzyCULSHmELKB/k6HUvMP9+vb33+/eZ/IwaI5yYkgmVqHn3trn+4v745+Lw76vVbR6PudizrZBdTg2QwUUcIhlCXsqyUduyTk1a3/tC9uTzavuvsXn/ttrZ7tbuHWr+ccFzTzSbTOcPWZNOjnallpw1djpoGAltzjhnRZgV9Zi1Ke4X8kRc3nWyeIvlvjFANEDuBf/7z08+fdqoVIpgilypCjvVBx0GQU1cxJcrKL6IoQhmy7GRa3d2VxyNQ1jd+1Jj/Yc27Tzc3uzeXT7uXR5f16/J1p9d3T63JVHOWAxmOD2AXYUYVBdr2CqVat/N1t/7YuTzo3I0eHg9q9e5ha1juN/IQZsW0N/Nc2S7SQKpyhbmD79sGWojHXSsOU+a424jnrdLE2Cu41EzTHNORQMGKBol/+i4+VT59YxX4LksAZUloaiXR8TGUgPtgUIp6TgJlDcWknUzoafXpt2tb4Ev/Sczw84OhvVlfWV9f+emoDnDuupd3l7uPD8XT/FV+HoniKheuEpUqhdLydB5vnreatfLoqX79eH1Zhy2RbqtV6/ba2VIvk9mLZxKGC92UYztAOtK5ZFqTk1PXjZUWFh3NpGNptzg04oUF7WlmxL5yTRHnPZJSKsGfLzA/8ACgN/yOP8wglORjZBoDPSAM3a0cvUrMEAcXHGHWLP1t7QMoNZsbWx+/M+ZXKN8jB8CsHH78+Nf6/eimvw3U5sv1Tfsk1ruNmRD2TCDFB9kqZ8XT8UKt1tl+bt9dbh9e/uYecsBou17v3oU6pdB5JnZWsLNa2rWvoLbgc9fLTeP6vpW0972xs+fq3l7GdbxZMbbn0FNNpuQi0G8SCVzwlYHv50/fdlSQqtUUw0E3niJVhkf5sGfMfH64kZG4p2k4STu5vfrh0yqMNddWgACs/Uhkr6UTwLz78PEP71c+rl9+uB+2DxOhz5fXT63yQwl6NR8G98rESJQ2ktlmvtGuldud0EOrfv10fbRbP4Q8Nuz2So1GPjm34lbStbMJW7a87Mye6fv7rqEb8YWly7LhGAkjajlyKW4ZOcsWksLMSuMpOnwcrAZ3fv5UhVl9sMr4OOGTv1IBjYijRZDeE5rqV2QtG8/pcYjIULJ29OUd1BfIZEsAr23M1g+6+eY361urK+ur6zfr988nz9sP28+714+d24JBY1XORzAUIpmeHS/WWqH2sH9XPwAfWz8YdQ7r9e1yGZYsSjDUSyTdTDJztci4NE3LMcPQk1nbHdogLaYNT7fPrCRtUS1Dnhl7lGQqSYmMQOOKqJyYrgx+3glXLnCSY6uVHVINBLCALMq06jNvs+mcRYJYQ2dpr9WMDw9vrte2Pm5tfviwDqEPRvkOZOs/YFbWof6sr2yur/9U6z9udw+/1sut5/EkjYsIJiGoooCPJE9i25388+Ho7vPRhz8djA6/gprVPTh46Pdq5f7Z6cnpFKI8NsvEND3nTaAFSCZdt5BJJmTXyC6MZpzes/XxIktbe4JAOiqpEZzIEanlmMS/g6U4QBAAaeGYk1gUmlREcEjWLSQKzT3Bado59zSTLRa7f1x9t7kFtlg9+AmGm9/N8gLme55+swYZ+93ayubq6sr7+u5ur1vvNPuts30tygAd4xRJMDKN216o2zo8uhttH9XhK10f6jew+gZf7gq1uv1avnE6Xtjx8cRIp13d8CzDcZPOHLYxkuY4HcsXnfh8XIjptpuxI04CS8sKJvjDalgKIsFgkGJ2AoIgsBisegRy/3pRG0jUNgr7WqFRO68Zib04J181znuHR51VOPXHtY8f3r5gWIHfFxivxObN1trm5ioktNX3q+++rneGEAgwvCq4qCD6QUbCSCdb6tef2wfX4IK90ejw4PLyw7vreqv+AGtjQKHLtVJ+b7E/NpKePcnOspasj2PJeOwsUyyl45nJJDlPzrK2ZeULtCFTWRTnGFIOIrBdt1NVwzxCQegToEb5cgoQMiebbBb61n7mCpZTQ1+7EzsZsqJmejzsHfxuZQ12Ht5vwYHfQ+f8gmJz6/Vautnq+83NFcCysvqbp9FKfftwu1MMNWMaTjMEKJgEPrObxe3u6OkR1vchRWw/3fzm3S4Uy9ZD57FX7hc7jVIeROEFFBoje5We5Yx5PFvKFwz7PJ/JJ/avzs4zrmXHzode3KEEkUNkEuEg8EG2CQchJYO4G64GOAzafuj99rPuPO6ewBTtpD083T1sZpvDnBkrWNe1m7WtlVUI748bK1vvIWiWCW3JaeD3hdtAzKytrSyJ2+rK5z/erB5d7m6Xb0uJKXSFIseyohL1EqVut3t98HjzNOocjR6h9Xnfa/e2C93revt8mO8U84nG2Laz1nye8CxwNt06K8UzpUQsXzjJ3yYS+bFlJazEPi1RkhiTSHIpsCOEX2SI4+OdoCqxKYyhSF0QUZblgdYJhBu3E4tiKNHsdRbxVmNmXM1qo8OVrbWt361sAmH+1RoMBiCrLbPBC5YXM4Gbrb/f/Lj5HuLmff395Wh3G/bzgMmbPsLPi0g02+w36gdHR52jd5eXT9ej0eX10TVkgloHGoGTq0ahdttIJuyFAXDs2MLK2IZteNDeFU6SmdtEI3HVOHMXacPx7IQDovkEJRm2Wo0wjIT6BscUm7IwAsReNoC0MRHBOV5CRY66ynguDFRgZNPstTPl2/xe7Kn+7t1vfrO+9seVFZhAraxsAowPqx83wdFe7AKWgTdr71fXP6ytXNeHT6Pe5cOo2c/PEJ2EaQ2J5056MCXpHbaeHj8cvH/3bvTu8mC5S3G0vjs6qndDtcZtvJk89Yxs1vZK8fTkzNu/HWeS+1d3zVK8n7g9seKgGaXPzrIGbTiyvkAFFff5UggfrKarhBasyOwFwUEvW5VTYQRRq6S4lGbcXLo/bPZC0HG0+tliola7/uPaH9bebYIjba2tra9tvoVsAAbaXIJaJjQomv9m4Vq6EyegsDsgtUXb9ITMdEoJbdXIM5AQEAJ54QAhUAjKs0CRVxkprbApurHHc9jMOd3OwkV3/gEXrlz5C/xDflHL6cwcpotc7uu79/tu4RW85Zi5jn64w0KwuIWuvSm6X+3vvT7wYS2h1WqbQeumum1RbZJi7oifBjeV1s0ACpFaESoLvjOVs8I0LaXQC26FeLeblHq8kezIMEPsNJtSNB1PPCT9gme0TLq9Uc8pjPl07/rg3RdgqC5Pv/sO+PLkNQ6i33wDquZ4L3B29gqrgyCq8VRj14+FQnm6rjcfXzgaNA19RDlpx5E9n7mwpT36GM+PaEMGATXbhuH/SBdBvNyRd99XH4s1MwgJHZarESEUbTYbxcH3LwpHEjThpH+6+fmHAUp4tdpuY8aUzfVUnos9KT0RRUzbqUlvzmsAagLf62hNTRTGQicqXvPTUSSrJfVg0DuB6MF7fHJ+BqX9N69OXwVOvv327bt330CI/znqMzS6mNUvs+6ckZXBORudx2atOt5U7n6gCKfzyuk6cl257CWTk0D2HDlgiQtR9q8xV1fIfcKFYHNiRtu87Krmgg+9OsAF3F4PmN4oPLbywzZDUxxDEOTd4Pt2u9EeDLeNRrFRLskldS6P54Ik9WQBy+bbTg/rQCnbM9Rmb65q40YWmhOovxa8Xu+qLO9JhflRLBKAPArc7vEZRMTYM/347gJXIF+evP3y7cErzx50K97Acpln2V2+3jKLJhJ5+9MLd/QbTTjsz/7fGuY8ctF4bpeD+R8DIMxo64o4csE/+ORf2oNdiU2Fzt54Ty4OUulIpDQsb5uVgcIRFs1QJEfc3JTL4A4HrQaCzKireEhNEHpxgY8mVWGCMV9KqtmoZGhSh8VSylA7vaBwHX5IJ2/reZxOR1Odjh72hS4jJwdu/8Gbi2+/+ebHb764AIn16cmXX+Fm5wyHIm98o6wQjE787F2lka+UBsM7jnRZCmLMSawcyifExyQJncCVy277/xsDrxHw1ZHDQVAU5aw+mqXbUOT4HBpF+75iohXad7OXIUkRpNNJ3bSG1bZpYs6sQfhuTGVNk6/RHjs8TJmnpfi1qkuSNo935c582SwYsqGv+XR2mTSidX2udbpJI5Hmx2wA3EEafRK0Fn7Xw9fvvv72q0+/eH1xcQaVwemn3hOQDO6Mx49VMHBsobyrKBYaJe0kGvSRg0TIk09XjHJlzwK2n+AaWIQ+c4QpAN8ugiSV2bPZHN+GjmPu89OTk8tAVi4M2i/tnyiCU0iKVO4a5VYDep1HVDKzIC+Wuibj9kIQ59e387iwyLPTpSTxqi7Kc41Xx6VpXNRLXUy7SyOvTpfzpaZOM538eJJJgynwhcDknl68+uIdlESfvgO/dgBh5MFbHxLnzIcVldszkbVSvVAoKsodzZGko4/kfaKUvgtowIIJV5/N7LETtsAYFG0SMAF5g/QmGaquSWoaMXu8B1YmMNY3rbv2cPBC0H3rp7vvt3c3w1ZrACVVuYrDeCwDZbYkdTpzNRVFqPHo+rIqdZKitmjyHWlusHohm7xO51N5U8btucBORb+mdaZiOhWJh73ekHvv5DW2TO9ev/3ina2P+BYHRa/f4JB6bxRwR4+DEZbX5RJA+g/b4cvMct6TBGcVFYZGCYZLjvDXZ0fUFZwDY5wuwDI0INiE/CaYYR5BndiD9mAP1Lk+bFdaTXODdCK5zaDRvqtsypt2tdaomKy+KLFTTdJEsatKfKc755OspOJ2obvUtLUsT7LJDr+umoKYirKiXMjr2Zqq8dcpQ/3FpnISLIRCbtAaDxdf4/D24usvvrr4/POvv3qNOuoOBB5ie1EPOJBxfawOsyAr9OKm9aFNtdu/5ttt8gjdEnX5ygVjyKuP7YqA0ow+43QRSBsgG+p9o1yZZs734H/fyCgti+ZwcDO8I0kayV9st7b4UGblir6rGPl83WBVPLWoiZIUzU47krCWWFFfqwarqeKyJvFrLc/qvJ6W2FupM9XCpWjJSMcysthMYusxCYN4Bod18NWX0G999cUZpFHwDn5jx6nPv5/KuHtZT0IQ43F2KRd0s13dDvo3aHsfgAS4MhoNvIIC8B82g2GoZrAOkBkjAPa0uGapNJapc186kxLY+q6MsXj3PcFRBM212tvW5m62LbbaFaiPzB2eE2LLOli2JS8sNV7QS0uZbdblZsGsd+JZbann8yVWinY1gRWTcbGT5hP1Lp/1LG9F8XbCXwcD4OM8l+63YLNRAjAQgNqGPZ+CBwp4QGxA2BeJptRSna2z44o1MG9MtvY4vKFpUrE+IYGgHQQDGSQaJwz5yK5rqAdHKFbUjOQGw/pQjbrD1/GeWZkVOIKc0QTBELP+XavdZp5ays22vakXN426yZbyhqZpYQ29kU8us0teXIsa7hbXxUZdzqtNli0kVXvu7/RMQ45m4h0BK5bsuKdFdTUaTN/mwqHD05gPVC7krVCBY30CpTTOpaB/xDXUmdsfCvq7TZVnC6axeLT7wbDavGkNirTz/QcXQsx2igPGOGwk89GVXc3Izz4j7EJAIJSaVS0cFeZ8qVIjG4AQHMPM+rZNxdagPbjZ3qFd1jag2tbSeoHPS5x2RdRhfpqNC7JslKB7K5XYQkFfl+Q1ipfKi2p0LE0Xy+uMNLp+4LujtZAQtUyy95AIYi2WOEbHP8Hq/2LvwPs5bqZPLsHVgcFOwHLP5LD7oPF82TRqRrVc28BHumlVKk7qiUZ8fXJ1hLQB7XSEr49caP6IOnt7i2CjiYGRr7GYRBbVF9O62dQsJ1K/TyjMS+NmOBi2io1KsYol0xZMmSyX8ujSvMjqY5V9sMcxvd7Eupplq6w5ZcdGSe5co07E9ZIh6xovjnghGkxdLx9SEyEvBFNg2vcDhydvzqG7PYRe9+3F67d+W+txnPV7j7HEjQipmDrOagtpbU+CTa24mCbrs8pjC+ECb6DRYBxDdNnpgqZp42eYh/f6zE1/W28W65XyovjYmlGM0qLgMWYG75ADZtjGvVCjVq7tzMqwVpAwC04BsZeG2l3AJTJbYEt6IY+MQXGA28aFMcvXgRK6gqjx02hajgvx64fYPBnvdRPXt+mM+hABL+2Fduh05PZiM/Da++nrvcvc+bEbhHng4TiSDoLdQq0f8fK6IgIPraPJ8HJTHDLKDAM08Cb2Alcfu2wMA2OO7AWAy64ABM0MKobRMNnH/ozh7DRa0RbeJRWOpgezx/vZYAivNKpT0Bl5tmbKUgmcmSqpcqFUZdlhbcFuynzFrBnszqzL0yZmBFGQ+Xya70rppH8SvxbSHjUaFTQxnHtIdOMTf8a974WKw+P3eH2gdYE9L6B88vggfvfve9IpENCqoMOhKbWb9eSiuXA6o09bVcbpYpwO1GKK+a8C2GHmwpgJTRfpJIDwd9iEbYbNfruhcMz2jkL2k6s7kuYAle8bFeQeVk7FTaGm5e1KBioTlYYX8nq50Bg2d41afZjflc28timwFbVQMkqiivCqR6VxNtXFIhBzaViMS/OJpEY8uXTEE8h5Qsh28LmXvpj7De5eX/m8kOLsBTKT45zHn/Anja4kRLuToHsEUn3/IZNJ9ELLhoP5gI/bdUUSyJjPHDADCMB1hUemKJqx/hq087tatXVDz+63JN0vvmew5kBRAGRub5XhzWN1AKzcqOyqhZ1ZaDZreb0wtdGYUSro1WbzsVFE/FULhUanbOisPF2KCyk/Htcqsl6qY5UOyaw27Y66151sT05FI/7z45APehsv/OKOoXideM9P38ASrx86iFjAP8klI4lwWJKjYSg+91Pey3P3RI9LcaHlcnGECxDZjjAAabzQZ4Ch4ZQZpTwPK4/bSr3CEUpxRjrRmSga/iJoy+pjnqGLxWK7WKlWa9V8tVmoNAvN+m6hx9nxYqw3m2yjtqhtNttq0cwjuOwWVJgaeQNlYFxeq3xNTU48QZEV9HgvHBej4YdEJOZ352K+/dSxH9ImT2wS8eA6Dz0Gmjs/+Kr9zPGDJxxMdZNzUGBdrBBwMnnmj43Wcbb6jFGNdLg+JhBalNNOGRjzb8LQTidz37hprZinLaUUtyxmG9rJAahSMKfPMVyfaWDNNNi0FaVR26Ge7Qrsrlyu15qYoDRglUGl0YBuhW00HlmzYLJyvWM2SwuAt44EPBBFnujCXFb5ODB0MHOd6WKazqXibnci4c94ziHr8sQgtw2hGuCyM+zOpSJpb8bvz01G12JHF8YhMD69vbO32Zycq93QDINHA3YhgARImIOcQSFzkRQcRXJWv/GsDCzlvkhzduBhTAVQxiqUnjH3llVECLWrZbNilptmpV6tFsuDQhNDbb4AV/Xb5WGlUS2uZkyLHTexngGdXjPEOQpEp7NO6tFslO9FRxMpnuJ7mUgC6rrc1O1PB3LdyHEg7ncHDmP7hyFcQfu9WG+7IcSL7Mf8HlQ1cFcaukA05RcmvkPvfJSZLgY0bac5SR450GPgHkSajc3QYeyphgHKp+mZdU9jrgHTwa1gEaMw+FOBoRbXHqyU9uqv+yI2mY87rDhxK2BWKiA3nv+aKS/tP8wPHyy6vynWOmNWG7NAzDtWlsvoWwZmz6UUxQInGY+qQncUgOY8lsG9fiQ2igQhQMtBShkLuHOhw8PR/j7M8Z2DTHSDeANM3A/w4fV6GU6xYiDtv43PC0OLe6+4HOiMlAMPj8TByw6zf8cZm6bB9IMGSbtI2kUTLorEVIC6TBGUtSr+xTD9av9pxdF9RSn/PkTvVNrF3Yf3A2SJpSh9inN+oJWVhXfzxRLL1nQzvxC1cYmtb0odjZdLYq/LI3G6y6yYzoQno7gf4md/IBTLhRIJpLcbJcCX8+2d7/sAAGAOehBucNCFEHhuAbBzHnnIjNNTUzPqq6eyhXx+78TjERbn/Iw7cmDVhGWmExWAo+Ag2NQn/l0bAkLjTRQ5isH0r5AcYtR+UDSgp1WfUwbDFV0f5BWF+6taeX5aMX3q2XqyONS+CnaEWqlmFGuFJjtV882duQTpuyjJ1+lk8lbsBKOjB6nrxo7djUV77jjogQfQI0MhmHNsl2UMbpe4pYZJEd+l14+lzRu/22/Ek9e+VFIQUF1q+uJ+ZimUEzlCOB2WvRmAMXhoFGl6BeRsFzbqP0PwDWeRJKyk7xXGYhRlNpvR/co9bTHcbFWs9h8HT4q1Uvqzvyz8BPO+eP+hb9HtsrUY12umaeosMh+1YVwqYJLOm0UhiSrOC9luOCqOEv6UJxUKeoJ+7NNingA49mO89j2He759b8z3Bs3mfA/U2unx4dkldNLuYLReco8yvCrqGMd58U/q/T1HO5AvQJYuBzxjuwPYDDkDQ4DDbCPs92AOqrPtHEvhnuGPmWX7yHpSOCRQn149DzfbPmfd/7p6mtE0jGHoJwaxRr0fVgaF8qpcrtXW+hR8xwImzbW8jOFnUUpnwZDw8bg/FAjHcqOcPxuM3PpzmVzCE4hEQvunOAfbO9uPHf6N849z3+HxiRvaSnfcfZKbTCClSiYDvCBM1aVR/suy7p9p2zf2p+/8DHDmygHLjv6rA1gVAA6gFWFDNYNT0DExpeJRFYohGGREn+lb1qrf5/q/Whb+ycAIZfW8sn6fWQS+OA45thk+9pX+c7nJQopmsDUj3/mniHPpTd0Oonh3aRulqC0RkN7m4aRVm4YA5k0JJE5De3v7vHGrq4bgBSIQkCI7SjfdelNZsuStF9576Q0LVqzYglC/UH/j9OGQYJzb1Mczc+bMeP6+qv90fd+9ur666mXzleZX5Wb+vEjjsvrY7lNwpKsnpwfQ8ubuCQuTjmRGPc0ihC16ay++efH++5++2PvyV+Zqarc/1K+qOCVrDC9I3rbJRVbVaYZkiQ1ImmgyaT6Jk4l5+LGBE6IvpVROkjfxNmkyqXLxTQMjWLZqWxlTz0B/qk02sqyUqVKMSuo1tV9+1z3r2x+PYYFjav7jr15evh62ro+/up4MgdVjdA5I6UNePIjunKZyNZ0/ZYHKwRZutY9hKHO3KQNOPuAhAwzZ8rCFrf3PPkqkT+76uXzj07ODav+ufP36+I+5QjMvFSZBgj/ROMfZyDjA4VvIQBwMNCAizYBklMy8qyQzimpztiBIwtQpqXJIpUlTwVpJVSgPTQ7vpxTDJSlp3//UcXj4F9Lte9TBNcx2xUKz4fDVRXtQLo2L2cPT/m2vwEBavoGIrB7SWyL1Eyj7HxePNjf3WemOAv2EhQdM7X1z9D72SRf3th63JR+1e5VepXb8Y8c0R++8m/kwKTo59dbPRAzMLB1n8IhxkiCSWMHLMkgAYGiQmqpk+FYtRZIpjgf7pTQQwdggpkfgcYmIKcLG8DXzR+un3xfTn3767s0b78eXP/jmm5evmcZj2dfg+GXlttlspg/Omo1S4fSsn++fnZ2nTw7Sm7Jqipn7vVMmkA/yPOFu54tPPvngYOfxBWPqh9udQp0F8KxNTJBtascXnY6qaurGBjIzjhppAmIWOhzyvoG5iBuoLAW3wdH0/iRYONmUnlE9+lWYRKhNV6DqmZriDVRJijeadJkNVUvpimUo5kvfMmznR9PrOJblH/tmwDjUm6vh5bA+rLfvctl88aR02zhvVNOP/WqbB7ulT7eRMdx33Do52uQdfbyzw0LDj1/svLe39ykjiB80+9lEYmefflvuovDq+tq1PWgYX4ecxRJvyTkLEApq3gQJcgfbxBtJFEbDJnpSxSAKkjPFxbBVxRz5lhq9jdYWYa2o6CTajFiRVqHhatbCsjzTWPxg/mabZKEf/On02l28RhU8DMvlMePKVe4dlCrdklDZWfaUZRSJneL23tbBPrdwtyHlzR1C/yNmNL44evHi6NOPPt6v5vBD1rUf7TaOL686g5emyTmNlHeEu3i9BSARnPG3EDJHBYnCD0gBaHhXhg21phrWFDOwT6bhgJFJGSldTb3ztoa4SIGMf5MaqYY2UlKW7+mm/dPvhgs29dWEu+xueMxdozFqpNYYdwvl+v1l67FXZyXQuFdsUqSBpMiiRJ53t3twJM9S/fr9T9776yPqNRbgsbKyn95m9PlF9i7dvhkOvMkksDRd20i9E19+8gyUDBqxihTO+BlfbIhmHA3JzJUWCaBz7bVRZpRRJYfiXHZKtdSRTrBsbKRU9GhS0xSJIgMaX+iaOTJU3/YnkbdwPO8Hmuyvgx+//+GaW9P39ValPmYx+uCqXCm3G4Xbu37jLFvMb5P/jxgI2GOacu+DD3Y/Z9p0Z393FzWwCb5E+2bv6CBb7120bmoPnVkQLGwLeaapYBEKgAAEi9xNEwKICRpMcbMWINA2mJPQMyww0lLGiItO9a3qGcKEKCH2iSvtXVPR1tA4QhU0qoJDmiPd1Yw3ry3PdRa+6c6C4zfM3hwf156+qre+Orsv1Go0qCqN3lm2d0Ypg+wUTcmdIfLLB7u7PIuL4ROmUg62E1v9vf3Dk8dupXFSus/dTq6d+evIWVieRfwrGc4SCWY/gwGFJM2Ynzl/kTe80HASQYhN6FiVbKMaqEzxNEUCCEKLjxJUb4PKIGbQQjYEoeu2qekBCtt1fvCc0tVioQfRdNL5c/L03dWEXi39wPpVqXx5zxqZcf4s2z8/y+dOyaPIM0J/n5DhAYtf7uyLDNjcO6nm9tPd3EPtonyFNLvwX0+CheGhRzLK2yOwSILEzQQIfcFnR4sjSPxM7CGwMhI1UjcI647IiiNDgxBQoAr3a7Af2RTjgCepJxUd+JpQHgym6US+haM5xtx3kAlT2wmDziukdO140r5AmBQqvXK5ccfgdqPweL59zoRQYo9KgKFw5rU3WY27uwka+mgf7TBzWqgNW5dzOqQXA/6StQhc0zYznpbawJMkMogZuVkTowBH/CXyLLYP8hkfko462RPXUSX4Vdqb6ogrYiYV4EgqQvSgrtfIAVN+jxuidVRTcyIrXNsLd9bxPdONbHwtdKLvn149tL+6uWp3x/TYC1lyznmXp4bQu0gX03vpYrG4vYUYeO+zLx53AXXAHVDW3Z09sjh59hDNJrNB6DhBFNpWx0VSGRLdUpHBZtgj7gNgkRiGBM6zGIhLAVClRD4TQ2zkRdrOwBJC5regIa7wRnyOfqhhIC8AphjGwnQ82G/qOfNg6oWzyAkInrkTTQaXzMTUc/lxpVxutbvdHKOC48d0Ot84zB+ms1IJFLeOWN/+6Xsf422bjL0kEtt3uUJpRstpGnoP89AJ3HloWnNToRumcRYbnL+AidMlKAQV+GIMYJENu5CVgALtphCeCmEPAShQHQeIOpiOP0OkqOg47CjH+T1xFWq6p5pB6DqrSRBGa2dqB3O25UNr0FlfdluXrdVlq0WTuns2fuxl0czne5Rn9J7QYMVEdZOZs13WWHFH8Iji+bxaHr+8aGGSYLCeWb4fhVQcxiizYWEZFqdKngEIlhEcYJONk+MV+5jIGhoBcUzQjsKrSIxEiwpKTEC9AM/F0YVgkDgimkygaKGiW5Zm2/w/3em8M3fDaG6Fq+GbaPnqFUaaDJa19eyr+ncPvWa7wAhns5o/JGqYVpUyIJ3eYyn/pwwHsL2HlDk4PWs3Lspk3pkTRk9hZ2r6ju8Fhi5qNyMli1x/CICveBMwcdhIYcbvJOmAg8vOCasA4WRJOshKHQ+DDISU3wXlCO1PqkEmZDiW0VTqG6pSSmnTs2zbj6LJ3B8Egf/0MhheDSbOfDYYzuvzqMKyjtt2rjGuogEO06enpzw19IRUUyRnHn2w+df+R7sQwcFJPntz2f5uNgucpw4uNrXCwA2nvm6pSKd3iWkNOhNtxgaKZxxxJSCmiff4EjxU2uymjAxxDnuJlYAHNiJf9jLoVdyQGuHdkQZDaIow3SgEi2FZrue5QfTkWvZ0tp4t5k/zibNav5oMasvJstaq3DJCmD/v5wGTSB8enhaldD7d2iQ9MmXPqqrN4kmvcL+eO8v2ZOHNTMuZzWzb8xa6O/I8Y6YniQpcnnNFzmCT51ABAUc4wI8YDTaB9XgDFm00RDFnLmQg0SKCTE8Kf6vEjSrUoI6E8dhEJkwt08rYHrHihuHMDf1otnB8H5+PZuvlw/Cy9rS6vbzB0RoJ1tP3syf5an8rgezfSvBMB+p/sj6PTEicdis3rXk0bz2h9pzpyHCClTH1uVBQpoWTwbuqihFwMxFl4BEjsEkvTeDEuiY+ABZhALaY2YSnwQgcfM7mI2Gk8lkiX/5hCjdEIdjU1r7pDYLQV42pO7Uty44Cp+M6TrieOoPKpLYcrEromlW5kZO521zuMN/Pp7dPgZPgphl65mj3iIWsh7naajV33bXrUPTpqh1ZHc1eWJoW2RRVuLUuV5vwEAIQK7AJnn99TQ7EPA1sQAA7djeJITESEFKcuqR8QOBWZmqkQHVSAAkHUDBoumXrpmUt7NB18XDXn87C+XQahu5QUsX6srZcVkolyLmZOx8XSs1Cs8qAp7gaQ/iJU7p9W5tFciUTX/XBehWuohBx6Lum6bmKaqKbXFdHDQoHQWgQFjEjEP4xCyaBrv8zkwRNUkg6tk/Mv1x7Pgkv8AJXUsQOAJLKuxoQNThNVwCjEP/0G0zXJ2lOnenSidxhJwrIO5JzBvXbWX1dWZaat7lm+7E7ZsCrW2H4N83GM0PwNdrkiQMeXpGldKssV4NJ59L26AXpo4WBeWKjZHTxlLgallr/Lb5Bw+tf0zzv4GtyXA79EzZoNN5SnCdswBvSQImhQXWKpFMNwwiPsamIbI0fRmdq6xr03OlchgFBPOtED8vOPKjc1par9bBSrpQe69n7eo/bNuMxk+m59FaVBVBFVFr+hHUSaXju/PB24MxXDo0t8qOlTlV7ZIwgTQqQFJdUFRqCmgDDeca2+dcU8Rv2weP+gyZmwULsKPgVOwRJrPxl8CP2PwwlFCDy2hI2U/QRwWmFoYmf+8E0WPmzMPKiIFyv/CWmWcECq2Xlpty6b1R6vW4v1yyVekx3p+UmU/Ukn2bIsdRkLjCby93PvbnjmoHcjTCNpWbBMCYNL1RH3KkQViLbSXH2vz3kMrNHgMuRf4Pp2c04TChlFP6zEZ/koymSLPXcbwPFKCPOR1MQ86tiHwNyNixHD4ibiJRtRutgMpkFw1lnNhzMZst1tz4u00Xr9Uq5Bq5WqQCnOz4b98c8kqCaOzzPV+/a/dbwaV54mkYavILepSIb4WDSlACL5Av8XvxN3Cx2JkIdJM977Aim5524umETTMBMxY0B9lGpGn9FZLV0QSWO4h6OgmgGE2oTR8PDTcd0p75n2+ipRdCJOlNYYO2slvMABljdImgqt9znaLYrTBAWSvnbbreb7TZl5XD+/PTwrFeqOKuV4/qmao1IykI4GmkSECDQVZTw2+IdWCY+zX+4TIBxzvHuv4f+c7RYsAkq7BR/JQVGLBDidJoCCVxAj0MaHIBBBJi+ZlgL0556thBBFLnk73kUOh3nZh5NoOfh/ar1UOsyRUzNWR6W0ZPcyKn37goJGjisvuln67WZExFnnZli0TKK+TOS5ldSrCLCXVp7cmp/A8ymuwHflbVoAAAAAElFTkSuQmCC\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "matter", + "air", + "particulate" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json new file mode 100644 index 0000000000..3b173cc6fe --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_pm2_5_chart_card", + "name": "Indoor PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine particulate matter (PM2.5) data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..48889b3d9b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_pm2_5_chart_card_with_background", + "name": "Indoor PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine particulate matter (PM2.5) data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json new file mode 100644 index 0000000000..6d7645447d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_simple_pm2_5_chart_card", + "name": "Indoor simple PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAflBMVEUAAADf39/g4ODf39/f39/g4OD////k5OSAwyzg4OAhISHv9+WQy0Z0dHSQkJA8PDzP6a/f8MpYWFjy8vLA4ZWv2Xug0mD3+/OIxzkvLy+enp6srKzHx8fV1dWCgoJKSkrn9NjH5aO6urq43Yio1m5mZmaYzlPX7L25ubmQyka17GyFAAAABnRSTlMAIL9AEN/GQiaNAAAEqElEQVR42uzPuQ2AMBAAsMtD0NUp2H9TxAaUSWRv4AAAAAAAAPivl831+LSa9+byahEln7G9mS3qHAeYNXIcIUUWI7IakZfduletGIbBMLx9gg9kgTTZzg8EAr3/K2ycdjgH2iFLcFq/YDAIDc+m3hqQ3hqQ3hqQ3hqQ3vonkFrx3aaqywxUnXGkGpDFVXCW2hTXuhNS84zvElPauUHpACZSYGtdc6CVvV9IxKsDiQDcoZYD0EzZOKO9Fidc7SZISKE3xxtkd6jnAuSFgqPKwJFQNQUudQtkdpokOl4hKSkL1JOj2nRCxBJa87qU7LjWHZBCnpI3iLtWQD04HT9Kc+jrTuBSd0Ain5LyBsGZOlwpDRLriq/mDag9QlDYJPEz5IOOBlnzNk2CMmFiETdc6h4IlEfySjOcLTtirfgwEWsVWAKS0QUXuwWCRCqe1G8QSBU8qX9yaz2oAemtAemtAemtAemtAemtAemt3iERfwESKZO2yNMhYtxL2WnybIjYl2A2i0dDPtk3tx1HYRiAvhkrDpdQIKH0AtNO2f3/H1yPgcxFYaesxA6Veh5Ca6LKR7FDWql7FYFwUPuHFjnnMJLnjywSva9DonYPLNKoI4CvrccT2R3H/F9T8KT5w4k0tVKpqNQxML62HkzkqM6/mrSO3nI/AONra/MiuybZRzCRpzt5gLzmKgYI1NZyEbLwPzjWikn8TtXIJT6fJRSorWUitnCIuiRvpfUFvueqQ/amQlcRBInq9MB5T5UTqwiCHNTpX0RIswar3Ka8+H0J30J4C0bdpcQKgpyGzPN6XJAYZjjJqkWnWtVxdLdIic4AFIgdCAXeJdJhFlpdQwD4+69P7706+EPJrEmdn9kiiVOV3CvisPQXhlC7GRHbGvBoJBDItMC0xo6FWmEX7vQxp52cD1/qGOY5xPlrspMOUnl0l4gtSzMkNjTGDTs9iWSI4xoBI63EIZlupH4QOW2OUsb3hg+gSusCQrxMe+wxVWmtzhHcxb5OXxZsv4SYDRWjISQio6s0jiKlTOeQxDTfcsghSxbghjZcL77rmzhuFpzwzwtEStRj51NIREwry/NGES3JssIQuwKQ49HgzRiHMy2y+nd2ybUffAoIicjrVkpKRMwwBXm6v3XFCuCCiK6baZH1RTrOaMhc27AIDw68CAv3n0RIYhWP1Pd25ulwWF2kHz2IO94YwzVi6KtIib/fRSxqCIp4gi2ytkg77bcZeoqvIpePK5JhuVgkzdcWIT1l0FeCQ1dlowgFe6RCs1QkUc3KIqSlMTyfe+QCYDUij07yvL6JEGpYKJKoBFYWuSE6LbQBEeQF4nHYELS8NhwvlomIx9oiGidMQESz5tW3CroLT2N3WiQiHquLkMf6iPUi1hhriaZTle0RW8Lq00y57y8BYvZYXSSMFwEPdSA9oqHNWliAeGxI5Ia6KCoppmWc2GNLIqTRHz+Wiezhp0Uoy+ADpuuybfxD9sd/RXmKPEU2zlNkazxFtsZTZGs8RbbGn3bumAYAEAaAYKBhqAL8OwUJjKW5c/AGXkg1QqrJPsudyAYlO8fdUq3/t1QzOo3CAAAAAAAAnhxh9Pec6lVI3gAAAABJRU5ErkJggg==", + "description": "Displays historical indoor fine particulate matter (PM2.5) values as a simplified chart. Optionally may display the corresponding latest indoor PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..1df0e07e01 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_simple_pm2_5_chart_card_with_background", + "name": "Indoor simple PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACplBMVEUAAAAJCQkfHx/5+fnm5eTr6+u+vb7m5ub09PRta2uvrK3FxcXg4OBJRkfs7OxeW1v19fU2MTN/fX3w8PD4+Pjv7++bmJqOjI7u7u729vbf39/8/Pympqbw8PDx8fHq6ur4+Pjo6Ojm5ub+/v7////5+fn8/Pz5+Pj+/v77+/v6+vr29vb19PTV1NTU09TX1dX49/fT0tN8wyLY1tba2NnS0dLd29vt7Ozv7u7d3N3Y19fu7e3x8PDr6urZ2NjR0NHz8vLy8fHb2trz8/Pl5OXw7+/r6+vo5+fh4N/c2trq6ejn5ebj4+MhICDb2dnZ19fh4eHs6+vRz8/f3d7f3dzp6eng39/i4uLp6OhZV1jn5eTl4+Pk4uLg3+Dg3t+Pjo5xbW7g391pZWZKRkd7d3jo5uZHQ0SMyj2qqqrNysvGw8SCfn94dHU8PDzDwMHBvb6loaKWkpNRTk5DQEDx8O/JxseOiosvLi7o6OhNSUqppaahnZ6EgIGTj5CJhYaSx05PS0zGxcZ/fHx9enpuamvj4eGyr6+r13N2cXJzcHBdWVpVUVLj4eCvq6xzc3OdnJyLiImGg4RmYmTZ19bHz7ual5g8OTqHxTiBxC0dHR3X1NWpzHxrZ2hjX2BUT1BAPD05Njc0MDHPzM0sKirs9eDLyMm/u7u4tbacyWRKSkrO0cdgXF28uLmyzJCBgYFmZmVYVFW5t7i3s7OsqKk2MzS0srLG4qKExy/J0b3A0am8zaWdmZqc0Frq8t7d7sfD0rC+z6Z0dHQmIiPz9+7Pzs+YlZay1IWtzoO84I+915plYWKVzE7W28/P18PC3KC305KjynCNxkMqJyfJ1reWx1jR1cvU6rfM5qm4zpy0zpK03ICIxzkdHBzx7/CWyViCxS3b48+324qpD7GhAAAAJnRSTlMABgUg/jonO+8nJyY7J+8n7ycnIe/vJyfv70M/FxHv4N/BwcC/K4+A30cAAB0RSURBVHja7JMxTgMxEEVXQpwgdFEkJMDGYxfuEikpNtoGKCJBC2egglvABTgGnIe78Gc8ibWiYLFSztPMeNbZlf6Px51hGIZhGIZhGIZhGIZhGIZhGMZ0FidtzBo+aX9tNuNAotQXZGPRMfPLa8VNJCA4faCADikFQeSDJ3fY8bx6TxRI4Lbi6ypFmwbO5113wgb+sqHKSTQyVMyUlnGQgJY8wpXdvajsi22iMb6Ix1KR3QbOrrqLCQdRlCJUtHPZVSNgr1wKAjg4ouxjzkOW7d+MZZPSZuS0cxNgbVCtoa70ocwNVj4LrzpQAj+m1CecSFJ3Kl5e0rOoHH7+L3m6kQBQyz/vkJCNXqWJKGblvarLpQ79qo8xU+KXZQtJgpoYG9HSwFQj4kVHRzURaUA1k3KO0is5xmG9XN5tYlLxQT8AjRPUbiRUiBOg8PXFx1EVi+phkyIW2CmbOW3XT7cfu93Nd456QqPbPB6r2hzXiNyCUGRLDc7LRSBBR4jJEA/5cTv0A5p+OWCW4Khf3789PH9+vb8+vqSiXzLsBwypaKsOj2okcI5RV0iPfjQe6Yc1s+txIYziuIsKl259gfE2qHS007fV2RqtMtrS0GlXpZFKkRLSpAk3SEgkmyKbSIgLISF7Y0O4ciXhC7jmu/if85zp0zFKqf/udmZrzc7P75znZRTNYhG9ABKz0E653wvFQiG7unbx0qt3Hz++6rYcxo5Lj0l7hVtG8r9Adv4mhrzwTxnRSOWxI5gZZuuVUqmUzzom3bihIldRXxKDP/UPBAd+9/cfRsARB8h8GIjBFxYMfbEwBYoKGEUHHPlSr1eqpBwzDhKFslOhyK8KXicEmkJz/SFc3PjaTiBSRgLyJytI9PrEQRBMUXCGdipfKfVarV4llStiUKCaDCnho3ynYbQR0SGAM+QQL4PElRFpgT/Y0HWAhI3sYg5mKDi5oZ2tA6PVisUIZFgw0f08VBjh+pEK0wRaztQPRqOx8cUgQWnt4jb+g4lQAUd80MhbyLl2Nptiilh7ZaUda5XyKTsHEkHRf3uqSHVJydsiTt6c1S/CDQwxMlkGRW498r1WH+oQ5aPouGQCHd5qr6yWkbttAsm6Q6fAY7KQBDCBa5yHjYSEzGwTAVdzL/XI7iCRtp7UpuaKCBcfxGHXyUSMKLqNdLrRXW23Kvl6KpW13ZzUF0gkk+vrOhEobSakaYYRmcsiINNtEPoFYYiwD3CYjp0XFZ1GOnn0aDLdLZORfL0OGHvoFNlJiEPO9F1pFaE/iPTHFHscFMg2AcG9CIi+eLgwwyNlpD+II7ZCFI0kMJBko7wSw/hLAYoLJ1xcEt0KUSNy/LURfSI9QiRiZAdHF2zYiE6kR4QDdZXN99qrqChQnDhxgjiSqK0VjFuUUjOfHUIJQFTkenMbiSrRRhAGAYaARK+gyURHxIjUFThWyl0qqROWZTEIkZTvYuhCWq1m3S4IiMDIpRY1AhuoWSqtHUHkSjPGjAiEHq+Eo0EyrOraWvUEYZAToICFBuJS3i7QFD+JoCxsBBjYhP4EEp7twr8nyiQccbNg15kDOqpriURCQOg13eiUiSVWqtsOmkRHsyxoJE5rbQ0SFyOagQ79viF5Ox6P39TwznifgYzHrnH2jT8+xTuR1KNnGxv3SUg1sX8/QJjDomZJkpTVNmZ426HJJAhIGEVbXsAIQiDxKSNhCX2vH7x5zjt3bsN7a3zyfHx32/POGoP1/vqoQgNW/eV1gPDNw4iAWNVq1QIJnEBIPuU6tMzH7+QXImGUhY0gU0ag52cjOeFAGAQvvm98GoxcCBl5Z297B3e/9l5gwZ6qPLnXSSdZQxU5QSAn0CxrIEmqibGetYc5xykgzMNVJk4W7BGOgFCdaSNEUXvg+cwhYAyyARB/9MAwRm+8s9QfN7zlQs6un3yysfHwpCJBRXGLoO0TVQYpMwjmd9sdDnO5HJmhyqYAZHEjk9IiDESPSvt8b1A7561rNID0+2PvAUDO+UZ/cNs7C4704CFWWKn8lQvjO19vJZmEwkST0irLUgUBDGhkvSIgGmNxI0yyRzCRB57HJPpqAPH9cd8AiOvdxhmBnBrcVzvBXrvcePjt5DSJTCg465Zphq/kEWghL1MgukkWN0KX5MlRG3FHTPJgCl9REYjhj71a3zu9O7V+Xra0V26U09e+fT6qQFBaiDrS+MvLYFqrCIms6+MRkEWMCAgJiQumKAGJO21Eg7z1/F0Esj76cOVqdXjzbfPDk4eX/Pdy+2rYRXgaaXS6NCnS1qRJ9RUYQQiGayuSvzRiqrUW2eDamv5X+EQkNcFntIE6vtkw7PX+rteD06cGyOMvw+ePSrHLL5/cupRUGFbVEhRwdDudLkIkcCJGsBIumgihgGQGxV8bIaI4Mm2EDHjj6DOByBadSitfamPRK+tFq4oARY1dDRjpdBogWaHqEhKXx2GHxmFNEs1f9whCpzvCO79aXwvRkS1ICITXiwJCHGsJxUIk2F9RumUshIWEURDUGNRoktmZ2wjfkRiJdF3oIyREQFKVFoPImMurrTWkKlYQkKC4mAQNzyzZFMUe0pJ41/wks4yYDKK6REatsMAZRnYLCG3U65XY3bLisCzGkKxBi3hhJe0YOr5E26xJ6lm3sOfvlIRvKgxCTrCrmNuIgIDdLOZoZ4gWQaeLjv2SKRRZAzMKtJQwgKnkeb9F/6H1z2GMPebWzZt4TDfnMxLtdZcrCxw0XCUUhiYJeqXRJZJVbE1knwU1sge2SYnx7yEKBCDBkB4xEhIygyNHW9xyV3XHNMbevUQCDAZJNwiFWQimraYVCrYp/wdky6Y4ywHJ3EYAIhxYwTdjqx10x5Lo2BtwgCShx2GQyNwYiOmBpBmALFBagBAQ9oH6+k2PhDGYg5+P5mwqrG562apmwCEmOAyS4ZELJHogBg1IAELVhUEs5erSWhyEJ5KIkUj0FEJt7uRceuKO9SL2UKBIaBM4ihKLIvO8SqNzGm3PfX+MHq7kiouDSI8Iycx5JBzlw4SNLJ6492K1RtLKMARzaJB91CWZjMzzyPLRo/hMpjs0gB1vHwZJs551zPj/M8Is8xnRHMDAo0U0CDbq063Bp+DYt49PE0imurS0ZCk7yxOS2OFj/EhCrxwXNWKi1TGVhI3M4pAHcuBo9vBoERxLCe4MssK3j+NTOqFzISMYkkM4IKHqgpLDx5pHsg5Ka1a32+f80cjvz2sEILze+rORXWrk5RUWlRVNIMtLGdy3MiIentLxAEXhiCVWo0hOl2vHqbTomcTs9dbZgee/ebPuDc7OZcSkwZcSFTFbCPa3xHEqvYwGIZCnqq7EAmHo8HtPCSWzFICcOQ4hx0p4KEEkvwYZDG7ToT/y5wVRKHrXPJMCPhiE5o/W8drpdNJayiSYRDAowDh46NChgxKQMB+DWABJp0/XmAMkTXJi/pKk770Ntnlv5yotOmojv2sPmdF5Qi8dvgshGHkzTCIUggEOhCCAQVEkELK8zN1+hjgOI5MROAriT0RAyTxGgMFSflBurk9RlXEc703Tm6Z3zfSqlzVUC+0DewMWFXaRYJlAZtllapWokZaAoRyEbhBZkDhmNeCyYUgKBTiojRMgKdBgoampY166TJf/pO/ve56zZw/rIn5h8ewFfD77/V2e5zln7+OIxQFD0AhD4HAjsiCQkMOyY8cODQK5NAgMKRAMXx05ABIKhQI473vvGbC3epd5eLLLu7nya5Dcc7VpTw929K3IEEx5JbBK0QpFBHFSmkNIwCEiD0AksMgRi4RQeWFISA6iWUC+q+4zD/tweF8QK0c2nF5BYgcx5FKAQKQecVVitsK0/GZ+2DlwJIaU0JA6JAg4CAIJyD1D69Mu67jrZFaQMlx3ge8UCL5NLzacmcjGoh+DiFT4XihhC6eYGJSRIemRZSBZIBURcAhIiI5U6hzJ0a3j1CmjcUyfskHdP0cIwRzJ3kJyTBDhiFa9FKlAXJXkm4lhvu9moWKmaw7eE0tSIDFxhIEVEZCwAaItma6ebuO2R6z6UHoB69tM1aIsRzYyBCvbaODlmp0+xBU4mMgcrCkNQhMojeW0cmRnDcb/UqimpkIOthsgjC3u/3Pn3+ucrq6xJ352kLIyI0e0TJCsHPpcYZVZrvIknjhUM7spkhAjA0RbsrOiBhT1dWyLx1o/2tfP3i4kbQ2sUthU6wKRpYa2+4fW5kHYQCqrQvW+UqQ5DeEbDw6CmEluhBKUAjGznX0dKJDPKF+7ksfHj1d/qJOkD4aI+nYdshVc9MTYBiDPbgQysWodp3cQ//ZQha+UHALCoVqGmLYIB0HSurs0dqLAFrkJyGTyrdJKT0/1XsOSU1neeMTWSX0Q895jFyVraK1enFeqeWDC5Jhobv5D7/54KqsidTJTJIjTBvJbYkYo6IDFsdirRnqHjI4oKBSiTCYqR47HsSjxHuhilsSQ5lmEvInBqQYE3bQt6LiWskDKbCATzcAAyuVVDYL7A6mmHg1U+JAhIFnXAIfUDTrElIAMO4bUyPUp1YvYAglQOBOAOaW+ilBg9yBmKf6ijup2ORd3EgmenUTqWdeu1w+12TIfwzJBpGxtLUsHGVDzS089dVGpOQMERwShJ97aqshO1F4N4rIMWVOzTvYUsxUyW2ZWhpxOlZDg0iT5BHHXRQIlyV0BdBJP5HDb98+X/1D96QYLrBqce0XmsBZMx9KvPBOQJwFSluHIvBow/6FBsAcg5pacJxyQLCHJzPKicFy4ICQJtYDShGo2tLIsHMuLiDRBGe1Vay5NYjpS4KuPBN5Jfg9HsJWSf7gaOl20uaXioa42p3ksKykY8fi9cmR1YGBJ/m1Wf9CQy2quGSAkmVMKFTiyppSk++iIUolZpRYFZFH1OvJLlMKw8ejQLJ5T1wVkqDeRGIVL2hKqhCCtyaqAXpR0fPhZ+6YXvTVt02nJDh+2ZYJQ2gh1RxJkTjU/Y4I8KyDl3YGflUKajCqkcUIBRGJrSs06CkvxEB9L4CmgzG6ZGZpxOm+oGZZgWpLK9cBbb2ES3F2Ja7qKJbj1NV2bUTAFIvG0NQiQMpHcs72QmdKcw4qlJnIIAhMJgjkjQEoLF5Tqncl1TgnIFomsmTwBSdzKdeGx35D9I/i5qG6srIwoVzoIuwmKVvJHrq0EhKdLNMmDSDCwMyWO4Mx3Jghz/XYONKAu5tARVgcB8ZSHAeIu+V2pZST3CkCkyqqpXEdhAUIr3+GcxVMu1GPVu8V1XcGlNZeOLbO/yyy4P/l61fbuSj8vTcPZnzJj+f5AJDhjtG1bcXF2R+YUAKA7qnmVIMgpwBOk1gAZVSOydwKQFYxxSt3FOAtTIEMYOsoumuPC3bszTpYygujmjg2Ivck45sHRcK2QCMrWBybJKRYFg48//BD8KJObPUdug0Ma+nlk/NLS0rw6t3Qe7MUA8dRqR6ZUQtZUZwHicNxSCS4DAZJnA3GlujxBYIisSWKYb0UGx7kDEdYnSRFfiC59QeqmKKCgiI4AgtdV2BzByAc4w7qjUvoP4N5flfKHK6MEua5G8iGAnM3L/x2RJbFjgTgtEAdJ5EAM8YkbmMLHk0cCELJESGgKLSFJloGv5zAcMUAQmmCxOYIEPwcM6PY5al7Nn5uTi2EB8i8WRZLszBHEloAUlvSqsw4hAQhGbYEwNcwdFq6usPnACXx8fDwuIEwTktASIWF45aynoNY/gIAsRqQ8/iiSHQVDbjYOJAZBtJAjOKmDE38AGQgEXvlTqtatEdWLZe7fAnJVJUry5F0nSJoj5KDIQUNi4AjFx4+3cyMFBThsRheyRJMYKPZxU/b7BIEAwsCCJWkgl5Wab6aW1oHUAkRdvvyPYh9BW0ygWQCk5JoalZUWQYBjgTCgzH16ZAhnvciPwt3Jdu4IMd15VYRhiXURlDVsgUpJ7lpcsCMVWkjirfgLFmmzMrX0NGSA4AKzotowQODGyN8EcYwqHF8XkBvqagFnxBaIywBhRBnKpyGS6jWOPcnhAFUlHADRJFJ2hAQiCockIFmEUgeU4BOPPrSNlRgsFsiE6Lxo9WlDOCJI9JJSV5aXr1y5epUz+YWzN6+g/N68qnpl89SBRxZmMPaZhQUnQGaGhrg1Z3LQEIDU5+5J/sSEDwlIVFAkutgZ2dXIQhQOKbuM6ut9QqoW7BAWWyRmfCxFr3MB4i4owBwD56jyFtbyMRs/p/5037x2s1QcWbfhaO78AoIcXLSLGpJv4qdUL24NdQtMlCxeQWFnMyLM7gbu2sQcAYcGQd7jxo+EpYPojx6tB8HqUISh3VCJ0TUk1BoX8TIfZkpDmSBQIUFA4t7/V08BBCpucpmS626M3gjpvOfQNyAJFgMDII8SBBKQdBkcvJTAAHkOIOEAQApTp9YWEgr65xp3sxlqDi29rDJJaEehtc5t7CnEX5FIk33gECVhFjDaPOX1SuZz8mXnsMOAQzsiEEx9G4f18RyS6L05//Yrl65hCA4KTWH552uXXgkBpJQckIMiB5UCIQdI8AVo429IZPrqY7GKilisXrok4oxXeZT7/eW1/MSGhBeUAuGdNAlHsEhAxEXmiB0EIghJ9NlP7F3LMpejwOC4zENohGrq3HhQRi8o5NHbQASR12oOMOCLHLls9MwaU3VwR4pYOCoK47oIXlHPCqaVQeL1Smh5EFoMRzElmyMAEQ5+zKW2O1SvT34y5N2+WCQihpAj48wCp7waRHNA4EB9IzMf1mKrtFJmO2oArxbWwW3h2GKLgVVU9BhAjMDyBnMycoQkFA3Br8jqkG+/DpVSaQoSWJkcliE6QxhTqHYQs8zcVyk0ZZwCYq5QXDx6i40WCWkS+zi9IoJIMwRGkDmSYYkmoSFBVGwEV40khAwMHIwLvYCn7NtZeglCaslzgIACYrkQDsMfOixhhg1VpEoNaDQKVl1sklY9zgCRwkAQ6She/MgEoSXkoCHFkLd2uwQXF6uU2417KQ5deClAmG86zSMIMWTcgmEEFg2CpO2/IP2yDi4DBZI6Fi5Hb4FYj5/PBCGHR0ILYuVeh5FmiV5OstsUhWkJl3n8KjU5rNOIrFSpZk4GVl0O2hi1YUeKzgThC9n8xZaILsksZCxidpJn8C2XsGHNChAaIpbYUNeDlIlxMpsJ1spOI/dwGVZuFl5iWCRm1JibvXyhm0O2rvTQFYsPM7Z0OeDDdVKNKwyYAJs/qhhPCVlZws/bouuUewDyyEMMfWF5NtMSgpiWQJgkBz3RUJ1bkoNBYCaIRaGDn47pt5eyRuxIvYSEGpDe4YhlgaZwGVmBm7CAptvPCz5YtvgNPecBBQRHgkFmiLdo29NZYovJLiR0pCiM7XieHaivRxurS/UVA4RjZGGGCIuX4XU7gSzVTnPoJRYJ+YQGEVIhMX4TF0XhNyVjGGTRWm0JUPQAveXlAPEztMDBYuwtZu+xSXYcOIdDSPk9UflYYWXId2Ey7sDJtMI8vOF5uTvinX1QS3tLSztunZ2dkztwpu3LPKcjP/9LJgqqs8vpODbZ2dfZ2dLS0teHl7V0xnNdAHc6d+CJTnkqHo+397W39MWxdem8gC1lF/7Gljj+M2zzO9xOR0HACxJLZR6PHyD+lCPSU6Q/+lEC8IQs1solhbrDkUDI9zGsdbsmOyf7h7879uKxeH9rw2tnOj7b2z/87Tf9HW/ubWwYHDtw4sCeox98cPqX13re/7B1+My7Z/oPdhw82DF86Ex/x/Dw3tb9je+1Nn710ZETY2OD+1ubGt84PdbUuu+1fW/s++ynpgO7Pxg7enTPqyeaDn/99e6xwY8G9/Y0NX3ReOKLpl0N47/se/+Ttxt6Pm/c//nBuNvjxXZUuNwPIaQAIj81SBE4cANJERD/Z998XtMGwzi+eSh0o8h6WGEMxnYfY6yrG+IOQ+pG3So6W2RshiQENJn5han5JZIEiYpMBYUVf0v1oAdr7ak3oZcd+xftSbRzo2ynwS799vV93rzvG/N8fN4nkfLq2vZZIDDP592BJy2spN1PgcNYgi4yye7m427ijEoXJZU9kSeDwYmqNQgOEzGx1hILFQQps/K5zEh9ungqSQNGKjLyWSmKK6aRI9FcBSVNw4xEkHSunkNwihRYlSWmNb7d7h3wtV6ng6HfCaxSR4xGA+UihXpB5HAl1xorJT1iyN3ANnzeYXA/bJO4LM1zxO0CDACBYoVkG4hT225X+AUMe1Lelzs+//6WP/A42J/Q8V34XcjjuFRWiqdZdvJVOpFVpBBpFnhCxDieR01TkCRZAvfjsTgty6dZ5oT5yiq6jlCoQaKNBp6r5OrfG7k0Ce6Rgppmqnr7oJ3BerNe6+Ib0W5RCJFBh0OuEMljmVakiREG0mgVkBI1FqN0KAxuwQ3MswiJjWKDAIVN4rJAtt0ea3lZ4YP4wL4AX8Ab8Ho3D4HjXD4+3Hq59ewwecKWs8d9iVFKghJpt0RiTPCtpogV8GhVHoyytDQ5jo+yI0mm+1ngKCtlo2Hk6jipoBpCUcawYuo6xEIpaWwUzTdFvgYcF53OtFVr8yIvonUxk89wPBbJ8ERebyBYQ6MKWITthsKeMMhjB8T1UwDishjmKBaTB6IBOFYW+cLhkD8U8u692U0m+kWhOgnCnsT3T4+KgsLQ8ZOoqcPqrhGYtbCIL0SeKjHSYDJIJI9OJwk6m6BHNH0KC0sT0kgOQQwTsqRuVKhGxVCjZS2qKoLAyqrG8dM20TvoTWfvLmqdFt9po2gGw5qNcZ2kWsRQxU0xz2qZlsG8h6/H+75wChZX2M5mKxxzEFhLgGcHw+d2g/+ABFXYn/IDSSq07/N6A09jwUGxmo1t7W6+PExIrMKMaIapCob1qREAUsgQYkU5k4qTfjIYTAJDfDRI9EejU0ZO45qJ4ppWoTSqAZlRMUwEgqOny+kqy1bPSBTr8CJ2MOu8682I6XR6wEOeZDCuma+QeBMz5TIufseROlpOvv34yudNpSAm82XltjnsZH/kcofDsJaALwUpDgZIXri8Yc+Oz+vxvt7z7vhhw8ZmN0iPYrEne6Fnz+MJeRQ7KrLpKGkUMliTF7nMOFNABLnYp0fBbiwRj9E0PegnihOZLeNlHMENvGSYpElRkCz1conUcIZUpWz1TGJRsp7neI7otGedi2ntYMrzYrNSyXDNQoakkAJaQisEqqPR8+ybV/5nqTBofsdyLbRtPdnvgXW7rQEgsIehwLHHA9/XUhAN72YAQD7sxoJH3d2nu8+eP34eTNLB+LEqCBqex7AhUathXB5RotKE7h4Fg10aqlGchgwBWkVQy5pO4rips1pOMXWF1NM4opRUVaiq5+e4Xk4jTbHA8Z3OrDfrYEAyzozzXJ7jhhUuP8RZMg+3Q/wsDpsJ3/hTkBy/pPkC5PYNx70H2xCUbTt3IBgAYgVu/qDZDOz7UqE31naLl0HY/fpp6/N7AIkfHQVjCbkqq+ZwjLX4GtGoU6QsnQ4GQeA4TCYtisTgpMiwVTVNamlSMU1cF3AqrZBfhRIulNNpBtKd0pCcTjbQ/Dgi1madWmcKa6rWIrgKx6HjCMKJBYOEqwxRRM0+/7QXTsG/XOzMAO9tGKtyP7x344bDcfP+yu3bKysr8AJ7e3Fg21srS926dcs2oLt3rXpjfWN9dW1t7Q7I6Vxd3bh7d8MemE8BbWysg1ZtOWHKXOvwB922ddrda5buzHX5hnfWnGtQ4LW67nSuOZ0bG5feWP4tvJw7fN/hABAg+YMcCwPlD8P/Xo6rhw678ddzgAPksLTogIbdhup3/5e9YH6+97Jv0bFsX4465lOuemp3LltLs7ykXZbXuayh67dLgQBjyQKHS3NjUaC6Iui7cgJUi/nL0T+dfDl92bWcuxxZ1gtHfx1cuAZHduu/yLE0Nve1rnWta13rWj/ag0MCAAAAAEH/X3vCCAAAAAC3AMdwIZO9zUzjAAAAAElFTkSuQmCC", + "description": "Displays historical indoor fine particulate matter (PM2.5) values as a simplified chart with background. Optionally may display the corresponding latest indoor PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file From 6ba5266ca3c7c5856fa4b619560f8a08844fdee4 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 13:47:53 +0300 Subject: [PATCH 23/39] UI: Indoor Environment: PM10 widgets. --- .../widget_bundles/indoor_environment.json | 10 +++++- .../indoor_horizontal_pm10_card.json | 31 +++++++++++++++++ ..._horizontal_pm10_card_with_background.json | 31 +++++++++++++++++ .../system/widget_types/indoor_pm10_card.json | 31 +++++++++++++++++ .../indoor_pm10_card_with_background.json | 31 +++++++++++++++++ .../widget_types/indoor_pm10_chart_card.json | 34 +++++++++++++++++++ ...ndoor_pm10_chart_card_with_background.json | 34 +++++++++++++++++++ .../indoor_simple_pm10_chart_card.json | 34 +++++++++++++++++++ ...imple_pm10_chart_card_with_background.json | 34 +++++++++++++++++++ 9 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm10_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 1e8712e0f6..1377fd8de6 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -61,6 +61,14 @@ "indoor_pm2_5_chart_card", "indoor_pm2_5_chart_card_with_background", "indoor_simple_pm2_5_chart_card", - "indoor_simple_pm2_5_chart_card_with_background" + "indoor_simple_pm2_5_chart_card_with_background", + "indoor_pm10_card", + "indoor_pm10_card_with_background", + "indoor_horizontal_pm10_card", + "indoor_horizontal_pm10_card_with_background", + "indoor_pm10_chart_card", + "indoor_pm10_chart_card_with_background", + "indoor_simple_pm10_chart_card", + "indoor_simple_pm10_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json new file mode 100644 index 0000000000..6eecda0f21 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_horizontal_pm10_card", + "name": "Indoor horizontal PM10 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEUAAADf39/f39/g4ODg4ODf39/////k5OT/pgDg4OD/9N//6b//3p//sSD/vED/04D/+u//x1/Ozs7IyMjz8/P5+fm2trbCwsJYWFja2trV1dW8vLz/zW/n5+etra3/2JCQkJD/tzD/qxD/46//78//wk87Ozv19fX/+e/t7e16enpmZmZKSkrx8fGenp7b29v/tjD9/f3Pz8+dnZ3/2Y/zJp/4AAAABnRSTlMAIEDfv1C6kOEmAAADdElEQVR42u3aCVPaQBjGcVvtw8tmNyEHVxIIp/W21/f/bN3dRGkR044MHaTPb0bmdcOM/F1iZOCMiIiIiIiIiIiIiIiIiIiIiIiIiIiI6F/68O75jI/nnfeue/7JdnQ+49373Pl4dpHhBHy+OOviFHztnkgIGHJsGHJsGHJsGHJs/ouQnkJtOpt1MC2A/AFIc7fQwZFpCenNTQ/e6CG9zEeXwM0dbkYzFLf5Hfay0l4PnhtaqZd36Omlag/ZdEiEJiTF7WB0m3ZczHSG2QPu9tuSSLwATuWGVrHBlqUYs1i9CGnvwOhuNMJodjOdNiFTjPYLWUukLQVLmT+GLOIXIRGURH8KqUq96fA74m9uL+/rkO8PuLzHPkJReBLL4jlEKX9u9mAFS4V60hK4Rb8CpQM4ZWhUa0ig642PsB3y/QZ1yP3d7Q32YgQ91LRE5ilEifHPu9iOcxGJJfT7Z1cDmbuVyD02f+5WsQQtIUEoErmSL2hzj/3IYi4SKv/EMtgVEstcV8aHKIldiJTL0kZUSyMRqhKQ+PWQShxfEuBwrkTWkfG/2VhWu0KUiM1c+hAtKxviRyPafb+2X2Yhy9dDAnku0Tig3grAXCqsJMauEP+4m9vwy2Z099RuVJXutf35DZ9LFA4tktI2RFovpAy2QvQmRIneEeK1nSPyVHJIK72qQ5Q0wq2QpTxvQyTqDSGIpBZgI8MO2fX2Qoa/1DyUueirwDFSrZoQ8adNjKuFqOZ+JsRbQlCKY4CNQR2T4XoMr99Hv5u4hS76ACbTCfrjcX2g35S3uDKyjsLmh/x2joiJSrEhKN20kNAW6DeFNHuit0LyPBmnaWKnIYbjYdEfDJM8T5Pi+lvRB5JJVhRjZN/8gSQt0E6tRSRUO0IWsghdCEo7u+tILL03hkDFImo7JBlkaTJJ6pBJ/mhnuzYZJ8PUh3THYxuSDiZpZnOHGdr5K/ULSsxm3U5a1jDxHv/9qgC/miaPw2SQp8PM7UhSjIeDbJAmdu26mKQJXEjf7cikmLoD+XCIN/AhaFRrhcCIPugLq/EEr8vTR1j7hvwQJ8ZBQ/r9toPZHlf8qNpERXEZ8KXu+8WQY8OQY8OQY2NDvuIUdM8uTuBtdiC7OJ0PDJx9Ou923rvzj6f0oRoiIiIiIiIiIiIiIiIiIiIiIiIiIiKif+Qnt477Z3V+66gAAAAASUVORK5CYII=", + "description": "Displays a latest indoor fine and coarse particulate matter (PM10) telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json new file mode 100644 index 0000000000..d1ba92cdba --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_horizontal_pm10_card_with_background", + "name": "Indoor horizontal PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAADAFBMVEUAAACcmpptaGHT0dCxsLA3NzWCfnvk5OKRjInCwsRQTkxpaF8sKy5uZFsxMDYpKSlVXVnz8/P09PTx8fH4ng3t7e7z8vLn5+fg4ODv7/Df397u7+/i4uHj4+P29vbi4eDl5ebb2trd3d3r6+zm5ufs7O3q6erl5OTc3Nv4+Pjh4ePo6enp6OfY2NfV1dTR0dHPzs7d3t/X1tXQ0M/W1tfn5uXk5ObY1tXi4uTf3+DT09Ha2tjV1NLy8fDZ2dnq6uvT09TNzc02Njapqan3s0bj5OPc3N3U1NUxMTGIiInj4+WgoJ9+fn25ubnn5+nDw8QuLS23tretra2aj4qEhYWAgYCvr69OTU73qCnm6OXLy8yMjIwpKSk9Pj0rKyvl5ujIycpaWlpGRUW/v8CioqOek49tbG1oaWn13rqmpqbg4OKenp2VlpaMfnZBQkHz59W0tLW1s7Kgl5OOjo9mZFzHxsaZmpqQgnp4dG5VVlVUUlLX1dT00px7fHt3eXd2dHVwcXBiYmJMSkc7OjrY2Nmal5SRkpKTj4v2yYBfX17z7eSxsbKmpKCXmJmcmpaUiYRlZmfLysjx2raQhYCGgXzsv3eAcGZHQTi7u7yysrmsrrWqp6RZYF5aVEs7PUbY2t3e3NunqrH3v2Q+OjP269jFxci4uL/11J2dnJqLjpd5al90ZllhXFVOUlP2rTamnZiVk5SYk5BxcnSIeXBdWVJHT0v4qSqlpK2LioP2w3GDdGxxbmbk5+HP0Na7vsSho6mwqaaQk572zY70vGFERlhqZVdWQDM4Mi2/wMSyt7/02KucnKWpo5yimpZ+e3d+d3NPWG92cGpqZmNlX1ZmWkxfSz3p7ejz4seWmaOVk45/ho5wfYlxaWJvX1EzMTbp1K61r6tkcIiGenVbYWtQVWD2uFRXUEc2NUHv5NK6wsuaoq95fIL3oxvo3srBvbvxz5nzx4Bud39baHpmUkP28ejr5dzAydJFSmNHNSyqscA9QVH4oxvc19DszJPsumjmxpBNzorMAAAAEXRSTlMAICAgICAgICAgIERE1d+/v9FRpIkAABi6SURBVHja7MGBAAAAAICg/akXqQIAAAAAAAAAmD36aWkbjOMAbmIamyIOfBde5jvY4ckloUrTzjWwpcGmo0VwpbJSbUC3RBiUIngoy5qZjhIqq0thupSOFTo8FC0FoX8ORVoRGR260y6CO+3JOuc72CkfwsOTfH/h4ctjs9lsNpvNZrPZbP+Tw+X68zhQ3IWiTgxxohjhxHECQwiCQDAEwxwOF5ywWDv0Fo6i8A23kr/xaEUdd4gJAo7ASefEBDqOwxC3/kRwBHEiCHaHGIcL/IhDMIEZ8Q9G3E5Z+ehka7X28OQxy+TU2dmvXK5cLgXjG61W9ZX/sPczXzt9ROcbV9eXtV4l38iygWBbFAUBMLqiaPF6t26p1uuaoQWjUUEHosxQFA9YCoDNYFSgOJ6neAYwm8v3Zw3jZK2dImemV8+H+lH/y+D1RYaml5bcCbfX7/OlvfPz3pVY6EHI516mF2iaXij2mpXKbijkWSwsFgqeUOxNmiT93hj5dv/zRetDx4ynkkkpfPBCKpXY78zUJOzBcTwllC3B9obZNRJqsXmqHheLvezNzbvry2YeFkmykUhSFMQAkHVF63SVI13r1DOGacbjhiCLiiKLsEiAAjyTlAJRFnCA5/lolGKkdkYxqrCJe2b62flQ0euDvdWH+x8TpI98Snr9K+lYeiWW9vm9s2TiOb2+Pje3QG81K2r22OMpPF6ECruqWlHzapZ0v8982ht0tWFbCkrS9o+D7W9sLgd4bnLsHsdxoFza2SmxQurEbK1t5YuHvUbtsPl1VOSq0aipbDISfhJhJVaARcxOR9OtKtW+1m9Xq4qcModrsrDJwCIcBQuxMsNTDAMvhwKpiBgQw+GXKavIb47poDVtMA4DeL/BYIce9xXqVzBeFCONWVTQJhjnlLAupMtLiUJiTCAjZB3CxjRZchBJmF1kRSwKMuMOq8rKwLUFKd2lg4JeCzvv7Z5v8Ps/z3/qOE3n9+3z8zcMk+ZwBl45aRjpdBqPRPAQoxGomMrFYvyPwPLm8103n83ms3m3ZbbbXnsYnGia8Pn+6t53xnJJrskpIlaisShGUY+2YCEYwp7atl3JVCXhor+yuofdhdddBeZi8xVCPG8S9PqEhMp0ha6CggLAxWDQ7Mxm0ASWY0FRl+8df1bNsCzGqhiUkCqUUBTCFiisUWrQOkxde/L45Zc7pel/ePpxenCQTHDJCINzSQOHCqYYj+zu5whR4o+0owD24T1z89ARhpS8OzFNzxquciL/+vjq7MwHP0WUzxE5VC6XVWQPZgvbo9j6acWmbb06kMDgz8ZCgW0tru1eYG7Wf9fD+WTd7vX5Wq0E50UD8m4JABiNdUCy0U5BcQRfGU3ffe/oPIlkymRURdRClHx4EYRkMUSHEyg39Drd394+fuUozZvbc8jgEq0WB3dvJAycKRZfxD8VIwSaEon9eBxPmx50PEBCOzuhcDjrzr2JNfx2nTp5O7q5vPwlEESM57XDmCTWSOw/5J/uPX/+ZNPaJ4110W3F0d7R517v8z9zZkfy0v0NDd0JJ/fO37tv7969+0Jywryzc3rLettuVkzZeLO9Lyjbe3brjrqKtIq0utD6nneBDyqiUxoasj3r66OBUd7QkJ6Wlp6WXteQ5lns6RmdHV3sWSylXvTg/PkpwbPfORoYGBg7ODgmlJaWRpX6zwBm9oKwgrAyb2Ba8032B3pgr4NJi52dopuhoaGlpZtbi8neqBPLFp7eH+Scmd3X1zo7rLAgEFRG9IakxXpAPTJv3py1c5ztgNoUlaSkJCRk5OVdXV0N7RQl4rVVRaVFRUWV4yUMLSUslRQBLI9dCoJAGAC7gorZmvL5k7sLuiuoYKYYCVZP4QV6DuwaHaIn8QJeqbP0mc0BhhmkFqJ0uQksiiIGXi0PaVpxiwEXSZJJeYlTBEMxFonjSmYzMqs9cyzzXIw21QnRCCHoDgKfhobDbAsBsB2DBrq+JZq2Vn6oiqoqikZ0/+bsN0VhYqLFjJDSIw13Nrwf96brrs3qMwzDND1fuPEfgQ1YbWvyc78L/WXEQUNfeJxztxTlMmJgQAuekNjqLiNyDsYRBEdOX7LpHbdtIIoCqPZgWHygSIgzpESCnxGGoK1vLCKARUUIhHSpHCNBYCAu3LvIz0KK7MEQvIasQQtInSKNDKhOmyr3cWKr8C1UiBzyHd6Z+rv/h6hSZXhB1s/GMuy2DjiAdBiSBjXERcIg9eEwkMcYSOINYgKE2u5R2vWxMglCh95fna1WqxuG7Na3RcaQSNpAtG277bgkdcwQDkPokmwpZSTgYIiLi4mF+fPRSIm2SyJXVaUKVPIEkjOkVHne74/FHR3tIaYQAwlDzzMOlAVI82DvOGgdTpNgEROxw7PYcdjpWqHbptvr5zffvzZ2m83690VRMESiETRsS439RTTwzrEAK6Z1I3WvOmLwHYrzEn8Kic6qSS5sh4Qqe71SAQKGgTClN6rgKKpRWVZK9QU+geUD8sxA4EgZgniBlSbGAQjy2EqTC+lanusQwRFYCTuwOOVKXnyZX53NG+v7+/XuoqpYAgc5pxSNI0BscvHo7nSKeY+HJkT1/gJ4SMeJjyk8AFQ+tskWedmDBD9QsIODRkYTVKEmk5IlmXQ8C0cEjiZDaocVBOiCGeZ8PIQlzOA7O3Acu06bHWndB9KpcR8+Xr9+86rxd7vdbH/gJUUmNE6Se0oiE0OHpO0AYiXJchnEejbTMw0IaQmIBmSx9H1/en4pijwbR7aMTvIKEuN4KGQPQZQqhB2m3U4LkCbmYwg7LAQKzHdoIC3E7C921IXgYA+cOHbgANcE/6LMby8/v303b/z89Wez/dRjSd2Iu8BoJxTrSAICh4XmaRbNQNHoZKil5PsY8o/H8ntpKgzjuP/C3Ns6nc7YOWdbZxxbcMLW1o8t1raaTaPAdqxgWVFm4ZIoSqygJNZCsEUQdDEQobpoRBeB0JXuajeNLjLyQoQEIUMTROj393nfUw8ksYm8n+f7fL/PE/QnusxqGDlG46Zr4fYD+/6DHP/HAcVAgtoe1nRfAM+gXjsgEMTB8Dtt3izK8Qk4hHRbVYSaQmkAXPF7JAked+L27RsYrfWPn+qfx9BIDBc9MB3p10aq/aYez5jgQMghHaWQVgUIkViW4OiPACQIkEw8vpuCDJ+GNCQXeYRABAeBwOM7YXTkiS4ZG/0iXEWjAeJgOBD/SIBBtFQIau5rxWdGnVQTtYELqj56fx/nREt9dvbz9zGa3/bdOiyiqmZ1JGPifT+/FtoS6Lr/Ynf3Ye3V2VisM2tZxzp1+VLulGSqbUECiWbiGg8AXfKBBBXGagEIMAQHMYR5aFuSdyMfLNFroQgKHHgdV0GQCDVEIRT4DBlI5wjpQV8LEIruHTve5e/iXG1Zn51fr59ArlDDZERbwQzFCeRnzV5rS1Cjhu49SHbmT0rS2ID1Op+Tz/Y+GfABxM9BrCrszxNZkeEfWdJhe6hCY7VrF0IXisQxe7pFbUJD8ciZYV5ltBS1vLy2AZ+i6IXcJSKv/umxuLyGEVINFXFF3+Kz8nBj0QG5PnQQp2lLc3Z1vT4aR1tDVgybMBAQID9r7HGAg2wa6lR7z+Z7H5zKJ+XYpZycy/oGTikAIY90IAf0EAmCmNB1yxeNyhr3yq59MDgZHYrQ+sCEU2Ihej0lxqtCe8Q/hf9s5k/nu8XZhq200MFBBpm2KRJo0MHBiRvMtpdmMHEgOQSv37nZsjoPRV7E46EMXSfeSEGAyODwbmxLkM5Dp1/mlXz32OhoUpJGAXJJygOkK5FApEXgfiQZ7XoDkshe1TAtDRsQBZOHd8LnFGskNjoKp2NoFliJFCnSIC3aABESeLgm9AsuB0Qsm6VpTKAwkmOdRslTZCtIZZA87c6du32rpTk/36y/GBnRAKIo6QgUefz7D3GE0j0fPnCQzoA3nR/sTbYnFeVaTs5mpeQ2JRLoQhU6YH9Zx4pUDNUrIfUCajQWircDgrzhgGghbCW+7zbTk1OsKNIIINNsiVWc1VcswiblYpk4+hoTrmKZXLPM5trWvq75K43FTe7icJ+LajJlF92c5Gn2wvPnWYCsNutfaLNbEk4sY+6X+Riqg0MXIJsAsjESyQ9eOe9NGt5rOWnPQO9ruu8CtMjMGIYfx4sEkLRPMtGJjv6MFg4LDpDww0T2qWIy+JNt5ikDhCwxzFZs1ufh52GR2eh3iY27WidqeMM4SxHIgu3fUmE1+mSFhvINQF1T46xvrxt5Fjxy4eLRwefwyHzz+7cD8LoOReZShACSGpr7loOAJNgVMdSIgdww8APHywE6FVQVHGkJCwclEwjWLM6aQsS0qvGwUyKbZcmg+4hzoNgPvCpVBEnRtt0AcfFZ4iAegLS2jrPasymbpcCxyKb9/gpjk41Jxuyphs1KrqlJ/JHxvXtJ1Idnjh692N3SXF1tfv6yrT1MiqwwLkYcJHOS0tPT8yHIQQpeVBTlTRtpBSSypcvpABzYIWVgdHHbqDgicAh1YbYy2m7kB37s1sSXBu0xyMs5yowtlGxml93uaTbjAggoOMgbfEsgE4xNuFwNlsLwLbOZYLDCUmC02TNX6zO2gH9vlljDAxK3++rg5f1XXv9l1/yfmq7jOL6rzuy67hJ3sNYGOFdbQ0G+DQSEYHwJtjlhDBUiFDYIGApTvjXwSzpWCQwcEYWX9u1EKIFI8+vFl7vsUuRMPQ+/lOlZXWpl+oN3Xl3P1/vzoSFpf8Gebh8+bB/c+/F5vV+v9/v9fE/w561bV6+2gSOVAiLkSGRvC/+SHGEg+PBn5xdEq1R44ICYYMZDI4YyQI5cl6tSuckmFSV1RoZaTnlTxuaWrCrj9oCen9VSPHyI5BxSZK9w1PccutEMEB8CeVWY7DPHdzsDSd6LIR+nyPFkxA4QeG/taAM6py9QlhiqtmlqNgrOn79w/WoJykpoAHI9mSdJefvmEQ9IAoEwDoCkSCWIiXJhvDgwKCGhQBqqVHLLmAAJhSywYGlBoIpNZEJxAAc/q+WqKgfiC6ELHQTDG7t33xMeZCSIw34cAUKNRclC61HVhL/jHuDUl4H4sPc4+VJ9XtLeVaVp1Qm+Ghk5X1JM5VEipZDwJCuPMBA0gIFkSDOiCSQjQwohJvOiwpTqIBpHKNkpZUi4JIOSJLqMmywDkMaOBOpWrKqinQA513BuLgNZK+SVjNf9p4F8K9w7BfKH8Bd07+2s9TNAuIqdaLjc7KwTwPzZU9LGBnUpmoPsYPqBcWBExN1QJRSo1eoMVRmBREejq6RIlInVSnXC/PlL1WWLAYHHwvjoaBUWMRlIFVUZJmNlKhVeR5Jz0yjP6DCnAf2Eutbut14lrRCOniMOf2TGHX//DwFy5x4K9JIGSvYVyXOhV6eDAJvnoMq3Sn/Z4roi+HXPnrySzQCR4EaLVJK/GceKlQwkUE4VU5NQEDhPnRGhOmpQU0QUIrEk7Lcs5byEneFBaK4q0ZobIDMY1IrQVFXoYnXGVlUZOKIpctJABJUfrRkHS5EVSPZk3H5OyBF/EqX4/jdQmlC1DtLZDYBsFzb4QgzExwPCSLiRqGi43+2eEIyMXLhe+CYPgqeCxeSvlSRFCltUaoIKior0hm3bMs1qdZY0y5CjkZU3w+7QF2Vt7dKkqiSZuWGlmk/kSr1msTmnS19Zim6lIhAJVsTPTS0teBBo7TUhlV+Ow38/D0IRuSe8kUwgc8BzYwyRGxO+RX9JID7TQPgFF02AqwY7Tn33qeDHCxdu5bcxkBRgYDC4OSYU3oyEVioUkTTFLpVndOnNOyszE/WB6hx1liG8yFBlyNHrNRG5RTmVmJhlwtMxVPspK83hmaFdpfKsYDFImJvA1oMQ4+BBKCgfv8VRTBdy5M7Hd7iLlmCAbxBem7tiDF2Sl8+/4tdbtExRjE8Ub16+RfDz+/tKkkpYjsAEAoc80u/mD7RI8CMYP0iLO59pLqrM2mkuUGfpNYYcc1i5Jkej16TmpGXqVSpRZa5Mo6n2C9FoU0sziwzbskRUj2n4hEXxLJsdzQDBCeOYCYIORtf4jl5b+8z2FcKGudBMEj4cjEMqFhdv2fL9968Ikl5KWp70uVJGVQsoACEGiI4AwUEBXwVJrIYo6xWGRSkSWfzCUPn8Z+E2qQEiEmHphksLli416HPnJ8glqBsS2AlyCgg1xdOMh3MQCM+xZFRIGuM65QNIGMdzC6Rox+plL8OeFeRvgdWs44wg9C724R5xIKJdytAyVCw1k0IkSpGK58G/40CikdpIagzpQUuDggLLsErxk0pU9MqCBcgQ1q/uB/FgvOD594L/nTdGORCM2Gv/GDu4/Zn/AaFlo0IcGxz3xbFjx155WbBmzZqkfBP8BI5EwUJCs/9IEp0qpOJdStlijIYgAU1gYGQknDmZCqtW8v9ohMFASOYfeS7kuQUF4j/i/AQWkOkdHCceDkIBAyf2K2smTT04CDyWMA5e93HAwomKizn809fvHHtJUFiYn5SvS5VxJMhODwgvhQQgcLJAgqgARI4oUWWVo93k0qAmU7sZBW/TyHERMLgVxIxMnY7BQ3hI+J4FEqb7MTxZRhxBgZhfRNntQ7DnPyKQpKTCjTJZKnUuiol0Bgmmu+Jdu3Yhh4gkmieNRH1DSSNzjaQGCCYsz2HIIJCEIISD4oEXeI4HYuAxXZ6AkOay43QM3glGQCjPFWJl7EJ4yb0AWfayYPVy7MtsiuBBgMK11KPIFAlqEKNkJAwUCHw1AAVblzDHhQ0Z5G4kPP88QB4aEE8wppPQq3xAOAbS9FjwEwOyLVg84mOh9ttnv757DCCv5S97fWMpA5kiQctY2WJC1yKDj6SCGMiCKfkxELIKI4mEswkBMh+uggfkwQF5YYaIbSrVKRoEgeeMP+Yd1OcjJWLY0PACjAjI3Y+WCXZ8Vphfv6GxfJUHhK9cC3gQNm+fBqJg7yEBOBIPCM2qmFfDPIUpEE9TZkTkvoBQzntShAOZ8zAQBAQgMloptBsvUUTu3hXsW12/fPWGDY2NG0zZura2xuymvDxrjVarNZvNpebmZm2rs9ZldLsOXak4qTOZdOl5k3jxQF2HY7y/ubm5u/lAxwGno7VVO+kYdDgsg601pR9UlmMArSkvx75aUXVu2tGjIUzwudK2bo2IYOZsAO6OKBRrx1CRmNmwaBdSN2ZRbns7tn/aw8NjYuCKxcDrD6Yzuz0qOJjZTO2GIv1wv8V96FDF0FBnJ/ZGz5w9e1bw0r76wvrNO0pMJuws6jYX69IHBqzrzGZtqba8XKvtaZ10Gl0WF/7mCoE0Zne0Ng83dxw+ffFi36mJjlbn+pNOh6OntdzhaLWRBgYGHCYz1jojx9/LxDCfGwH7mnEwkJ0EgmovAgcQgCEGyLx42kKKQjFNBEd7e3tiSAwxQLBcgRNnt9tBBI7c6iL95RM2d+1QRW1t7VBnb29v3+0zZwT5ha+tqS8padNhL9W0cdPnjdnranSNLTVWK6IClh6AGC1G8HdOnMxu1B040HNiuNt5YMJ9peJUXV3HxE8XnYhHj9bR6rCN2yyWwUGLscOh+fL4yJfvdnUZqhdFpKWlAQUcMOsBAscGHIgIIYgldCKLXYgCRFZ3yCKEhO1GwBOzR5F3gdeZ7WoHEOJRbfitarjf6CaM2oqhQ52dnX23+y4Jnq5/vXB126ZNurwmq0nXqMvONrXoTNkbW9JNLdqBJmtNixMkrgqQ100UF+s6nIP93c2ufsuJcZvR2N9vc1VYenrQxyYHBx02i9FmseHyVnPpV8ffxQ5z9apwcIAEHDHBIS8CIz6e7FXMjFlO0o4b7G+4LsRBTc1NXAQKe5QdpTUWfPCN4+LC0O3CYhgIceAjal3uCmjoEFj6+p4SPLmjfnVbMRIk3VqTno097iacpW/I7mmyNpXnbTKZsAnscrlq+y711Z1ev77upNNiO9FvsVj6xy04OzFsc9sGy7u7cxyTeeucuNJodDsHu6uy3v0gs+sbw6pEGP0UkXBYwXEx6FpYyDPzCAA0bBEQnMowNJc4CATRsIMCJIgTCdZ4FECQK+hY4Bg3uoy1JJ6jt6/vSYHgyac2b9yAHLdaa6x51nV5LQPapoH0prx12S3W7HXX80wl9cUXD1Vc6uvtO73+0/WHJ23G8X4jICwWo3HcYgOPsxz7zKXanpoBo9vt7nA6mrursO3aVWSozg0PeZFDCYEXnJa2NRXNFokDArjNNqqINEzFRtnjiAPJEIInOhIEGhSAWFRZCL8HU0CQIN3jRjdBVODZSep9ChzQI4/w32KBZvM/Zs+mb73Mwo9H8LWVWfgSC/2kwyy6BofZ/MXsysdI+AVPHHg9AT06U48/UI8+RP95H9+voc+EZs1Gq9EwaprAK6+88sorr7zyyiuvvPLKK6/+aQ8OCQAAAAAE/X/tCxMAAAAAAAAAAKMAuPhcJ09PCzwAAAAASUVORK5CYII=", + "description": "Displays a latest indoor fine and coarse particulate matter (PM10) telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_card.json b/application/src/main/data/json/system/widget_types/indoor_pm10_card.json new file mode 100644 index 0000000000..a8610563ef --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_card.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_pm10_card", + "name": "Indoor PM10 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor fine and coarse particulate matter (PM10) telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "matter", + "air", + "particulate", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json new file mode 100644 index 0000000000..5387b784dc --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json @@ -0,0 +1,31 @@ +{ + "fqn": "indoor_pm10_card_with_background", + "name": "Indoor PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest indoor fine and coarse particulate matter (PM10) telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "matter", + "air", + "particulate", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json new file mode 100644 index 0000000000..96fd8e1a7e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_pm10_chart_card", + "name": "Indoor PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine and coarse particulate matter (PM10) data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json new file mode 100644 index 0000000000..2c7c0f7935 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_pm10_chart_card_with_background", + "name": "Indoor PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine and coarse particulate matter (PM10) data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json new file mode 100644 index 0000000000..347d2e7289 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_simple_pm10_chart_card", + "name": "Indoor simple PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAilBMVEUAAADf39/g4ODf39/f39/g4OD////k5OT/pgDg4OAhISH/9N9YWFj/sSD/6b//3Z+QkJD/vEB0dHT/0oDy8vL/qxD/+u8vLy//x2A9PT3Hx8fV1dWrq6s8PDyCgoL/2JCsrKyenp7/zXD/78+6urqdnZ1mZmb/wlBKSkr/tzD/x1//+e//46/29vaFHg9VAAAABnRSTlMAIL9AEN/GQiaNAAAEpUlEQVR42uzPwQ2AIBAAsBMQc3/WYP/1TJzAJ5B2gwYAAAAAAMB/7dpc+xq15LO5vGvElbNvb2SNMvoBZonsR0iRxYisRuRlvw5WJISBKIruXsGjFqEoCNEoCirz/184tt0wNrSzTZzJhUC2B0Koqq0Gqa0Gqa0Gqa0Gqa1/AskZrxYzG3tgsh57Zg6gmwF4UBMU71dIjj1eBYawcYFRHwJSEOJxt2HaUvkt8xLifnYgEIAqLEUHLD4gnSrgzBB2KNo1xGWlHo4zZFOYxhmII+UJeyI4oWDXkF6ZJFBxhoRgnGEaFNPQ3QOykofkDaJqGTB1dmrTPSAeD8n6BsGRKdQoZ8gC30/BriFYuZf8M2Sh4gcC1T6w/P/7GQLjnpxpCUfjBv/KWJIAsA2ADIwZxbuAIJCGO3UFgeTyz6XNWneuQWqrQWqrQWqrQWqrQWqrQWqrdoj7X4B4iGQa5e4QSdzWdWOSe0MkDYegH5LfGvLNntk2JwoDAfg+LXsJCQRM8A2taItv///33SYxp3biFTrDFWd8ZkrCJu3sI7vGqRuWgGPONk8tsk/DLE2fWSS5PoecTZ5Y5I0t6Bpq6/lEJotL/h/1NThLn05kaU8Op1IVADe19WQiC7bfLesqsbnPAW5qa/Qik7d8k0AgrScAST37SFkBN8zSsYssKkbk4EnY0g3Ffm9DkdrqKZIJTwMebqdf0woTiUqFWnGIklT1nPIOlVOwBKLM2epbIiV6puARdvolHA/RqG6OqCDKymeeVl7L11N8Y243rCpWFUl3kRaVtPDg1UlkjVkkerJ/BcU/T+93NvdDAo9NqnRPFnlRs7yziMLy7jUV+oGI2crrjcCLOJdbILbSeJVS4Tre6Sz3Yz0jhV1VwGPmRfqRT1wHsTTpKHLA9f2dCCIZIhDlZdCIgkLORrr6QaS0KcozTUPjvJQQJcTYhffYRc1mFdsn0In3arbrJkLZNKrNQsUIiIvQVSuBF5GjqywKuZigJY0UMtzY18LE6+X6vVJRLKErSb3vJHJCz8G4dyzkcRGOqIwV8CLCJUsKPtbSBk1XiQcpNT5qke/STeSAzVke0XXKka5xEZrbXpBeRPot7pfCUmurrUFEvX7QIoOKEMa3vLYpCfNApKT1IGKFz3cinIapaxt+PpsHp8N8aJGQNOcCG2lLo5X8s8gUxVXkRDdRkUC8Rf6bCP0Eys8ize0TyXDaW2SWDiwyRXHJ1pyVQ6NWWZCL9ohC2VckZ8uBRc5ozxEuQhr3PdIAGGFFTtptaK0IJ/eeIvn3W73HyY72KSCPifgldCcMCjeXFC97iASPwUVORySEhJiIQNRtaBWaN1bkgLyPSPAYvtmNlByucG7+itCSMZyHT1XmjLjlqO52unU/xCnIY3iROEHkRm8NRIsCttkWuhI8RiRyQFGWyhZTT1bkMSYRLtB//OgtsoGfFuFZBjfI9TozMAZ+/xrVv4NeIi+R0fESGRsvkbHxEhkbL5Gx8aedO7gBEIaBIGhsEcl/2qD/9mgBiQdJNNPBFXBryGwMmU1HbpAOGuPKqP7/1vnZ3UdEnetnqbJ2CoUBAAAAAAC88gDG/flsHc1jFAAAAABJRU5ErkJggg==", + "description": "Displays historical indoor fine and coarse particulate matter (PM10) values as a simplified chart. Optionally may display the corresponding latest indoor PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json new file mode 100644 index 0000000000..3d3388a292 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json @@ -0,0 +1,34 @@ +{ + "fqn": "indoor_simple_pm10_chart_card_with_background", + "name": "Indoor simple PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical indoor fine and coarse particulate matter (PM10) values as a simplified chart with background. Optionally may display the corresponding latest indoor PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file From 6b8eae035e69fff6cfb5c51f976ab6cf34d4a7f5 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 27 Oct 2023 15:01:58 +0300 Subject: [PATCH 24/39] tbDate: add toZonedDateTimeString --- .../thingsboard/script/api/tbel/TbDate.java | 16 +++++-- .../script/api/tbel/TbDateTest.java | 42 ++++++++++++------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java index 084bc25c1f..87a6e1e0ed 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java @@ -94,7 +94,10 @@ public class TbDate implements Serializable, Cloneable { } public ZonedDateTime getZonedDateTime() { - return instant.atZone(zoneIdUTC); + return getZonedDateTime(zoneIdUTC); + } + public ZonedDateTime getZonedDateTime(ZoneId zoneId) { + return instant.atZone(zoneId); } public LocalDateTime getLocalDateTime() { @@ -149,13 +152,20 @@ public class TbDate implements Serializable, Cloneable { public String toString(String localeStr, String optionsStr) { return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL).withLocale(locale)); } - public String toISOZonedDateTimeString() { + public String toZonedDateTimeString() { return getZonedDateTime().toString(); } - public String toISOZonedDateTimeString(DateTimeFormatter formatter) { + public String toZonedDateTimeString(DateTimeFormatter formatter) { return getZonedDateTime().format(formatter); } + public String toZonedDateTimeString(String zoneIdStr) { + return getZonedDateTime(ZoneId.of(zoneIdStr)).toString(); + } + public String toZonedDateTimeString(DateTimeFormatter formatter, String zoneIdStr) { + return getZonedDateTime(ZoneId.of(zoneIdStr)).format(formatter); + } + public String toLocaleDateString() { return toLocaleDateString(localeUTC.getLanguage()); } diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java index 1c2c5bde1c..d3951dce0a 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java @@ -30,7 +30,6 @@ import org.thingsboard.common.util.JacksonUtil; import java.time.DateTimeException; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -374,19 +373,34 @@ class TbDateTest { TbDate d1 = new TbDate(23, 9, 7, 8, 4, 5, "+04:00"); TbDate d2 = new TbDate(23, 9, 7, 8, 4, 5, "-03:00"); - Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toISOZonedDateTimeString()); - Assert.assertEquals("2023-09-07T04:04:05Z", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); - Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); - Assert.assertEquals("2023-09-07T04:04:05", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); - Assert.assertEquals("Thu, 7 Sep 2023 04:04:05 GMT", d1.toISOZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); - Assert.assertEquals("2023-09-07T04:04:05Z", d1.toISOZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); - - Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toISOZonedDateTimeString()); - Assert.assertEquals("2023-09-07T11:04:05Z", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); - Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); - Assert.assertEquals("2023-09-07T11:04:05", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); - Assert.assertEquals("Thu, 7 Sep 2023 11:04:05 GMT", d2.toISOZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); - Assert.assertEquals("2023-09-07T11:04:05Z", d2.toISOZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toZonedDateTimeString()); + Assert.assertEquals("2023-09-07T04:04:05Z", d1.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05", d1.toZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + Assert.assertEquals("Thu, 7 Sep 2023 04:04:05 GMT", d1.toZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05Z", d1.toZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + + Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toZonedDateTimeString()); + Assert.assertEquals("2023-09-07T11:04:05Z", d2.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05", d2.toZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + Assert.assertEquals("Thu, 7 Sep 2023 11:04:05 GMT", d2.toZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05Z", d2.toZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + } + + @Test + void TestZoneDateTimeFormatterToString () { + TbDate d1 = new TbDate(23, 9, 7, 8, 4, 5, "-04:00"); + Assert.assertEquals("2023-09-07T12:04:05Z[UTC]", d1.toZonedDateTimeString()); + Assert.assertEquals("2023-09-07T12:04:05Z", d1.toZonedDateTimeString(DateTimeFormatter.ISO_INSTANT,"America/New_York")); + Assert.assertEquals("2023-09-07T08:04:05-04:00", d1.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME,"America/New_York")); + Assert.assertEquals("2023-09-07T08:04:05-04:00[America/New_York]", d1.toZonedDateTimeString("America/New_York")); + Assert.assertEquals("Thu, 7 Sep 2023 08:04:05 -0400", d1.toZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME,"America/New_York")); + + Assert.assertEquals("2023-09-07T14:04:05+02:00[Europe/Berlin]", d1.toZonedDateTimeString("Europe/Berlin")); + Assert.assertEquals("2023-09-07T14:04:05+02:00", d1.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME,"Europe/Berlin")); + Assert.assertEquals("2023-09-08T02:04:05+14:00[Etc/GMT-14]", d1.toZonedDateTimeString("Etc/GMT-14")); + Assert.assertEquals("2023-09-07T00:04:05-12:00[Etc/GMT+12]", d1.toZonedDateTimeString("Etc/GMT+12")); } @Test From 787aeb4f982f04bde504977c888b25ed7d24d8c5 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 15:32:02 +0300 Subject: [PATCH 25/39] UI: Indoor Environment: Radon level widgets. --- .../widget_bundles/indoor_environment.json | 10 +++++- .../horizontal_radon_level_card.json | 29 +++++++++++++++++ ...ntal_radon_level_card_with_background.json | 29 +++++++++++++++++ .../system/widget_types/radon_level_card.json | 29 +++++++++++++++++ .../radon_level_card_with_background.json | 29 +++++++++++++++++ .../widget_types/radon_level_chart_card.json | 32 +++++++++++++++++++ ...adon_level_chart_card_with_background.json | 32 +++++++++++++++++++ .../simple_radon_level_chart_card.json | 32 +++++++++++++++++++ ...adon_level_chart_card_with_background.json | 32 +++++++++++++++++++ 9 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json create mode 100644 application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/radon_level_card.json create mode 100644 application/src/main/data/json/system/widget_types/radon_level_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/radon_level_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 1377fd8de6..2569a8c62f 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -69,6 +69,14 @@ "indoor_pm10_chart_card", "indoor_pm10_chart_card_with_background", "indoor_simple_pm10_chart_card", - "indoor_simple_pm10_chart_card_with_background" + "indoor_simple_pm10_chart_card_with_background", + "radon_level_card", + "radon_level_card_with_background", + "horizontal_radon_level_card", + "horizontal_radon_level_card_with_background", + "radon_level_chart_card", + "radon_level_chart_card_with_background", + "simple_radon_level_chart_card", + "simple_radon_level_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json new file mode 100644 index 0000000000..8821cb4a43 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_radon_level_card", + "name": "Horizontal radon level card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAApVBMVEUAAADf39/f39/g4ODg4OD////k5OSAwyzg4ODv9+Xf8Mqv2XuQy0bP6bDOzs5YWFj3+/Lx8fH09PT5+fnA4ZWg0mDHx8eYzlOIxznb29u2trbQ6a/CwsJ0dHTV1dU8PDy43Yjn5+fIyMjn9NjX7L28vLytra1mZmbH5aPY7L1KSkqenp6CgoKo1m6Qykbt7e3U1NSQkJDH5aKdnZ2n1m4vLy+qqqrWFLAGAAAABXRSTlMAIETfv0i0+14AAAPtSURBVHja7dqLVtpAEAZgSzsZkmyuBEi4BAhXsdba2/s/WmeWUiJW5dDSA5z/O4rJBOP87G6EAzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9O7i3ejGu+dS9d835AcTosuXuo0bj6kdAVaH26adBWaCHJmEOTcIMi5QZBzgyDn5g9B3JiUt6ssHh8d2kiWtJN8pLq7ko5wsiArzmwcNu62FN11Rgk5ibRejogklOyRbES6kySU2P1hhw7lrbLg9+n7/ZisuC9uPXpm9rzm9W9fDzJm7pIIeJck6tAo+Thcl4v1cETRMEqGUfSoQWRn7Uip/LiU4sFBMhZmun3k2CPLZcvc0lNx7tOeMXe5+1qQjIWe1+gZY7Ki9fdH6txFi6h0Rp0lfb0bduxoRJ3RQqujZLRYLg4OErDxphkbUq6pB5Eh8TmP9+/v0Z4skFbdF4PoWcU9kccq247I1yGty4+LZccZlbUgEqHTSxbRneTrOAcHafNMbvNNI9J3LQiJLgc6DDLHYpdU25BsSuVWEnq3UxJT32SvjEjAIveI3C6L7m5qOdFyveiMZGoNl2tnG4R0SiXfHfm5PHxqzfquDRLbv5iZvSA2Z5AzmzZ7tjzWvPdamWlfmRYzY+KXg9yzCCgYu3HOon7XRL+3G/Vq/efhAu7aKWCoHsR13TEbuzme+WyPBOzagVtpivYsY9n3A1rx9OUgXdv9jPmb/KaY0qm4xp7cl1uzv9g9Xau+bcfT26694xed8LkdsUC+u7l58x+iJ8HptGJjJ8hU+zVPFvvK18vlvfStLXtaDWyQQDc/bTdnctF+M4hOLTqpuCs5hMTp93Mee/U14vNYH/VtkDG7z4NYbwaJ9euktFfb+S/tehCdVv5uREybjg1ijE7OnZT+IH3YL6R0qLGsQRV7yvBq+vTyO6aVzaZteBwcGyRjUb+29bRN/XooyGq1qNUMtdCkluxPfkyoVRSbA1J4I9KK+d4Xtp+na8T35SqbuxTn7GdtliM+x0cGcdkaPwlSlmFRVaFsDWhQDOat3iAsyyqcP4Rz6TycpPN5QWloD4TV/I2JteE/C6Lyb7ompkYmnB4xPh0ZxPDGtB7kc9hLq3ASboJMPheyLbVJEQ4qG6RZFBKk6k2qVOIOUvprrqtrZMazo5/G+13mvF1/Gh8Wg7BXVoNURyScF4Ne2qtCqT3MJ1VIGqSlIzKZL/RAORjQv6BBTvrCqpjQyz5XupAuI0ir9drBlP6ZIHPxUvdSIci5QZBzgyDn5oqCfLiCt9mJ0g83DecK3mhvOQ39CEfTuXTvG9f0oRoAAAAAAAAAAAAAAAAAAAAAAAAAAACA/+QnXMPkgka4f5kAAAAASUVORK5CYII=", + "description": "Displays a latest radon level telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json new file mode 100644 index 0000000000..e05ece881b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_radon_level_card_with_background", + "name": "Horizontal radon level card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest radon level telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaAAAABcCAYAAAAoEWGPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAASGfSURBVHgB5P1nr2Vpmh2IPdsc76+/ceOGyUifWb67WO27ySY5MxIJDIUBCQ2E0Wf9BwH8NBAkfdXoiyAI0kggZsDRgCAGQ3KaptnN7qo2VZVVacNH3Lj+Hu+3m7XWu8+Nm5GmTFdnV/Wc6ujIuOacvd/9vo9Zz3rW44VhmNkX/PI873O/n2VfzCXxOvhZn3s9Xvypv7f6Hf7t+77dWm/bf/5br9vb2x1Lksj+y///d6xZDO1/87Vbttau2Xw+t/VOGz+f2Xi8wO949sHjU6uWC7bdLNm1nY5FpYo1br1qxSCw5fkTKyznFpbLFo1Hlni+FUsls0VkWerZdDK1xwfn9v5R3/74Uc9qllngJ1YpFqxVr9iXrtdtlGT2S7/1q3bnd/6RlYo1vM+5jQ7ft2Q4ssnj92xxcWaFasWOp2Y/uP/U/vbXb1k66Ftrb9cKhdBmw5nVKjWbzbqWVSoWFIr62vj8xDJeSxBaI8iss7Fu5UbL5vjdoFrHmqYWLxZYh9T8WsuKzaadP7mLa/CtUAotW8SWRliDODUP72FZorWM5rFlfmalctHCQsmSLLZourQU91Gvl8zD7y6WiYVZYOl8ZkmaWlA0w7tYivUM8Xt8LGmamF/EtaYl49PLvIqNJvh5fF4cR9Zo1u36/h0LogE+v2xeurRsOTFvObI4ic3H+ya8xhRrnSSWLDNcd0N7ZTEcWNAoWamO+/Rw3QvsVTyjAj4nKJZwrbgaL8Tv4l7wtSSemoe1tzSzJ0+e2bc/PLGNTk3PqF5M7dpazYpYLx/PvBD43FEW4Pcj3Hvgc4/xuRYtipZW5F7AteHHbT4aWYT7WUZmM+yJCf5t5uORhLjXuY2m/P2ClQKu9dL8MLA1XncpwP0keBZF3GdizVYDn5jhPbPLc5fiM7g/4xhrjX0Q4rqWUYzPL2IPhHiuiX4+Xsb6O+Gd8rrCgsVpYBvtuvUGc5skU5vMIttca1qA/1Xx2QHuy8c1Vir43DB17xOlVlnr2Kx/akHs2f/zX31g/9E3b9jx+cC+emsD15/YMl7afLa00Ti1OZbl2+8d2sE4M6yKPbzoWR379BjPZhP7+cs7TZviZ9/Ya9jbr2/azmbbotHCjnsj+8G7D+2VV7etgntZJJ6dd+f2P3z30Kq1Mtbd7Mn50Ga4neEstu5iqbWo4p657rzvaujrWfE5l3Af3IO4C1vDs/Gxd6thEWsV2VOc8Sm+N8Te4XtU8OYLPi+sVgvv8Us3t+1iOLVDrE+Kn6/j+ZRgGw7x3K7jOTUCs8NJZCf4foZNHeDZlAr4XNosXEfJD3FdgY2xn33YBm6VddiSJdbyGuzJ7+xjf+J7d7ab2BYB9sPSHl8s7GyGPYvP/x7u++Fggm3p2RJ7njttiX3h43sV2K1ZlOqZ89q5L1Z2Ms1NZab/ffLlZ6vvm97T1//38q88f632WgDj+Y/tC3hdNfI/ygF9ka9Pv5bVYuF7Xvq5v8s/ATbkZrNqL2/UbaMS2hke7H/3p4/sV26s2Uu7G3b3wVMcuLJddId21h1YBIMRYAN9BAf08v4mNpZv9bW6TbGxJnjohWLZklnPGq11GdOQhsXjw8Xn+TQAS6OtinEwvSyyW506DCk25nJhb99ow7AV7aOTqd3ealv/yUNrt5tWv/aqZTDqpdau1XZvWv3lX8LnzezBgwfY7LF9eDy3b76+b6X1Nauvb9m027NKtWbTftc8XDvchk0mYys1mjBKvoW47xp2fakKQ1YowDD3zcP1azWxZBmuobwBR4aDnsAQVTrrMPhTXCM2OYxOSqeD3cz7o0H1vQDGCwe8gYNcruLrMHpw2o1qE+uFgzOaWL1asikOdoD3WOJeaeSL+JzFcqn1pePz+WZ4Lz5DDwdrDqOU4rqCeKELC/A8a/jZRmcT112SwU6XYxxyGJn5EAc9tQiG1eDMfR44OBi/WIWxxe/DIYU0OnGMe+vg/WAQYBgLeL8ABjBL8sMKQ4ubhtGCcSg2sFa+ncDZ3z0cyaB3YGCKcMaNMgIGPMcCnDnPYwzjzGvl2nCNXXCDdUFA42GNYxiqCJ89wf6K8TPziJvQtxHWhk5nAuPdm+D38Z502kus53y2sBCO8XSwsAXW3YcjpYGM8d4L7J9FNJejqyDA8BBIMZgKaeiwdgE+k89ymJRgWFM5Du15nQsGDJH2YqFU5WGAnfNkpGuVQM5RgUgW4vMSrTu+CAdYQnADRxR6Vqw1cK9wsHDGk8EFHNDYLk7O7CsvX8OapXAqOAe4jiXuOcQZg0fU+3NveLjvw8FM173EfdFY1vDfs+nCWsXAduqevQkjfOP6us2nkd17emrPDrvWbpVtY61hFVzHWXdkZwi+7h537XgwtRH21eFkaQPcF51uB8/gOvbjLq73WtnsNQSSL8GZ3mpUbB9/6jDWW+XQAuzjMdZ0gKBlDKdVhhW+3SzTziMI9ayOM1DEP7ZrRaxjaGuVom0iUPzVG02r0H1hzRe4zwKcV6dUsEqhrHM0wb3OEAQ0sMeXSao15v8KPgPnxMZ0fvjsIr5eLnh6Vnw+w8XcenMEbXgeM1xTvYKgtFrA3g1siv1cQtAY4P4WKdeSjxLONaODTGA7Qhvi3C2i1DmZzLmalZmkA/q89CDz3B/T6XD/wT11GdxkznF5uV/6Qh3Q1czh5+X1mdfD6NYYkeYLlh+6T3sFOAwbnaq9vrtp+52G/fEHT+37hz1rIqMpwsh/6xtfwkMIkfGc4AAh4sMbHp8N7OlwiUPSxmFARNigAcDBh6lfInIpwRhV6w0dNK+ADYJQl85nguylWqvCOGbaOEiNrI1D8r17J/j5ij1CZMMN9hac32uv7NpL+xsWdw9x+MfmVxAVYfOmw3Oc5bkdffff2Wvf+BWbL2bI0sq2ub+HSA2HPKZTiJD5wGEUGMUv7OhZz3r9oX3wwQMbIzKbIpJaR/SewDAHPGnIXha47jKMQIRdWlrfQEYxtuXwAlkIDAgMtQ9niZOk6DHF/cCtIkpLEVmXFGl5OGjM8jIsUARnl8BwMPL3kSXhHMMBzvE7yATlBODsPEZpOPB5ZM7HEyAK51NLGVnjCxU48bBcg3PLLKzgwHf2rAUHGyrjgE2bDqyQzG2J6BsW3gJmdlxXXE+MLI2fk8ABZngePEQFGI6UmcHalmXzqRwYsy2+Py4WBxm/jjXxGOnjc+lwppO+PXl6geAC0XQRUXI50MGPYShmMKpPjseIOOcypDHWuoJo3MfvcZ2YsTHi5nXMZzObjsZwZhMr0jngeqaThQ2xTh7um1F7zP3iI/Nj9IqLqTYbMCaxgpBGvW1nx2d8BDYYzW2Kr9M5zOBgnp6c4/fnCJ7wzJE5TZBhVmolGFEYOMTtmefW1KfzwLVxzy+R7czxHtVqWc4HUYcNphOdFmZfvQHifeyzmM8b61JBxleD0ynSYZeKWEdE3hn3ApxgqlwPn+fj2ibW647t6ODEDp5d2PFJHw4EDgrZQbNZwbpNbczrxJVNlqm9c3Bmp1iHMQKRbTj3FpzCdTiLt9+6Ya12yy6QIT05HOB3JtZer9n13XUFEWMY5+98dGp46jrbO+st20ZE0IEDu4kN92t3tmwHF/YKzvYbCCTbCCya2Bvr2AMMijYqJWvi2bzcKdsNBGs1GPgK/j3Ec+5jD5f91K7D6ezUy8oyTpGFNXDfr1SRyeP3i8jSvgqb8RLO/k1kxdfaJWTtmfWxpjPYgmf4+TneZ4CAKMKzjuj0o8zmKTMpT3sogSOKYMP4cx5+l84NURScaaZndwMO8wSOvYNrKHPv4jn08L5lvFcT1/vaFvZFIZMtYsDFAGu8jJ3dkzPJGB3yRFw6ls+1m/krvGIs0yzNnZbn3tPP38v3/moyoJ+319Vrc6nm6l/03C6RtDyVJIT24u8G+LOHTXoNUUYdiNK/v3dsj3tjRLfYxK/ewMGZWa93gUNagCFo2b3TMQ5Migfv2Ve/fNM6my3AOA0ZJB7Mso9orr2OiBMbctjTYSFkEMAQB9iYGSKXAjYPM6/pBPAcdtWdPWzk7Zq9eX3TNhpFe+k6DgwO4RKHNYNhnB09svT4Q1uOT2EUizYCxOdXceBuvGx/9iffs6//yresEkY2OjlyxguR8wTGpNFo2zlgidOzvt3CZzQrVdsGxLKNA9MfDJGVlBluW0oojfATDLhfgpuo1QFR0BaPLYZhw80BeovgvKaCXULcR5L7eEbKfJUR/aWEe4YTZRCM8gjj0eAThmGWF+IQFWhk+T9GzzBYSergMj6iFM8nxbpkiPSDxo4lARx7uWPFjZtWXruF+6lZxYNhHDy24eMfwinCySwAvyHLoCONolluFGM5R35SAQ4mwHqX4eAFJsDJlhprNjk9VubjFQFPMuli1C84A9cbuuc1x/scPHpiR3DePozyGiLjIox4QucGaK2IbHc6RwaHe5/DM5QB7dEILT1n5JgBcC0Is6zWjcaBX47hYX/4uAsHXsfameCUCSL4CAbwvDcU7BZgbWZLRvQmB0aYhTBmRAgJARLh4lrdOZDJ3LcxAokZruf0YmhjGKoS9mgJvxwyMPAIj1YR8zgYKMOzYvSOREHnYMboH4a4253AMcBgMtiAKSrrkmNAn1WrNWvKfPjsuG8inI1oOrUlnEsB9xbAyjbxcxutNdvZqNrOblN7rQmHSxjpg4cXVoaD3l0DRIs9kfIZBUVlEK8ARSjgunbxjF/fa9n+LpABfMZ3fnhs4+HYijiPbcBThAFnyHJGC8DgT8+tRsgXEFo2g6HG57zSKtlLPJMMcnSZCR5tamM4+jLvP2HqWbAx1vAc632IdeL3uZ1L2CAbQAX24Jyw/e1ikejMVrEXtuEc+CyezRPBlmf4+3F/BoeT2Ane5+7F2B70XSa2wM8RqltrYb8ioyrDMVQZ6OA3SwFhsqLOR+YHl6Yeu8QGMwaEJefkcU1b8DQjPFMGDmX8Hs8YodcQe3wdmRFOi/3R0djmBEmxB7rjmZ7zKtOh5WOwkdpPVhbRCeU+sTxrcgmaS31yfE4B4xflgFavTxr7jzumL6r+8+LLZTir61k5navX8hzcXF3yZUaHBwRrYf/JV24Iq/2X751og3/z1rYMxofPTmH4WkjRM/s379xH5B3KkH71lQ0crirwXGwe7NZiqYwDNRcm79Mh+RVBgDMcDL+A7CVZwPg6g5wwr8AmJUxRq9dsHdBCDSe9gwhxa6MhwxHNJ1ZDTYbQjQcLOZ8MEQWFVn/7b6mmlD5+Bwdoaus721Yvha72gGh9CqzcA4xVgyHoAhJh/eqNt1/De5UAYXSQFRX1/jR4rEeVEDH6MDzzfh81JUAsuB4ftZVkCueIayjDaeESsNkAfTUayt6m44mMNjNCZgmE5hYwRoU8A1qiZhM2qnivCr63FCRUgnEgDETj5xGSCBiZpYLx+D/W0Irrt8wau1bfuoN7LMBBIOJubOEaq8hGe+ZPjvQQuYalcqDsjtlYoVzRgyXsRBtPh8ZnxH3A7NUjZFQpCB6rtDfxA4gYYdyDeit3DokCjCgaItOqKXthNnby5AGcz0L1HUJvoQcjRgeEe2RmQGilUvB06EMYhwzhITOvJQwJodgA15EyI2T9il4HnxXTc8tBTVHXwdriWvpTRMYwNHRAjLaLWNNWLbAGInDCoDHqYYTbCLuxtjZeOoiF8GkfRo83naRuf1fx/MZ4FjBbykwb9aqDzHB/Pp49s0Af+4iBAyExOoDQzxSR08H1YajfuXuMPQWnhKysiYCog73Ea6m0tlTziOEMF5OJMh7W27R+WGd/iSwiXbPx2Vj3dXHagyPLlC0tJrHtwymNAMO++7gP1KEBKCsD9F2yX75WR+2nbt+4VrVNrHMZCAZrJmNkjHeRPTHji7GO65UMsC4CCOyrE0DiAzi86zttGHuzt/c61gHUyL3G+ydU7GN/cs8doaaFr9jJaGZnWMP7vQkgsEzZ7wRrdo7nNUJ2ssTzu0DgxtJgAxDvNULKWNRDGPYazhiWUUEVr22JM3aK3zsDbLiE3aji5+pYR8Jw61UX7FR5H6xvKhNNkYUVkGnhzCG7+hbQjTr+u4Nr2EUW9eZGzfbbBdUwX8cN/dJOxdZxn8yA1wGLVoGkLObIznCeR/js71/M7V887MGRssaW2AjXkuSZz1Wr95M6H2dP89/1Pl4rkkPLMyEkal+MA7pasF+9/qoczYuvlROp4YHHimz0VeccUQdQvqif47+vZkfPf5egzx7qML/28o59/+6R/f79Mxi8AgqAa9p8a42OnaB4z2gJEL0imTd3a/aVV3etD3igBKPtFRCN4kAXETmzBqFoYTHS10uIpqrNNor2gHYiFhFDGU1+dshCM7EkHGrh92EORcHgCUrDf1e3NlUfqq3v2uLsFPWaI2vc/orgmv/+n/4zu76xbrXRIQw27g9OkFlNMVgqI+NhL/pVFJDpNMbYNPgMGGs6EeLkIYzsqHuB62J0WMZ7w6igGOovEdnSceBqeJDpmCMaQLxnCANHiIYFT0ZX0XSu31WkiT9lGMUM3yvCWZEiE+N9SnxvHGLBPzB4AQxghPeaCPJxNaQZnN0MRpkQJY0cjabPWgbWNDn/wJYn92DYUYMDbDkj7FPt4J4Jf6JIDiflebEMLJ8ZDzHxCmYdwi1Y48BnenRK5TULl1NLCSMFfHaIRnFvPvZPhugzEJHAbHR2Yud9BAFwXGVAOh1kpEVeU0YHwaIygoEya09zayOFyUI6ARocRKuo22ABXYSP/83xvHlJZF380Q9O7Ma1pu67wOeNLfrwyYWNBiO8b0n7gNlXp1WF0ysj2x3YASDfEWDTGpx0hGc4AWTFOksRf0Q0IIyTslY1gDH0kN2OAJfVlH2z9sVnUoYjolPmHsuiREV3wqOsVzHJ8X1V2aw3Q+QPw7+JTLmO+27VC7aNeiSDAI/wKfb5krVFQkgpCR5FOdcPPjqzBgKqRdS1/qyPbHnmsiJkmNUajCngJALPGQzqXhM1U+wbHocLQMK3dlrIFALsh8jeO57and2W/cE7B/bstG83dhrY0xV7ea9mL7+0jesgEWYGh1gVTLjRLNp2q6wsYThCvRIZTOIVrT8h9JjaYzifHw5JkCHc5esZVfB+d1HPneACergeQmAj3MMFntMYSzZCtj9AfawHoz5IfMFfScr6zFLwWXe2EKRZx3MvBCqGKBCpYq/goeL3EVTADvTg0KcJ348hJ/a4kXQCOBbv1cczdBkFshn8GmtSe7j2L2/VbLNcVMA2wRptMPDBc3rSn9sHQ7Pff9q3f/2ob49wrzgKgiIjBrVM935GQNXVWtBze3mJI11+P7Qv4HU10/l5cTyrF6+HaelNbO4b+6/Z//jHf2ZKIH3HzFr9/bnvgYNXwcGaMDqaE6NN7Hpz3W7vbNg795/AuGT2wTkiDRg9FrW/dvtV+/qbO4Cn5mJO1UqIOOdT5+sIXSFV18PxHAxFZzbDgamTgYQIsYSfF2zlC1fRRvZgWEqw1swiKrWKoseQBXoYN29wjoOKjXz0VHDA7OChDfr/BNHX0r7yN/6G3fzK1+z4+//e/Ce4VkSrU2x8MqBo8U5PRra9kcJgAV6AISjCGc76F9iwcFA4BDNkbJ39G3A8I2UCRRgb3yupoM6ozb1NonqIh6i7QiYXsxtYqwkglSJ+J9ThTGSYWGBlDcyHofYY/SuT8HWP1a0OHF2qIjkdHSNaWG3BUeRijVCz4uOKsmcqevsBmXRw1KgnVeCEYh/vi4J5EPeU8SyR7ZElRnBdLDgaAisLGkyyQEwwPgixjAJf7LYA91FEFjPH/Xt4dqVq0+L5SFkKM4tiCzU31L3mKKr34ZjpaIuhY4t5cFI8cHTKrPclcJILPMY26jQ0IiWSAAqEceAC44UruOM3GI0TUqHTTwEXrtUAlQFiozEuII1kPaSF+sQM607iAdeVbKQlgoCsXbR1ZMX9UWTHcECDXg+lmoLWs1Ctiv3FuhML0LP5QqxMhGK2vrclqI61it6EWeYAzztCBgu4D4ab1646FNY0IfyJ9eLyFYLEtvCZi0ndtuqB1WsogLcaCodDMsSmYwU2XFc+86DoIFSgcHbvfGo77YmgtjngqSoyhkN4s1vXywrSYqzfIbLzAb5/gee/WfWEGiAxQh0N2S0y8Y+eYV/g3Hxw1BMsGRM+RSZ5rVXE+o/sB48v7JXrLT3bDuo7v/0qgsNlKoj16dEQ9cEW/G1qH95/ZnsbG/aDg0OxGLHr8RxrgpkJl2026FSKqtHusM6H9RMPgBkk9ycc9yxmzaso8gcdzw6ywHlWUWCG425T3P8Fzk8qgoEvEk6NaEAe8/DFQJJZJf8eI4hkxqzaDxb0nBnEmLBaYPf6qIj5c9tC1rmL542Ex8HCrCNmCMyQyZ3jMd1HQLQEdNtC9j9FNrRcutpm+iLg85f0ol1LrnzQF+KA/ipfDRjj1+7cATxVtj9/94diC338ldob13YEdf3BOx+YSxJ/9ItR5upVxOZgEtJpNm2t1HMeHlax2+vaf/G3vmbfv39uf3p0qgxoHxj0WzslQSRMh6couHZxaOvrTTkRbr7laGBJoWzn46Xt3tmBgZjiAAKSQ1RJIkKEKD6gk0S0u8CBJntGrDB8LUQENJ4ReoOhxyX6MT4HESJTYa/eEH15gsinfWfPqsi+1ne3LRpfWHN72+aEngCBzUdPYSgAkcQFFEBRqGw3kCXAgZDRhA3LYmWMA+wjytq8/oYVKnVbe/umDe/9qc0unlhrbU1QXozshBg8IYcsdgY+jmciDpC9xtoZmVeeaL8wiDBoNEhFFMuJU09HyAATsgzhgGFMUR0T3XqKegqTAdZqiN8Tx17igLfwrGPWJaZdq1TaMJIjpk9w7DDuzZbVinUsSMllRITPEJGHWOeAhqRAqjSw/MXAwZP4vAROP4BRFxEEmV6h1sI9FBW1k4Ju5RZ+HpG852CuDMGFByeIlMZmqI9F2ANNFPJTOFQP95UmMyYTgmnIuisjc2oz844cqzEjq4n138DBwcxgyZYMYWTncA6k/bLu98aNLeyNCeDNBaBP3AN+dikDmKgOwwyslhejjy7wHNs+4NSCXSPmT6OImk/mcc8iap8McI0VERo69aKynojZAeqZMzithWpunsgWx4DDloiW5yj6dwAd1wmnBszPQmVJrJeSj7IGp/N7h1P7+qtbYieuWhVms6Gr3TEYZbZOh4tny+wnQObwmy+v4T2wX6d9XH8Jzq6M3/et1ako4OoNF/bh8QQQH4w2oS7Ae9fXDLWiOiAynBFmi1Wuadm+e4z7QmB5iNrPHz4c2xoyzW+93AHcVrf34IRu7pCcgjXA/tjCRU9wLXvXO/aDD4/tA3zGI9R1vnd+YE383hxZNYOSCWpbZKyyvjHHZ90mvAVHkyJzPse13GaGSwOLPbXE3meQhm1sQ0CjfWbrUSwolZnfNta3CcfRwh7gPmbwVcP1ch/X8HUu0YDkkkLgyDoIRCdLZJ/IFseLROdgCPuxIGkFDvZBn8HvHNkYnBHsBuFfMlfJdkxy9iCdXBnXz/e/kB309NxVo/krSgy+0BrQF01E2Fxft5dv31K0s7u5Yd9461V758P7n1js4/7AThBZESt9fp3OCLz4Wh2m5/9mQTCwWxtN22QUCmP7p4BDeEg+OhnY7737yP7w3lNBT9+6sWn/4Gu3AJ+sK1NhD0EfBX5mOGSAhTBGLJBmNDqiIsc45HVsNmQ92IBBhLpJFihdl5GCwQwAPSlOLnCjRTIUVRgRRrqEZ8aTiTZhip8r+Y6ay/rH+OTUwvGpxWeAKT54x3oXgDwQdTYKrIfUcf0z+/DeKaALRrRNRZqM3BJi93BihGOYsc2HZ8gkxjY+uA8nVVCR+uL4AJkI4AHVGzJXkKxUldGp9oP7G+L6QtZbbMXr9AQbmZxgVbUzHj1Sm3kfrDvM+buE5HBIi4S9EpdZk9HGLItfI5tqo7OhgjPrEuVaRWzBOorfIe4rKcEJNa7B2TdQv9myYhPBR9VRsplRplNkCHNCijOtE6+eztJHxhSu7eMyWdvqKZOKuT/gqGBtBJcBGxJpYHR0pLpGka6AzDlaZdQHCmngSBcsSiMAKePZkiRQLhEiSQWDkbLNGtdyFiljKJbo9Nn7haiaxh/R+WQOGGdpitrJ3Ds6Z+YSWgNOsFUvqceKBioVc8+3dTyXnc2mWFlrgOXKWMRNGPUC9tRmu2zNagCjXQD8hT0SOtJBRojXTDBmBc+exJQ62Xn4ImEiEgH4tfl4qixMRwp/FnhGU8B3+EgEZCU9O2Y6/HZEGjmLgQxI8Ifryl9kLSglFw172kcWX28ScoOzLWSC90jiWeCZD5Eu/vN3u7YAzPm1mzX71Tc2VX+8i6h+kgT2bndhxwiuJoC/7uCMfQSHSTbaEGexigDgCD/HXrPuDPcET1FCtvDnDy7stVf3bYG99Oigb+8dju2do749nSYiWHSx5qRZL9gPRAOO51dHlqieG9xVFdfHAJR7mVRwBU6k02eeSB5ngK353+z12kKwUEeNaR+O67X1mpUZjeBZr8HxsHeHddgKnk21SKo26q34jDWsdcDgLAgEY6fYB6TuL5X9J3abMCudIgMWwtqeq1/TqRN2m7PlA99r4L3ofHjGZ1F8yWpLVyzfL4ChzD3C+nemjI/xkffFZUBX60BflLdlTacIw3V9G1kEorp//UffdpHAx69sdYFX4M/sM/t/XuxnonPjl0IySFDQf3tv076817UPgD2TXv1VHPw6Hvw2DOCvfe0lg52Q8eV1zScz9WQwMmFjIA0qDRRrI6USC7stNRESLmJJAHgCovNEENxk2BN2b2GC/2M/ThVAcRdZBw65InTfpsCZIy8QJMB6Q1hBJAmsg42IRdrCEMa5tgaDve2okkU2ZY5wSMc26M61Jl958xYgsoqyFGZFc1wPseUCDFBW37GL+x8BhYGB6AF26hWteWNbsE42X2jDqecJjjXDe/I+5FCqvhwKm1WL5YrgBf4s/5bfR6aQsRkXhpS9PJMZHV5N0f5iQoy+JIYVDRYjPUZ4niolgesHwiEm44tEgiU+g86dTZJLOA+/tKYGvXJ7V46JGSWPYBpU5VjoxBNkMILDPUf59mEMCvh5eCtLBw+0PVjrKURTZEQFGdAITqFMuAVZG0kUdLKszagQiyI6C/iMiFmFriMbZ7NtAIeQMphh309QZjeGIn0Pzz8r+XKeF6gzkO02RWbFGgIZbsWQTZAIWuhksJ17gKRYS9pGdD/DZ5OBpb4gfL2LCiXrhul8aFudmnXHMKBVNj3ibMDIk03JDK2JgIIOl9kYKeCMcwpsqOX/cH1NBDVT7J2imm0B5aGuxLoM/7vX7amGV4SRY72Sa3djMxQteDFziINqegyy6JAWrtZKeI8Uc/an0MHyOYZYtxkCHCyCnNcMv39xPrEOztEhYLZzrPUbgIk31+t2Mgb8i+L78Gguw7rAficD9HiGQOtZ1zZbNZsha0EJxs7wDN5Ya6EOMlNDKB3cAtf+K1++gfvMsFaAIZlVsd0LhjzDOnBXBYTF2NOG53IN790sFwQ5sqm2xfXB+RrCSZWwZ2JgfvPEUcsH05mgsg4+e2+tbsXUZSFtOCUPn1NA1rTVrgIubwhqZpM2Hq2cI+1jH8+OpKX+nBBaZutFBhio7WB/D1ELLcA5zxGFkEl3k5RzXM867mGI9x4xQMmwB/DvNgIMwqt8Pzapcs9ovwvA9S7BsL+ITfbyTCr7Ef6LdtIRaVa/9wVAcJ/mVb+oehD7Vv74T78rJ0G2VZr9aKdy+Vq18n7Ga/U7zIaY6jPj+RBR4w7gqrf32vbh6dD+wZvX7Xq7YFuoL21vrQm+GsvpkNG00IFhE2CUoSAMA0JsnjRLL/PE+2ffTg3OoRCPBZP580jOiUX5YlgQtZWRLjv8p4O+IuslNnOMqNwPizpETTgfqiOw2D4B5BbWWbeoiDRAWKmYwcFt3LCD976H4u3cfveNtrrO/+SdR/bbv/wqakXA2rcqwvy54TNEMDEzH78sA7x744ZFgzOLKhs2Pju1IrvHLdG9hqql+brXFBkAPJ9V1jeQebA4XbXp+bFqH0t8j5lCFmaunwTGlvdV9GHQmd2xQA/jVOTPMPJkwUCpRCoWHqNqX4C3iUk17Y1twmwJ2ZxPWKkF6KyyI4eSquMT14gid6G+CSOxUF0lZL2o+9CWvWeO6sygggV+GfqiCzRmpyj2AXZCYJCo4RUGCBBcwMI8HMYSe2DRH4kezOvJ8sZANseyKTVANFuFAWfgoCxa/RDqhXC1JkJzzAKE+6OI3RvYFI4kASyVwdCxnqdMgoEKgwhAaVSseGu3Icq9TyIujO8ATlrZF/bUNYTsnXYdz3QuqnAb10lK/xhGisoW0XwhR0gWGjPaKrIyP8mbcXHdoWKCou6nIfKIi/b5okFVLYt0eMKyZFGxGZjUbGalsVNMUGsBgpsV+1B0/cChCHQ6rEeRfUiKfgXXPARUfYp7n6Gmyv3DrH6WdHHNnr3aLNvfem3dLnD9tztl1SnL2FcIb+ylvSbg58gq0ULZZHfsami7u5v2x3cf2tFwbt+8vWNlbwbotmQ/vFjaG68w5Q7s/buHdn+AOgnQEDZ2buA6OoBPK2mIvQonAmdLGj3vrb+gU/DsdOEBFpuLfTgCFFZAYEBFEmZJe9g3c+yDfTiZUjpX7XXJQgsChNlyIdUOOpze6Fw9P4TkScePglDnmc2wr2x07MtbBTtFvesDXPt7Z2M4yK4caKSesVSw9rsXE8GuLdghIjAL4rjsEWOj8WSh5yPvkCM6Pwun83Fb+dnkhewKa3hlN/nP1JyCRvjJX8g+la32o+jTn31tn/6zX1QWRJgr+Qwxg8+/hxWR8PnrKvTG61eHL96/ww59bJioHtq3kdL/3r1je3urbV++s2VbSJG5AU7O+4KPothlZREMTAQst4UCdLFQliFijYHvU2U/DIvX9XWrbt+xYHph8fjcUkTPEZl6bHLExvOkQwNjjw1OlYTUHBOJhQQ6NjKCysDDBzMUzNOpKM5VUq3LjgXmw8iwHsH0vba1bbv+0LooHL377oH9s7t9u7Z7YV99eUubaEqSBD6zAnhkiai0wGRt3BdhIcF7FSqhbeztq35VYmMiDtUcX1/gUPEZbO9sWgKjE6xtY80WUhYoVFglJs05VbMA1zSGMyJ0keJALyljQygO60EYhH0xfCaUbnGMK0ISSx0sOqKEjh21ppQqBkWsQbuF30X9BBEqe4cC1n9gdJNyA84FkTrqUelyCGM+hOM5QGQ+huFyNG9mY4SbwirqUXBUHuEuOFK/jJoZwJd4cKK6li8aMut2S1sg2haNgQSH5VJZGQ0w+4iYrAZIO1fGO1WmRwUClLenrsZAx0e5GTYXssF0skjlNAsyTgvVD9Zg0LYB9548gTOcongfC4uzc9Scysja+8NYdPEi6jChenQAu8xchjRF8FNRY2ysRsEZafnsb6qG2ptaI/UyJaw6uDob/ouZC+E2sfvUh5bq7NB5FBjEUIUDh4z9QcxDfc85UTpwqSeQPMNsltCQWHWpsh5SvLlOUeR6p9gz9eFHDywtVGHQAZUNsdJwaOMF6jOtEqDKsv3O2zv26q22fefhMZ5lBVE+6qdkp8GgPz0fi5XWKnjKhh2JAo4cGZUYh0AAFuOBhXCyBWR8v36jpn6YKb5/MozVSLvfrii7LJEij0BoA8Eas84qso8JonfCoCVks08HE1dPxLPaperBJLVZymw6Qo2lKAeFHEvPvTejmoWDvxlf9fF+wXwhaL3sZQrQOuXMqaAgQHip07G1ItYTyMOfHnft9x+eqedI0BnJLObozcrSo+f26YKoQ5p+wra5TCeTjXGqBt5fmHDg5Y6Fdb+Pu7UXfu5FE+t9PGMKP6sX5/OM84+lofY57/fzxoT79Ncnnc+L98H/LuqQe3YwiOzu6UgR251m1f7OnQ6cT9lGgAl6MA6Uf2GBnYVbOiRCCwzaK4AC2BPhBaj1BIif/KmVd1+xIg1fsWYn9/4caTeOJ2pI1E3jgZaUAiFC6jhh0/G9aTRm7KtgHaWQCvoqVkjxnSKqRZG50JHcSYgaCGsH1Z0m4LgRNQqstf+y9SZUHJjZ8dy3uyc4eDXeV6rMbQinskAK78Foj4Yo7KN+MkZUxobOUnMLcN0hakpncBIZoJy6jZF50nBmcJisR0W415Q4dW0DkR/JFFMxx7yEBjpWFEeDlVBvDLBgjEiftZQ0N+4Z1xCF4BohQvWeZIq+ScmmFA57aNjnRLIBzBgyR9TB6nAUoetArzY2nYOnxBHrRsj6YoT2YYbshiyk4SEK+n05TT6UoOCMY4AMNKh3EBg0VE/xqrvKRGJkT8x+fDjSZDpW5lPAezEzDfG+S8KOgZOtYe2PcoLVak2UXu0jMzkHEge4D9RsikCADaCU1SHUNoXxrNULgL1im8HYXd9oWASYhRIyg+7Upri37WamuhbXnfDoFAHNxiayVTYsI1OcnvdEXjieFezrL9XU7EpIkjg8M8FNPKsKanOCQBPH1OOak/xA58Gag89giZT2wDmeSE3RcOqzqavh8H5iB2uHpKnTtnCN2QRbDAVD0SEJgUidtRSrXUVxU3Gdnv6kl9jx6cROUWhPsCYLTxpF1kZW3AgWdmu7antbNaxjaN+F8yU9fzxL8XvsF1tDQIBsF9d2u1XBDmAGB4ONvdJEbauHOlXAIC/iHsL7tOhIIxj9BrKVgj0BpLW9u2HpwZmtA9pDqoWfC63WIGoxB/wdaF0yQOpzPH/eWxu/12nVbUTaNSFQwMNT9q8hy6mHpJIv1aPFR1tXg3WAn5tqHSrYp3U8R8Kl9EgZtfHwvFpInW6i3lqCE7o7WNi/eO/Qng7nkuNZ9R+uzL3/aSb0Y2xj+5h8jqKp3Kz9he1vnvD4Yoh6LpvJIfRUdarcSdoLiVFOdrjKgvMoRvoiTfrnWbXgZ/36XC0473m96OPEA/c7PJTtUqgFJ3X0W7c27ddf2kTWcE3yMDTWhDrKlaLEKgUFIgMK8w5hwR4wdtt37lhpbdMKu28qwiw1WJ+AQRgdqyA8efznVkimYkjFOBARU3h1QqdicMU4YB4lc7ABRqcnikLjZSJnSGq4F8dOzoaMntFcBt9DNE7GTQEH8u7hhb3/qGtfQr3Hh2M4PFvYE/zc//Y37qCoXbPHh8f2//if7treRt1++a1du33zut14+2u2OD+04dMPUOMquCIs4Rzc1xzvy2i4BsydMivVzXUYRBT94VCpFsfD03v0DmpTOKBYHzHKua5hoPpHJOccqvZAaIc6VcwqIlid6PwCzjC+rCeQQmx5/4L05WpwQiQgNDq456q+F1Y7qCFtwflWpASBdMVKGy/L+WS9h3DuQ3d4s1BOilbDJ4sIDjPoXMcBhjFGNkoZFGZNy/5TS3uPRT6IEYHHgH2YIQhuomzOlToj2XZlBAjMPvmM6GhFRU1ccyXZaEsEIEgQlPkwYmfPz4yU9WLe7W+un2k8xfuXA2uinthssy4XS9uMhAQqRTCTIguu21tYowGH2EctL4pUqN9A1sQ1IyzLug/3cwqHdR+w61t32spgdO24JjYuM2sj2YMOiLAbHTJZisxgqOdmubMinFRiYXmFlBRcFkTigSSWsGdZF1ow4pfT8UQsIMxEwcvz7sy+D9Tg8TkhU0+swFqYKrNqBZHtA86+sdtWlnc6GNmDs4k14BwG2Ncxrut8XgT8PEOWMUFwV7ZzOCRKDY2YYQOO3YKTuBiObYrrvY4s6suvrKOOU7KdTsH2GjU5z99758Dg0y3D/So7XCxExkiXuB4EM4SxmdEwQPEZ3yFIonll5sY9yHok93RYYs0KQUnBl2wUJbIIhY65n2EP6Hgn46kyH2a7qoMigGKDN/udRsu5qNt/0pvbv392bl1Ae7EIG5l9XsqySghehLt0bWLprQTFfjY1+CB9wW4q8/UUfKlJmqAtnheluYT+8erZqJzldY3V539eH9D/UhzRZ97nFefzWeuQt6iqqexVQG3/6dvXbW29hqxnCENL3N05rhhpe63hInvSwUlD7p70RTSorLMQCSigs4+HQegDRuLiPkXMFOEvekdW3nzJ4osHMHBzQRcBDDcNxpzUZEbeHvXVPDWGtrd2bHTexc85J1OQ1yoKiqFUDA1ySq2wWSRNtw+fPLT7faq1ZXbvSde+B0c0w+90WGxFhHY+GNjD47H9/W++ajsoch+OM2R0A9v88M9s7dYtZGvXbXh4hHubqKmNMAEhN2Y+7P4vbm3K+RgiUGqxsUHUH59Zq9qSEfIogcJ+H99RTUnHprfm5ZIHJ2PIgxS5nqEEcIeHbEgQEBs/iSPDcNIYcL3IRKNxoLGkVpzED4ePlUklMbKA2jYcNS50eCwju2QGxj4fNV4k6r8pllqSyQmYLfK6aruK8LJsbMn4yFI4IGY+KcU4p5kysCxv3FiKDZfvD2bHhKF46BkEUEgWK03eSbHksgMGEzMEL2QY0gEXiq4+VK/6CliKWCcywGJki7uoSfCAU0rJz+tfk/HCqoCWJjMqGy/FmOrA+VycDayGugUZVZ0WdcpcsyhhW0J6YkoBpry5kaiJN8ozTundsc7H65UStnOoqlHiSND5kDzguRKWY2eRWEAqtejDngQyGYAxMGNWRKqy0AL8Lt+XkNazk56ddCP76GiI2sbU1nC/b252rMaGyqJnt/fbttlp6+e7yLZOUeMkXHZjjUrbE+tFoY2RqaCYh31MujsDsRGcS1FrtA0Y68lgboMswPs07INnF3b7zS27vla0rQYyDpJPYCDffdi1BweoByI46WBf7K/BacQVOKi6lXDNZJHOSZxBMBDNUzFTCeexdkaiDEU7FVlgSzHTWmJPUCg2YC2Lmms44wkguwCHg8olDCoYeBBKn44jKYxfIANj4+r7/ak9w5l4jGfKlg1q+TFgSb2PF6RXNsudgeTyeysz5ZrofWWuif9Je/dTvzKnYvBiTYc2STVcbGjq4VXZUK36IbJw3FfkP7/mSxVsgq5ZXgN6EVZ68YdfJA18Xk3nF9Fpfea1kwrkfVYjqidJFWovFfHf/6vX91Bo9ZUiFwpUbZ6qEZI9FIWCJyJA7DvZGD/X82KE6OEBxTB2ZLYF0z4yIsAd9bYie+LGrNUSHqIhNjZLslGT6sIU04ThGU+6ymKYScTY/EUx6FAARWGWmQTxaA/OJMb3aQgcuTmV1tRDZDrfP53bb725ZydwiDe2KvaVa9dhdIr2rDtCMRiFz6c9ezbJ7G/uINLsdm1v95rV17aQ3T0x//49QQgtRJl0EDNG1+2OiA2ltWtWRITppzSsNUkMRfOBqNmjizPXO8L+l8ApEbDXgtuRrD/1g5prysxQB2HvA++bigmBsi1PcA6Zg2zSYybHJzjHga4yEq37olNLIgaOvIwsRtBXMqSHhFMoIZKF45ueCdIjGVySIdoHVFjA9SN6NdKPw7YUDlKsZ3byPc5BQJYIYw/4h5RekgXcNAJHLWXTqjPCDm6L8iI7jT6fP9lwpMVKXRvR93Q60bMsI6vhvkjhSClMy13HvcLmREbH/JvQHEVLy3QIhHSwx6pVZto9QXhswq0o6l3Yta26ImCyAmmDXE8Rsl5q8rGZNyjImNZqTirGMRGzXEXBUX5XRk7KB3SwfuLYimTpUfwIX6M+3ny60DOhAfLlcEXlVH8Ma5Qs8ZHZNpiirgJImH0x37nfl/7aFOv3S7db0k+7vd+Ec6igJuoo+V04eSlJ4Fxdg9Mg43CKLLSP59zCfjhfom6ySJRtX2uGNgKEzQw2xJ4bop5D6aEpzszWTtX+5psb9tX9qtVw9Mp8ZB5VCnw7Q7bxtVsbtt5omUe6Nj47xLkb47+fsVem4OR2YuxpxG1YR9TUsA6HJIQA/nzU66LeVsf79O18iAyUlH84mTq3epZIGaKAjIjin4S+SaNnKkQViik+h8SOA2RoH8CpUm+PygmjWeR6zbjKaWIrBfI0fZ4JfbwMkldhclo1rRBVDbIfr6Xx8sXMJvU/mWuJjm9uDIWXa2WSHUqGoBMrNdX36IzlrAsFwcERG+l1eXkRPnv+ho6AEH56H9BVyvRnabW9+PWrv/PX4SXR0St9QFfvew1FzP2NFjy94/7f6DTtFmo5bYRvXGrpaKl/xdMf6rUFkq4JFS0yI2J0wo5+drjDHlp99yXLZqc4+Ci+47AybWffjsHBsIM7Zc2Ea5u6TmgSEZhRcW4Oxw+w50Vy9cLjXe8JI1EWkaNkrj4Ulz2xr2IuJ1ZDlPZLqFUFOKhsQiRdm3rc7JGgjD8Lwx1APFXATuxrZOTWO7mwZNS3/Wtrqt8Q0qEAZWQC+6U1F8AJVdvrliBDo3oCaaRBe09yQJOjR+L/k84bwfgWOEeFuDCdFzxOSnaW+npiKQ8II3dPAHDiWAchEHnBIclBPkJAtHXCI/ibGZRapeio1DvFLHDqWG2ikcGBTM9dsZy0Wb+o6D7ISmI6sVFViGu5pVpbPH5m8fkHllAYdjyVMyddWfvBXNaT5rI9vubbRIKvPOeZnJKD5QKskkzynI4d18EPVYdh1sEMlXAVYS0+00TqBAmytireN1LvK7XJsixyOmwkblCRgNIyiXOshHOYfZLJpcyLn58TAhzNPZMjooMkFEwHyReNBr/mlItjUdyjKMm1DhM9D9USAu+SyeTOhSMULGNH8RVcRzYeDSBFZPHzA0T2R+cze+fDM3s2iuwHT0f6egmO9Mu31myvU7RX99fUq8QgibTho8FYZJMd9gSV6Hg8QGlzuxjEkt+hsTvtTWwXNZtqKcbvdqzCOiOcxRjPY2trHb5vYevl1L75WsdeQQ2pjsfRkHAsJY+K9uR8JJgsnEXKygajkS3wHqzrDIgw8ByIsVdEhgnUggxDBKUP+5ylM7X3j8/teJGJYh0GmZQYyliD9VpRz4oMSrI7CA0vcb/ncF7buN6LyUzEmlf3WvavD/v2EJkcoc4LZD3MGNIrUNrzRMBlHldrPKLse25Gz2pOT+Asvmqez+33j1mrv5rZKNvJRUXzOrcrI2VSfAiEpDghZvIbm2xwxbqSoEFKyRL7kazLkkSHU/d+Xj6WISci8N8/Fg37atr2eQ1Lf50gOzbweZ/SC8Q7/N2vvG53Hx/YW7c37Z9+G9FneYFaSVGHk9RIsrHIeCrBkBWCWNEvY0bCF+z7oWqBrxkgOCC7d2zt7V/Hz5Q1FiFmYoDovEp6ADEt/EwRGU5aitxIhWLTolFPvSN+wWUzlyqShE9yyjkhFTLl1NCo07BUJjHqLRRduz7bpeRF1lH4JCuvs9aWYT06Hdga7md9o6N6w+5m206PT+3r//H/2uanj6x/8Mz63SEca1GKCxNAjiykMq0OO9twqqi1MAPBZU2Q2dC4UbpmdnEMI5xKrTeDUxMd3DP9PvXRIjXKItJcugg4YeEbB5JQEC7Uqo2G2HFUfOAgPTZLEtbI8s4G0psDVqeJ1fsK2LFeFXXbq2irugWM33jsslA/dl9LCS01NEaIDafMsgiV8cAtew8As/Wl5p1KFFWuVjALs4C44M7HFHBLEXgH63BhngWx7uHm64QyzmKSkU3HMxjTWTGUDHQ4KX3En02oNJE5eJFGn7j6YjZWvxMPPiVpZhMnl8+mRTo7oo4FqjGwz0Kzc5QQaf8RoolzJyPJFTHQHMzHOUrq66EqNZ2mxiNkUrmmggX13iRYTiNI3Te+BzO6zKk2rAaVpWoidtg+V4VMQ94r1+D8bGgPnw3saXcucsQEDvXaRsMacLS7dQ8ZdRX7ryUtMj6iC0Be7KParOMEMJMhuYJ6aGPSBPHMsY8IMb53OMPvImN/pYO9Vde+nyyrjAZso7NmI9SIfvXVXfz80F6D8ymmWGeuP65hAAjxB3cPbYyfXcwSOTikTQrMOF5kDbCY+smSQDXWLhzfKArsGZziEHthBQnXqwXbLrh6GIeLcJWpvHKBwHAwdXVaEk3I1jvsj5AFBRLx3WjX7Ga7bO+cDO0EWRYDtAFgtyR1dZKrZYHnDii7fIarenSae52VhNsqF8o+BcX6US8/c06Bm17/7TuFl3LoZi+pd0r2JlM216GgLs5nUUFOLPXzc+yEKXUbQ08qH8zyv75esT9DfW/xQhsMTywzxB/LAf2krLfPev1l1pX4vrdv7luj2bbvv/OO/YVf4s1/8jP4OL/94X2rkd7KwU14+tewoVqIeijwSF05GnFCYSu14IIeHKIpbHyynsiIYnzRWKtYYwc1klkP0QQK4M0dycr70yHqN4hqJz0NQ2PEni0mPNqUKtZDj6cjhIEzRasarMZGN3MMlFRpeyCinJS2k0T0XurQ9TkOARE/MwVScs8GbMzDZsPPTU66OEAhjFJqm+sdDYc7RcbDpaBA6ekPv23b2zjw2IFSrYaRpGQ/e5PIaqpeu4mCfw1G+1AU1iWvL3Z00QCGnZRj3ytLYDOloCrhCBiB5dzp1xXXti2o4kAOu4r0S8ik4sLAFoAoSllFBp9RORlkrG+xZhJmDqpiZsm10AwcQH+pv3QioWTkMKrGuke493Ia6qDxsPthrAyNDKnUz1REDgDFpGFVahRk6lEjLh5P1FTp5aoNnITql30pHk/wfvz5KENmBCwfVWysVc0x3fKZPSJ7GOHA0LG+pHjtemiyfIgf6y/UVqNTEJOMat2Fkmp9zLB4d4IU8cYcvMYf4vdCOCTGH3TEtEfKzjxXN+NzF1swCC4nWzIYyCQMG8nQJPm8IUGISc7SI6uOqhowPPOJUzqgVyNLkTpwqXp9AtXrqIFXKHnS5SsgIFHfVGKivndHU/vgSd9+cLy0Bq4pgsPcq3M8A4w8sLA3X9+XyCk3SA974OKoDxShrMCPE38VCCROJZ5rMIUjpvIAn+Cvv7lmFUnhzKUYwX3RrODswcCvw3mMwsiubWMPWUdrxrok2x0mgKn/6J0n1kOkJwkk7P0lAhSyTOliqe82AQ41mzjhXywDnA/+wDlRgX2/VVN2XWLjMJZsRMYg1mmGHyT+scA6sHZURU2JjegcDhci0LlO4kipqMF+e82C/d7DC/sBMjCejWGux3a1t/DSDGXZx/6mM+ArTZ8bc++KyUrt4+rTP44T4j5g5krVbTaZc+ordRx5v3XaLjzTVOND1Gkmod555oYeTrGPUJEVpE9h4irOZTNkj5RTQUGYSewiFzvxc3L/83v7saV4fhaO4y8zQyLDh5nG4ydPP/ZwfprX8+jjk5mfS3kD++b1TfsXP3yEA1Gwv/vqlqTn2ZVOOITGkCq3hCFYI2DTHSXep7MZMoaa+jEmiOwaOx1XHEadwkOhPkJxfgqYp7J507x5z7GJpgP8cWKigrxosEqo+cxGxmnqlOIhJMPxyG56phujSwLBAsbQV/OlU9BmlF2qVbUJGM1P526T7CDzIVzWqJcEoXELs77AzIM/PwXkRjiOETYJDsR9FyNKjCACYhaD9y8D9ilt7tm8e2DLcd8mfWRzc87aSdWol3lujDAbHMneYrHdOOmT0fdi6Zoey3iPVlsjDmbA1pMJMiPCKn4mh6EoL3MDrlT4zPtOXF+K6QSyQL9Ur5SnJsRMI5HZf8IsIVBW5kZIlAB3tTXmm5lPYW1TopUxomy/uQcHs4ZM85lNj57A0ePe2XMlfJz9LqmLeP2KRYU2aho+Il48X8B3zJ0II9IpF3J4UPRmcww5kVKoCUbWHD3HKlLNRz7LGbGWwp4c3oPEaEtObohFW8/JE9FBjfCMaCjotPg+TkA2E7uSJ179NVQbj2INtuNL/524upXWkl/MHMavDIZrmVPF1QVEVQRCMKWimp+TXN+MzjXVUEAnFFsCjMh9HufKyseo3Ty8iOxwwIbRkmpEdzYBg5UDu7PfstdeuqZaI8dcHBx3UVNbapCcCRlwbLkhshNS2xmcLJGNNOHg2AtXb7i6irI5OOmL3hBOqmHVCudFIbCrBhq50ME5YaaZAL6bDCd4v6X98YcHNgT89uBihGwrVnY8XCbSGiSVmioFPQQSZ/heF7Wm4WiuAYuNim9LIBMv3ViTnh7Xh3N2iDTEVMMwN9WUZ79NFh/Wa4CzP+f47NAxTl+qFyRn9P/63oE9GSLw0zgOt+Yv2p5P//dKecX72JTR/BE6QdGfwsayxlgmFMzeLPybgxH5DEi84UiOp4Ox5hoN4ZDHgPIvAM/38O8u0IneknOVYkkVkS4+xdbqkh3oO2DmGHuUGRkH9TVx5uc5Zd9J8RA08rx//NcBOuPhffO1V+03f+WbdnZ+oa7qv+jr04bPceWaiP4/fHYuldu/ASfyrZfWZDjWOnU3OjgXWqzVS5q/wsxnvpiIbcQfjJcwNjiQHqKj1s1XzZ/1bXZ+3w2aq3UoqCXJeT9FBoFsiLCPZGew0Zl1BGy+FFusLOabxiezqJw4Zxcywl46iqifjxOgcaKhms9iDRBrtxtKsVuNkg7IBsVQPTful1MnCzTkiPoor8K5QIxjVGtIHYWYDbSsuYQlOCFmIoA9vOVIbLj+yUjZTgURKQkYZSosY0fO2EPkOQiI9SuvEkqclDWJsNPSvTIyL9CYsbOcjEGKcDbauN3EwTq5wWb0ykPOrCRm9kchSs+N+Ha1F1df0RRPHApqdDGLYZWLauPMJghTFVj8r7Wc1l2hYX77tmoz6eAAzvSpLfp9DacTyElHCEeasPYXduxsikgP9YALZIE9QCiU74+DkqT0I9LPcd+EJQu58oEjJjjdNDV3kvK8dOQA/vcK0lrBLM7BukmwkszR/a8acBMdYMJGVEiYw+nNJ3M5eMol8VnPOPcF2dsMMGy/P1ZjJiHgUa4wkOYd2vybyhG6Ljb95qO3SyTJ5NG4a0DNLvtJimLSefnP+moSZq2Lz+MJzt+T8xgwNft1YjWRriGz3gX0dvt6E/WZDWXoo8nYHh0c2QYy7UCznTyXUeGyfv+DrobjrXOPLNkfNbT3Hg+lxBEUAbkhceI4kRmpypEbGNeAcederuDrNc5LijkxdgzYeYh7Ce17T0bWX4b20RGCqMg3DnfoUaZmTvHVhiAjTWmlAK7qFu7eqUDdhWVtUlEbAcsPHp/ZOA4UdFKUd4w9egKHtcTv9bHGZyjhPRtMAD/DqeKw3cYZ+/rNTfv28cT+h/vnajhdkYnS7JM2Rj1oQWD2sTqQ8y1XoTXtqbwpZ8WTWzWa5iMb7ccB4HgNBJY5IZc1LzoJjpeYMMiBcyGjjdOF6YiXqSPVrHp/+KGE6WqoYbUQHGxVS7qKbaw3HRlHXzB4XpKIkg949PP6JK83/Dzn84tGxf7Bu+/b93/wrosIf8av1TpQQ227VrL3AAvtw1D/yu01ReOslbC/YarBUyUVd0dSxKXhR62nA+hqOnXGjVEMHl4ZDysjM6yxpqmaTFEL0Qw1kL4rXhcrwknZgEo2TLqcCoNNEXkHiPiItS4mfQtrbbGz2KdCyIu4hdhkbIDj4LosZzblzoUwUOpRfJNDt3Dtay2HYPvMGRALywgRw4YRb8B4UlOuWpRCge9N5Oyp/TXXCANcdmfTapu3bHL0oTTRfBppqizMYsnRR6p7JXKwQUSW1lTPqFKoaLYPFaxFNix1YAA48SRQQZckAA8OjU6NskRFfNgS9RsvL8CyZ4UwEY1guRSqwC86cFoQpDWFAy9yjtCM9+K7cQ+Er+AkSEX3YscUDBrXLarUNN48nVyQdmjR9AJxQNeNaCC/ohCoHsM6FQ32MnZK2SSbLPB7D+l0OdRuOVEkXWdNAhFipVmW4ea1FWDQk1xlgf0fq6K9xpCba66lc6Y6wMph8YzXGxV9pqDDyNVrpKOWkwkIabKWM1smeTEA2QNqEI2qIy/QwHCMBhU4RshcSYbg6IUZvs45ObxFPs+CxmKkKiyvroP7ftWEKrkjL5BKgvquUkc8WAnCMjoZYP/3BpmG9f3Nr+xZs+4p8Kojk3YDBQOpkF0MBjbG+bgOqNeT8ncm2I2NtjPs1wqh7U5Dc5MWiLZPRyV79cYunCmCGAQqB91AmZCHjVNFvdJH+L9AtF1hYGUkUCzgVGfKdhmkvfd0bEe9qfWQDZXJOmSAmFBZZAnjWZLKBAlFFzgGnFrKnizfc46Yjb4cZ9A/xDPusik6snNcw4OLfLAc6zy43jo+p4H1aOFrDQRfnCB8iAzqTwEt/rcP+xrZQLks1RCZkjuP8gkbs8puZKTzuV5XzfAK4RHxxXOEg+BKmUTEtEvGmXdJLvgsKC7LHZurCztPR5q/fzkJ1VOGzKyGGTgHObITinqGI2SVFNZdpqrM2iDXgBy4AcWC69jUS1YlITraLM6lWhD5oL35PPr0T+N8fpLC18/6xYjvZ/PKPrX+ww2xiej8Q9RKKljIv/f6rl3bakkNm6wzRonrOAA8UBEgAzYF+jIyDifOiGVjM12cD2x7oy2Of4yipp9FquEA0LeAXfdc98hpODEuZP8ISQcsoLIonxXJNWaEN0MG0hAjLsMhCliQTjg/HrUNOEQ2IsUwPAHgoQgbgYVVil9S8oQQH7OcGmCKJZxXkQweGOcZDHwBxqC+2bYQRmw+GlgR8Brpvd3jM0X1PCBUR6hxREPAhtN9RN4zrdlkMHIQUTFypAoY8zIMYYLryDiqgM2xuRFOkDl46ygQ87o54DSY6+Sk41OREjR5lfQ7vvEchrO9CWM0tGDpiTnm6EKWH0IHzZFNRDUDL3U4Nh1cipoV60KM3tlQiF8G7Nm05WBoBTKJKmtyEvH4UOoG6ejU5sNzyeywUZTO0AtSOT2yCZk5imrOpmGPZJFYB5ZjLvrIfN64hTUN8Cca2YR1C1yrnBD17ArOCTGbpDH3ii5uZUak/poc5mVWQ/IInWa0dOMrGOVLRZ3FdBopL4dvPNJ7Y9frhIPNGiObn09hcEuEBKmYwegWxoFZ5BDXQfYXf36BbLoSljSNlYEUocboynBDGrsZoOMq+7UkgxRrn6v/XaM2zOn35Vp2z/CZ+9fK6vPSoIbA9RwFBQfV0dE8OT5GHcu39WrN1UbzJtWKhgFSMnBpv/T6ml0ME3t0zp4aZNPl1N69e9deub2j9azXAAUhq5NM0YTiuqhbIsMq4DNY56GeIg1ejPMyin17dDoSeYVMzD6yH9Y+17BGI/z3TazxrTogNhjQtXbZ6mGmNeN5PxkiaMQqMvCY42scNudVfaszkqfYberEg3daZRvCobVQETmcpPb9cWr/5NuPbMAMgj1QcEosecY5Y1IM1dzGXDocjpznugPNoIIHg6ksb2p2+8J3qhmXNskRBzI3m8TRpa+Y3swxpC2nKNkV7uLH60T5P7KcZScHlqMhZaxhrciR4rj/JBNs6FEd3Cg0u4Qzp3NJAa/5up4qafBmWpcC6qSTyDlLnndmpNR9RCIpfcMpa5irm/uLvq72Cv0i9wStXlcZcKv74Bz2Xp5d/Wdfvmkv7zYBRRX0hDnxkMXaarUsJYDlmLBIpOIoxy1cdPuAHBCVNut2iOIjext2bm8imlsocisydcXGjvojF8SisOolbuqpDBCcQMzmx0pRmYy3HCszUKFbOmdFKTuzAY5R0xLRJFUFCGGxlyFFLYYDvtgcR0k1Fn831tqKVKOsJHiH2Hb7+p6NT45t1h8A+mrhQHTUDrUcIfqrFiTxQ+Nf4jgcjj1oryua56gFMgDnHIhH9W7eD9lFMPSjOYr/HLHAQ4jrIWVcSA4MHMcmpEGmr2Wpmw3EiZ0+MhTOsJ8X4KAqDRm7Re8Yz6CiGgw3NyESOY440sHO+KZFTz09EvakE4MBruA+PbwHbSHrPgnHmzf24eyPzT//EHDMDPd7ZPGsZyGjVGSVmozqu5LuAtAW2VJqJiWeXa/h+eEQJlPrVIsyROF+U3DccTe2j55cmHetDSdQsj6cLo07mxeZLUnMM8whFN43DD5Vpt1yhJLuoYGKU2eQmL3Q6EynzhAtSahYzl3GsXAQGIMayRNx/ZDJzi661mk17fHJwNrYD3TE3JckwHDgoDfNcG2hLA57xkQBXxWwYye7w+ynWHLjt6W6nbnaUn7KleFToua//r0n9o9+66Zo8Oz1eQOIAA0UjT3v1UXmbjAhJ28SHt9Zq+ozehcTNdl6K0IFswPsgykgw7NJaB8eDO18FNtb+w3sVcrw7NtoOFBrQxeBEoGgOvZ8I1nYVrMl8VKq8S3xvCh1Q2kmDof84LAnVmoVG3mKPbhVniKIKdhusyRDf9CdocYxFRECfshut+DIAAGXYEwnWIdyIRHxgOt1EwjCVzYbyvTOcL45S6mL8//f3Duxu3gfPtdw1UuFK2w2EChhLfjzyix812LAbHSV6YoqHwY5Pdl3zcx5cuTlWZJjMMaXcNzVbp3PMrMMfrXPsrwhXs/PlRFEoMuzntX3CdhxWnMBXy8X2b6Rar4RQBAEIEA/KDkFW7OBe14sZqrLcl8zSGKGzi7DM+wxwbb8Gkeg1xxJhvA3a1SUG0oTtz6lpVougn9sP8brJ4XjfnGdUD52e6Ucmz9nRR/E7LGQL7Wq9g+/+bKyjQqisyaHgmlMj5txIhwWm72L6InNnGUqJdMR4bA/A/7MYm4LBoEqBYwAaEQ5c4XGw/Mcps4pP5Lv52wg8tu8XKE4dQbCA3RQkH7aQk2ezBgI8yzh0FRrKjgUmNkT02peJ41AgAi8QkVkQAQlNrOSdZQ6xQA2Q/Iw1DdQhK8DGiHtlVRtGiDAEk5k0tGJqxu71rjxtoa+FRu7gLJ6MHATQFhja7SQbaxdU8SeAK/36xswbHNH0w5dIT9Sr1IoiERzYJjdUeKFkCPWtYDf96OpskfO3FFPhRcLLgqx3qnbvJofQ6qfR1l7HIyMUN3GDUvqu1Zob1ipjdpSa19/bOvLlrZumtfcQwYEzP/+H6pTP4NTmx69a8lFz5ZdGKuaGxE9P5/goxeOEFAsq1uezcELZDopHDHntwD4kVoyxym34IxquF4yvOoU+MT1VsmkR4ZLOEyhauY00xxRJK9d+U6kcyXhw8yYKg0kDHA/UVyVBj7IHQWdDuszS0rhzPG86iUZAcI77CMp5VAf5VCa9aKIJVU4w3LZqRG0AAvW6hXR1bkHyiUna0SjyKyK9PhS1bUVsAbIzJLkq0BS/k5Nw+nHZfbW9Zpo14LomHEWAifro+bZTEy/MSKeB4fMKJe2t7stOZoRxyJgP7P2FPou25iwLkiHDJj2fBQhiKkjcBvbl252UHcFrDhe4m9fGS5HJPSHSymbM8ulfJJmRKVLZfOkDXNg45OLkZ3i56ZwHhfTpZ2jDnmIQPCcUDXnd+G617E2a9iR7ODfoQrDes3WGw08M9QysJdZT6ZBbtfLGk9xiuv+8+7E3h8n9m8PevYvHpyhHpjPTyKkWnBZg+jtZAQyEE2dQgi/luWNy5qy67vmZZELzCkbrBhjXt53E7wgA7aqE12SEexHvxzjLHCkF3OZkeox9pxc5ZyQDJKUUYp8zqHJmVPklZ2BJCINkREnsDEDNp7GqTT/xnGmKawMVlgLehk2Uv1Q+Dl2BtERbeDZbQOKJbNuzACHeonUgrO/hNcvrpQPD80ns5/9nR07u7jQBvk//PqbSMET29msWadetVaN+HmgiJEWgnpeh89OlOYzWqvhMA8BF3C0MaOeDp4UZ4FwxkoFRmENOHgBDilUt7zrcmetIs4ZXsLxzZzUDCGXzEE+pnHPuUp04rBg6W0ljnJLWjiFMdktH8+RoUgewxkhDd3keF8USEkQoP4YhSqLm3uI8BsanZxFrIUMlPlNAVfRkfE9yg1kFK0tHHTAOOWm5GKi0ZEthj2bHLyPpAcRot+2ytZtXNvUJheH0mGrNDYsmZwAcpsJEip7HC8B+Af359XbaqT1CmWpDHuiRdcA0x07py44IdLwOzan0PmqMxzGo7T1skWNGzjQMBD5GAoqF3iCzOYaPldob6H047Tpood/aMvDj0zmZG3dxv1zCxeAaIZLGUwSI9h1L0NBo1zrKFJnBkQ2VxEOhdDDEnVARn50JMwO0jCTgyI7sEdVChJNyJjCNWy0WLMriRxSqrnJr4wECadlolgHuc5aRdIlZHNRUsYR24jHF1ST4yhyjlOYw1izUXMZB+o1o+bcfJkq0mRRvogAhMXkCq6zJIwehgT7zidzsey026Yo4M8R1WpIHZWiSfcOXWeGr6bV52wrst/i2VJkF/aMifRCSJC1RmaWZVcDXcnDyLjhOk/hAE5OenZz/xqcNgwXFT6WqRiiNKyqjREqU1NloDEeB6izLPB0Ls56trvbsU1kKs+OzmmsDMkHaj4tO+sOrYPggqOxSeQoIysfT0eCrLiXM1zfyThT/fViltlDBH6soJLgQJIAs4w3cO66yHqq1GNTQ3Si2T4Xi9icsAXOJmtKcCgPzrqA65Y2w968B+czYfNqfs4uIcgcwqKjJnzFQGGIjIBryKBzLqJGoD3jtPUCNQPH6XPygdMJdM3Drvbj5bWZ/GcYAiQfp2bbZQfQp7+uttG8COVdRa7I2iTdhvWxOgdbUqcSwQop2FyDkABDoaTf6SKIGCw57qWgv3l9bNXgDKoZ9x/2b40QHuXEgORw6OJu2VeTKuW4WJdO/jIH0v11aUpdPbiDkxP9/Z+8ecvWsYu3OjDC/lIGSVpiORWFpAMeImqiDWGgCGG023U9gDmgkTai9HolVLd9GQ+3hZReMjDmhrKxTyOifAmL7EuOHga8w/oOoKhQm2+uJllGUjzwbIhTTMMImNLojPyKJc1m4YRXNr9GM2wrGH2OW1azauCpwZBUywKw2PGwr+sMYESi7gn+m70OjFsiqVdr3gsjOkSadWQawfpNNcT6lA+SRtZEygn9B++JZprBWPpVqghg01abRqR/OR/qcFWaW8gqhshu2GcxVsMl14zY/SLsoF7TdDIxyL4qMDRe62UZJ8HcHLVQn4olmFJAlP0J1XXrJ03rP7qLmg6gp7UN27h2S/I5jIapkecH2PCToQwVYZ5seAaHAwizDiO/nOLnZlIhmCLrC2vrlsHpMpjgGAGSHwqokXHWiufTiReF6QPLQ9DQxX2PlPUlqLNlyEYCNjADxlpLXH2E85kIDfJgc8y1xEiXueRJKVbtkKxo+lI2Ck/pMEmtZx2IMCoZjYTYsqHosqxtTPK5UMuIGSWdAA4/ILciDT8uzRE8CtYg1IPnL22ChWNFlspl0adZ56kgA6jj+VKBgkaPWSgzkCKnyFI9F2uX4LnSqBfYLxUWlXWGamx1WoMlQK+VxppNT88uMzmXmQIB6A5sMPLszVduoxYzlVYgVcSTwJEl5OwKbpx8hVlh5snxN2tM1fGZMdVFEnsP0ObX9uuoqcYaqcH+sm8/4DOZ2W9/edM6wIjmc8fiI+pQQK2zh7rQESA+sj2Zb+9udewA7yOW12SmM/N9OCVOC96EoxxeTFUbu77W1ERWatkxI7sHQ/t0NEdmmVoPWc4smsjZrIz/qmdH2oX+qt/KxLJkb4yALXyBsPyKrsZ/00A7lXBnZ5gFkfgg9CMnoAQrBX5zuml8cetVqmVlmXz/54G++5xApBGqEniOLII/hMyot8h7oLOkpmKbzeKcDxW6mV1sFKWUmGMkpKpX9bHPZouFpq9yH7DWXWJfH/sLOSk3LWgqcJnzspTt4xo4Gw1niTUyTmBlIFjBuugpZIHrMUJOdDJZqmzxM3dAv+j1n8+77gYi8d949bpVkzEMz9i21tsa3hVKs8JTdEPqIWmwjTrHCjvRzCdPULugyi82NRk5jBTKiEKriODI8uEWK1Ry+ivZX+y1YC2C0iy1ukvlYeg4IZSRnppWqS2XR5pJXpsgls/5O2wKZWGX6a9H487I3K9KcoYwoejWNISaljlTIx8jIp/K0shqlicPLdh+CdkPrrvZdlEtfq/G0QSdGzLCQZXKAajHYIMlMC7ppGctDkWjEgOMc7l9Q6rTs4tTK65ft2B0gUysadnsXBkQ0ijVaHyNPQDMhOyluP0ajHVZ9ZcItZCYIw+KFWWBkvIPUQcLYKDLCSKwnqUwOlVpfw4srKzb+TnqbAePbTTq2rVbb8DAoviPe6DhiwDnUeo1guWv3fwmu24dtFcko69qyz6goFe+pEyJEkjhvGvZ6QObHd6TMxjN5qrdsGepQMXMJUHSRJNP2YMy95B5AbLpI1PkdFOOR6jgMNcCV4Avea4pVoPr2M8VS90LZZzUMa4YgJCBFXvKZkLUDChYOhedGpH5kArdc0EevIZdZNDMbhN8PjOY2cVAOm+cmVNvtZQVkxnHEe7UZwtrhctaAW0MMx4+c0J91A2jE/IV5frqHyNNmT06CbJUQqMDBFPNWqARCLVGSbI/S5FKUnz2iep7orxL7qkkkdXT7lT9cAyk2NPEfqKI/WT5iIcVlZiZf6aMoCiD1QQq8P6TCZxGS4SalmeaptufDKxTI9xZtv/dr+5jLT2pq5/3JiqQk67OLHBGpl+hYjf21ux0gO9hfdnXwwBqjGCBenxF7mfsV9ZoWV8Ken37+u66GkkPkF09PBvYQziwU8B+CzUN5yTnVeOU2SVbkPAav+L6eTI5E42vN3d/Sa4AoHlXUqpws6ZcnxgCDY4qz7MaSSGt6Pie5erq6aUMjm+urstM2/dz0qOZYFc2I4ciSyHYIalIGRlgRtWxAil7c5DdDPtmmPO1nszd7DCanXESyhZx9hD3FtsrOIerStV/rNUh4Glm1mw/mc6cbBP3FCWhmDCr6RZntlN0TEM6F5JXSMpiNkUSAtvl2VNEluDFfPbjN6L+JAb8F5t8YJf1nyCfsumYIZ798o0N+/WX1+3ktIfiIiJgGKoKi9Cecz6zyUzFuX5/pIj24HiAov9Mm2AwIeYZ2HqrLCgLz8M625uCZwhlsceETZ00Ctrq6jRP1XzKTcrIpVCo6TCXOlv53B/UTBYou5LeqvKCJ+ybIxtIg65wsBspuwwoyXOGsfIzJz1DuK0CTJvpP0djp3kROCSsRhFJHKLq+p6gskJzwzHbeG1sHqyu4a2qjh7ORtnTH9r89ECTSyk/knCmD5xTqNHdHQ18w+1rDDS8mhNtRQHfiN3DeCeNHStsvY5saU01BkZ+lXpHTYJ6Eqz/cABdziCaDfqKCNnVw4F4pFTzvQpUoUD2wZEJi3Hfqp1NwRV8JguqdSNrYvbFPgxGZwGnS0p5YgyngIDg5tcQXMAJ9x/Z5OH3LKU0C6WQ8nEK1WZHMFAhKMsgMEhI4QzGiPSj8RyGbwo4s4DPbSKzBASGgCHSD6aCmoi4szCrqFi1IVIkUjGsSCCR8ZQ4RGp96o6hxtBD9joazQXrxYnTZyPQy7rPfJGqB4xQHBt6i3S4jFbxPKlwQD069pMtORUzcTNyuG/0p1RQfZDNxoq2TX0BgBvx3HCflKYRRMLhgoRj6nXslUjzqzSKAMZuMkFGuvRFeU7UMFvOTXOKrHpoTw77dh1OhGQMjUJTQdypMCS58vaKys31gJ+19x6e2dEsRDF7YffhwBJk2ecngEjhmHbgKJp4FswI6cSfnQ6si8fVnaZ21KfwqDtXzUZNKgqzKFOQNpmnCjyeHp/bW4D0SHjBsmgPcO4VCTVT1Cr//OGJffdZz94/JMV6Yt1JZMkK2cozF1dXXbHWcueSuYI//6NGWI01WrK+8nrOymnxZ1qoBQY53bmMwI+Qms5n6BxNmji6u8tsHARP1uVOtaQMkXUW1qNKlMmRWrkjiHBPFWlDcE5q+HpVo2xxPqJUARh7lMasEZvJgSzY05O5/6atYo+OayR1YyacWjVzR5NNWSBY28Rz3MAZ38AGbONCGriWNhmiHMqJgLrGhlZ87javlfAsMz/sQzow1vtE7k0y1VdFu0+yvzwI7hezBpSpRvLm7Zv2zoPHrjM9l76gk/nVl3YkgzNFdBtuNNxUztQxpdQzwfoBjMKEXfFwAgPKUWChhzKKgGV4GBGV0qm0tjasXG9i5y8lY0/SANNZbvgQBXITyySWTAwvgUoFTgKmKmHSlPI7PMwkLbBQoPklTlJfemLkf80nebOXqdZC4kKWz9Dhhme2REXp8i3UaqwlLH5477vIVOA4AKswtSus3bRKZ0d1GakPtK6bV2m7zvvzhza//wc27Xettb1lc0BgrDcIs4ZxZzEjC6o4YDiocJTzJX5u9xYiOECT9TUrtfaMalAJx0uwMbTIWoRjvKnRMvByOIequY5gQNHSBBt8jkIo74OHnJT16byHe4HhWdtC5Lxjxw++a2dP7yPRasFQ41lcnMP5V2U4CVk1sCiwsVYErDcfLawA5xMkE4tOP1I2R4fOjEcOueBL4ZySQWHgZG8Y4ZOGSmOj2h+VHpKCotnp+bm1b+xYduSeOyE7Rv/seqeYCRs2mREwM3JipcDRh5GLtPG8Z8yEchWEiy4HmxXl/MlBYbbbAkxUKvuK/kkcSBDENKWTF1HZSHBlA3ArmZx8pjT4TuDSNZ9qHEXmxGMzQl0kZFA1wEzOO0lmmnFDem06Ie2bTn+sOhBJBj1kBWOSXRDgBNncOMONjLgx1pJ1C85u6iKjHHFCLc5FvHCD8NQfrA77WEZTs49itixwzPUU9xza3X5mx6Oehinil6zFZuh6TarZfQRz/R7qQ3juQ8CPRwOy+nzrtNzI9N1OBU6f0FEixe3T4cipNrD+sA6oEZ6mUWT0DmOMZ7vE+tzvL/HZsX1wNsLvuv4pdWH4TnVAtRoy1hbLKxpsrumZ68lsJhSNvqBzzZ4svI0m2JJ4MmGUT0dFRxK6kSNSxkemS0bjNHHEhCSXSnJmyNnOwHNQOx3ThLN1yAql4/Sc0yBKqom5DGBy1i7HIbAGMxRdwg2I4/PjYCYGhGQiSlWEhCnK77AWx3lXvsvopPVGck3mYMUqnQrleMSGC3IyReyGzzEYpIYhAho2rBalop6Y40omtg4HO+YYCgYcuI5doEJd3HM1DcQ+3C78BGKkP6kz+UXNgvjA7j09uvz36jY2kDJ+47WbGvhGZovkTryiiyIDpxvLbOL49MKOkb6ze3ownOl3KSWz0agqcqF8Sp1NnWzW7AOeqrseDNY5fMm3Z64ukS0EyXHjEE9OAU9YDlkUamvOoPWOHGYcZKLhqli8WIjOzDSchpeQTAmGnSKdKTb9ArBJoHqGY7ywQFgNndKBv/e6OsJtcmSL0an5rWvYtDiwp/clc+83r1uGLIy4fYbvj+/+W5sA9qKhTqTJFTqcHwaitvUaHNIZfAPgMcTsrQbhlTIK/qfIbgBd1rZR4K8LL+eguoDiNhmyxYzNikVNHmXtgpBQooMvTQGsAxyRV7daM3OwCPtu6QyimYMqUDOrwVH5d75hB3Cmc2QOdIBTOkPAMVSSqFR21E/E0Q2ZKMwcArhmafexLc+O1b1frLhpn5rHIrx94hpQORaDuH2QyBgz0yCRgLAY9eO47gxEuo+e4TnVBWtxw7BeV5YWXCwYRJ6MtT4EJIR9EgQICzrutGxP4CwHs0yZxStbVYmPrlXJYoNxRQmC6zGjvJC66dmxj8wDP0+ojvW9zU03HoOjpVMKc+AJUKWYdSfK+mTU3edQOkJB9Q3p8nnjcyq3WlTuyNFwjAHXNVl6UrA4vVjaOTK9asiha1NlDZViLP2182WkfeZ5Uxmu0ZSCtwX14dBBS6eOBhgQ9IPjqf3Ld45VV9pHXaaIvUuSztlgCRjTtxEueIJN9MHx2Crqsh/brXbB6tg/fd1jakNc00F3bNd2OtbhfCgqmMMhHwNXilMWyGd2gSCQ4x/GNOzDhZ3cP7ULePZrnaqN4aV6dI6Jkyaiwe5Nossaiud7lxkaXysyAG3Byglxm1OXjjEENdQ4Qpw1V8klsb6Dr7F+shISLbHxteCqMhOuH0VgLc1pto4cnV1yCdy/1YRuLhMdLLVZ3Q+wr4jOIEq1foR1KdhK1uFF5rKKxULcZ9WCyHQkU20mJqurAbfwLLiXO8WCWK5z8nUoAlstKlut4UxvlJ26P9mszLpJSGCJgPD4SsZpH05lGS/zehbJEwgOU0cjZ0aqDE2N226v7LEmCwifZ2DMBnH7MV4/C2eSfUrH78/q9aPUHH6Cd1J0MFkuPvaehN++hIh2MZ/ak+OhrW+isN7AHyyok5Twpe3WAwTT7c9UB9JgtiSVOu4M2Qw36uHpBAd3aXtvvuSEL5maYANlNAbs4cCBzZYzFeGT1DWf0qAl0uJqutoOMy0yjwANVWBoKZY5pwRM5HqOGHmRcUPGXIWd8GTfzIdWL7REgU6IxUo4MFBjJSEb1kcLAYz/2X0YTBSgN163yrWyiAvz0w+tDAiutP0lWIOmhnDF5/dt+v6/sinqDipKE4ZkATlU5Rr/RgkSzsRv7lqI2pWUp+d9GL3Y5mdPlfb7G6j3wOiFMFzK8qKRHBElePQ+nDpJdhRZZUnsRj/rmaROjkfHxHPNoSR0ULiT6roslONnW+W2Dc8PNKeFUXZ9bdMOnz7U9++gFlU8+0g9TdEc17K+owxnfnEAQwk4suDmEmlg3SJRhEhHQ5dIKZ7y1pYFtXXUEF5yowiGJ/rdRfdcjY/sj6KoqSSFqC9HUVMO0ctcIbpIAglhLKo8zKYyMqUgEzPrdJqIUZaOB2Tc26Ojvr1xc9NGw4ntIYpvAd774f0L22yXkBlh/+GZn5yOsK9gNFDnWdtYs0FvjAx0psZjSeHDmZMaT8g1I7ECn1Wg2rTn9O2WuPZic1PBQ4Ii+3SAbAD1Fkbfp73InjwbKjOinFGADLyKPU3VDep/Uf0bdsRmeEaEungvG2sFTUYNkbkQWuRnsMH1Avvln3//3D48nWkfvXN+bOu1ip5vHdhRrRIJhiPdnM/m9Z2mRjNgRW2GGiap+xGc3nFvZM2NjvbV4XgBpzRxShtJooz4+ycTO4Az6s0JATnohzVPiri+dzwS+2w8i9WfMs5nSQW5bE36KbpsTnzV9a5Inivvm3G0amZSgaAmPxeXJRriVMKdAWYgUPYds40EkTL2BKeFLmInGsx1ZnPtdDZ9ziLMHV4FPztLoktHpu8zklCPTVHjK5j1UAB1hgdIhJSOo82xK7BjO1hftiqSSNCotq0PO1VnXSZzg+xqeE4chkeYRSw+MRtjzfspqnk0QY2xbBOc2fW6C6YeIlwtl5wTY/9Ug4Ea+xWpo4c9XOPk4ixQJkU71WmXL6WEGAzyTDPwa8N+/cQQ3E+TDa2Kal90fegnV2R4/pCvvpiCvtouqmD+wyen9nXUgQiPEJcn82WKAjV1q54cDaS6PEE6eghMmvhoCVaEPRcc0ERa9BsvrWlOfcFc3SgjbFZKhYtWGvswAIdyMkXOXSFpwJxqcrQYA07akgOjoU4HA9WL3NwZ18A26Y8134a1EakZB25ODKNTyooQ+so0eqCoHo6gjvoLxzRweilgnAT1GHVOU9ZnARgE8Ftr/ysacJYBdmP0ZIC6Zh/9G5udnTj6sBer2J8iCtLIZmK9Vdxbmddas+LGHWRqB5okyp6e5vW3UQYCxHXxAWovx06/jdJBcO4LClxig1bu/A0L119Thpl5riufmLrYR57rbxLtNXBjOVcyIhwmx2Y9KkITaN9++Zdt8c6/smaREjFda29sW6vZsvrizBo0toT1ynhG127C2M9tOR3qHgqhmwjK+lkauymtzHhj1vx2XnIBwe5XLWysmx+zSRhw4vbLGhxIR3XZ48PhdcMDyfukiOxJCongWNQgSCNAxwnIsMreFwq+jlCj4j3A2LPn6KzXtTsbVfvoad86dapuF+zh03M4kpIdIRvpNNcFh2xsN1THY5aZzFiHInnFPa9MqgslZHh1vGeg7DUgBAQHHU37qHNhX63tmMf1n43F1orFvoMBXZIhGeE5+tLKo/RKHe8951A/kVnceHGqT3B0A1l+zPDUk8Rrw/1wkmrgdE6tBid4NHkmGf8BIvRDIAQVwJ+323XbrofKruhISW/+7ddu2BmgXWaQI079xXkiffBpP7FHvZl9ib0pWDP2l1BVndNRAcLa949ndv9sCAOYOUFgrC1xBdY4JqilLQTBzlQzUfDkefkYhFQBzYp5pmdkbjSBFIg8N2OKvVOZhvu5BtGCNBndHC1n5/LOfzYsl9hoHcjxcDAlhUup3OCpewDrCXSBIyHInCRacZVdl+QDDWkL+DuEUS814NQL5tnJeCkJIF4H+2vOUZNbg8MvYa+u0Sk0ylZh2szsLOO4iUjZogREkQVSgBS+StJBKj/wunBudqo1OM5U+1VabnQWbDPhqBj8/ps1U5M7z+IzwKv3aOuQrvYkQ1awBoIUdkPWsB+KuLepoP6SroFOTQgwR8NMFj+5A/ppmlH/sutBn+ZofrrPy9R/8uLrW3d2REE8Pe8JOZFiNO8Ji8smtSEW8hSb/tlpF+lqIEHCl7caMOKxmtfOgJsQ/99B3Wi7yc7oVOwxYt9BpayDXFm/qZ2uLv+iL5iPijuJOUHKEDBZMqEmWgu5bVc9FZkXasMzSp9O53II1PQiXZaYPHtXChwQFVGCpa/MikwjzropSJMrBSwEAB+QX1IFHNLetggwVGXnTTiyhWjdjHALjR1d8+L8kXnde7YYDmyOSJ00SkKInthTnlhmbBZls5r6cEjDHj6Dg0PEvPUK80t1/rMpdjk616wjr8LCPq4kQCQ8O4ejGknGiFg0m2vVY6G+BdfcKDAuKFw+dxqO1bgBkUZIjPATUXspv3/9lV9GjerAgu6ZzYtt1NmRuSLbGzMSJjbeRlG6Djiw9zQf2OcYgdJr4zwc6Xfhujk48PqXkNns6NBI9ubioSj0MWWIkjkcBA+uozD7sVO0sPo1K22+gedFiZ8TrHcLTmIsBp0HZzHv9q2Ig1rCdQXNJq5hCsNQQrHaABchuMHeYjY7xp56ctK3C2TYYWGOLAR1IxhUKpjT6bXwC4RXuR+anYbD9HHI6Ry4Xh7nHLU6WOcQPzey+Oyh1pOAywKZSDQea6IuB+I5IgzFQvE5eDZTrP/DLiHSgb18cx37pKFeNlqk4cQ1MVPSiLWZoNi0ASCWw/td+/puQ5JDhAMZAJ2PI3vY59C1hV3fbNiNWy/buw+e2IeDmXVRT/vyTsP2Uc/hWvnJVOrJExivYRHOBfsLJwoRPe7Hr+v+lgjQ7g5ie3o+sgdD1l0HKpi3ccYI7xBaI5uLjqRKVffxxNVvVKT0BC2lOTGi1WohC480K8jLG0OpdtGi8jzWo41nJHQBmXKX+oFwlhQhlRRP6mpbosWQyMM+LpFPnOQUa3NxPoxN3Tcp5+YspLuY5HOQWE+52pOz+pv1Q01DTl2DPAO2pc68dzldeQlnfsoRLvjeOa6/jK89w7PcgDPYS0MptFN1/wR7iXJBkp/C45vgvmbDpWqtpB3sAdGpcwIs7AxrWm5E/cRRzAMq/HtivBXgnCivRZLBEzgf9lzFlPtCQD6JQrt3OJI0T6OcKsOqcVgfJx4DXaGzXOMUX05onsfPHdDP2km8KMnzRdeEfprsx13jx6FC/m+vWbL9nXX7/gdPbR1RBVN4slMuhiPh9ONpJq2pw2EiLbF1wBtkRBFqkiwHfraJaGgd0fa1zTacA84ucuUQD5xjuRnlpYiep7NMhps9OAWpW+MBleoaMUBWHA26lzjdLDeIwKQBxnLUjMaD0IqivoJmzhP3JTWb8vtkbwX5PI5SWBYzwUd6X731KzY8+D4i5E3XnwMMN1iMEOoMzGvsISRyzZs+aibp8fds/OyuJdOlGmBZBg85nZTXi1BKPUilNiAJwC9wXgtkPoySCohOSxuvwvBO3HjjGPWwm9+0xfH7iM5GorQHlTV87oX5u4D/Nl9ykaY52RHGZ4HTQrGV/D8z0MB33eKSP+Gcm7w7XCOuYXDZUFpqX8MtbFu99cwe3f1zFH1RndhCdL7/lsRhG9s3cYBQvB4cudHCZHzI8cE4oADPGlQBkb+3+5oV8F4pDrqV63CUZ5JKiklf5tOA8yHRg3UgafgBMg3g1A3vu/joj4A9jOT8S+yTYsQJo7VgFkH68pCzivCM4OSq61tYzp51kEmuoWY0b5NBhEBn5hr81rcIb0a2ByiOjvzo4FgKAw3sK9L7SYioYL9ywGEB9Tyf1HE2eyKjShSMTAUJlrCvIgQSNGYhjHMApxX1pyLNJDAMU9T0ihxNgdVnozApvL3REpnXDOs/UZbImh+VBKjEzbojcX38pgWIsH/nTsPubNVEnjhBPWfvesf++Ttd6antonZDYsfvf/euCDYVXHMfhvh/etRV4yx7VgiZsUfqpVbd3kRZsoK6QpteGWt+vVOx3793Zt857Ot8cl0ncApkhVFy6BxwJdmbDsp2qMZoOLqiHJDJ+fA7gp1IPdaQQlNTtgbO4XM2KjUJaW4CSmRbwxog6DM243qugVJogc43HBSdPccmkciDfePnquGipms0eyqqepBPLOY6p77rb3vOPcg+YcMc+/q5KovYk6ualCYQF4R26H1yRpuGJaLmeTKf2308szUq1iNQegV7ZgP2I/DLcko93EunGqgvSJOUU44DNxGTBqzPAIEguzERjJngvkixDkU0qJIEhL1OqaI+Mspt7EXaIaq3FBAsdlCiIOV9MPNkuzIEw5tNZnQLEVQ2W6gdeVdYcH8ZDuKvUpj0J39lZt4nr3Udxd9Xgfk3ECUcofD59RtNq7JJEQ9/iohuiof44KCLaEJgmU1xEPfpCJBiFziKlyq7ZIC0a3YdWRGPaK3dQnTKEb6OwOBp0BqK6GxozBUOQhi5IgrEpDqL5BCUnMHrH7qRCKTzohBOyIqDutTQyG74ydTVQRC5Uo16kS2kXjvlAavVciOdSMFgNu5ZMD62+ut/E7UE7DxqoaF+E40vUBRHDanccgbr9D1bnD2y6bOHYt5NR3MZwRIM5hKwX2kd7zVLRJioIosiUUGjbjjFE463EDal+p3gs6aHp3CGcFrJDEZv35bdR4AwkKHNAF/569Z85e+qPkD6tPSxzJRl6DCkSyejmDfbZTmziyc/MacyHGbpJY7PQX0ZCR3MCFu7trt3RyKqdFY1/LuyQWfQAIQDg4zrkSZBNtdne6nrwygATvS29qyw/YbLODn3iaoJaSbDF2i8BGlguGfN6qHawEJafXbwHUSTFyIAGOWaqBRAh21uimQFTiqG4UxZa+IoBaxlSIp4ew2OEgV/RPIBFSwiGl84FTzDGkVEOYdoPpMydqPBUeoV1IYczu7nwrc+1wpR5xBOpf3S61qfBJkgG3Ore1/RZFGLHlgB18k9xhlMnH+UcIor7on4vthz7LVhYToO7aNnPTsZzAH11ayLdWS/y4Jr7hVUpL61VraNWmavv7ljN1CjWVINHganiWv/Z989sv/+B88006cAw/Wdj440xE4kj4XjTZHttyBq0GrY2WCiXqbDUWSH06X6SJaPh9afxVI6WFAvkFCispy5yBgz0sER+PHB0ZylV9CMcAWrMuvx7XIsAF/sVaHkzggB0iJyQw9JP34CR0YYj+PBScpjEZXsxQbOEwk9bckUZZKUIWTGYJDNstt4RhwZTkYrv07HLEYtG0xzkgEH7ylDi91+pYwQCUFeLo2jUen55V+d/bPqnSKblkHYlPJFK6au7yqjBO4lYIzAhDW1p1NXj3446VoLNmejgjodtmSbvUEcpY3nvbnW0PtViq4ZmLCzri1A5oj9dwY4tgkn0oA9JO39nGw8wLFLiqriWRwgyGxgz5Ca3YLDHozGIk9oLbNEMJ6HwEZys6yHAz5cImj+mfcBXc18VjNNfjEYcZm9eJn892+/smfrsBnPjvt2hEX7ldevadMx6hsC8xzh4VK3ilHCHNHey4DZmB1QhoWGjFpaZfz7OrD8jbUq4BHURfCUQlKKEYGzb0ZZjQqpc42ZrhAOQMHQr+9oJAMjaxU9BweXURsvjvAC+xlmUaSohIVe1neoUB1p5AJwd0r5mxury6iSeD6LzTGMsiRaAIUFqGVopgvqADQqYXsLf26qQGp0Rmd3bX50T+oKHCZHB0RHVkWmxyxkAfivDCgr8Jx6d+JVpPxdrjTF7MuY1SV0cIAoR6dWe/k3cY0o+o+6eD9EzPjcAJ9XfeNvqWhvYvG5wqZTXnZkA7oYUj4dDVb/ykNYV2QoXD5HL39+vhNBJIWVUXWxavUGWV5TOTlJ/gQFp7V3cVcFWAe/mFhtJUAOYXvdgu0v4yMAG/aeWHT2IbIbBgeAohAk+CSH4E/mUdEChz5GNof6md//EG+CGkheH2OPFJt3w8YGHCNAdE665XUtEid82ty0lFR8imwiiKitr6muQvVmZpYcLcAWAGLziUYMhCKvsN4VYo1bVC/As20g8uTARJ/MwvVNK23d1vpEp/ct23zNWm/+bakSEDYl2SM+P9OeS6OpRlZEqLkRPqLyQbVCBqWnovQEe5Nq1WR6sn5Nw1xCoFSB0dwDsvL2Vsl2m4G9cXMDGc6WHJmmyCIYe+94bv/Vv3tsTRSxSez4wdPupdFk0MfnHAv2g0En6UajJ/i7rjYxweedYY8xYjfVAwN3Tfg3yQdkg1neiO17LsNZ9RitXivttKtqz6wr1mGQb8L4EmK7IL08csocDuzNpNXHOXkbCN42SpzmSqkc3ymBp061gNqFXP+QOnocR433rmHtOM6Nn0uny3cr4flyDZl1braaYgg6KaJATsrhLysSwgsD55jlh+Hl1+LUsfSoIMHgU7XUzGnvsbdtJrkbVx9ifx9ZcxtlOBtpCnL0e6Ksc4j7G+fkutHM6emx1k2datbNSKA4x9qzj+jmesX+/FnfWHWuSzh3aceo4ZGRyenAbG24DftXBSz8/snI+vidLuqFfG5k2c1yWe467NPZcIq99jOS4nlxoX5Rm1FfhCHLHGoFB/PBwdB+eHhu39zrwIk07N6jE9EK2ek9xq2fEqrBQ7uz1VLPDbMBji0oAq9m4xy1urY2O9behpEOHV2XB4kKABEgnUQGMnWFTRqq9j42QEGbgQ10GYx3inpDgqJxAFgk0SHJ5fURRdY4ciH2FYF7hMLwoCsoQnuAt/wKCuUowBeAlxdhMGaLCeA2/PzmDRg7FHkZaeFrCX6+3rqDQ1mVQdQ0xPGRTe/9S4tOnsHpzJyGlZmYYqR8jkYjqyHaocJ3gCJ+hoOwmCOihnHNhk8sJV0cUWkGyC+dH4owEex8STI5iyWM8+IMGGLXQtRIintfhREvuqzZc53frO+kKswunbo17y+aiaId6Vm57n5mE6FP46WRkBKmdBpamZpvCdso4k9dnpTgZ+lIA16XV5DBZv9Nxv6uMhlvCCAqcMSUAtp8E2uByPUcDvjwfStce81KgPSYkWr0HYvDi5FrUMS1ebMLOKrHqgm5LvFYfSghmzw5hwjPMwVMaaNDHb6kDOgODhlgvJWw3uWNXZs9uWfLs1OrbO0IorWsh0yyZidPnsmxE06L2DCL8HajXbEajF9ZUCjWR3psgDwazMoaUvaeI/tsvf33KV+uvhy6cjY0x8NjKQ1EvakouYR8fSk3wGDVPJtMx8puthqAtgAXbaM+8Eq7bkNAhoS2bu7VkX1XbAsIQYjMq6xsrCQlD5JfaCQfno3tv/vBid3eW7Oj3tDePehfOoYqskLp37G4HTl1junSScwQVqL0ECWMPNQ4qChP49xHIZ2q64zWw1z6xjHDEskPjfPPXb0CB2LlKtRX6NQwgjcRDBJSauMcvnveF+wkxhyM6y6y+pOLgQz4HA5ngL27VqnarWYD0T6ecxJqCq5gN0J9rJnyc9g8gH3XZDscamElH6gABYuLToZpPJtpH0+mbkw1r5TwXJw4Vpo08cw1izvlBZeJ62c1Qyhvkk9zOS3PNbEy+5Dcj4I2R7HW6HUz/TfrPHPsvRLqlQzUmLV1KtzreA4l34D+236z7BAYkmKQVXKG0xx1xSZ+twMHTUXvt3eaCMQXTp2egsuJG8hXFIMOe+90jGAF8B7WoZoLsHJfHqP+tEH4HwjBWRbaFiC4Bfbvz0yM9EX64i+cA2L/xgsQ3MubG4j6Z6qV0GD9Z29uqY/g3sGFnc+JyTsp8yFSyXUUZWvlgiKyOrvMcXQ4Fnh3o2639zestYaouUTZGUa+U30eBToTRrzsykek4SOitvq+9LrYzxPAKbAnyLpPYcDnLjXH3ywITpDyjieo1RiZLBmKghVpl1Fqh3I6RRrJlHpriFDOLxyFlnJBiEA5TtJDnSUEBEZDH1aaOtwajAajxWO7AOw2uvcHtqDMCtUScF8cGMYxDmMeQGZgeM9dFKU3X/kqsplTW3SP3Rwbzv/Bu9SuvS0VbLKt5nB2iA9t46t/30aoOSWjJ4Dr9gFtfQXXcV3RG1k3NEgaWsaZNFLAzkdx0zFRV039VjwkZZcd5RNWsyTNIZXsshYkRtIqI4fDUx2LSg7s6SEsUmiKFeYtBjZ//58D/oLRa7YVQUdslt3/Og5/VdBKfPBdFPE3rHLta6Kq86AnU6wrCt+ZWFVweniuzCITQpk5rk6l5iLqElGAWl5tU1poXgp4on8MuHRklVd/WzCVj2uIkOGyPkPmVjwcC04MNq9Lhmhxcabm0dPuENBdLR9AuLBOp2UF1nCQXS0RBNSbqK909iTIujy+Z+HanpVufEtBTzw6s+Xgqc3P71oKWCmjqjHCUq05xy4Yo3tPyt5aSXba+3mhXBG2h1ojh/jN9IzCel0aesViZm0EWNk8dorxbEYFRHQCSPG/+r2PALW27cPDsf3wyQkK5AU1Fk9g4JQ9kLEFSJrBzDR2M6/4+14uzcMaRKxx9NnliIIVpTdbORMzZfNDsh/zM8y/gjwzXpUC0is1Qp6F/WbNrrXK9gDQem/uEIxglSXhPTbhOJ4B0iv4roG0jedIQU1mO497EwUQHFTH9aO6R1WHKVTLBQV83br5uleqRMwoZkpFETJWl25cOjO/GtXc4VBuwLmfDmfWUf9Nphoy5+lcwBZQ8UMNpPlYg8sZPvnZcJ1yedavkR85fJ3k8Jd3VUHbnOoJ4ToEjfWCazxtFZ1a9s1agGspC97criPAKTnZKSIxpwg+6giq30PN+wQB29mCDLmS7eF3Hg6XdjGLhMCM2ISvNnNmXxnq3wUpak+iTKoJVZ+9Rj8DLbirkNulLf+Fy34+6XwYOTXxEHtU6EUUwM331qv79q//+H2ltjBPiMbGSM9DpPEF6ZYReqtopokJ526iwLe72dLhKKhpzXMyN0XXVMmIPCXtl8y15jUpDJQa22LJeNmFrsmj1A6M+AKwCSMdNp1x8Bk70SuNiiLUQuDYWmw4LO+9IgXrICDXDYaKLYFwUBxR4KPQn05OVTBPqGbAA8BicgXFcnxGhr+zyRnqPQ8sfvJHFgOH53yQYa9vI2D/rDn4FVUwbNCb2QyHooooqth8YIthV0XIJQ6QBztQXG/b4Nn7qA/dFN25DGdXWnvJZvf+NZKHptW/9A8BMa7rXkV1DoNLfFvjJML0chy08q40ynsrTIKU/FqQG6DVZNR0lfnkL9GEGVEKBnSFWv0337NQdkQD0tWJwVfgwLG2CWpjnJFUwHPwKpvS4Eu69806u1beekVKFMymMs7t4VTTsOYwKR+OCtlGspw6lWdEzcVKVYzEDPcb8n19VzAOgcWT0VjcecMx6ManIjUk7BcTFR11O0Bw814XwQcyJcBzlWu34SwGtk2UL4XpQEG+uJg5aI/hJ6C5Ep6vV99CXe1QFqr66u/g32twOkc2O/3A0t4BMmXALLEjd6i5ueAERKXGzfoToudKTtPXHChkBTTAZOLRmDXXAPGlNWWnJeoScow8jCtrj+VaHXtzKPiS/uKffu/QpsiIfvjugbTY2K9CAdx0mbiJrxkhKzd5dZY4KI16h4SIPDGzEp1D7ofY3CA8wVOiSGdy8mzuZs+dVCTyoglFAZzUUXqZAelM5xI3fA/CmPcuhriuqeq8gedIPXyLOHETSAmZ8Qvs2ufbdKcUJcVnjiJzXT6e0F+uD8dVz3FPDWVDqA0jKF3JLTFNolYdHQ+VBapwVncAR7Ie00S2eYHsgD1+e8g6d/Z27GlvLGNNh5oC8zvHHuriPocw6oNlkuvEpc8dMaFCy+czapxJ4iDNLFc1t+c1ML4SzZty+pF0+mNknVU2yTMLxvceoHy5NVzYbrVmTxlUAEomiw7ug26ImvSiVLfLFQm9bgFt7MBOTMqpDRgg43xu1EI9EzVNYG/e3GhaC7/9uD+zIQL3EbLcKRu07ad8XS2KXX39IjqfF8kHfDCUqeCB3EOq2MWKffPWhr33dGjHY+peEQJaiqq4wIaYR+w4jlWIJad/Hb+zi/R+ew248XZTndJeTKNWpZ45soSFIjDO8tEsFcBkQWufCDigLMAhMGIcQUBV7MXFI0X3PAALDq/DxmEUFZCOyoZTsmyQSXnsIEEkMj96ILXsJaKVzhu/Ycujd6188xsSgfSZ8fgRDOOWFTrXALutO+0pUnXDNpzHucaBJ8fIULBBRMTEZqaK9mLmGuf6KGpzy7OvwcfhePaoZ92TgZWR4S1hOKs1wD742fI4strGdafsOwN0uPayTWEAa3vfsHDrjRyucMPWaGCyvBeD4p5ZrvMW5hlNkKPjMR2Ten0Wyo7IsGIU7PDvnF4r/N9kGAWIeE4qybucr+IrktcMmcBNsaX0Do9wWIIjhrOQyGJ1V44m6h1K9bu0/jIyzKrgPTbVxgsO58rkvMjmXnQfaCgfMyHCsSzq0xDRqVsRzh41FRI6UkBv7HmilBJrSDFqT8nJqRvLwPfieIkGhw9OrbS5j486BZw5EOtxSY9QqaEOgcx5gRCo3HB6fMT54dzLLGSf3lMwU1i/ZYvRsS0P/hQp+ikcjyfYZjZxzc2cw1RlfTBOckmZQMV4SslwAB/7qSj9wjHoarjk/CX2vHFsNhtcl9Rj45ymQFkbucccgsg5SRwX8d2jkR1NPPvD94+lrPzLL+/b0XkPBmgi48hMR2wuNvKyBiXULB/RIP2zgiODhPmIETMX2V9mQZkguxB7t5Q6d6CJ5KuWMHeyP/MlphvOJMcv7NbKqI+gzjQPBS2TwRlhDxz0pnJIHDRZ0A7xVBehdl9TI0LcoLpNRPRbqHsQAhyOp1K8p2gnnXhBU8w99dhw39XLzDiK9iEyiCk+m/JCN+pFazbKNkD2+eh0YB8OppqZQ6LAq4C83utObBffu9tfqM0hwvuMYOgFU19h7ebeyFZk3tVoB64DVS08ly65/j1bUb6dHlw0WyobKrP3hwobuPYHwwnqQ0PbwhqThLEOZGeKM8FGVwZuvcSxOQ8RXJBSPcL7LBF9b4TIahEYneNyJ3DaFZy1ZoFkqRj3XxRvnT1qpIR/JgSX5o1Qq9enUQRffP3iQW+5htKVS3ajtwP7j169rkmTfFw7nYb93S/dsv/rP/sPkrGgpDtbz9j9fAeRKPHdM0BpDES3YDyuAQDe2Wraq3d2kaWUpQdGnaQy0lrOQlcBkxIq2GBlGJHq1i0xyAIYQBlZamrhMNGYpOTPM5XHZbIQnKBOMoeD6nTgtFQETSWFw7ltGqlLgcNyC44MBgrwiwcj53GwW3VNDXl6oiXOOAFMBiPqI7KPyETjAes/tQJhpNk5vtZzYpuZG5FMLS8anRmMEzH4EVkvzarYW0Mchko9sLWXXrbO7Tft4sn71kKxfzkb2wzR+AYgugzF+MbGS+avv3rZRc7shBs5DN18IvbwaCJnwcmBsLZDiMap7rqoPclVlTWcLXPZmLM6gQq3lhdiqXunc0h9LjLSUGvigD3CWexJyQow/oC9YhjoKg6MhwCA7oMwYFLdVnbKXq3Rh//Bqi//DVxTxb0fajxp/66ciw9YzSfRQp8nNN9SwHJBAXUdToDFmi+9smoxCWtj+Lys/9AW/ZGFN1ELm2CdDw+ktMEGXjYXRlyPRkNRY0xmHRzXogv4EkY+4JhrQG3MkPy8057MyArWuoTvpeNzC3bfshg1qHRypD1BJhnHuBMa5fOThAwCCjfDJlONipp2nAhfp+Aox3skuYbcMlIQRmqxxsfH+UROs+cNm7lgL+WdMkXYvnpD/j/fO7Lfe/dY2mq/9dKOCuUXKFi8d3CmzIYK5FHsPouUaU9GL3VNwKrpufeNRQjA304EwywnGDBAS3LIzFFfTEK0OsOWT3D1HJLxIhvXzecJBFOJpYVn1yiGzhly/2VUkE6shczoYj6VWgjfv0kDvHSN0ZEgY0ezpk2o4PpJxY5zyI8KCNS6K+M91/A8qX5xMZ0J/uIU1xn21iaybipiPJ4ubYD73ERAlyB7OJ878dhvrZXtG7t1jZF4gqz3wwsU9uexExBmJpk7Xo2kt/wYrG4zlw3y1EuYXZJ8MyV1mfbcqoVhZffy/xAqwfYRjiDZLbmxEWOqI5QcPZvD9mrsE8o4kRZZLQlQRJE4ABHwLZ8hnSMbU9twRALOSZiAo6Y8z40WauP4+v3z8WdnQC86kktZivSz44qfF+dz9TpelAB6vuDmcvWrv+O5CYHrbJSEQfgID/z//J//TdR2Qvs//ZN/q02SIWqpIjob4vBQN4kjaJM0coq1MMgbVTif7bbduLaGAw0DgmK0Xyk6pet0KRqzr7ENzmMUkeamiGZlpFA7YNMgO+3nqBEk2PwRYJYSDusMzmJG2Y/5RNRfMaRIVSDLCp9BRV3OhJlQjRLvw0J0BMiGjrIo1dRIhIRgORaNN1kgK0EdJTn90JLBM0TlXRiRquoPhdYNo9RhhIwoAQxAI6Mid9kJdEpKnw25O5uWYI1uV1GD2ruN7IhEg4mtX3/b+g/+zKqI4Dc6mxa2dgG/3UZWsO1gsSSR4SBpwC/kVHRmKByMw7qPTpMb55xSS65Qcc145owLr1G1HXN0bI/wnDTYCrmNivOHTwVvZJkRaj6U+TH/cmjYovcQBdPvW7m5q0KtD2gyrO6jRuTIDpwyO0cAUITzIf2aGcLi6Z9YhjoNHQ7vyTScS6GtZg/ROZbbtxShcpheXOqoryqJyQCE4xodWQbYtnDjLUBuF5Zx+iphOUqwwGBxZLZovdTWwj1Tc20Jx7FQXxcyFtSMFpMZ1rEJg1zSiHRmYewDyuDMgu1XLD1937Il6kOA+EIUezlEboZsikaBTcqFvK7mjLUvh8MzPYdhGJ32pFo8AyQzmbG/Z6r2AZhVa6NeEufzpXitGvEQOhoynxdlhCiyee94Yv+3P3psf/qoK0f/H79xw76yWbe7J117gDoPYwQP0TV7RCR8SbaY5/pDaDQdVRqRtEWX51JPM5e/CXNl9PnCTQRmAX/VvSfSTuQcBPeYi/ifn/vV3/xDFl2cw3EsyDOzIZTLrJtqAFS96OL+OfM28hIpQ4Sxg7pIcmCzJyfSio1KJWl8UE+TiVcyUe7Fs3o66yo4KgJ62wTEiWqkxFQRVYhEcM6xGtgzVVz/s7lDVBow/HfWce6LVfsh1uqj3kgwnmjkaXbZG6ReJEWebpHS1X/mjbakjV9Ck54TOHWL6QKQlQUkI1B9fPx9QtP4Hq+LY8dZK+rAGVWyhW1RfsxMbFqJLod0Tol6/zj8cVIMJFfF+uUY60NqeRhkyBAroocv/CXqZ3RiJvHXcFWYetF4f1pX7s9zdvNZ13Z18z3/Gv/fc6YMH9HNtbb9nbdv2QAQxVev1axPSRI2w2HL/be//57d7Q6kFyZ4iwcRD/ICh/tGo6SenB1kQi8DbnPKxGVrdeqCtma9AbDeogyaDgqcGCMjsrqKHIvMzUCqdRblXfVjV7Q/P8XnVZy4Hzvy4VAqjDLxe6R1OzTJqcqy4591iDmNDsUGgftH+DzGJWRlees3YOQGVlKTH9m/MMioEw1OvqNIlP0CZWqBMWsgrDO/EJ2YvT7VKlWglw4KwV6plWs2HsF4IBJbwIC2r+2ghjG08cEDZTkpR/dODq2B4nm1heyrfVNkBDcqJVcXLpTEWlI2xsyFBoOJaBBe1m3ciPG5NnXE6yL0xSZZ0pdVUHZYcyrpE0+UZjwZR9cmSYDZXrLUuutnGOIHVdcYKKVr1IBu/iYgsg2NZfAWQ6k0Z2EdzniMOsozi86eWWXjDq4F7wFnlPWeqsjMUc9cG870IZwVFOuqAQblbUCfVSvUWorm5fB4DdNT/EHdB39Yo/GoKj3qqk9GsQHrDnM3roEwzmI4FQQXtNYUfQcIiBaoNfXhjGyOOhH1tuodZMCRoB2P6sXXXrf53T911QAqXMOxz2C0lmNXgOboctWXJITKYjahr5n+dmgHajpsHSCBQNT9xN49GNn3Tnp2Pprb9c7Y3tpGgFVE5gv4V44IZpeTMvkE+rim758s7I+OUvvO/QvrtBr2d17dsZuog350MrUjGCsGUFQR4ZgDzf6B02akPSUt3strN5bL4OQ2ltcb5HRs/psOihlUUbWWRJkctdV4qGez2ac6m5XKwIugTZz32iwyVx8s5VnXTBUnV/BfZMllbajHOqIrt9nCnOPThFIvu7w+skc9/8qHYJ9PUmdvUhjcnh/LoNcASfUzz5a5/eFAuNOFQ2MIUW5indbg9P/wsGfvns8Ex6cr55ZleZuC6zNSrcfynjhb1eXd++be6Pn9k3wjCM7BkJx+ysF0YuFRXidneqSXDs4TzN1DYHKRsacoUmBYChdyQg3OG8PPcRQEW0A0GQnnjeO6iQxRFWa74ouOzfJCsVKSjXiCYMrJjfkf15550RmtMp6PZw/ep9Z+/qoc1E/2udnHnA9fVKr9P/69X7H/779/F2nywr5xZ89+87V9a+GgfnTUtf/6z+8LXpurQTHRBiNDhiOfufBf3mpZA5jtDmo/1641bG97w9bbDesPutaoczaJCW4jXXOBTIasJ0p5NNbX1S0v+Zf5QFptwrInY83docYVoSbWiyY4XJSFn7BTmTNHOGF1Rhr0OozUVIVgRrNkMbGGwAi12FhXvYG9RB6goiUhGtw7J34mSpkr2DxkNCEyru1gWSaiTNvsBA4LxhHvq9G9Gtc908aJ5qn1BkNE1cDPEcm09tZRlihpTbde+aaNn75npXbbmre/aWU4Piosc+CZn7qTyQPsEwqT0q+DAZzehCmTWwVnCQfl0SDgc2M55qUyR0ZnARyJDps63fMAynd/fD4jHnbVkNz7CM7zCzmkF7s6DofdwXHHHGvBAzg9F/mAbLEM2eES2DWhPNaavNETVKAfY+FreKep+ngo+IpCC36/ikAFkGF5zV176Ho+pJGG+4m7pM+fSjySz9jfeN38s4dSEV8ZSDYNsq+H4x74uwsyIDmiHX9iZkYJ6bS+AfXE88T3pj1rNcu21moh7W1beXPP5s/ed9lqMVMkO4UTQ8AqQVqSM4olx6wKihRBTTTtdJGrVNOQ08iTBOAmc+IZw3E9vlhKYbq/9Oz9476YX5SWeqlTwZlhw2FJuoenqIueoDB/Po1FCnipWbFfu7MmmOV7907gs4k7tewP7z1DoRuR9Xh6OXZaMkqEYhnZJ07hPMsdRrKq/ax6XGxlZJ/boSpgLGZD3AIcbLeQGnz2mQ3wYt4FXm7bHM35KqpTYdGG9d80k0o0AwSOLs/EwnTSPfyidlj+a+mVWsyL6MtlQJ+5oW10sslz6YP83jypIhRIqgicvBZ/4h+9vG7P4LT+7GRkQ5z/GmtMDFS855/j59NTL+cHZblkjwg28eXnmOfbpdLLJXnB2UOuCef4MMsjmUIt3cxKSU7xHRIxj92MMLu89DRHKvKbze9D6AwZtfhSM58WTUkjMt5KysrcrCFmZ4QnP+GArr5WHbg/Ss3gr7r28+N/9iedD1+Uvfnq3po9ACbJ4h6HPbWxmaeZU/nlbJUE2U6Uz2zn4m9wnDF+j/RD0hdvwwmxk/ttZFGklc6GLu2mDS1UXRmdRjjKXCdfe3NTo5p9yYJEgNommqJIY+lLT6woiiuna7LQOh2P3FAnSc4sFMHzYiizU2QnfurG57a3Ub9A/YfvE1Tbkr9xytLmmjepI4esgFlXkfNcCHB4gbTm0nQqyEhjv0ktpl5dHKsYH8Mg989GNkKGeHzSl73nqPEFJ3/C4Gzf3pPBXn/1lyzcfh2fX3L7k8OnsljwGJ0k+04IDwqPxvoFOYHAW4HY+My8CUmHhFL+TmML913QBBT9H2s1Em/kuqo5VVO9dIgow+ChWO/nXyMDjoKMdEBx7JTEaejS7j1kh69ZhgzGZ1aoEeGuYz0rdPDvnvlwHvO7/8Ex2mptOXveCxW400LLYjqeYksQHdeR9Rky33zUYJLeE9UVOJ7Cw3NwNY+iFA80II7wLQvUqq+grpPqQIoqf3Exse3dFjK0knoygirHKITqwK9yjAIHFFJ1gmMQhoBrez3h+zHWb9GbO4wf61ghoYHTURtF6RwuoqXmNFGfjTTbWGKrRb1fvzd09RVkuWcXAxstA3twNrYfHI0QpoQ2wWc/G46lBML+qjH2xBpg5xEy4m1ku7vIjH7zpY6ZVCt8O+72bWO9oaGMhJX+3YNT1TAS3IcGn6WJ6qyrKaCu/uPm46yyZZ3aLD+7+Vlfaf+5713NbvIeGcrTUDE+e54NueTGNauqnSGJcyjrOZP3Yw4jd4TM0Kjq7Kai+nLayWUvznMbsnJCn2aL+L5kvzXxLAkRThiM5Cke/05X75e5MQuE8ykZdQ0F+29u1GyCYOn7gLoZHLus8MV7/+TnOskhRwesIFidLV2Pk7tYl1Um6XNqug5V5oIC/otBuUbD8FFw3lDqzml8KTLgPFh6xT9cvY5LgeBshTjln7F6SnmN7jMd0KdlOasbe3Fx/6qhub+IA3rReWoaJ1UCcCDHjLrN6UepFyHf5NSCowT5PiL/jUoodsjrN9bsLUQsNRoEajRxMJtmBjkWyojNqtSL8iPAEy3RIvE4saGnbjQDjXKx4q5SdRKTBpzwmbxYz6FY44UTMeScnpOzmXUAHbI7m7Ls6l5nEbDV1mZhf89y0oNNnyDagBONx5qxE0sYsCClW06OJNQ3U9OcueygWLIYBjRFtBqNEKmjJtA7myKjA8ZLAUEaTXx+Zw2FZKzD9Ve+Yh4gPE5QJWOM2Q2ld/zaFqeBycBlPo1WwuZwdfDTiYfMNnivpDMzOyHNdumG6NGJsOHU0plmAAWp6/ug55NCg+XjK/xVZ7uvw8zMz8vrBYz8Lw+pPgPrOEa96+QdOS2vRtkgPq+qmn2p2OAXmdFUXTYTT2x5/98KBqREUaG+IfiCzomNq3xFQU01KjaeJhP2W00Ap+Ee6NCovkASCDcOBUA5kRKFWUokFQpuCigFPSmC6Yvun+DH5hqvzM9hkZyj2ikIy16xEHXEQrnlolksZDQbWjqB40JtIZ1GmsmUAN4lPMZ9Q2IxHV2pVZbI7WKMn1lQcSCUkkeMC5D6NZ1A6mmWDhluJJxQ3JbS+X347u+intONTEwwUoGp8tFEPen29WtwtF3r4Bqp7nwImPoprn+ZAQmou6mr7FVbh+OuFhP7qA+I7uGhm9qK53SG4rrkjyy7pOCvjOFiNdIgJ0O9CKutzq7ObE6vXmUCLxpCQo8agx2QOOBERVnrYUAZ5jTw1c++aBeIPkgZInAZE6FwNXyaKCeOcGDOWfFFR5Tl5uTqdSi7wX9W8bzrCF5bdML4PWaD4yhTTZjPnE6oWipI0Fd9Ufj3Tazv9XbZHk6WdoTnvUwcW1Qaf1Sgz8khzjE5q7/K8JLcvHNcihPyzVUT0rz+84Lz+DRki0FiksN6Ovu+G1DHYCHO3AwlR4/3n8Od9iJfIIcDvZwMkX9O+GKt50Wj/KMERX9Rnc+Lta7Ln8ocHXg8ixzFNwwvC3+rNeCSVDTVklMAi4DeSraNCLMJuGMK7L5WLqmDmAVfvt/FBWfS4AFlQ9vZbIkSyUxoDgNSVLMfHBM105o76pZPYKyyOUqVgiYyZUmMqksIcSuI7PuDgZoj1zs1ysbpmiowiBovzdk1yL5CRLFLRO8xaiUhN2I6sAUgnhgROkcSS8qFvQmhY8nQeVGfbRmxwQ6Hn/TyYV+K3uPu3E7Pkf0Ml9bCvbYAw3T2d6x+/Tbgtm3VNDxBVU/x2bjP6payL2Y42WpTs0hPyjcyNxEJOLwuWijC1Ebls+H7ZDk1W9mOuj3kcKQPR7aZBBwzc7MUPdF6nGPyzcmXPt/8dGjqtVI3NpH32NGZR2eAMdnL2tR7ppMDo9R/Vt1U9M73DZKxTT76AytSnwswaqHSdhp2WPBiY0tGi9kOHUw6fGLx+QeSv0mQQVNOJsTPVym3hGeZcuwBpfgpwQ9jzEyXWWHY2oCRbsPgT0UCMUCvlQ720GDMHmKtF7ud/YprME6ncGLLkWPqRRS2xD00msqeJqjbUcm61mgpQ9Y0WjwTssVSjuUeczw3IRYYUGQHNKJ0eoT2isiunh31rQHIbzCeS2Ilw88xAJj1u/byWk0zkpi8U32DUjvnyIRO+kM7BGrwEBkdJaE4RpuUZQqK/u039q0aMatBcLOcIwtCFsYZNnhOqDBKol/q6MVA1G9mJmzODAXPJB+zO2muBL2qbXza+f0YUpNH/1THYLys8euEOONE904ojM6RkvNxPnhuZTyzVXxNin3mCvLqx2ODLMee8+ckVpqIri1SgtQLnKHm/tU0UU1BdXJYfDFT4B1zfPqE1GjURRoIHL663QC0mto9OG7O5SHDdoq/W5Wi3QbMOsQaPmJwEUb2q7tN1M84Oda3HnuEvLJ1WYuN3PWrZ4pkGXzu+WT5POPJs5CVvI+ybOkrepbm54U/qpERXOscZlyNFHcOzxPrj7N8PIXO7p4uExLC6+6j7KoajmPiOZbeirCi5MhzsLu04K4+zFUUcvVN/qohts96/cTX5H2civlpeK0onHQ4HqXYy2JXcZMm+VPkQyTl8jpgp9c2G3azWQcuXrJrO217dnKh2sBSlNrQet0JDHdfmDNHNkgRN3CFVdJjyejh5E02opY3X0aE29YAr4yjpsdjp02WZZczc5h5ufoGx+YWtCEYmXlZuiLBWJqn1sp0JhMZeVLNY9RSWMwvaGS2p0PPiwnEKgpEdqBBJSWa8Ew07tsCBmY+iOzsfGLn/aWtN4uoW1Vt9/Ub1tjaVURJyI6fXygh0qfhCwlVAb4Kq/oeWWiaHEuM2XdSO17qOtt5f6Th6t9e4HqGEjddke/l9l3BOZu8OZEWgoaThkHyKkkq+Cuz51n7SomYr9SccZBQIzOzEWoy3ScWEH6s7cHwX8g5UvtK5wMG00P2Nr/3h4DNUCgFxMSsjorZbBr26tdR72kra2DfVXb6fbxHz9W6ONuFMF3o2GbeciBhVw8/5ze3LVi/g5pRTcSMoH3d0uo2HMEUp3omcolGWBAqhWFitkwGm2oldMAlzylFIIuhcjY14LIGn9VYPRXFZkvCr4TZuCb8TC8lCy7SeG1O/owTT0rNcsy43hm+l+AZjaZ0SImGlo2Q+cyQoT1DwJFIy7CsZmvu1TP83F3U/f74cc9+/+Gp/cnTC7uPPb7Ae52OJ6ImM3vj/CgOYKthXauoBzLzq7TWxBDjcDTWApapoxFvthoSE62T1OB70p/L8qidn+/O6lWY6ZOIi+pYOfzmr6AerNUNDvCrFnFeSf9dKgjUvqMjYN2LZy2vF8lA5r9KQy5ITahUJrmrWEFcKqMs05kX+rxLpMlBSkwN0tW/L0kA+XVmjtjAa5vgeZzCJhzgWY4TN7mUum4se+HjbI5nNmQfYrtp9SJFjs2ewYkv8LP7NcpqhbZTK9udjTqK/CwFhHYdQfBuoyra+gaHRHqZ0OzV+PA41zosrByPK/W4TCnNLofgORgOsGHgGLR16sfp51xGmOS1MHe7LoB0oy2cHeIIDkcwyqFRzz0jrTyuqUKYkZp5tAk/bh/Qz9vrJycerPzz89+V1lTqmCcr4/XqelPwAjfIgTqSI1dnMLfYVDXYwkHfKLmZIa+t1+wf/NbbdnZ0JrmMLdRFCGUcHJ4Jy6aEPJe4Ciye8EgZG63dwaGG0ypWAvxdsxLlU0otx4CBsY5gIOM5EvTE16HkdbKWQBkeyynLczLpLL10Toyq+bQ5YdSFFiz8azehTuMyrRWdh2rZVH0Oim58QBVRM0kHFM5cTvoWM/OBgVvC2B0dwvkMpra12cR1F2zr1etWrDUAX91A1lRi2yUyrBmgvLoaNZ3OXVlRomYYefngCO4lT0dbDXxy9HGekWau6z5dyel4Lk/3+cWMRdeiZO8z6oyRYk0n5AeuqC74xbF1vEvH80L2rql1MOYX923x6N9quJovWKstXT0SBzivJejclsTN7P63LYQzKFVrtsA6hQ2Ks952E2GlHQfDNT6x6OR9rWcB68FpucoCCw3pbrFGJ9fHCateSU6LdTrJqfguM4zn7O+hAO1Aoq3M/FivoqNMAUWyWTTFc+DUngWyCE4ZJYuIowKkJI3rriCLCjjrZ951k2MBpVKYliMVGGCQwcjm0dkkEtlhCEfBbJeEKxo7jlMejWPBTPO4oD18RLkfZG/d/sgGuAaK8B70BupLOr7oKmiZqRHSZQBc7pLo3aYsimSY17Y79qsbFRvHodh+KQwOSRMci8DZRqyr9BH5HwMNmC/FORMVek7h1XmkuihnAa1QnCwP/hjsEHaVrlvmHIUibN8Nj2O9lnXNm52WnY8mqtdwrtUQzlyTPpkRZk5+iPuDzbUMJpzKRpaTYDwRXy5tjfuyswH2PCBPLyWfnBdaKXVkP8I08T3o1D1zjk0BUu7TqgVHQuA+WeakjG2OY8eemmBPcpBfyXcQdh37+Iy9RVqTUHOI+J6lkPVpJ7dDBZYp09PUYQNkybJMMGETPJmb7ANLOVI8UV2MQc4kcbUj/h7XgrB+B8EvHSOhQY7SiGGb2K8kGrxqapnIK5LU8p0mI1lukrdk3xV+n06WbNr5MtXAukWOY3zq6+cx41m9frpre76huF/K8Opv3bhhj46OrUdhQBZfsVC/cX3LPjjr23fxh4wUNpCSiiliCD53p+zbZqWoTOX1VsH+9//pr9u3v/OuDQcTe+O1G5ps+O79Y0lbNKquy7vVbAsG8TSKYc2qSK1LlVBQGKMV1/CJCHLWVSahOeqEccqhGhQ5IZLSPhzrwAI0YbFoNhU5gdMpA99FW4nk3AntzZQtsfbCKZhNkijiRE2HEeoZZVKrqSzMgXh4v0nvCPWgui17KGbHS13PjLNfDseCTva2mtZYC62zzYmbgIo2X7FCAxkQ+588FsZDDZRTLYWHU42kzkgExbIMqQlWW41QCJ34qvDrpaOQsgaUGwvJFCkK1W53Uabv5vQo+FRF2Rkcy1WEXXrvpqRmObb/HIOGYZgNbPrkj61WazqJneGhJIoSnx3/MFrlDfVPTR/9mflwxoV2TcrQCgwIVxYJ1xVUm4pO/sR81apyuPb8SHUNHw6rsr7pWFJeQVF2WOxIZFXGKU7l9CWWmTgYUWoJDgDRzCYvr2V4RUBpyIwCZNoZJ0pWGmJPRnivAPUoOvdCgOsDxJr1zqVunrGNyosknsr5UCSVLOBgF7PUOVkah1IxF3h1E3nH/SmcUNF6cArvPD62M2RIR0vi+iPV506GExTEY9V4Ls7OZdTUY+O5SJiv9bWO9foDJ7YJZ8cIew5YqB/7tg2EYF7KpJt40R8rA3jcHdtNOKhmiSMBUCAvc+BebBPgwaR8h0X87tJX3xIzNw1GxGe9tVW3t3ZbxskfnIo6nC1Um6iQ/bZ0Y9vrzZqddrt2iNqKJgtTLZr7DLU33m+SJJe1EvYN8byuRiD4KyzKLuvnuXPJ2x7MyxlsmWuK9a6InTITyNKP2Rl9PaeWa4+uZgTh33MGPryGYsFNBCbvBnuLEBx/g8rnHQ5yJO2cZA08v1fWmnYXduZs7Op33flY6gwhYWtzo8UJgZLocZQ+zwhZjyZ48Arg86fDuV0gs29VKmohoDRSiWos+Nll6ILFAs4/YcV1lBQGczeH6gTXwGvjWaZjaZao6AAYsVbMnaXDGiR/5Jlg2Eqe1fHme5zbzgyee4lMQ46SmC1/dmKkX/Trx3dCK6mdPBrG4Wxiw/8Xf+eb9t/8wTt2Cryd31pD6r+O6O3+xcBtvBfkeVYY72YZtR78IR3ymzswONj0fODrxbxJDg+qAbiEciQc4qUmToQN+9fW8LDKci7MnEL8TKnGgXRFiT4WEcUupxS2jN345ziTk+NcINaMCAWmUahenclgpGuM+DNM2Ynpz3hQY4mUko7KzdVuV7DBA4mMFqQJBUdWUT4sWSA2iJEhxxHcgj1iU+YzPocROhzZGeCWnc2yre1WbPfV2zpIta0vWUbNMb+g6JcMQl6vJw0zTz0yIgoQf+dbCt5bNY7mBzuPGEV6Y58FDS7L0XRMzhy4A63xC67fQ5Em35eS+37oYBBzKsiS01nh+JmbnEqEMfCyS3gkevzvLD36gZS+Sc6Y9+CA1m+b39gTZZtCp7Onf4Y61ljPBBbXzRGqATqqojZXvwY4q2sRaj1UHBDZIk1VLCclvlxew7UgQx0PJHiqJltqK3CCbWPfQb6ApLxCTYrYiUgPkZpoSXLgSHAuCOcX8XA6rN4kN7REdlWoNqVSXFRDLWou3RN8TsnVTGLXiR7HnjIfqh9rkBjWhpnYHDUEGVHOHcJeWgBu4wToMSz5eR+1Bzgcjnt4gh977xmcMJzn6aCvqNapNKeKatm7s7zSEMyX7+cCsr6Db5jlcMDg7e0Na8dz+9qtXd0LtdGqDWSKqJES8pnCuZLRR8iabEs2sc5h3PoIrE6xlx90B4IKqbpBRGFO7TnAzt/AOeoUsC9YC8W9PkOgmOXPmDOBrsGreZWqPTjpKpsjZKUSJCPuRST0gAoPz4v2z1/PYT5Pe8+JOOXnP/+PF7MbP3dEq5/LzD4Gu7k6UfaJ33UmyTm3Qk6RXjm8LHdy/mrked7zQ+eyUObmsj4/H9pXJaGGKAkH49WqgFHH1iQSAZt0AIdDzUZmXEuVEmDD6oBM6eipXQen0ymXdbYYrPAEkpwk0VQ6RMkiUWDVFxmKSMFothDyMCL9PXOpG2+NUB0bo9mnSGUJUq85iJPEKUr0nCC4EbSZmZyU0IBfVAd09fX5zuiqA/LsN9562X71lWv2//4337WTkXM+dequwfBH3vMGrE97f2LX24gKjnFImKqG+XvWsMiI/TVue7cSCEbgOG3qOF3bqIn1wp+kI6oDry3gAdVxGEtwhKRg0uDFpEbjRaiEiPaAin1sOq05xVgqUEtYkF3GZJZRmRgbgbUkJ0ZSwOaMJKvCBjFmTezJSDMHO0yRFTGbq5WpAYZidbukzw0KniRo0oQSPIhSnw3s+HSqLuVN4M9b1yu29eWvK0Oy2jocQJ0dbHJ8rC2RRSZJEtZ5hA/nFE/VajIZU2+JjTcbAnI6VzE4pVIDjI40wbDeMa4xaKIusvUanGft8iAGmorqjDFrVIQdUj+8LGA6JQTHgPLcg5LJkCSP7+jXMjSoSaTnHyFT+BBQEKDC4VMVm73KBmo6cEAR6hgnH9ni6MBqqEkoE0GW4SHqp1Ari70MABbdZyKHmPaJg4NY11Jza44mamyEH8vaLHBfpdYWHNA1J31DR11qimwhk8m+I0aOcDo07oQmmRFqfTjewnczj4IyMrT6uiXDI0tHF25qLmC0AtcudtlUvMgdD7XKyIjk8DQ6HCodIFCZLzJllNQhXEYFjT2fJaE9OrywZ9hbjwZzZP7IEqXxlrlhdKlj4q1glSRnmQl6y/UJPXsOX/NnKWQaYF0o1bJWK+G8lO03Xr4ORzexw+EQqEADe2sh2IjiyzxDhRI11JaaPsr46Hw+s4fUYfMCyb6c4HsL7P05nBiNKTMyknCqbPQmlR3rVJIqhdkv396yZ90+sjpPo7OZCareEzrq9oqtZvZx4tWnka3i7LnS2uXPvmBqyFJLXhxkmTsIy7Oq5Hnr0vNM6QpBILhCrEjz/auM6ZIinat+mJejI87jrbI0Zkj8HPYtUVHhZqtmm0BZnJBsJmHTcwQd63g2QziNIfYL4bUGgkYOm2NmUxQxKJDAKwPY1egHwn0MBUf4mV1k49S03AZkXwlSwH8RMs2ZpqJmed+Q6P9iDCqnNyVAbE+gJBbXQqFm3kOUeb/4DujHy4SeM+D219vWG05tDZv+je01+51vvG7/5T/7A1GuX0yfr76Ikb+OguoHiMySnCGjjeK7aJDF3xYO6U1AAEMccmZTb21WNeiLEwJ3O3XroEhYk5oBGwRdYY/TOWkwyKp6dnSB6CK1bo+NpWYv3dgFFu8aw0qlqlhcNDw9FpILFesPhsii6jZGzaaISJcCiF1c35iMI3YpFxAZ+64BrFoNbTQaGKvcmk/SgLGollQ3YO2FUex4kto5oI3cttibb23ZS7/26xYggufETzoclS9R53A1nTxboRFm/84CkfnkBF4Ujga1jwjGmtL9jJ5SaoxljuauyHPBrnI3fTKgkCXwo9rmTavc+V3Lahu5cXc0YjeIy8vJBe5z3cPPR3KnOcsnV1iWMeQh0oybSCoIGQ36tCtShBehznX2A41H4NGbHb1n87OxIB9q9ymDI2yBSDopteGE1m1+fg/3MnFqDVwDWJVxrw9nX3SwI2+u4EYvxNFCY7xZcyg0r2neEDNZ9QlJPLas9TDfhQ6+OUdNHTz2DHGh5oD4isg0C1Wy7A5sdvZIRpsD+5hpsy8rRl2LTLh44eDMiP1baUG1Jkoa8TmycExYjLOPJlPnsDjfBiiY/cG7T+wZsLF7/Ynkg7j758L1k+dOpeBgK5EhcqWAFd151Y9TKhcvadB0BKS8S3qGU3WLvpxIAfvslb0tXMtCa1DGvW9ubADmTu3Jec+a1bLWi0KuBKeeotZUA0w0ghM5nCBDojHE58xyZECweV4oZ21iimf9S6++ZI+PTpDRxTaczgV58p54narz5MUc71Psx6c5o9xyuD6d/Lwnll5mLisCQnrFmeRfcUSGnO2lIJMsOtZiGC762cfZYsnzi1Kjdv5Zln9fiEm+t7l2ykq91WflWdoVB0eiAGsuO+WCoG+SFVjfuYXMh6NVxjkEPFq6s3UB1OONjSYcfyS1bcJp89gFSAt87giZJYN0Nw7F9N4VaWiGNohi6VqSfEKixzJvKVCjrvrzMjly3mKWa9fpvxMHX/+FHdDPYx/QJ6/puQPiixyNV9cbtgd8+u9/44793//9D1X3+bz3b7KIj0Ub5sOuZHjzYVFevtGYodTw52a9ZFvVkquDwPDd3mqoKfJap6bRwoUSZeSLEojkoK1mC1Ex8a/UycjMcHgijtdW81gmqjdrBWUc0q3Ntg429cOmMzafRtaoEANP1ezH0QlLRLs7yLxYK2oiagmBE4wRRXanHKI3E6zDVhH2/ZDuzLECZRhFRjDzhRuz++YrwNv/zt+zYmcPEXhL2QdZQzScobe0qH9g2QLQHYU+o6nqMyqea7yCM1CcOOpGXXDa6kSZBendosni3tibwYI+v8dueaprF9q7Vr71G5bWrrkGU9ZK6GREvggEqzkt30yQXT4e1jHcMke3vjyRrK9wUBgcozfvaTIqIzGRdJc9i3qPbXr0FPcykiYZWW2MlIMirwW7pN5BJrSt61v0n4qAILI3z+9sLOVnqlvIaJCmWnG9QYos+HNUTKfEEXfc2iu25Eyk6SmcVN3ZMIqWSk4oVv8RWYjs/OMMJenYLeAoLw70+eVmXazBFD/PWVEc/peOp45vQorxMtYY5QDZsQcrM4Whj1FHYS8P+16W+G9Cquyp+vO7J/YMNb7HMOw9RMRngHTdCInkElrTtM70uVK8RqQHjvzB7Oh5S0LO9/Ken5UinDL3d5qLydYAC2k+D/xXE3vgEIHTfqcNx4TzgnO1gazzGND3BVsY6PAoPcXRDRF7jlC3wJ4uw6EuCHlifdiYS/mdUNfsFKfprEgOPh/OnLIAYdely+JWLIIk51SpJ2aVPjh+96XdCC/bLvLR7r4jWlw1J4TdNNY7FUhxud1WNaT0R5hDB0N/rCr9iZ/xsxzmzH/YcywHB8lJDDX9xHsqm2Km5LvRL/z3fqNirzVCaUTeWqtbjTp6HH8xxxlg4MdZRnBQoyhW3Y6/NKHyvQI/J5FFcgh7vUp4liPccFcyZdgHSxIJ3DRblcV8z2n5mavZZqovFaRSXg1cCYMad3SQIzg7ftzPxAFdLsLPK3FBxKrnDkiceeyS/8s//E0cxgP7/33vwcdlzT/rbX7E/XFDVgDHKW1FhEAX1ET0R724280CIK26elXqyH54KLY32rberlqr1bbT4xMNouNslxk1V7DtiXlX6jhonBBKOAofP+7PbATD08OBTVG0Zf8QHeH5+dB21mtwNHObLCJFG/u7a8D2ET2WA7Fphsj8OtiQxMzOkTqXA+LmZoPRUiN1Ca3stHzb2u/YzV/7XatuvqRokwrb1EqLzn6oCZuC1jhGHIaQcjj8GTpQaqPxcwNOZV0s3PRU0qVhIEmaEK6ey/8HQSYNPc0YYpLPZs8y+1hQ1+jctLB5HZnQvhIekh0W0zNAiSV38vk9kgKCIK8HmaufZPHziFJMooUmjabzgYbQJfOu+dFIs3cW/TObXlC0E1kiHHhBIykCRXJkHAaMFuub6nuYUREZT474NscmJBxpzYyKMQN1yajlR9iBrEUY3pj3UnJMt0KDNaA7+Dqud34qUgk10FiT8wEHDp59YPWtm9TYUQOrzwmy054G21EFotRakVLcoLEZMlQW1ulYyXKUIcz7O1zjYdlOTse21vAFtQ2mC+vjuY/ngQ1gWP7sUdcO5r69f3wh6IawrXKwnAVWyEeek002RsZHx8O1ISSjUdneJ5sVC8XwY82Qq9kz1WpZTCvBv1TwwDNhrSda5FR7n7B2YBtABy5GE7G42s2O9QYDaRwSbk1FQ3dsMb4n+1RS9b2VRCC4sdWWAv37x+eA8WbKijXzJ2e2cXMknn2iedVXNh6oaZekHWa/87mDwfME5/l9UqkiTT7/7OcOw6lTf/x7n/hsyx239/Hvf9bLy+E36c7lTL0XoUAeyTC/d046/RpguMM0sPF0hswnRFBcUJZOdhwzyTrO6L3BAhkP3g6Q536jrtHZbDg+nMztZqdiLwGmf+94av2lU9wmwWUHCA/LFVuA+Jp4YMfDMT4TZQfPaWSOlwspXvM8ECVi4y1xk90WEB9cz2wxszknCeC5DuPkr0cG9KNfzzOgq9dapRKxS6p/4tdn3XOQOU9PJQVGc21s8F/ZbwKbXoezwUMG1n5wMgREB8iu09GWIlGBxf+Ntao6x3c2m1aEYyH84fD2RFEnKeNTwGRd4CdjFGCn44Wt4T0fPD0Hto4i7sIVKDdaJXw/svPuXOrVdRgCHw+7hMJUkwrK8H81fK3Xn+iAt+EEi3BStSai0ZubVn/ld9wobzpSRlIw2NHxd5G1zDRa2kXqDsfVBEtFxKumtMwV2Vm7oXQQsjc2IlKgk+Ksy+GZ4Mxlb2JzOEsSJIoNZ/SZYZYpW8ThfWWy1ToO3mRBfQTjTZIHHFlx7bYV93/JktZ1x7Dj88j7E6SCgMyDdZV0AYOeziwenljSu4f6yZnNRkNb9iObUHEAn81fJyORjkfjqCU2CneDqDyo7kjqKFo4XTjK+dAQp4QVOWGJ2LtYYZnqLHQEbEylknMJBpzQUHnzFTigbUBmcISLrliPNh+690EGSfXwAjIBqptHMBZ0cJyqW0KgUKxXFeXTqDLrYbmnwOyL81QyJ+VjuWMiKkM21YI1oGWqPqnRLLPuYGYHp3PALmW7B5jxDx4dAk2tIRsainXFrGbF9CIN3MHJbs8J+uSAXThVGmc6lzLWjMSLq72CcjrqUfNUg1pRkiVlw4bjxMGs+UmUMWUPCBUzePZaNY72njuoK3V9T4y6+eIzIqzTxN9DGErtOQRke4DSp1iTHmfRaBAhEvFlfGnMNQPnU072pTRPrgywOsteDnkx6ItyZ6tmUrJH8yzEzzOmT9R8Puf1Ym3pqlLDi47nueNzf1+u8VX47zNezgEFgN19u4HaWwN7uIra4VNkhK+tl8TS7CB+u4EgtYdA5NEwVjM9x6vUGMjJcQb5qHNTE/nZyA0HVMaC93//DMEbe4M4chyZ6yacGOHNSk6WYcsFfI/VYHMGeGa0fxRiPp8uLwVas1xpmwMb1VP114GE8OO9rmRq/pUH6dklDfPqS1n75/jVz3JAfGvWPLZqRXulU7bffWnTmkhfzxCF/u5vvG1nZxP73vtPJJ9D51BgJTbh3PgiorpUDaaMxvjQVx3W6ofBG+uQcpYKIu4Q2HkFcMsPkcF1x4n1Aad8cDqzL+11EP2y3yMC5La0NmcOFZ3kchvXdGO34cQHa6S5FlQSpJMpbjcRid+C4b0pxWaOPGAWl/Qf2rJ7TxkNlQD8mE2QCzizvIueBA5E7hwLkQCOo74Y+2FiTjbl3PqYDJhIbKCM2RmyN84xWuBeCPs5ZpsnuRjO1Km1ANfwBGhsMj6DDSt4jwxWgM2jSeQ2c2lt08KNl81be80iMu7UIxKpSJoAbuMU2XR+ZhkcVzq5sCVgn3l/aVMYeTpdyzu0wwqi4EpRdRUiZ0V2SpIp19jQ5NHEqzhBVmQtTDeCZGaLwenKwjnqN2CJEM+PiGAEx2aIEks1ZEXt2+Z37mhKaoYMLpocW1GZ2ND1PKke5iRwqBNX1lCkUJNZOdyvXm8hC1ogq50qYy9JfDXWeA8+h/nUjWnnMDD2NpHl1O+h8L6gmKhpFs80Cu3PHh/b2K/aD/A3Vbs5V0qzcoJQ2nDVYll/s0nZkQ+e09glEOo9H2mtPb6q4+kfCOTUsI06zMSpUXMMCUdsr8J0J01VFPnAjcP2ncFPnHEXbb7gsqYKnsN86WoNkdbIk6gpiTzVSkkZJFXoGWzROLK24aSEnht6lynYpSNcff3F/w49/5Ld9jFFhZyLKTjtStYnHUjPkV+u2hM5Jg7Hy+HJq3Zj9Zmia/MMeNmnSvWs/u3n7R50cp/mpD7rxayKmpTXAae9ugYnM5rpuXz3uGe/dqutddpAWWCEc7zAnqjibJPqzbaAc9QIqcZNQhCp0xwvQWVrsu6497nNB1jvFvuL8PUPL8b2FM+Aen7MwDcRLNdw7xRvjnEW2nCAnKQc4tyOF0sRUgKN0gjFwpRt42iZn8YB/WJkPD/i5TmV2M+SFuKohQbw/AtEuj/W2115H87boDbc395fs7uoLfztm1sacfNsiGyl6CtCIIe+h8i0jc1CKfSbMP4qHPqRotJGtSLaKrOKMoVIAamxH6cKB/Ktb9zGBk6ksnD4rGd//FHPHsOpvbbbAg4eoPbk2VF3agf9WBu9ift4nXOc4cM22h0YWx66JSJ+Xw1iYQWfC5insf8GIK9dQHpwUJWWson49F0LqegMA86hdhrClsHYYxOGKr1kYt1cMtnMFMETLppq2mtJIxUCbLTpyViEB+LyhNyoWtzsNNTrNAGsVELxvwgjU2GjJSVPqlXd/2LETAYHou5mFRkF7DOno1YEPOmXK07TTUV0HIjxABnPmYr6kuFBNrGYRpKhERMn5QC0TE6ODaMMAAq506fgnJwfPpuOOPbKrvBLGSVcyxQ1nHA5Mn/Sl2FmAYC6bpQ08TgaO3U4eIDovNS5bn7rJaegMDqwZPgY8OUpskKSMdg7FcsYxVhPOj8vJNMskVNwJKlERV5i9HN4kwocGlMqJmKsZcSEWXEJE9Z6sJ5zdtQTV6eUyxj1wKysffDDJ0f2ZMFm0pmaMd2QNt+xAPH7FNcMcuHJSxWJzEXhLjsyRcWWrVQmHDFkhQNR7Z00fM5RmsJRsuHZKVs/F8zkH2rMkeAg4kC1otEJtUpVDax0fpTIYeZRgUGkwjW//+rOmnWqTvePqvSn45kgUdes7JQSNLrDe35tfDFrmiBbyrxPwluOHOBsWJCTaFZZ3FX1l5W6gqO9uMye7+QaWz+eobgbtUtYbEVOSK7AZbkrFlMwTp7DeS9mQ6uanggLeaEqzEeRf2ZAjG+w9ryLs8TMkuoSdMMsATwFtPnKpqtBjyLnLG/WCmpyZU3tEDAcx3As9PGpzXA2mpVQrR3TxPX8bON8kKHIjr0Bgp09wHl0Xk9RTz7BPmQTaw/XO4ucsy4HrsF0ij2wXnMCrK2AGptwfPxTcDUqZveS4rGf8vUL64jyQXQVePivXNsQVMIi3epuSCWeRLmTWu3fFzMk75Md0dxsHWQVt9Ya1sBCn0yWwkVJH50iqlirllTkP0Aqe71TtV//KmodlKHBzwyAe9fLbrZQrz9GFOgwap79p0eAbGB8nxxe2EdPB/bhh6f2J++d2vcfj20b8NUJ0uwbzcB+eIjf+5/Le5MmydLrSuy+93yeh5hzzhpQhQKKRQAERVBGqJsNsltTW5vaJJnWrYVW2mkr/QCZaa+FzHohLVrWbdKixZasKYrdJoIiQLAwVKFQVVk5Z0ZGhIe7h8/De0/nnPs8IjKRVUBRZBOAvCwssjx8eMP33eHcc89FFLqwgsZWv3m1gTR4bX3AXRyFSxYLBSUJoXEqQREGv74DuG/nAHWXW5riKfFQFMQXD79r4RLGHPCbmh0pRikZHxf8lIAjo9nAlRmoM2eif6dwHk2PovF9a2qLDaaShOFw0HKtaAPUq3Q5k9QZZ1ytJG5pymLkaT/x7GWiiq663hU1+ygM0rsEGdCpIKNIZqeo66DAfzawxckJYL4psg1cexrnmUfuHImhDnoW9xGAFEo5UdAJuen7JIEDZ1BpwBFvW1i/LoacclBcr5iDAXERwtXYFwANxopRdE4GnAYjYVZLOLOxZUHzpqWVjouSnvzYAmRAQezSJJx6yqwgZM/UOs6cAplDKxElOAspzCra/ZOpIFQOJ8znSnq/votED54U3kfSChuSAfzByYQoxK/tR1gzP3k2tMezxI5h+AnN8XLTmbJMLOYjm4MlY5RpmeH+1gCHbYyxK4NfrHlRmbOsJLsIWgc8Jo2QCMPzajhfKwYZ+0gKBVcfx+exoXUlzcJQkBunjmrU92KpqHm7UbY3dmr2rS+/Asc0s/cOz+zu6chOJ67wnTox351ImvXKbEhAmWip6lHnR/j8w1WiFY/ZZnKqS/AEmRTN83JkG+UDrpPVuWrK85/5YlAeZCZGjnHjlJLAs7xsUF6YbjzTT9vQZEMw2DDjLlHAwxeQGf6JRr2G9UyJsC6ykbvDiZqBZ7jXHCTH4PYE+/AMtmcriu0RRW8tEoTZAiRPwkGc9XuxokoyE+FHwp68WgOs21NEzmQ0Bhqmtwa0t7AD1Ine2W2qHaCOvU+4jUtglWxUs70qxoB+ldWvxqTQYy0eAtZ+xAz+L5MBbbz1L7JUz2c/fHj8775+w75xvWWPESn+D9/72J6D6bKF8SIU9+I5K7WWDEiqZi8Oj/u3X9m3Tw5P7etXuor4NYIbP28iEiHPCJCs3b66pTk0I3iaARYMU1UaoQ4gqHY7b0dHI+udLdWjs8ACOGZKnXMKI2soCHitAxzvnVsd+5NPetaDkafuVRMOkHIdX9wrYRHGwNcLwt+5iPOBr+AKomn2B3Sv1i2Puk/l4EuAdbbhYZBN5CqoRfRhyD+0kIXg2cgiToosVeQAiPVyFEEIfJdNk2yYlbGhmjPS6xALeQ3oh1H2EjUq1oJo5CiKWqznXF5mFQLCAyQDiDBB2kDYYQUDysF6NJBM1aVrFmXGQBIeecmK8HtzaSjpG4ZZLJAvpz5WekmlbsFDK4l6R9L5yKJLEdNC9drw31HWT8RjJxSYI2uRYwaat9S3w3xOcvWzIepPDy0ZPlXHeYD7q+yFqQjuwWKy0CIpoBCeI2Gkjgxy58twYFcBxz219eH3NUCOCuSED8WoMjqRNFNozrkYLMkPUeKzWGKXKyK+QceSS3wo2EIKF0WRSFjjIcTW709tNE2sB1hkvI7s/uHIklLdHg6n9iEK8yRFMJbqs76USaVoEFsWlofhJSVn4zycgjISQVphNj8n8GbXKGs63ewP1RbxIYPx1K9BLpcxkbP5ThlsJ0mYgovHcglynXCkA/cLL+M2st4WDOjtbk1B0N3e0O6gTjrEMbPjn2NGNgQIBXv8ntjHi28ID5tjugyzMROLX9B/3ECHlLfSuku9TbQGeFdTWfXeUEHPRe9PoIxR323BZ0PzGekuzGC0jfPwZumNrpAjJemGVJA9NqKrn/UIPK0TQ42N6HUEliV8zzZgfhp2Cp6SPUiVFY5UOADSUcbaegKH0a0WdK+pF1cACsIWjVNkMNOsdragbSehiC0TnuJJdJRUd14liiwzCyXaQJknrgnWZ69WCrpmI6zHNd6/4P5DZj+cUxk9yWTMAvWHkXzDigBRA/Yrfq4M6EU2xy8vFOeToe4iEv9/7h3bXzzt20WmHlyk0sHFv7vlkgYozdfPK2ozYsgHzjIjQ4dMqTe3G/b+s4GmAFJHiVEy6YivdCq23wA8MFtLwXgAWO3e4UC1lQoW0Cs3tqxdjeBMOIQtbz98OgFmm4igcNAsyMiTfDCYx5LQYE86GxCfYXHtIxPqVHNqXHx1q2j7ezUN0TPJCSEzg2MjBJLLU1Eb0QqOpdzFT+cKikQtvAw1i+qW+mVWZw9FzWb8z026wMLCahGdKAkd+mDdg7Nniti4hMiW4zMfR8y6wsINUpp3thuH8VU7NcFiISGvqCiG12KxFpTHAjyJCBS+5HC+IqBJj8JdTZiZVyoZmyjTO1tr5gtKNIDoEN1PliJCJJmGle8dv6EqrNPIBt5XJMiGGQ+gnlK+ov4ZOuWgik3ZumlJ6xULG1ex4XDRUCux6RNRuJkyUhx0051OdpewMGSRJUIegKJyjQ4c+jV81hXUfHqWnnwgwkGEzb4+nyVFNp2rpHO6KtUolFnaOss6KEdBlYAoU/02z09CH4i2kf+JkR2OEIUMR4n95JMTGI/Ifvzw1Ho4pk9OhjbGWuzDAAwnbgQk9U9np1k7vDI+iyY8r9O4QcxlNZSi2HwqcjlrNHRaNtdxGLkO4nLl8jdO0Q+dpZiy98wAL1dlaLZRD+OniD1Iai/e1+k05XxTwLR7jQbQgdR+/+3rggt7WGo/fHCsQXeEq6na/bwupYpGWeZzMX7huZENdjEg7nln4bCb08YzWZ2Mxr9h8fnjUq1I5iLIPi/I7od9qqMQZMfPvhhR55+YXfONTUkt/Tl4ty//AjleOIUr7aZ6rjpw5rQJHJ/NMSsFKp3AVl2tlcU6POQEWrLSqJjB3q21i9ympPTjsxRGYL/MFg41E4lhOZLitJTSeWevKbgeCL+dshmYPYNYG1SimGIdHkk4NbEWAoke1hwljjh4s0XnqPlGTvJYUU1dKhiJTdYmSaWfywFdTjFfVMn+5X1kBirdLIQw+9l4n4tXHjTb2rjsIk4uOWF6c9JW49RlX/7uG1fsv/jt1+1br28jelvZR0dn9ps3tr24DkvLCZJVRrlYFEU4HXYhc0N0GiX8DcW9x2fWmyAzAQwxpJNCdNIpctxxChhiYSVi5nA7XCAU9qsVnM5I9lS55AoLX75Zl1FhJFvGimGDH+EcGgxOLq202XdUtXIdmREyoVytLR23sLLr1GY4xnnvnlhkK84NAiSVw/kHKWA7wnNIy5n1LcfIjGjwqSBB0UI2Y5Cpg8WoXh0KcpZpWBPVrFJ4MvbZsP8yXTjzzyP9VIaO/TRBNp6bs49ozLyQTOXwlYxvEcfN/iFlRTQKK2qHzrzhVJ/hitbEnAkJ8TWKWEMveNBwcsYSP5twnxJCONZyZ1tOJwVsFrAORrFQCoX23jcbHwLSQ5DACarZcDs2fnJmTg73IwDEUezuW8S6UeeWJRzpAOgy7f0QMGBfMjtSU197QT+NPfteq6nToTbClhrNrdfNxUKKs2I0Ke7LmdODeZ4kGzCIpwLGIwROD04Bp6yp2ba0M4rgUm8NUN3RcOSqyrGruas/p1jQdeHappHgmqbzq1Sq2XjqVPCcYL6NQc4K8XJOnLJLxYZEU5EUcJElxntJA0eNL6ptNFCXW+A+MeuRUjK8wBZHeCBLJOGB6+p3Xr9qv/f6rsYOtHEPHg4WdhdZ/L3eSMKz7G9bSVIoK/mnFzWqy3DbRgnjfFenLky6oStv+vRs8zt76UZmx9+fZPyy9AK62zizMDjv88m8ywVN7WWPc6LCS/6QZYAvtUbp8wH9prdw89/585lTlCoFFVew5+kM2JvDAI3KGkNcuxsoAzwBssKsiEENiQKMlybs6YGtoAQSBzMmS4dhHVpboRSBz1p68DdarjSFtV107bZS4PA4s8cJ1iwDm3nW90MmYo8wME6En8E6XAWoAu8j60eVjMWXy6DZdUb0+FQx0ucu3SXn8+Jzv7yP6KeeuXC0rnvEVUAs9xD1GY96Lp0/L542amxfQ+byj37rlt3cbQESGds//s5D+97Dvn3joCVoaAfO5W999bb94P37FiFSng9ntqyQngwoCbfgwYO+dJiacBYB6hMTZCqcIkkjMwwLkhxhrFIKANet4XiClYwqlWm7VRiWtKZmPH6P+huwEMO893TkCoEyJxaBo2Ki7IJ1GOp95gE1RZTWIWONBf41Mq/hAyzuJaL6PakI0NAS46UCAzv1Z7gWsC4q3jPaYkKYK4TZpFNSAFP1A3FBs06hEdqFQEZsOXU2XFbTBYy2VGaRz4a78f2qGSCr4rXmsa84U4Y0UWy0dOEEBDbAoRiDRCGrhVCDLnA9rNnkTA2JxWrFaxtkOolxWJCxofIEX5vTRAJcLwq11nbhPN5ANtMSCSGZnaBu8z6SlyfaICQJJIRnIkb4HOWdCHKLAYdRjZrAGRtNg0rXrPch6j3PXCSVozAI46nXJjrXvvPFlmQ0cBgAzs5OXMoooMNg7YvHQUYfsjCyIEnblvjs3J0W6yecdDmfjhHswGiw0RgQXRFOkTqF1NBjAENlZIaztUrNToZnMjZ0dKQ2M6vxuUZumaMol2VYPnqA9R9KBDHAcBmbRDpfhNRm60AafnWeg5G4k4hVVuKAPaRAFThBZl9bjZqN2YsFiI127N/92i27vVWxCf72wztP7f1+bJ88faaMdAyDx4xHBjb10QWp220FVRtm3oaRt3FEG63A5JzH7A4gzdZZ4IvLhV4D75eJs4w0zhANQrdknUZ2oW6dpBf6hRt2nbPnIpeT+VyP82LyS21OEFzYFff7wUWOlF7qLXJ5BYkSM8Nk8+h4mY3OZjCKvVAHkrCL7CfkCA72Y5VyatCu4x4dFKl7iXUbAkFJ8mr+PkW2+RQ2p4a9sVvP2wM4rhpro7iARWTorL/twG7xY6i2Mo9nVuOoeBwXaVrLDAIlqSaP7y/j2AZk28UrNf0r68J/+9jnp0QR8N4OAqmBE2B+PgjusvP55a39fPrjeXjRJVKCDZ3lUq3wvEjpebQ6sP/L33lNgpT/5E9+Yv/9n961R6dndqtVUtr6W2/eUF3oD757BxsYN7TRsptwWP/ku/fsGNDRE0R9r+xvwYDMrDeeuDIADMJ4Qc2rCNlQSQutjd+P+jPb4iwQGIGdamg7TZdAYQHyYK+h8my9WhRtWZLvpUhGt4hCYwULstlpWImNqHg+rHbc2GBRhDC80peSSiCcYKEuyRdCJLn4TNHPgoZ9MlQxvoA6BzMHOa7A6zK2zlSqBROFmnFEQkVOs+YD9QQRwsurcK4rrkwnyN7vA+S83hOp5WaZRa7Y+Fio7NZmVLaaI8KaTFUzEsKogXVeWB4jK2NNiYoRPG86upxIBptR1/5vCsFqxHWlboXObYu23tJYbt1jZDyzB9+29eSZsrKUdRtqq+HfS2QXxMbpCDivJ1dt4ZQA3e28oXHZYf+uxYOPNX6AcjxBJkVCJ0x2ozS76OhJXGDPUDGUSjpxec4SIuki0PRbh742TlzU3ISMwJlGcrD5ltd6gHX2Zx8PNF6dzmCFzx0BRhlMpzLgZFCeLbzR9AzXTBlf7EX8CjNMXM9areaZBnuZSPYgvMZlH11MuYxk7CIZjjXuWaNSliOKYleqLhUjMSQ7yKiLNQr0ppp/VWcfEwzPXi1nv/vmgf1bN7qqS/7h9+/bd+6f2o97MxvAIHHKKjXeyMjzkRzhebOmiA1p+jzZx55njxGSlCNK4nPHoZpDEJ03hjqfzDxzTtMLP5Dt741zSTJnl2QEgoIQjuQ5KO+593/Ox6cF7pcbZNUOZRcqK2EmthsEHjbvYg8TKmU2M6MmHhxKGDhUy3tLh/DNW237weFYTM8qgpAqVQ0CnxVVwH3fgp1o5D0YQdyKwBb1a2TfdGjMbKgjOVrrQJRBMwheAEOrk80GaI2Nxbzuw6UDxXRBYdbjwxYulgeYfZFpN1n5rCAyJOk5amz05vqOXqgBXW6S+rTHr6Lz4eMCUvS8vcyCq/108+rm/LcQOf+nX70pufr/+d379gc/emQnozUghbx9ATWgGJnL47OZtM4o2LdANPG7X3vNjs+G9oc/fmLHpyO72Sq66jXrOVhBnD/DLTNABEsMltTISrqS9lLvbGzbbE7EItrvUK6H455z1sXqubrXQtQMzLXpcFsNx1arl5xSDsdYpzOE48rBiaWFSMSACHBbUGxasX5Fhfgl59Iw4oVjUo1lTur1UEwpzhoKkB2FhOMKFdIL3AEjA+ACp6PRkCvqullmVJeuxpDMF6IPi8m7kXohNITvqyBLcaiJUj2cKRRqfESQqVgvqRcXx5KsZ7NnzAh96USDKKODsz6lwja/U9p6/IxARjrK+WeLysrx1shkSrguVB/P1XYs134VRYovqd7DLGR18rEtjhEorKceOSepQ4zIOka9AaJFjrdAdoZrGABmSmuA3jrXcZ3Glhy9Z8n4sZSd6SgjqjzEPkmXmQihDtby1PPCpCTUQftcIFLWkywaT+WfsDk109OVI1S8jjLIKCfmHCnl/Az2DtULeZFU2A9FGRqkLTaYzFw+P/W4gg81hOY9iygAxmUmMCVdGX9vIKiYrRaq8dDx0oATsuSgOI4FYIGea561m+1WS1NT2/j/DjKcJpuJ8b451spMorc5u94u2t96/Yp9682r9uZe1wDK2RrBzf/y7mP7/pO+si86n2NE2xxZsslqQmXjvkaC0M93Q6LZUMG5pl2jzq9vEnnwlM/lzuG6yxkPH8y885pq+rwQ6GVHIpgyyPTumBG6N8uIFZeNhX2uxyUuw2c+zrOswC7NtvJ1qDVPfT2eQ5pIyoaZKOcHUbuPvYdUA2dm/fuvdRXInowXIjpxD9E5MMOsYQ+0eA/LOX3XGdYl9+5Hw7mPdohMQqUaHkNCEVULEicNEFGfISArSJ0iQL1uKYRAcjtw/j4byC9qbD7JmXuLoyfmcmQrtYVwvEMipmvy8gzoU5ssf0Wdz+UHL18X8MprgM+eAkcPXkK/ZpTylRs79n99+EQ3mQW/vXrFWkhVjlBZI/e+jNfdg1E4llrsCtHe0P78/rE9PB55mgwY7N3DoS2xiJ70R3YXsBwpkz4OmaSHSHTc7UbddtmcyWgwXYlDf2W3C0fHBkCHpkiL5oKtI6qvIhqicWLq3UBxnHUfzrxZRbFEKimaSnWC0vYbMtKr5Uid/hwnHawnlo6ObY5IntI7hN84UC0N8y5EOR/JwBeRHdE1k1yxmiwUfcd6bawMiOKEqmnI8bjhoKOKNC12KVjnfBqlWHIu+BiSFo2FuVysZYy5wWgOCoi446ynxzIjxX4QFbYJUyUrTWclJloquawO6w+KoJn14KdY9kF9AWHONjLW3a9YWj0wmRpkPatjZC7jZ5LCUWGdDY7YKIT9xNpn5IfoPhZ/vSzW4ApZYT5AjaeP9/aeeY8H5xykgRfw6V2RyfGzpFfOSJWMSWxr9k3x/NRhb96Hk3UyZdwony5JmJDEC9FaOTcmjs/rMaVMholNmSGM+2y6EDQ7nkxUD6PRoQHfare0fmioRKQl6SEzrC3Nilp5Rzu+i7NhKOfP6JQOi2ubQU6llDXk4vin47FgXbL6KB+Vwhmw7+agUbEv7rTsN6937Ddu7akB8clwan2r2HsPT+1ffvgMmXhV++gRpaSyGgePhPdLET6jY0J5xUI2byjVfmD9wJ2Jr6k43rDUPEtamw9EU50oE0n1kR4Zwy+4ICZsIZD4B7e2pNjOwv3lh3p/MujPJy0EyuCjLHBKf0YJ6LKduPj35uezs58X/x5m35vPOZWa/ybFmew11nGYhRJ82BT5FWzgda+1EaiyZ2cy13p6o1VR3ZDbk71CS4348FrP0cIdbZrLZVp7qV1Bve4Ua4mNrYNV1nwc+DplsFHBd7eBqlCkdA/2iR88zggOizg9Zz/yoouMIVVtD2h4INSAY6DaUcP9JQf0MmLBZdr1yy7Sr9qDC24Gh/GUtQ57cSFdZEmP4TS4GV/ptqyHaJMRwNF0qWIcFwnpjYw8l5IpXwkCqmPjswmSMvFP4HButhvKbHYaVUVveXH6I1EbK3JqZcPacdkXGPgaIlESFm5f6cAJBNbEzSe00+LYaEbEhJ3Mm/6ajQYixZwUk1eI7gsRYaOcVWtdK23dcKeDmtJiNhb12hZDvIYLB+fSe2qL3pEPtSs1AXf1xOUPkPnkcmV15wdsiqRB4mgANoyS028mp7aWjEpySTtsrVksIhvkQ81k2hiQ856S1CRJQye1JquQUR9rTMS3Cfnh91pNrITwQsFGaiTMoJclx41zFDCbS/P5DL7J6irAsArItnItOJzdX7OocVP6dulqYjGcTjx6KmZQAucTJzN9fky6OLI+4xA4RG4FZqf1GrKmHSvtviVCRZCMSMNTn1SkiDwQVd1psnmNmqZJI4TCOUmM9DdTKznskOfM8dobMm6wUcgkzBf6yGQxvjgXij0YfI/g/EgQGQUyVuvAB5ktEtWCjrAWY7yegpPMFOh0CJsxSNHUSvXleHMgszFXHfBol9kWmZJ5GH9e/xbgZQ4uO5uitoRXUdeQ1GlCiXmKf+o1BTU6fqVbwu+mMowFDOd7Twf2EYKt7yHo+uHdx9bDUjlDdjTBOhlhLTAQkWpGGGQip67hyh+eT7oxylx1EpANHBrLqMw+MttZfOuMPBBlmnaxan/nZD85+o3z4eybvw84kEgw99fd06mawc9FWNMMYt84m8s/fkDPwfH6ipdkOC9TMHhp47txREsFsNnzjjDMqNy5DeOQQylxv/drtAnIxBFsvd1taNxBG3alozqsj154cDa3V5CBDhBLdXAiV7EftijJxflAo5XQguuIYCnbw7NaxH68xxwBby79s2kWZTMrRzGQzUbpHkK6dayDKtbIB72R7cP28L5KDT71sd+8IOfMTe5Rqh5grdCmUal8bVHWh5V8eg3oZXDcr0wGFDgT6QIZvpyLC3vxl73gfDa/mQ20YOTZwMWpjL/z6r59fHzm/QNZc5zkJmJnoNRKVfH16agYtVxHRrOLmkYX0QhpjQ1E/jcrkb26S7ojsp9ahFQ5EdbKm0mKdgsZFn83WAuBYaRB57YbjqfKmgj1iZmXc6kTSrsw22HETvaTCvOI/tNKE68rocD+UJTyQnlLsN2y97Hlyh38vmchjJCMFFWZ51Pvn+AMGzqTRezd/CQVoIZFooRgN0FLLkXCbCcwrxfwqq3mzjnyieChy5tYNoqCDLrQa1WRGFamXoRg5SwsKlOn7PAnK4tD8FSvyGoBuieJSAZUCog1cK/oBXR9Pgw3ssRcrWm57dctt/O2K1DjWNZzRODTM3z2QJmbZvNQ8oejE3JkyZWdK4HrX8C9DuHA8u3bUgZfsy9odOTQGyV/NCzQ1YOVxawSOR/VsuhoQ69pRGQCRn7M2WJSdhNmWfWKtTuxrBI5mZRNqhQbpRjmKlGdhh5M/7GuZN4Ie3zq2WqlWpMxC4K8jMqUkvsca42vOgX0W4GzUJawdtYhI+FqqaKud+H6+J7rN66oMbrbaCLTGVkXWXQbWUstTzmdou4VlSPo/N85aNub7YLd6DQRbS+s3OnYv/rJE7vfm9idk4E9G800ioIZ6fHpQPeVytxUPWCtQA2qWQbDCJs6c4Rz1TCb+OiIVZbx+dZ0FYLEG228KTMbQrhxNhuEwoKLIj6daZjVdb/16rZ9+37PnmLt1mHMEbao9qp6LodCxs4GzGucRZKNzNgYgefNyCYTysiCPzc096Ij4p65/F7XqfMneJ0k7YVjFbEA/24xEMD9f//kzD4ezO0pUJgh9j8RGBIJuK/fP5lYH/uG9OhT3M8eAg02opLxd5V14sSzYY7oHiSeXZ7MVgq8JhmUxxPka2f4OwVJqUROLbgZgrK9elFtJRM8R603zoHiOAc6Lf6EkhLzmqPYqKGdtxRIzRv7ebRKf34Swi8/7fryI6s86pFV/S7/2GVCgp3/+zziwX9z4ulqulrbg5ORnVc6+ffEhRiLhaI2O5lBebz+a/tt2Z4vokbEwWC32iWkoWX72s02cFey6mJ753YbRgNFQhRwC2FsXaTTmxCsQBAWd/GMUa53CYpGW6aWGcKjOqASQhfeOOjMJTfskVS12SuzWk5tdNaTOGguQuYUj212+tAKtV3Vo1aAo3JwmBy7wIFsJE8G2cTFcCXLICFSzsNZyxmYitcbCmuqeSVeTObGkhilDPRKsE+ioVXZzg0zCZTYF7vqSQtCbUsZbupRhSRDWDZkLnaCA6NnLuIlGWLkGjCtCF2mhvUCFekz55Xffd0KB4Db8jU5H+qwxauZnM3mficwxhGbYNUXVPExEJOeRmCzzhSh9hWV2z4R9NmPAG8sfbRzmhlHZpOWRc2WKZcreHNYhA14ZBQq0qdXSl2bb0XIqUy23sqbSxMXNRWvn0GMxGidfemEgEDqD5vwXCQFfBQbDcvI0ErF0CazSAaBhmu84HjrAoz+XHN6FHPivnbaTUkPteFY82QCmgttlgmnwZGxnvOs14MTqtt0NBbpgnBnPnLF8f3tmr2917ZXkflwfhWzrPuAe358OLAFYNIngK53tzoaXdEfnwnC5XyedINfmTPmNJ4Zn11BZk6nQ/mp1cqHxm1GQ4itdr5lsybQYDMGws5ldbTvAq9VpBZcavBMM+cf2DcAm3M/VnH+J8Ox6qnMqk8mC713tV6fm4ZLbu+5hzLrTAoq+Iy60OeyldlLo8zxhGrxiOygXdcsJcJtjWIkTbwxAgrWlMlcY5DBGiBHunDJ9GZryd8QyucYhgrMxUQOCJkxyTuExwJn+mmaMhVMBM0mymzInPyP36jZb91sGvurnyI7v1bJK3DisjzjniTMDKddy5sElwkDE80heYE53FTUedOUVkKpM6nS+/52ZYhUmXc+IyKcO6AXm0xfhN1+taC34NLPpzNaflb2F2cS7ecsG6WhDqWsVcQ0yVN0EF3+7VvbKs7/O68gy8AmeH23JsptHLooI8fkkrU0wYau0KjA2Vw56No+sqKtbs2qlZw2awlZEDMHjtuuISIqwNjSMHS3Gn7MYvl46k422DpdaQAWgCQNJsvXWoL7YtRzQmUyMDitPUT4O1ao75gNn+A9sSCfPIx/VKlbippCMp0ia1jL6THqJ9TFICmv3pjURVUtM7rJhVEQ1MNIXlRZUxE80KTTUIaORlfaYVm0K/EOjZLOq4m2CAe9Yi/N3EkNE0SrhYJ3dNPxqCaSC1S0z5Eannj3fp4OfO8VC+rXLC1W1KCbSI1gKuhQq1sSP3k5hzBXVYS2BtyoqaPzMRxYyYrNPY/mJqfSxFPmAedFZ7RRUKb/Y5axYo2NI6ZT74egISRrUCwmXYvYYUNeqkRHpDURZArSoh6nmbQMoSkqTJMywsmxhYIsHnvIZK0582btKtR5F8xGHYYRqGstnCFhpSBoldAun8GGD0XxdgHQuSbpBvb49NS2ANdWazXrDQd2BEiY8lB19gZxNDyzQ3w4ZXI4PpzZOuWfaOSK7KaHEzvBung6mKn/pAdHQwh0wGnDubzgO5471bvzBc9OGCRJ2mblAQW1DuccUxHHFzTr0M6p0hs16A3WtWkk3Vgoz258v67TSy2e8lahVBa+9dZ1ZQYnsJL9/kCG+tWdjh1O1heajy/YgTC1nyIgBBd86Z/5+HltpmdtDrtuY93yh/UXkpO2AfuG2I99OJwnHKvBHjfsNw6MY5ZIaGu5diYgnQPXEIkFvSlFgFHvAiKwVw7tVQSylAY7RCbzcMEhdcxmvUesnHd4Ngk9W/3K9YbtFLBWsVAasEuE6hgjLrE2WW9cUSkbQfBv3Ny2D/prAUqzxGcCFcLgnPVZJFOSkHziaBqDZY4fZ4ZUxvkVwpew4F6Us9j8/lWv/dgL2c6LDufTzn8T6VJFNsleR+/egWH4xkHDfvf1PcsBiqoU8zJ4zVygYuBep2w73brdagHCuNKUztjtK23bRlZUKTpJgXjqPINQHh0NbIAo5uOnQ3v3wdg+eDywB8DYqebwqDezx72F3XkysP5wiVrA2gZwNk+OemoAZc9HEY6EDLc8DdDZGaI/OA42lXLqJ+CkiEb68GM4piGeqwKOa8AoowYzONbMHtGjYUDEUiMygfcWK4yGVueFczmWxGFHs4tmQcskYNRPE/vraFQI/STZ+NWcen1yipCCJFIzKLXaSN9Wm+AyzqajRopUIxrAa9fhHM/E6lMkryY5ODYx/roW1K6rR4c1LKRS6nNSL4453BdnSHRUZGYEiGjyDE7mSLN+8g1Ey5zuOT9FRsZaz0xFc0JmuWJJvURrZJOc/qgGXM1NcudKrTb1mHDuDaJWwkTMIqgC4WQJsujyqvUpMsxl3ft0KGQpcpBbVkgnB1vD7lCz4nwcMeUSh6iYMdIXUdCUw/GodvGjBye2WCHyRBZdrJTFJAzLDrkwkyUm31XxN2fj6QRRdcmjenPjsduqZ2s4p14XNpZSyXqETGYPtTiOlN9vtew64DYqgD/qT+x4NLGPTobKiNkkPaAKNyEfBjwwXpSQDVXzisXmIj+Do8LJ5lpnY7K9thMoKJHjCYOs3rIhKrjNz28aTy/VYTZAumWvkVhp6jbrbQRxbxw07TEc5P3+WHWIDmDFPozxjWYBUOFYx/qZDiWw58sRl167kdT5rMdPEZlsA7EFqLXkVVtrYK3tA16/3qopAODeGQASo3Okphv3TzEf6aemMS8FNcIT0mUTcE5KA+68OQaB2n9USzllcykcPdVabjQKGgxHWO4Z1kcDyAmJImRt7uJesqPr4XAhnbdfv71lJdyTE9STbm5V8FMVk5OyYITrjnHNJvjbbt6znkOssxr2ZCPyicX8fjoY1ddI1WfDM+5pldJggd/RLueUbbTgXuwm3jw+b93nZ9G4fzEfm7rP8wvp0yA4PkiHpOwOI6lr9Yb9t//J1+2//qd/avcQpfx7t/cswiIivJZQiWA2Mc6ge/1KCwsg1uC1ne0te/+jQzs5nWATrhRVVBiZEuGCaXyEzXJ0thbtkUOdtpCOt4qhIJkOFg5vLlPdAl5d43AoOK0WIJMqHNcSi1YSL7lUBUBGI2VKdFD3Jg/svVY3azUtzzpRzF6BophaSxhMjhEIkBEFcJrTo/tOXZ07+yqwTTc6F46zchhRc6Kn5uiEzuTioDZO6KQOHi0ktb+U0WScWF9TGf8p9YZHDQbjXCGSETgBlv9g1M1ic+wYM6nQfrs85CcbJ8lqJCItI2vLVfNyTmn9hmbzJPm2nKtD2sj4Ck0Yaz/nhOKiysBwHHAyyeQxHA4yPdYjImfCaeYPWWN0JkUSD9y5UHk0jvHalJp1RWlrkVrODnPKkETVqnTv6JTE+qEzYec5s63AYRZOrGWWw9RLzmqdzRWKvEGUdaCIPVuu0a96yhoGYD0AnMdxtqn3J/UniVQIBuOlHZ0s7c5pLJmjwSpnHz09tQocUw8OYhmRRRVquugQa3IOo9FFFv0I9ZltOJfeZKx1y6Zd5lGk8xOyY82TdqULR9bA8dzq1BGl87xCO8UiPB0t7IcPntkAhrKM9XIKh6Qu+pKTGXy+UILCNd6Du94/myhoc2gmqzcHJoeUy0zzOkjPxUAdFM+CYq4PXmP1kL1kG2feiJnDNeyLLvbNvWdnGnjHY39zq2Y/OJlLp+zrN7p2BIP73tHpheDn53yESbasfw6TJ9vIgMfYNF4R9HUN94ZEmyqO7f5wKrkaLa/UyQDM1UkAoMq5kILAn2cmofZPrl8zqVJwSTDriTPNtdnasxJ+K7MrOp9bzar22Sr1aSJsSq3h9R2y6vDKbRiqH6GkQDbif/TOrtVhQ9570Lf+NLYzGKduvWDfPpnZBDeMbNd3WkWtyx/AkfexFt4BLJvH583wdwrMTvGbIyCYnXHtbXT2DoDwlIuZA3pRauey3M6v/uPlzoePn6JFZs5YGRJWXRc363hO9lfe6jD433zjGuokK826aRZR23l9B4XBnObhtEuBHR6daW76Is7ZU06AhFF9/3BoI9yYx70xNh1SZmzS/VYFm7xgu3AG5PmTalyqVbVwu8iaDqirBiiJ0Sgdixhn7FInTEM1WkIhgBlIyRbNmeUW1o/KSLHLTWU/4Xyk3SNBQS5Qzu8ga26FukehqDrJmn0rcz9fZlI0yBGbPM1hKKn7EsYjtISMZQqYrkiILR/IkPKHDZYavhZ7AXnjwJjq06lRTy7IJI3IjynlyiJ3SGUbJ1yCs53hejKr5PEw4lyJHlxUtuCjuX0KK4UKyHgLKS7afQM1LNZ96oqGJfoZ+twfRt3Jaiblb425np7YqveBak8Se+QE2kBnKfIGR38zUSPJQA2yOdSJ8H6RAjTneaXGW/Z98z6wZgQ3j/OeeV+HMhbAlpyFYgvVtXhNAjo4doOzSZDJEGG52LJx0DgMsvoIaRScXZdw8qTSh9QNkBx9rOyaG53NuVMECx8+nNnhYIlos2nvHcPRzM5QD0oMZt8mgE52trp2ikCpBONCVhozr4kESGPVz7a6LdSA+sq8OaCN8FAD17eOfx8Q+oVjZ+Bz/WrX7iMz//DwVB3uhHHOUId4ctoHrFdRNjNDrZMwHp0eKcKqBbEGwWDD3MbEmdQPocEoa2beSOUEG9gtuDSc7dL4iPMtHDgUd6VZU92EA+sePutZu1HV6IGT/sjaHA0Ah/0Jjpkw4FevN+3+8dTu4Fw/r/vZZF3BS2C689ekGQqYHV8F17ZNSSIESgVCbsgsKaFzNJoq42T7RJPNw8uVQ2KpE3tEZEmd/BSIyBJqosxYRJ1QASu/hs3ChOA4rptCpMyspFJAIkjgTpxMzTYn2GLBTVMf7c29RbWTKkwEh9nVsFfGWA9nqCUSqbmCIKVbDuSgHp+OrJeW7D3YK9qVLWTZHQSe74/mIr3M2LSKa9xi4ITVTkWEuQCMlc63itvbyXM9FWxMRONlhvby45czo/k8j4vZJpYZnxcf54S5zS8trFSNotfrVTX8kc8zGACOOJvZv//mviCEL93etqMnPcFojwABEJd/Mgvs+4fH9uPjsaIdZjK3sCj/4Rf31XBI8sAxEofD3kob/Z03rtq17ZI2MPuAaMjJTsvBEZDIwKmoLB5Sb40jipl1sD7BAXeusBIIQ46IMlDQczqGIUhl1FyMMRRzjDjumlVNQAGMbHOFtsWEpODM6DnivNO4I9aBYCXzqBGka4/016jLUJHa55ak3j2eLM8bDL1uHImCzXSfBeYFG0opVMg+l8CbMGn0VxpPEcsZlauVbMyDeY8N7hWzBrHkwkRzh7h5JI/COhB/cAyFSks1mCj1Bj5K4RhrPeupTy8VKypni9ETiwePAZGOAbstVagONZBrrZ6pNF9xuJC1LmQYkfox8sgwJzhWfB4vGucWkShRbFkOm0y9OnA2CRl7VPvNaoxBDMiEDMblTEO7ckWY0MUAlzuWppdRjkf1u7UYb1KVSH3k92xV0v0MJcKJ4y/lFV3SKFNKhdALB9ZRDqmE+3S1WxTzcYTTKC/HyDxYM2xIEbvSaduzQd8KOL/p2UIOvALnKUcPgzZFvS+P61shxIpMvYLjmLNnieeF75ux74tsNiqCH5/Z/ZOBTZYwau22jQZDG+AuVVEX4pyfV5slm1QY2c8VNLC9gU6cgqw0rKR8615kDkUNt7EPOdMww03ec6kU4LWyrDfFLkYmkFL9hd0GAsEIcNvUPsFxbQMmPB5P7fh0aFdx/hyD8Wg4RNE+p16pD57EqI208NoLxlxGoPuZvT4b53LRybShfV/Unxg88Npvw6kQXuOAxwHFg1Hcn4n+PvOaF16+Crz3bbx8nv6wSjcqdexzQsZLAgQb13F9CriWrOXcP5v69OLA9xdtEccoqSk5Q0qoz+b2gHOAXHuQgIiaffHcCMc1QQQ8QgDazq9sF+thC9esiM+jTt/DnjeTctxDKfQG4L16SbWgGlCXAziinyCz5XfMcJ1XUwZMoViFrDFJIgwO9tVuQ1ny+6djuw97ea4F92K/z7+pLOjFetO/+YcL7V0w4C4efmyBogmx9NPzd5zLi3dhgNswom9da9kep4/itTVkG0fAxp/eO7SfPD1RxPuvHwwRjZ7hBseCnRp4zxUYlVewcUbIAqZRxf7Xdz+0Lx907D//5qv25o1dNSxGGTsnySTpo8DpjCe9U8FedcBp0mvjnG28rp4pIPC1hHFyVCtgox6dhaT/Vy73EVZcqToXSuyS3cxSPMbxyShiaeQ1ZA0Lf/9NRLNlmz78c2tUkHLnPOyjXc9RAy4JVK+h7DU3o5o1Gf9EPkiLvylKyOdyjOpzPhdlo0vGjUNGWA7/FarMJGZiz7FuUYCxXeB6LWGsSqWKLcOl7kEe2d+G/+pzXUxjGugA2KcUFZaKnuPVEOdah1ODk1nOkV0tlfEkq4nTr6kAgWuUhD6ZNtWITsKkdfjZlfc2mBdkF+uJrUhRx2aj/E1U7kpeySVc6GpwjWtdOL2SnMOSTa2KVnAeYdmFR3MzrJtY2Z0MxAqZKCNSZFZkQbFOE+YyKJMZJxxZOZ7BceH7cyXVfXilZrOFam2coCs6NpkQeRh8OBWOLyBsO52RXk3GWR4Ga2avXauLkPB/n+GliGpvAdtfFZt2/OixbcEx9bEOCt22Tfo9Tc9Ubw6ChsVo6QrJed6n1D5CAHX7yp597+5jq2D9JXDgj5+O3bADwmS2dAv1hg4glh2s7w8BzxCS5Rh4skYZRGiU+CXUReOvY9e4c6q15gMqW0ovUarNMvoQWYLsLUGU/5s3d5AURtZHJnGMbLWJ+9ND4HfYJ0pQtDqOnQ6Q/Xb34JDItOR3UEX+dmNuv32tY4ez2O4ew32SabhR27aX2QO3VUmQQWXnmnBKMfQ+Gtjb7YqcA58bwfjfQ6B4ynuWzbaSgkPqrRSily9S758JX8Bi0mzMfPYdPL4VbQzWz+/f6Ni3UQv2XrhEZCN+HGHgCbNrtk6YQ/B8/zXYhl/vFpQx9wDXTpRFrYDAeJA1lOgv0GYEIk84HiU0jWDgmAVmlaxFUQB5G/uWTpWNrpxF1Mf5TYCIdHHefXznMkMpUjHuGAhmJQwyebGf/uxJ344YSDJ02EBwn9U49asPxcU/5Xz4oGH7jWs79g/euWr/x3tP7Y/vH7nzwfNkAf3uFw/sC4jynpyeAdOt2ZPRDCkqNhucwQNEYJzsSKz5GRZfurkJUvAP7YtbiBhRq2H0chOQ21f3m/bOtab99ltXhfmrGzv2juJi0eXNmS3QuAwQhVbKHlHx+XajoWNi9KoCMo0F6crqBUqcrh26FhQzJ7LKCpW6MqN4Mb8INjKNO8E92fiCFamxWDjj/tB29uoSJeWmYwGdTZQBo3X2l4hmTeJaIKgsZE8PFyN1oDgPae5jGRRdrjMV5UKkegMbQAOWqvPmA604NoKabeWM/s1NiLoQCQmrbAJmXmrWvi3VfMr6WJR4zaYM51o/gKMEVAYoNI3h6DhIjn07y6GrAsAIcWy3xoebwyHOWMt51zmp2KwTsVGXNQwydmCsgyKK9Kx5cTw4jmUx7uO7AbmV8JNv4ObWdG4kDFAyh+QDRt6J5HYQEBDT5P9zXANjfDirZH4qmCQZH7sKA3upxFhbqQ6kznISOwAtzhkY0KFjyY4Ar7XbRS/OI4AYs48DdZ8YsOBD4PSPn42tAQfxEIb1yhZqPLiXQFLs2RAQHdLxVolsKmfRranuTTIEYEoKUBLaW1L8AmstZlaYBJrUW0BmNIVxuff0mTI5BRmLmUZL3Mc+YE3h1UrObnWbkh5a48P/5d1T/lnGmU5qhs8+4QwhczJFmrGkNuuQqCYbQgVFZgbZa0nu7NkDs49axrV2VQw3Dlsk/fsh6qY/PhqKnlzAdSP812ADMu7fDuByFuXv9c48W9lAe/h8ogs7+Bxq3N3H/h2sFi+1EpcdkHrUEhcODdVOkClLFBx+4muPAEcuRdf3gYNiSV5yus89JOaWTVvNRFQvqzdsHlGmkl4UHGeiUW/66p6zXcFGSy+wfdiKr+9W7Talv7B2OZ5hvIqkvcevGlGdhPsQ9/nZZKGBdOohWznkzVoms6V6OSeojm6FTd+0Paw7VUUqSjQ+Y0nUgY5GWfpa61d0d5FlKJyayunRfrK37JyEcD7j/YXH/x/kd/whxcfsxrmT4UXdBcT2lWtt+8nRCJlGYl+52rTXd5rWQlpJ9se7j8/sEyzqISNvycjH6kLfpPJOz7ZzJV8+gqwb/td3W/aNKxX7dURgveFERuImMqBzdV/18YSC5QR7wGGxGaxaLYkAwHszm07O4SGvhfpAKnX2M/ooRUpzyXpSbaMYacNTVj/JGuC87Ovl3rQQqEa0DlawpXlRcGNBVjA0c3xXueqwGLW16HhmU2VipFpHkSsQUPKf/SKR+pFcC41ftKKatWRuvBkyCV0OX8edbAruof+N9FBE6VT21hwiKTT6QD4yyeiceU3FatM8DJwT34+wjRlnUmrj82pwED1lOuu1Z04cNxEmmeNi5kZIiJsfWdCamaCIBnBQ7DHi57OviJNN4cwSZCusmXELruHUciXU09oHyNjgHAsV0bx5zfNk3NGxaaItIr3p0J1/PFM2RAeWLsYW0wmpHobv5tRSPofsjarDhCFJ008AeaaRZ44aa8HLUPDBb2HlwKajUwlHatT4nAX+KZx+ZP/7dx/YFw7aCIjmdgo4pFUDMMOoE8f1eBzbR4+PxJq7Xsnbzd2mepqmyLIOD49QZ2wKzj1E4NSqN6wEI/7wuK/shSrta6yJPmuYYSTHPcM6It26jMv69Zv71oWh3cHa4bV8Bojmn/3k0FrIBlq41084Xh51quXaadcbtuRmzZ8z3NLzXemisoSK8eQ72B9vXmlLzoq9Kz3AOGdjBHKI6EmzZpYVI1BhtM5ufmb/HClAJteHR31dC02CDZ0B6YxNf2wmoUrGJ8qG16UZIcA2BBoXM2X9U6Pas8Zg1bS4dpOLGUVKbpLL9XV3eHxsVLfdvmajv0O/j1J2yL4zvUQ9z+h42f9fKjtlTEAFn9lcJwp+XoeduFENpTm5ysRASVYYrgMFOAtBzYko3fPYESBWkwihE92hqjodRxnep429VYfDaClo9OmuZ0tn/M7VUAqHizLD0XRlT3CNR/jcSs5VuzWGm5A/vps6l2+gjp2PslH2MADp5sb/VSleX6Zz/+JnTz7kS2eLi3W72ZAyL1kaVVw0BJV2jI37Wrdmv3bQRUoaINOZ2h9+fGwnGd1UsiHp83XIc/gSz3eAkd7a37HvfHTfXt9q2FeuNOybtzqGdZH1lficmCmc12tX6tLxUvTHcbZsBmUEbt4XQePOzagfvHcKo7mAwytpNML6IoqkdEfe9bVINuAvMlu4yGnMEjWqpmpIpGJBKaPjBoLlsBDZ0UwWE/tdsGsCZBUcScCOopSNjqxFUIwwn1MTp+TpQy+ULuCUWCPi6l1MeqKKLhF1q9ufFOUsAyIdmYaHfU2K7Fgzwfcx2tLzZZfSkcoulZI5PwdplISuEdWlHLm9SpStAJ2SgZaCAOtfcIYrOGyqT4dyvqEYbGKhpY6LE+JjXxIhSAmhAiYjNEZWYq7gquDUyFqjbhMwKymi3oUshzU34wC/QlWfZ5TwWbLHqmnL8VCjvWNkNlG5BUNL7S6nSoWAqlbxKqNe43MnyJ5QL4o5tptZIAMTwSWuQScW4SpWrbBEKjWeJ8Vbnf1UoOa5agZSXg3ByySnaPhsgCzc6va9Dw9tF0XkH350pIFlvCacqkrtPvbufAUwb6cU2oNTBBaVmhx8IZ6L/UaNQurYPUTBvjc8s3W5JsV2KkZwDASvz1NkxVTioP9+a7dtV3C/3sQ+oXTOjXYDnxHaHcB1Z3NSnisouCf2J4/79gA1IQZvq/h5wpPGQmcUXYpWkqa71yjZQbVgO92W5JYmM6otR/ZJfwDn2LLvffwQxfRYhl5yVgzKZsx8iiI7v7bfsR89OLSvXu3anaNTjTNh7XCCe77pOdLWP6d3B9nIH1dmoBsgu3GdtRIQThJZYuMgwwwevFwnTn3kw+Wgnu/JELJLyJIHjJXIBViTc/ObadFp6GNGyBArJcwmmfgLeY2muLY5BJbs9+pi3bewkfZwvciU9Ykzfo6cKck9S0fDmkybrR5wKNv1gtZnb5ogM16ISdo/WwlqrRdLgu6bVFKBr9ptIVNs52WfHiHDPkIgc4ifAezPBIfHIYI81h0cR5lsUTKFsfXokPqAg9lMe7VRUd/iVO0V4U9nQH8ddZ+/+TrPZz28b7rJ+THaFIm6dx2K8kojI2T+M8p8cpJuArTgvIvcPymTm2BrSOrlySaM/ZdublkLG/ud63u2X2BDXiav0WlKgPPkeKiMpFZFjLf0CJsFWjVh0ungmDooCC6mI1GPyXZTxMUiPIwdWWJzbDoOgLqYkbJS4Z/Xvo7vGY2GcnJlzW/x1FzKw6HDKMomOLcHiyiAk83he1JkEQZYSKOqo6pkOMJ4os/WdeGGAEwVlBtqTkUYj2wHx9jYd9roepo1vZ6p+J5Mx4K+VgtXPMgTIyd8wK7svOubSTkhg9koHUQBUuHsiY9oIE08grGcnw1gSCPBUTLolOwJfGAgGT6rgMy8YjadMhDER+ZboVzXeGyf6qkB9r5RcwWNoihUGoIg5yuSKvw6R9W2BtVR9ob3hkQJ7ho1tao/Mvb5OzSmuap05tZp5ArE4zMEMpRUWgpGC6jNF5v6KUpBIoNOxyQHFE/lyJy76POE+GJOPi0RjszGDjDqTpPMWEfioeNlIWAtEgoiaawVAAuyBnUCY3L/eA4cP7IPHh0qg2nXK/bJkMVm18v7uNe3NiDkYb+P7AJOqVUWDDrDfTlBhhFjjXLy5RDRGCm1qUbJrzWCm0blC+2abRUjJ3tgc3A0fBwU7OsHVRi7QHJIB/td+6N379s/++DI7iHbn629ByrNoAKScTjV9wYCtING0a5gzc76p5JFinEfJzByH/ZQ40HGP5tRSHOpfVtgrxZZVpnILa9xmexPONr93R0bnPZtjPtzvVmz377Rsr94dmY/QA1inGXl6kO79NDIAArPcl7N2cgDwYyfdDmgDi64BucPPlcSPJrNEkvtwjYEm/4kdzzMzGpszAzTjCZtgr4oe7NeeU+UBHzNG7Ml7WVsbHex4T3sT2q7cS5PNeCwyYJ1K64aT+yDTaN9BIo1Mjfx3v7YCSetWkUQcAN7/aCRs6sdTk9u2Clq1kMUhRYca4/X9WeutMCIbIZre7BdhcMqyFE97M/t8WBkkzSngPGHz4YiKLjUjrMymfUQhWEmto1jIBnDXXUiSP8QmdKzhbLGMH2x3+Wv+vEL64CCzXhtV3plpO5CiM7vZyc+oQlFKpevUVbP2bwuUkYS2KtUI8ACKmMRvnWla9uoVb+2xcYy11Ej9JLHhtnuIsuaTVXwp7Fkoa+NOhAhKlJiV8BeGWVw/saffYCC77Ua0uCcYJFuq6pZ6iXUlwaDgWjF7ObPhbFwe45SZs1B8jVZluTsoVhwXi7v83g22LXXl1bKinJFb+mn84lqJRd1hDlcA3pKNRpgarnObWQwYxUtvX+DUFGqfpeQaUi8ABQ0BHy2h99nYnfRMFE/TjAY6y509PNA/VDxzAuxeUZDVMPmyOcMCllnMI1UmZXNRRoNziK+VTuWDIZa9NK6C1Zi5/E7yChKJQVCuvPClcRhUFylO9D9SulM1TyK64cMLqB8EBtA8xU1duaqO/iOLY8qOJ6AquCJj22IM8dOegINHmEcNu1qmQOqW4nSvBQkx/vIKacR5Y0A/dH5UYY+Vo/p0nxSa82nRS77xN6kMp2Do4pRf8rRkSN6ZCi5zuoh7Ini1NBkEfugOmroZ42mPJ9V4ll1pVEzJEN25wGCiKis8e9PT8Z2NJppDtB7KNRP5q59Jn02XOcrzSacitn2dhsQIeA2XI/D01MbAzp5dDZWYyGHLHbaW9aGX23gXK61aqgDAC3gv0nLBdz3F3ee2jdf6dre/j6y9IHkeP7pD+7btx+cyVixj4facw3cz3f2G3YLe4d1Tc504lqbosD98XBszXrbHgH+m+E9p9O5GjGpmkDGXlEq3OtsQ5pqMoIqY8I/voZexX5Rwyte8MZ+Gxne2q60K/Y/wRk+QlauRDjwGhMfnCxcQJ2TM6fWWc9X/JIeySjdDJELMiVz7+0SKT+JL2jaQaTz3LxXIx/wb5InJEGE/T5NXLOP7EPWZUkWyHEOFG4rWzHKUSoq+1arbjHqvF3YipnGlxS88TtxIVKSDlhjGZGhiMBiQpVzfr+GyMGRzCa2iyC1CUe1VcsZd/jbN9tifC6QnR6fzfF+XFPsSdLvn6GmRohtB983ArRbRLY8mQY2QLB7iICHygpzHGRvxvclGkRXIKEG+7tEGSlchSHHRgTeQMxrwtrVDuzi1QrlySQoHPw3bpD+aggHnwa7/SJmP5o7E1zQOy8PmtoChPSNWzsoSo6e42NuUuhCQHXZHKAFvm7LXm0W7CvIdP6DN6/al7c4WbBkJUT9W7h52502olEsGETQFIQkjFZGdM9aUb8/tevYGCm7+9XbsXJhz5zXbIhxX99v6rqy/kB8gIKBcyxAMtO4yklp7vWGMrBjMpk4qnu+UsR8MbY40Sjd6Jy2HMm5Vth4ygGpOK4gXKtrPkIan3DgVFAWdMAZQCknihY4uZT4N4wpRTwrXRlgqutGjFSpdIusgDNzVihM0xmELFri+RgRaYxFnqtUZZxJVtAgOvzHCa1EySgEyppMtFFQMPK9onN5/RyPjRIxVCXAjxZ1JgDLrIwGVCQENr0G7hzzgevn6ZzpdPIlEQgCyfm4gZGsDzIGyvZEnVfwPV1NR02TlZyFuDyJZyvKpqT1Boc/n/oAtcwASZppMVPti5ua0bvU1dOCIDdmBzn2JuG7yFhLCCeyeRBZY57RPO/Jio1XMB6rwDTzL6UDjTygYJBULKuOJLYS2X6BV/BolFWUXroG4RiYywiO5qgHuGuds/uPT9TcefvgAFHs0k7xN8JQfRh6rQUzYfR8dJAtjM7OFGScjJEBAYKiXh6bHMl8IoxLNfUucPyv3ryBmpVr0h3DQdXhHOkwrhzs2xzf00e2wwbEAT7jf/voGBnM3DZ49X/4xr79erdo1+EkHsNT1uC8WsgI7p1MkCUttKbu47NOYehobNljNqPUD7v3zVUpLAjPqdxUaOZaJPxMUdZurWqtct6GqFe1Gg37+Mkz6eT9ndsNu1rP23efjhVwUukhzqSieG+Z9SYbYsQ5LuYVVnclkX7n3HiIdbap/fD/Cb+xPhZqXtOmwpMINqeR3sF6L0ecrQModLaUoyiRvYc98RbqI03c3y/DJlQQsFLVmtD3tXZJzc7NVsmV2hFssMg/Yw8XNukIv/tyPmyxyIukMsG/j5Fp9JHN0ok28jmtI9YYi/myFPR3cB2oJcm1fTZNJQY7BUx5JKp4Isf/wfHETpam+hkbWJ8AwSBpj9n3cOkBzDQTMHXtvlCtKWMEB9TM5HlO8bkc2cA+IY6BOKTDWyQXDsjsAn77/1K7+bT3/aLXgl48vHWGuZI6uanvFGHAmjCaf+/Wvv2d6w371mv7toM0+Nf3W0hpc2KEPUWhs7PVxqKZq6GTysKnwNAfHQ71OXls1glqF08O+zZExHHnEMVcjqXOUT5lKTothR9P8bcffvgMzqupMQljbDzOZJmiqFvBRmXWQu24nHpP2Qnv0Npy6V3QfaTUbUSmaiQMmeLnZSg3M1TY48GBdktYGTKTaPhX2NCc76LBZhTrVNF/qUwkWg3w70Djs+n86CiNsj1koy3OtOk5YJwRnGjJgBxDZEOGmkmSkFWUKD1n71AOtRT116A+I2PCeTc082nWeBm60GmaZtAHRwjASNBhsZfAVs6ek5x/4ErKhGB4D5f8TvYi5X1sAw0/R0iINp85YvYJJaj35JsHFlb3kO3tAWZqwnHWtVFDbaS1XsscmXTZAJ/LoX/cZCuOoCCc5m0WrjNH56lo2dUPZHTWc8G3Ia6hijT6ewafaVprSXJAecoeCYYbCaKjME4UMGZfKnMMg5yosRRNGMBx8HuZQTFzJuxI9p/x+uD42TtP0scSWdzjed7e/aRn3/n4yP71x4f2Z3ee2bv3n+DYY9UOKItPejVrIlTcuNpp+MDDrSYiVUC3jSacyoQpsQ0mYzEb6dhYa2Q8W6lUrAm8fzoaqK7AqcBHvQHqAU7ZJURL+PjZYCSD/kq3K4koZu1EPe+dTm2Ie/l91IXuIhC7g7rCe0dTe0DnCKPaLbriByN6rncasI3mHTN3wnKXa0jLVSZgS0iZxnE8FmS4A4f69HQgWIr9M4Px3H4LNViKrb5/PHWFgUujvjWfKJd7rtG1joClnY9UxN8pukAonTa12FZYK3U2c5IoETnhZ6N2wb1Ix15CsNFF9rGHyJ/ZGRVTWJcjNNXASe3i9+sIWncBXxaDVIa+GHrbRa3uaglUBpnFofYq9fPWahEAPIoXD2GncrqPsURJT+eeEXMfsIG4EvpmalBlH/9fwDFfRRGa3QxVZES0B5wnNV4ziElEt6bKCanZIV5PohNJHxzNMILTZH/PkAKk1KLk3mbbR+JDGNcbIgb37mbESBYEerCYSM9uQRLQyxzQyw108FKq9ubxonjpc3jpL6zzcfbXxWPDdvG0ms12Hdz0X9tpIDrJ2xcBE7RxYzjb/u7pDBslth/0R/YE2DRnnHzv8UDMmz//6FByIQ+enspQ3McG29tu6hvqKPAukBnRmbC58MZ+TdAYi3LTWSy5+v5oAawehdsrHY1vINxWqjYlULrOKJds9GPtZzJhYdajvhkWRqEYZTIzjrGri3oZZ/N3gkyR1gkKhOXS2DXWqEdGp8LNuOSYAvYVMfWfjEShXSPaIs1XQqVkCrEWRPYPewiQCWmKJuscy5GkaVJkQswGYnMJHxpwbA9BbHIEjNxTn1XD8QECuLGECqWaRjxsWITE46OCa8RZ7CydcrkimDFHCI2bdb3MGhaZWMC54DhYGmIthxmfVAxKMPLlppU6NywuwtnU9qVcEMJBRsjwmJ0S1opnfVvNhnKX3Dsayy2hRRpdXC/UiUJmNoTtshUTasS214FcpgjHOzuz1XSIut1EKhP5IMkK3GtnwVG2gdnu4kTCpxx/zsZUKkvEmVApFayT5dSpsKRpSyYnlBPMZUKsXL2RGBjsYXIm1grHSKP0z/+ib//new8VjXeQTn0ZWH8Z15pSOI9hhE/HU0XlVRgnDp3brdc03+eL1xoyYENAb3vI3rvl0JZw4o+Oe3KE3OqU/tljn0+jbG/steGI8vb2XtnayOxfwX5pECJGRtQHTHzGoXm4hAyY2Am/D8N/0KiicA5Dx6yAewKGc7+WtyfIuEqAK48QtDE7YKPjPM2Um3GfmelxQi5lo+hoVutMEDjxwItzc1YZikCdsxqV4vHeA9Q+iELsIeO/N0Zmhuj7772zZ+9jz3Jo5KYWxYXkNdG8SCCeMYRqnWBWTUfEqJ56aiKyWKpr0ZSmW846OP/efKl1KdAJv9u49jvlwPZxvfpwrHcQHM4l1smmzkh78pu3d1Cnm0vTkEEK73+95L1wZL6yh4x7v846j9irHCYJ9AFQPhWxO3Bek2UiKI7KD6Ss7OO5iGuCDF08z74eas/VAaV9cR8ZIupGlKeionV/wPaOlWD/KRme+P4x7EUfmUsjZCaUE6VctVjq1C0T0fEZKHI4JLcvf2v+T9a7xf2xUTMPMj+k8DdwIoX3NV5yQLqcn+JkPsv5nJvzF2pJl2s/v9iMuMxRSmKMI45Rk0FosAvjxYY+4qATOCMyh94HJPfhcKrqyD/621+yx0cD+8HxUJDJLjbQx70zq6G4/rUbO8C3Q7u+27TddknRdLtZEjbKDmYOlKNQ43a3hsVTFvzCiaYVFt7ZgFnxYmGtWhIeTcn1FuA8asJVyj4Ns1jyeSr94Uh9IJwGyl6h+dyL/2So0SlpbICsuWkEs3eQ+8A4stEifFfMAgMMv8ZFkXoqCjKLySRhIFuqdMSUYw0rRsYTJrFotmHWiicMnMyxqAoIY6YVl4ZR1gTr/QQaOQB4icZUixNRFKngLIVomBgLnlS7ZjE5zebEiJyQU8hPPJv1GGrTBaEz/ObTqZc2k4wJRcYf5XhwHfONfWQ51y1svWJBbRtWc0u9PVGhifPKaeaPrafqYZKTEakCUCNgMhXIOVmWqthwaurNIAmBDnbFZkYUV5KlHCvnM9GBcDAd2XrB/Bl+TpTh5OBQI8n+j4Hf9/ARJcGAmvniMnAWjx5YOu9bMu17ZsS6FSFMZmGrpY93yCoN+ayrvFBw50tGoUZKUISBpAn8/NF7qB1Vt+3R0z7WZ9++vltXxL9VSVUz4b3oYu19oVu13bIPBxPcguCHI+bf/eQIQQ2NdGyHZzNkJxPrsSCPPfAb17bsC3tYC3RazRZeN7Mq4K1+r29NZExnuH93h8z45jZgzabRcl0yhR+pHcHxnSAz4T3uIaDhmOgjvG4Ix3aE/6eIZR/rnfefqvFLrl0GV6xrZD0wLmgaK+rmFFf2JjFL58N7XyJlXKwxErZmBlLHnjuoA5oksRCX7L3jEZ4rSJj0QW/ilORL7N312iHNMq4zZ3+xhM7+pSkuNJlkKg3i552DLdSSJhq0Rh21GvYNm81Zs2UmcxN7+u1O1Yb4vE/g+A7ZV5U4rTyH7+nC1vz2jY7dRyGfkDJHgJ3hPjThrOikOLiwUXLWKyEzKuJLXRrnX4N9KWq67VrBCgNSHv8B7E9V9TnUjXB/qwguG9hH1xp5e2MHAcJ2BfcvkCNnNjVEwDsYJfbuk6n2FW1EvVgUC1h7DLbtTE7QRCBgkDMTQy+WMGpJ01Rj1SYFNiYOd2tAZpKej8zYlDrkixLLRo+H4c/2LD+PCb/kZF7mbF5UVvjFcUjZ6ase5FxK+e7UhzURN2cERaPMxf4mCpgsWn5wemZf3e9ocNojLKrfRJ1mv1m0Y2REX7jaVWF+C9VcpqU1arDB8C1Zu2A2imi4VseiRJR3ZXdLHHpSR9n/0gZcwOiOhmC31TCSFJkhqXETi3GIqJIL5wiGZTBx6C6S0nAi2Iwbrl5jnQRFTUY4MCxFdoNjI0T4LH42X09VWstqYBwwVqwU1NeQcLx1yXtjqMisYj/HEFBkABuW47hZ+6BzoEioAfYhtBctZ2o8FV+TTXcsMMKJF4oV9dTkQoqkwvgRNlr59FTCVUvg8yEFPQlFwdly7APrUetlImZQ6ep1W/aOKZ/sc3/gqHNpTkwyCmdy9hDpyRpCFyXqUTAKFbQOJESqyaTUWKjueg8RabMcPBeWVCMj/CSoDE6Fjk60apyXxn1zUmxYkKwQswsW/CX9iL8XiLBxHDhqYay5iACA51MWfpFp0VHyfew5yrWQdSEDM2Q4LHal1L/DMSS4JjY9QdZ1oszLCPER+iXcskLgg0IxVSfoeAkN8rsJX3I2kdhZlFVCZsoOJ1Kwn42IuRftwwfH9qgf29HxwA5wLV7p1AFtjTWV9MMHhyhi13SezAYK+Ny3rrSlwKxxCKg3jXEO7W7b7jzpacZPGedXJMsN92uI+3M0T1SILsEwr6X1x1piSYzCXN6nd3LMN+uYhEaLyGhi/G6j9kEVhLOVZ6acbcP9p6g9cyAKVDKSj2YuJT4196Jnxkk/G520zayZOFPTjrJeGjkP3JN2taIMhSzMb17p2hif++0HPdSbKhoXfrtTUP/an90/ypq+i2oVoKNnjW2jiFCOHJKLMxobj6+aZUUkWBC5YL9ds5RTUHYT2cevoV7zCE7nz0+m9kwUZdN7b7bKyLqW2jdt9usgi9zH8VRYe10n2lc0znm1J6wVqFBINcwVRGtm7adEhQqSh3B8Y46Nz7sUD8kEPN5GPSemJqeYdhp5qbNwLOXDs9Re3as4mYSN3TjXNWo+d56tNeCOqMxXd5r2PiDRG9UAr1/bx0BZCM3xPbtYB9SsPFuR8ZeKcHUk1e6VyFH8zAm2CCn0hAcP2Tdml1xM4L1MYeJiqD+VAf1VPl7Mgl78/1+MR+IqzpfplJZKhp4PKsy0sQGruPBvdUv2letdexeR5UGjYl9EJPgeMqBdRBxkgjyZoqjXbtpiAqOK6DrGyjnE4usgMjxBkbVZKyl7oRMi2+oLN7esgef4HcV8KNmQKJuq2QVEQb/i/TveF0Tttwo2VL1ZpR2Wo9zBYt7ZbihSa8AB7u605eCI6RITL+B3tRyKmLChaBOmY9pPuEdz3iRfE8uQ5KSan2qSIZdIgHoJo/iU8BJgGDZ9hoSGyOJC9C/1gNS13Fisp0QNSRbF0OEHwQWZ0AQdpDra8cSCsiRc/PO1dNmIwREqYG2oWIIhae7qvSmMbB5wJTMB0rQp7k9VgvV0JiVrQXOKRR0a0uhqONOUmQYyHYTg2MgVh7VYByLrjOSN5UTsOGYm3Lg8XRIr1owuANHNLCeGNrFqyfVzbg2eIETBybEjFHx9kiXMDbIm1rM4eymP8+fQPwUvangsiD1ImPHo6MjqnSuqvaT5qmCloLKF46kjCKjBAW+jJtW0CJkbadtE7RJkIhFVL+Do2e9D7lLCLBHGJ78W6VAahCdngX3wYGg/+qQPYzJFJjm2t7bLVoNRO54kapam0aChoqZbIOmWUCPe2VjMwCfAdR4D8no85uDCpZ30x2qCPeg2sL5j+wQG6oxF6oVnKmwHGJOggPtAVtqcUy4zIU3WJ3jd1lTRYMd8xWE2SpFS2oU0d7YYLFfe8uBwTHiuinC+F7NCP50NI2wNLUy9YbwIg0wiz8YhhFnvjQIsZOskJNAcd7D2d7G3ylx/gAYpCcvs5BTH/o1XD5RZfNwbZzYqlCxVGjtq4M95mzYFc70dI9Ta8dpqoHPmcr+CWk0LaPJXunVkJwX7Pizxn8Lxj5M0004rAylZ6foVhLQUrCWWGdcj+3liGXVmLBz2VguY8QRw3BXs7QqyUGRQJxP12yyRSV7vFu3aVsUOOmXbqnJGUyoUhn1FLXzGARCX6/tVa1bzGtlAg09iC+tE0xmbrQHZLUM7HsSqS3fVH1QQfbqBoJSsOELmJ5OZamozZpJ05vigLc4iI2zP+i3vHWudORfLJcOPoqsno7kaWS8ZVu+RUvOxD1vM2V/j40XYTpFJZulfVF74m1JcCDbg5AvP8dhJ89wBPk2JjmA2tlNs9r39K3bt2cT+4ddu29df37Hkny+R8pZsr1sRDbKOhX794AuIutJszHBZ9MfVis17Lpty72HPrrfz6tBPELnSsVhq5xtLDXnq5Uk0kZIgF2EGbsIFIlC+r1GrqaeH47gZ9ZdQ3DxFLWqG6HSEG1/FotsDxELa9VzjnH3mPLXDNLWUjLS8q0GLAUTDxAI7G1CRQcUc3saR3adPEKHGahKlCOgC8AgVB9KVc/4LcIZUECD0RM2xOQrSlXZXJIwgqqioToB4PnHKa6QpnaEmqrLWw4i4DGcez2P1RBECXXAo327L4v6xXx/UUUjVK+S9kdY0n0hDiajbwxja4SiSz5gkVWFU8hX1/UTsyym0pOSQrM7giHgdcO3ZDwTDK9YTIl2ef1poe4MuEXRh7kvUgyZw4M4Ay1caNpucoRY20VAtYupxWvDGQDmxIgwMYNvGnvT7QrESFt7Mi+Pc2d5G5jNzeAJOjiFxSnWEKiJzfE45PpVY7GpwiPU21+gFOrA14JEwGUm5ISgqjQPkAQMBB8EGQ0bG7989tKdD00C5Cs5lq0KWZsE+PjyzHu71AGtgnjiB5fjkxLaRXdPDsV7ITPfZaCrW2YTZF9bTU/Z5YH2xb2hxMkRA1LA7WCsTFZhhyOAU+xw6F2S9MJxPROV2ZjWhT78kVEMYmP1aK1xrFyPN+dC4ZBOIegBkWSO84BsFXJ796O+pr1HCbrfbZUTgJUXZMwVQOE+s1ykp42ufQ0Xocu7CFxpLcRIhC8M9XzY5cjuyA9SrVvj9ET77HgLIv0CNNlJDuFPqnVafUyM1/5PKNNcWG5l58rHbCJJgWK2pINW4ASfB/cpa0Z8cnQFyA9y5ijPhArd1bEqOsnBLARmvJwO6JJVDr+N7OBXWSghAW20bnQ2RxUT2BNkI8nnbqYV2FedK+DyFo9re4kRaDvNLxABk7lWE8W/B8RSwOHsIJI4Hc9VROXojL2WOUBpwlOBaYG9R1mu09jowRUkrqMv1SC5gTVG9aEu7wgAbAepPUCsrY09fqeYQdIf2bLiWg6ngu4pYBFRBYF2uh+DydLHKMmoPoiuFouaS8YaShKFj0rjuvyII7vM+XiQ1fBYB4ud9fF5YLwi8YcxeOC7hzKljzW9ukYUW2DeuINtBraeMKGaOxfK1qx3JVfyP3/7AvrbXElPnzYOOCqoPnw3sFt738GQAQ1Cw49OxvXGzY7udpn3n+3etBUx4t1W1/RZuCgwzsVQukAKcwy4WFZd1reIFSHqmJRYZobPjwRSOp+K0Xyz6FrIkyvPUq25MWJCdYRHMsLg2WnEc05wwyiQrLHU+PjMPPiT7sXbigvqJgqwOlg81aVOjkeE9qGIdFBxWI8VZnfiEBVfOkBH9mo2zrJEUnJUm45ZnxrQQ/ZoGi/I8dEQROyEoqsjIMXT4jdAdqemqDyHLq3SvWXL0QEaHjAL1F1AahLHo2qFH9k0xrotUE1hIjLGAKneujXpPsatenjhH1e6pxFdJq/Zhb/h+ZDvUMJdiQq4JCGqRORIflEeYjc21xLzZZ0H4YZUZHvbplAh8KavyEeNUBmCvjwqtzDIjp26H6zNdq2A2wufOvDk9cvUIjrwQjYFQIOt2uBfxMs7UsPOCV2KOP8+i115vqgZXtgV9dO8Ehmelgni+WrPHyHCO4bi3AHPtt8rS6brzdGR3kfYUShXUFZCVI/rvwbGwrsnekv1WXU2HOwgA2I9DiIyF/zGK0YenE7HGHgFSLpcKMhYDOCmm3pOFaxsml/YL4VsyGmlkShFfv/JRApniRpUN0OEmCI2kLuBB6EUA6D05l2wCay2hE4KY3WxjDb1zvW0ncLo83iPAWGTVTWlMVxmBKPBJxdRh5PeyQbuLOg8huL97qysWW7vetD9GnYt11ko+se/CefN5woKsKyUZK07SNnSgZueKBFVO6eVcI+wh1j+2S8y2EHjhun2EWgpZf3F2HPys87KEZXJCmXZak5lP0SeNlkjGwO83dupq8H2q0dqpZG9ebRfs2pWa6mhcv+wpotEnY3WOLLx/hvPD/euwiZ2ai4FPE2bv+HzhjqWUL0k6aQkvOpuHqLH5cMUBgtVT3FMeP2c3DWA7NKuYI2QWcx+wiDVA1hvrzUR4rtRzEiRmfW649Am/PFeO+/iQrEYGBitvVOd92AzsdBWhVFku7anOQazGvyEH9OLjL+OALjuczYL5eT/jU52PeUG8rgFuEbDZyK5QkRkXkzjufB2IavnVva7tY3Hc3GrZP/5XP7Zvvn3b/rPfeVWzgP67f/FjK8Cg1LBQX0NtqEOsvV6ww8cn1kK2VMXC293p2p17jzW9kFTpVRaFkHKZ1wKYakcuF96fMBqPhVXfRbTWaDZtik1MJkvotX1tkCdIz6nvFYW+AIj1rxdz2/CFWfgWrh57A6NIBQXGY75Q8ur9SXRtIjjONZlrjEYDH5KWqj5U1XTFOTJCQhVBqepEBDLp8HdNtqT8TLGgwXQWuGwPnZQaTCmz76iJGHA5RODMxPK5TISS2mjIIsP9tyx++CMVRdnISmyfdFf2DseE72jY+H5OECUzj7AiM6gSNdLqyDBa6rcJAXGlcD46fp5n4mOwiTUmUUMMOjZvUucuTaassri+HJ5f02ICUpud9cwyZo+yLpIO4qXgujwHs6SJs+DYWwHjS7UFMtqkwpeiLnd6B/E3zVJOQYGEXOmcUlfb0FJcuQIzx3azF4PGnCOri8igJ8i4nh7N7MnhUP1Ldw8nGo28gBFqICImXHiGVIgm8vXdpj3rD2yAdQN7aM9g0BbMpqdLCUSmcnxza0Y+Fvka8H7Wrhjl834w609zNfvg8VO8H0aKkSyuB2s/km3iPCtCSrgvdDZxRgbQSAVRbJ0aL8caZGKjm+5/1jRIlxa13NmmngFd7N0k9axDs2+MEOjKCSliTfrk3Fv724r4P3r4RBCpPpvMNcpAAWaT7qGZ2HCh+vV8Iuw3b3fsKuqLnDTKeuYxHO1HpyN7jHor63i8j9NZFoiYaX3TiFZJisF/lOgS/GYm+In3ksKvfDVpyS5g4ASfSy2FWTYYSKiU0GMTx9pCsFXDa7ZQb23gxfvIWvq4h+yRYa/Ml/ZqsC9wbpWcw+ch61w+cn6C1xF6HsLaV0ocRFlQEEOWoRwDalsNQvihM14fHk5EPw9gP9gfOKLMU+KTUTkhlvaDmRjRk2LBnaQG4fF4KU6KtdtEAMFx7zXYsjtHEzVyU0yUbMxTfM53DsfS+NMId7em7pzM738UXUgTbaTLGOD+tdaAPu/jL5MBvSyT+vneGNtlWQ3RUdnLkLiqwRcBAVEHs4hI9P3+RBvgd24fYNFOVbzt42L/ycMT++M7x/YAToeR4XuISv/Fdz4RdZQq1w+AoVLg8Q/eu2eT4cKOgNUzimfX8NPDvgxYH3/vI7MZAdNlB/Wm8MoIYY6Ioz+cqi+EUchsSqdBWGRsr13reo/EeKEFSfkLjsueIQrm4DsSFvqcT4RIdj73znvRfs3pkiXUdehoOMrBN1+ogj7fR2w2kgq1K/4Ww5wLmhJjJ9sLx1jK+o5yK2cPUU05VAd4omF11FtjhiMBUrW9wGmNWSOJtBnPFYTjTIiSjaE0aEzR2zu26j2mBXFFaEbbhDNW7jym1B+jAWc2FpmrJPDzcD4F1DJYpI9wToLhYEzTYtWjQ8oMcax1WBKdV0xAPk9mG1WwcyU3HNR6o+o3NeOWC/98yu2oXyvK6LmEMxY+KZZWAXWcRBNQ82IJBqQHx1PUa57AScUa7UDyA3Xe1HWfrBXoUJ+ORAVeazbwTbOxFSQDkHX3SGPWJ3b3yRlgsoX1x0sZbNY+GOVzXUQrGJw66n8lN3or1IpGcOw/OZqqplBHhsSLSNHJejEVFNMArEiG5Z9+/NRu7GxZF9n5MSrNw7FDhseA3sjGYgYyw5olfZd9N5oILmajW9hk7cKdZs5aPN+DQSYWizXDcQgckbBOlj4+OvTR4KzniOZMeFlza5xwowGK5/uYZKBIzmEjzjnDfXx82hfZwTKnJ4gug+Bc19Lfy6CKa0OsuTRn24DwOPSRtHGSfu7DwI5X3sCsWqLXyLNeK597w2CBASIdKAMsUYnX3qDMwHQZ+1RSb1z14/wS6kDHvDeZbiPh2iY1C4PISUj4kFdwzzp4ZwfBHgA8ZZmsDb2NwHK/k8d9K1i9ljOCF/P52kkgM5+lRQiRzMgGHVSYKoCjFBfzUvb1UaOO9TfK62huFJ0pa2K4L9f3W4I4mUVW8q7OL5Kq6PgIkPMmZRIxCAWTeeBaQwY6wfpU5oLvWWB9fh91iR8cjgQ3bsST1dyS3b5NaWUDp270MaOMWPIL5YD+Msy4z+o/+qxHcCnxY+T599++Zf/V771jv/bKFfujnzyypzByY9zoJ4wAOPMGRui9p317CEdBSiI1nH7vlQN7AiNPWvUVZAJvtSuuHo1juA2IjcXzCDf9jb2OFWCc3gKM9z6cAyPAAmCAt2+17fpuVVz6FTKr/nCGdLpmW9sNfb6EOEkV3d5SDafJcbrYZMTxRRWNmYKPrbnVhROaSieuDbhhF/Woeq3AuqZ9/HSqWgvTbNKi2Umew8IenA5kYDmnZ8AhZHAMZUA3uXym8FtxbTZOGs0jWtOoBFKbC2zg7ChqSvPeaMeWlhw2QogaCSndzEp47kEhlJHZKAzTsC5GC8/EmCUhYxDcmVHIJZMj5h2i8gln78ylFJ2wmE38XZRaH1RH9W/RJNj3IR2wvBQCAkRpCZUQopJqKEU2Z7LOxX4aqmQT42fGVPBeKcoHSeKRXHA2gBacsEDDSgcdL4aKnsWPZI1kMhTbTxl0VPa5RuWG1zESXxdRNuSQ05ds1hf0yGGAocttyHCo4Zbj0lfeL5KsNsV29netVEAfIfgYT5aoxyA4IdsJgQYT1hIMDc93MJlbGxakQX28kD0mkVQEnsKR3AVczLEArFuQ8t/Fa/Zwf0uAUgqR1y1KhJeQ8Xxhr2FXEW2TikxmnhpHca3Gi1jXnFpilBQaUambzc9YH4T66I0qCHqYxWs9ZNqCm3ECkeSOzIfpyUgWFCFzf7AHpg6DJo0zQJpkaur+Z0SAUNmQT//ciIPKmAVe+JZqebZ/oww7li3I6kh8b5WEA8pbmQuMcu3sN8p2+6ANSMqnFJdLJAYkdpb10PH1GxtSrzc8Wwv93mhirAXZOYbKDAlpLxNXprCMsEAwsDdb6vgaHMLIZlJcP6pKU7C1i2DxZjmH+xNaC797sCnci/V6ZG9dq6K2U8a/82rnKHFsNdl5HLZIBwc7QD/LhuFmjVA9RyGslPHw+JgBjWaE9OGop16PI2GpW8fnI+hoo3aTD1bWYoM6e+gAo1Hzb4GgRdOQRXOPlOFqnEKajSYJHAHgoMX3Bgt7tweIFwE29eYukzXOpwngN3X1mOWw9YRXhQF3mvpYcTliXMP/F8liyFI8JaUjAAAAAElFTkSuQmCC\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_card.json b/application/src/main/data/json/system/widget_types/radon_level_card.json new file mode 100644 index 0000000000..ab1533e4c7 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "radon_level_card", + "name": "Radon level card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest radon level telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_card_with_background.json b/application/src/main/data/json/system/widget_types/radon_level_card_with_background.json new file mode 100644 index 0000000000..5785502397 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "radon_level_card_with_background", + "name": "Radon level card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest radon level telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_chart_card.json b/application/src/main/data/json/system/widget_types/radon_level_chart_card.json new file mode 100644 index 0000000000..6f988e757f --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "radon_level_chart_card", + "name": "Radon level chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a radon level data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'Bq/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'radon', 'Bq/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 8 - 4;\\nif (value < -15) {\\n\\tvalue = -15;\\n} else if (value > 15) {\\n\\tvalue = 15;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json new file mode 100644 index 0000000000..cadf47c1a1 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "radon_level_chart_card_with_background", + "name": "Radon level chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a radon level data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'Bq/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'radon', 'Bq/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 8 - 4;\\nif (value < -15) {\\n\\tvalue = -15;\\n} else if (value > 15) {\\n\\tvalue = 15;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU8AAAELCAMAAABu2vS6AAADAFBMVEUEBAIJBgMMCQUQDAcTDgkOCAQWEgwYDggSCQUcEQoWCgYeFA0eGREiEQojFQ0qGA8wGQ8cDAcZFQ4oFAxAIhU2Gg8kGRHVfT9NIRNHJBbTeDzbj0k5HhMuHhTafkNGHhIuEgsoHRM+HBDYeD5YLRxpMR7giE1mKxkwJhszIBXSkFZQKBk4JRnMcToqIxnQhUpVIBM/Khx/QSgjHhbYhz/gk0pgLBqEOyLSdDjVlV7aiUfFYS/UgkU1KyDLfEHIbjWrVSlWJxeHRSjKZzO/ZTCLPiJ9OCBcJhV2Kxffm1x2NB41EguwXTDblE5uLBjVhTpKKhpOOinFaThPMSDal1c8MSWyVynWfznObTWRQSRwMx3JgUvagkhFNykhDAfijlPPdzS2XTCQSCriomU8FQzagj3HZy6dTCiqVTPZjUEoDgjAXSyiWDF4PCThmVKjUSrQfUenXzdhMiBaSDeaUjDOdUBqOiW6Yi9EMCHNiFNGFg3EeUR7MRpzRCzanWPUezbcqXlxOiO3aTdXQC3ZjlTQgDqKNhverYCCMxrGdjtiIhPfg0bmy7XTjktYNiO+ZTzksoOXRiO8WSiUTS2jSyFrJBRPFw/ViFGxYzeqTCOeRR5lRS7Ubz2+cD7Zom7lvZrAbTXNcjCSPBzcsYukTTKbXTnjlVplTThOQTLkrXjlt4/diEHgjkTmwqSAbFewUCOTfmaxVzmaRS1gOyfnx62xbkN+SzC6dEVtWUWJTzDUxru4XTtjUkB1Yk68qpbCsqGch2/epnHLuqyQVzaAKhrSwbLUiUDct5d2WUGqZz6aPR+KdV+4VSTlnlyfZUFaGBDQZzlwUDesmYOBY0rQonfkqG3Af0ykj3jMkV7pz7qwdlDhxrC4e1C0oY3HmW3DhlaCWDymbkjSm2lyHxbHbUPTqoOOYEGUMh/ZvaWogF6ZdleviWmLbFDPtqDAj2W5hVyWa0p7IRiKKBpnGROlQiTPsJW+noCkdVHgz8O1lHSjMCXHqIuvRyzedEq2TjCZJSD14ifEAADcd0lEQVR42pRZTWjDZBh2TZZa862taRtaaKgZLUtpCKaB9pRDB9ukiiyMHFqIh14s4lCXIUHcoUREPExkiIdeK+2ptB1IZa0OT8WC0PWwk6AwFHUHD4IIIj5fnc7/n7dNmr9uzdPnfZ/nffsAjbW7+HXrl9dAACsEu8YEApxCsMsZbrdnzW4vr79f6p5rLcfjsdv1XdcxOIElBJc5M0vTOIYRNKJxhCWCQDjB4OifwAFBwzZn2BohsmFwhmnbZs/g2ECAFTi8srhW1nAVr+siJ6v6dKzakmw6vm/lVU8Wuy4+gS+Lof3Td490KRSRpLy9f3C6L8khvD3ECqIUzatqWIqEeI1l+XAopPAkRIISi3t56jSaSBWz+5lCIpUs1DeTlUe3csW98nGjXKzWc7m9ZDa5mYmnzosnJ62T7Ucz6bV1RCR7VDo87nSaw+Ni46xz1sgeZTKZzWSykqxs1atP1lulbDYb/S2ev9m6X6/CWBPktQDDAV9GmLhdy5oNvv76y3Z3PphMu2PHtXyHZViOPkR3OnU1jeE4RtFMgzACADKIALwYBoAqAJNwdo9jWMEQiOI4mq1pBrc6DfBZVhCAuEIcCqcs+/jzMnAiiiJrPB90ZkvX8y1NJPHzFwu6GObzeck7OD04UFVRJMFQkOUiG1I4puYlPhwOieEgK/AhQlg5SG8pFH0msZ892E9Eo+lEIhp7JJrZzGzV61tbuXq9mtt6PPF4Jgmgcu8Vi7njzsuPFh5eW1uPtA5XaHaOO9XdxrD57IvZQgqRrJTqTx4e1kulZCFVOQr/Dk5s4oHnfWCHCVCmCgFBoXRlDAcE8fzZl19+PVvM55fT8czteb4CLAxGYALOpO+DeCwjEMBkGgGBAB6BMExAYAzigJwcEUwb8CvYUDzb7mlAFvQVWI7DAg5zguJ4hIQURe+PJZHjLcsmHOHE3rR/ObZ011NEIQ9O5sUQH5bU09PsgaTrMZETCR/k1XA4HImKUiRCz/NBgYQ5IM0F1tfWwg9H0vupeDaFSyKx8EbiEdAxeZirFou79a39RDz9SOyRxzOZUrF4VB92RtVMZuOpdLbVuOhgb6dcfbI8fGPYyGZTyeRe6wjfQq6092iyks0WCpn0z3jeIXkP5Grr7gihWBtsgCUrYE1n7Hc921vcXt52Z9P+YNrtulJeALVoSjO9Sc/RNAHXK4qpUToSQjiWCSAMQgxBYBEUMwI0TadnSz2N0/DHA4QLcBwr4GrDU70wL8t515/jm1L8yfVlf4rSMr98f97v+l1LUXjp4DSussFQKJ/e38+e7utSWGR5HoxUI3k1LPMRNeJFIiIB75lQkOEZ3E3woYdiiXgqnY6Ewxtg6GY8kd5MPVqvFsv1rVIimjoqVZK5UqJQah1lm28MO68+mkmWKkfFi2GzeVYu10bD4bBz3DjM7ZUOc7lS7qiSzGT2Ksn4I4l4IkFRu+Pmn0C9RxZ4MgE2sEp9zcXdOHq+u1jOuu3uBPfoepaIdGcoZm5vYgNPAqrZoqkZ2CC0Kq64rZkEbAXuDEtY0bR7ltsz6QLEcT6AYHmWN2XfU4ghKnmvP+8h97uDy6tPPvnk6urqk/evBjML/99yNCmdikhBPhQGmvFU9jQsgYkP8aqcj6gHOs/LYl5KSHlRklkWaMocvZOHgqFoNJWOA89IIYWcT8cTqWwlW6+UUuloupAtbY9qo0QpGk0UzgBnZwRAM5XicNjE8Q7AxLHO2TYq7VFp72h/czOZLYDhUXwzhWTyDsQ/I/n77P9ZlGgQs+v5uu/pkjVrW95k6o5dRe6aTABwaiZ2Nce0TUIlx7QV1FEgCNYBKipQoDEkApucbE96dm/iTSauYhgG3o+/jnwXNF6xLFUUeFOxp1ObMCGnP7i+vnr/uj+dzQaX/Znv6H7eJPm0FzE40LNwtJkopON6OAKGqpIaiZ+en4ZDQSkf3VfTaloCF3kxxNI7CQRCsWgiGo/E9GIB/KSPVClTSKY209F4NnvYuRgOy5Wt6qjTvLjojF5+7aNXX3tt1EGyN5vD4U5nNBo1dg8Pi4fgZCqTqpReTG6C4oUkdpOtFWr38ReQ3i0IsuKn7VsHnu8oiqp6jmNNLHdsi7ZF0RamE63XG080w0Bx1DSzRzTgh4UjAQSYSrVJYEBepecipuPJeDJxwE/6fsBMOKDoeCaB+CjOYGwEYChmy/ng+up62e36umfh4bhdx0A6qyitQTH1zkEkXUjFZRBSjsTTB+cnp+cn6YjI5/V8JC1tSLEgyMqv7mM9GA1vbCZi0Xg8jVoZC8XC+c1sIhHLp9MQuO1h8+b5m4vR8OLijYvOTq1Wrr71RW00urgZFhrNEaJR3K02yoeto9KLrdY7rcOtw71sJVmoJFIouWf3iK3o+Gd63h9bu+OnOZv5vq8TmrGWjdybHLiapwSAZ88hAhRcAYQQcc3pEZRDhQoJ0hl4IkBFpDtDeg6IPZlP++Nxv4c3MJTAkGbR9iwVlVd2VPdyDFlT/Fl/Oe9D+JZIdKtLvYRj+SrhxbwuCiwf2Y8cSHI0roZAUDESTRVSR1k9reuRfFqiEp8PswyJhJjVTQQeigUfTmw8FMH956OxSPwkHn0kGottRKPZo9ZZ5+bm7bdvLgDnsNnp1MDLcpmyE9meHo1qtd3dcuMYmBaLjWbnIDXc3m7lSpnNR5Lbpepo1Lz4I5h4+TM9sWZ/MacBTbSWM9/yTYYRLdc3kXvdhaj60BKBOAL0BpDCcJqK5tjY4UwD0K8SHqVUISgBMD+mbYGZ/f71dDyYuKSnoDrT86IMqDTbVFTdve7bEHvfXy5vB8vpdLaczRbdxcz1vXzXt0XF9EBPTgQ1o7F81Nvg9XAoEknEN1u5k5OonhfzkTAfiYQJixoriT/DGXgw+NDGOq5KJaIQpY1ofDMdi0fSqXT2qNgBOd++oUVzVG7AHNF6SaGlSV5Dmu+OavTg9m551EFtLR43GtW9QjSe260BS3wLwz+m918mO4L5laGsZvszy/dkKBQy3hSJtXRF+0BZA3b2ygvR6ilopukQjTFQNGmag5MgJzZBOVzSs8d9SNmgPxuMJ7bmaBxLYRYN7yBvaKbkyO7VfAoD5vnd6Xxs+f5i0V3efoWcH/uu0504Niy7yXNsJBXfj8rpqBTOq3w4Go7Uj7bePTlJ7UvQ+DA8PsMFQ+gHQndJhq/1wY30Znwzvp+KRmCaYrBNG/lUIXc2Gj7/9tvAqVarvVaudXZGnYs3GsBvhKiVy9XOcNTATqMBJo4A+tmzjVJ5s1LZbpWGFHvU2wf+OVaIkntRWvVMxGmfqx5POxpTITzrty1Z9fWAAEk32BVqrKDZCKQ6pF4RFGFl64mhaUh3+B/HcvtjZPol7Fa/b/d6wBuAGoojyRoRNVOZXV32FUZzLHiypddt+/754var20/bvgt74aqWpEt5uMtQLA69UaHWaj4sRsJS/MXq8XunJ+d6XrdEEdaMl/iQIfFrd3iGHgrGwEoa0f39eDyfRiRShXffa1y8/Qrg3Hm5/FqN5varNRCuuWIrfOcOBazT6ECWkP2dJnY6w1z0GMQ9zKQAdac5auQe+B9x15CCoZZv6Z7AIvlNU+AOPMfSZxYDIbdhkNA0aoaiOIptmqCnQjE0aYckUOYSg2WVntPrjqfT+QD9AMUThYGDSRQVT8Y7YVol6/KTa4cEzW4XtrNrnS5OaKoPljPaSziW6ZmSrqoy3KcoyngGWT7K8/Dn8ULx8L3W+cl5u72v8kEWdj8YZIkcWHmVB/HpA+sPxQqJRzbj6cL+QTqdKhSS2aO91uHZxdtvP3/R3EHUqk++DCUHaIAOdG2ArUNAi4U+i0V4URQCgLh7M8Rqaw9Xjsq7T9b/E5CB3wl9YI3l7IXrSSyDtklhwnp3rEu+j+pnuyAs0NNQHx2EECB3XZJBsx7oGyAxZ3q+O132p/1ruPTJZGwqVLiIqMqwUYqJ8PTB9URjFKs9m/etRbs9o+l++dXt2IcmyZrqm6au8rADSkiWIXhEjIZESc3H9exh8b2j8xePztsHsiOHQhzPhLRw4GdGPIzV+sOx9CORyMZBPJHNxd9tHcLH50r1xhvPP//GsLaDxH6y/BgARPy4wpBytYZX5DNYiVXu+GJIM364CvCVUnO3urX11mMUpP8W98qFJp4xVZlzuIDIQsD1b5a6Zk0EpkcmSHIDxtMABR1FAydBNpMyzjBNCifoSWzPnUxnY7cPDzSYTyYT0BUKhpzk4AlwmQZPNJgqRHC6fRQEH2gub6FGX81mlo7UIIql6rouo08IYS4iclB5LsxL0aieLhwVj/b3919cHOQjPM9wKD3wuwh8eArmAw+ksrGHYZPS8Xil1coU9pKl1i5SmdqkDvVHleTeY8jub7/9YYigyY5Ur1A+gpFUdCBFw1Yc+kPBvEDq13ZzW7mt+pP13NYKoP/Cz/vrkPZUiyHvkBgBBlwFf3xRMQKKMTFNQAfniQrp2CbuxZBNA5BCnHBGQ0FFZZ1MHRcWaHA1uJpOpv2e6diKIQAWgdiKbVuuKzqXNq6kcM4X3U+Xy+XsdvnV8hZCaDlE8nTH001kgqzZEs+zeC8rs9QapQ/i8YPT83NdlZAJJMCg0aU5fpdf8CnrGxsPBYMb6Wgim6lk9ra3G1D1i+dvYDffRH9eLySrOys5xw6SHdwcjX6g8tN84wLxBp43EB7s0bPwVOWtvT1MRdB7ljIvPXDfHP0TrL9v7hHMmj0RWXvVl7Pw1QSqE8AsBCAqJkBxew6wxQQO2ArE7PXsiSPbEHuBkm6quON+9/Jyfj1F1rtoPBUFNNI0WVGs7qJrmdZAEw172r8CPRez2Wy5BJ6zRduzzhXR8W0LCSJoHsgcktGhQud5GFI5r8ZB3EhYFCF7DC+sXC0CDKD3QD84v46SFdpIbG6WoMy1p5tDMPPmDQDTaGxDxrfrtTff3HkTVr6DJ7iJWIk3HsDyjTewDDt4W/PpncZ2aWuvtPX61qO5UqWA9iB9b4sC/0LSe9Qpmgh85zKhucTIeYnlGAI8pz3bRd20nZ6LNDY4woCsUHynB9Z5tkYHSlZ/7vv9fn9+NUf57E/6tin3QGJBQTnQrNmsqzvqtE8EfTIfXF3eLhFgJrT900991E1wUs2rpi2QvGsTluEMnhNCMGs8Zneq5OXRCxFNIJLA8EHdb+sEFKXUfAAv60w0tPbg+oOReOKRytbuWfPmBnA2O41ydbsMSzS6GO00dup1yNGbK5buYNUcIpDdFEyk/PBplNYdWi+3co9uVeuVXC6b2tzELCCWvu8m/zbv/9bmGxgZG7Q28ZJgAFYScGwbPskBHdFFurYRMAQDIAY4uefYY5w04OfH41VjBKwGl5eDqevinIOnCWob7mLRdi1PnTusOZkNPvlkALt0e3u7mN367XYXUqRokq3DivGcSWSTpeM9VGRZ5rSwJpomLykQKEHkGSZinX/a1j2JJjsl6IoE9Bngg8HII/G9aqOJ5EXZLO8Wd4HPLkVu+8ndahkaj6VW29kFRalFomIENCH2naex2q6Vd+mjXq/nCqlkAkMA2hqkEndgIf4jPX/f7nMiKwRYGCXAiugxBm/bdMLUd8eWYwTQfNoaiMs5FrS/Z5iK7F5ONWg6nNL1YNCfTycTwD9BN+9A5/XF+YLOW7xrhXjjwdUn17dLPGa33yzbrte2FBH+QYb8y8jmMFQIowDTsU4PUE9VQB0msqSIBFWIFU8//fzTtGqp7N290WRnfrbQ6+uhdKmy9SwFaXhWrLfqh6VcddR8A9CWWts71XKVTuYaWFA/ASh9InYar5ZHtWN68Oln3zzbrdZLqVQikUpEnkonM+lQ4H5+9D90/jfTPVZkaH3C4JMGw64JKJ0TpzcZAyLHQCdkYBhHu1RHU8Qekl/uYpgBERpcwnyOLzGOdp0equh8QiaOg8mR5/quMusTB3qFmRKEaLZA+exaPa9rE00WgKep8RzPizyqMYZRp+3Zud/1VVOjMz6NZ7kACVufvvt5Ww+7OjSJcpMyk0L6YHhtY/3Bh+KlIkR9+HTz7LDYarUgJodPD5u1p5974eXd3JNPgq075dfK1MaDha+Vd6vVJ3G0dryzc3b8NHwpBvXFSnwTE/p4dCMWz2SjDz8U+JmVf0j1tX9m6O8RZUQtsApgJqzhgxuK3XPBN8vxJ2h6DA4GiMD4E1MRbRtduzP1fawmg8G872CBvLsourBFxOlhrNn13KnpXtrmsn/1/gcfXKJrp8kO1L0JRpmmImiiLPOCJPOhCEtYQ5OlRbf7+adt2kDYmkinsCR/8s1nn1spVc2HqFVifv/zTQAj0Pr2Wa1z/GyDTt5ymK03KAGxbOfqcD+lHCooZvFVAFs+xOqwWNw+o3VzCAv6RLMJJdpMpWOxh0PP4GekRDQElbsnJ139fgLyH5WeIfD0lKL4kAKlgGDaFM6xhSSGP6Ue0iFgrkEgNRhF+yirjju5nV8DS3veB5591wWSLrUEPR12fdzzZnPi3g4++eCDq+UCgHah7xg32bxpmcSE2CiqIoVRa9C6clD59qJ9u8QsT4YwCQL6NH/xzcdfHRzk5XOJ+Vk77zQ0iHuFIQkVXjzerTV2itvvFQ+xNLYL5ecaz27vlHfxO1Amt0WLY/3J1+tPvoxjO2+OYDKfbd7JO8R91GglE5hTxYFlKvFI7EFmhSUwvROjPxH0nxC9vwRSJJDVWB2orj63oDkTCyN7z7R8hWFWv7xRPMEpp9tzLfh8y+n1oUSon9D3wXQ6oDW0P55YPcvvYiAHM3RtSWNo0YfvD9rdJdztYuGjPxAdKw/7JSueI5kizwep/zUUOp+ZtXVVWQ1d1h6Unfbn33z3TftU9U78nxi3mtBGyjBMM5NMJpP5af5oIGGdkuLElME00OJhDi3sClWkQ8zBwgj20kVaFjNrieiKJQdvK9KDQsCLluQUoqVtqvmzRYgEhCSyEdlo9VBoWrUXlUUPPl8Sjb+133ZDf7LbzdPne9/nfZ53WcswpbXgAE8YoFaK94SQFy1uLq8srMytrN26ffPWC6sr65s3Fudn0WGeurE8O3Vj+ZW5V+aeWVn94ObczZtPvg8o0bk+unlr9Znri1MTngAv+ic8vJtlAeaQ/pYRniOo/h/R0ReAHz1KlUnntAHPMkZzFbNnzEIpiIxLNrwUKHmkPibuq5nIFTFoonrCcj+sQoGikhaqlZoB9tZRPI1ouyCn861W9bBTj2faKJ9NEzYr/qiuqSk4rjoGLZKEUrRKczGfirFUj6qci3ZhFo75xPo3Fxe9eCrYzMj4TP8CDe68Ff90hHTSUmRrfQpXeGXrha21m+jYt7fmZpbnk8szcwuLEEAPw+a8jl5ERHyfk3jA4y3S8Gfn/ZgFOLsUuibx9r9E7fg2BJQRPUeIXo2fqIuD8HNseCinqhXLubIpOzUDGkpBYFRW+0mcUkzlE060K3SrRq2GflSpHh5WD1v5fLfaqhRKGjwSRHumHu7kFBO9/bB1noHX2ms3myQvktPZaEoxzLiR8HHw9liKJvmzj1ZkDBCyjdCTRKThzMnPp73juJY5Sg1iqzEbhQdq+EL75mdyamFha+H2GmroMyto8JFkaGoR4mcRpXNuZWWFyCIyC/WRfO6Nm7dW4Ctfn5ua5Pkga4fJHwl5PI4hkkPxQO5Av7P/F17/DuufQyVSOf98aNUAmGW0IhcSdgtFgnXdSSMKppA0QT2irObMYqOAQKhbPezWqlVAWgG8hporpdNmyZT1ckczzEa30m23w5l6pn2RBSVLSjHfNFLEGdXARFROSE80I6QBMVqNsRg6KbwmGNI7JwTPeHT654yvjye+O6HpkEiU5J5Jrk9tLmMDYflg7vr6owjO5/dWFrGasH7jOsAEbHMwlp786MWbq6ur13G/1xcnZh++sbLsZe12yjHOi4HQhOShhrwcQoEZ3GohkF3edS5h6miDBGcAbywBbVlMq5DZBEYn5nIn4SfF1XMJTUUvMlEOag3AWUFUiUc0nUKjpiv4Uha+vyLrraJiZBudSjs7rcP2PD7O6Ki9OjRTCuApHMl/MQ6R4NSpBeFJ4fLTJCAl84WSPr74uXfajIrt7RRxVYnqBKKDfyg6KOvhryXnQ7iz1x5/eP6aZ94PKzk5EZqfWryxtXrz1s1bzyxO3VhZeXP1vY9+hWB68+Gp+RvzE7PLD8c9LNzn55HmeT2S5OHJvDV86YP37BbLpVJ+7NJPj/AcFRAaLEMkZMqghA1qNKbG4JhYcNSsklKQDcNHLre1fKvWaXUR/uJ0O+VW1lQgWLMk5jMaLUU3oOXPdS2YSsOYP9ej6FKZ3nFagUxAoMcpPgKnTYjJCbgoqDkkTKHRneRg+uTkqwfd47ASvb/D4VMEwjFU8CGcVpp5yCNO2sfs4uQTbmEyEgklk6HZmc3Q4sJHq88Az1urWwuL169j5wOic2o2cm0ygHTZI/kn/MJDXl7geWGc+NEsoeSocwxMDYLnf2B22UA/esoQTLwNrXujDDxT/U0PDdJFjcFexufpBDlmMVeulzEU1VqVSrXSPaxWK9VavlXU1Vwe9UCLaXK5Uk6hAndqZs6npPVMRteR9af1895FCq4eUhNMnIj7SRZlGhoCgeGmFdmSkM3zi5/PfjpratGfT6CVKG74xT+uEfUsbw2M2WmH3cGGQxuh5EZyChbo8sIzN565vnp7ZWHxxtzm7MRsMuT3L/kjoRD2lpLJ5GZyKiQECC0DEiJRnrHiZ0P+PugF/B6oCHzm/yD7vwPO20bV1ELn9DKAQUYEYajToGUMdQ3HYshKIp3PFongRPVEZ+/WUCIxoBe7eaR6cE4NiEu91ipAAJQbnaaukkg6gxpgGj0922vukPQUV1pWkDYRQaukIN9xzwdZNByQdKbd653+9AAJffObjG1AS9xG0PRPZ/wOg1TOG/JOzi7PwH2eWViEa4e3lZnHH96cnX/cv0SCEC/utftZXhTc3smJSdHNSH6PNyJxDjspkyNJY8X3J3j2f/0LZpYrwPjPVaf+X07RmHTy2QRNkTgI95yCo9x/WVTCRjy6Yo3gmStBq3cLnRr6UN6s1TKGhiEgCo8pVag0VCUPq5mU0vB01NB1DADNdPTk4hhDOySRUyE1JOZKwE+WnX1ikDw/iG0SvX58cXH2yy/nKSP7w14Y33/Q00f6eIwbDvAs451IombOoC+BnDNzMwvzuNxI6bDn4SFEjAq8SFJk0evmWW9AZFnRu7TkHjah0aGsY9YRukMSXknNEwgvr6XY7iL0VIBgvwmQyxnreyVYVNRyCOFIaETWkFrdPEQTkIUwKmZzwExVwLdCN69qpYJZOEfCr+lBRFBaKZdphjMXTV12xjCbkxyKRnwCfxRu4aB0Ik7RUyl0ot7J2dl3P2Hv4XQ37qToAXEGBB5WelJoGZcw7l4KPb65PLUws3Abwh7u5bUI0ZVexMeiiE2eu5FQ1Cuwbo4R/cy4IDIcw0oeLzOobgMxy7H4yVDWQTlhrORndvVLPrzV/zLNj/CkEyifxRyNXSeK0CaGF26oMbxvo/BeuZHHZccziujxJbOEU8x3y3A8NU2B+FHalbLs1DsoCGY2qqWmFc0wTEPP5FBGU7G+RgKchJy+mKFwYD5RbMjgadncyRyfnl6cnfz0Y69ZPP3yjkKj0gwQ7Av6IaxC2ErZAKkjMPH4OmZyADqziX4fCXiRdfpBzFQciw0bdyclgREZlsMAxLHjDMPyjOiW3BbSVvqkRMVmiFXlsFrxocAy5MLja/+pL0fvXEU64VhiGpY/S4SeyG2AIU3ydhCUIkQ1AV4ZUqlcJrshMDxLpm7WKnBCG009oULqZ7sNVU2c1+q1bCkoG4Azh2cl0hnFyEwrABI1BJx3qVENKagMchI4Yzb0p3Tm+OT09MHp8dmPv3z/88WXBx6bDSiSZ9j6q6cDemIxhZQimxDwJzdnNuHTTSWT/qUI9hfx2+MVBc964GBh3Y8Y2u0WWJZl8HysQCCX9gtubOn0CWqlILUHr9nK0BT6uuD22YkWv4ydY5cS9+9DVR9P6PCiTi44NVAwdEKFI4SPXHKiiH0Q2CAY1o0c+KiZOpIPdPc2BnhdCWp6tlvTphW91i4UMoY8jfwyZsiwmnWEpdMxBWjSfRXPGVGMXWj1g8vuVIB4Exf9FBu+vXffffWl0y8+zXAsnk6ICZpabJxzQE/ah1mAYRlRgmsZilzzAMUAmOnHBwG36L+7dfD22h5m87AA6W53OHwMM84+JIm8e9zBYw3FI5EaabWCmIN53eqgrVaLGA27wViL9V+5+U/QLnXvR/3Imcvn0wo4RA5NejER8fjQRqODl8oF6M4GbroBmA0Y843Dlmk02lg41oxs9kEnoSrR80Kh1o7KwSikO8okgjxFhqdEFkOBDgw6LYp0BMFevxNRiEiiMJh6p2cAtH3++euvPvbSY7tHQRcN2d/HEyha6DECPgljZZ+IW0yjGo67pWcZnpVwJrGpjK2b5Nb62tpmmMeaHsM5HCzvFnlB4Fk3yz8rQXkG3DwZMgHKAEw8Yv8Ry+DjQWmasRJAr8xPojYvIWv/2HLZdr6kqTRZUETxpDX0E7z4GIUM2WyUCxiL0I5gOGNSkqHZD7t5rdjrFZFy1PVW1+RUrOm2Kq207ESMh1aOsMgwVSfnJPechpT1qUZqOqGmBs0G9otuKHqz3QOaD3rp9levvfrq02/d247D94KtTNBEtaVxsKcoMyzZApDdTquNZjgRa7ieQDgYFsNe6SH/xszW22vr6yIriUCb4Vhe9Iro6g40JSnA86AoL3ig439PTixkHnI4rHjA3GSniQilL+9FY1ewR0aA2uBvFkoliEPi2FP9xTCEHwaQUc0iArhGodaB44mwU1ZRG2Eq5UvQ6T0083qmAaUUM7C0UKkUwojtXMABz9J1kJak9v3/qaCkTbjRyOJgfsBuwQYPnpHBXcc5Tje/+Pi1jx975P7RDiZNny0G0F1ECPuIH8LJSlDkMJgSlR+ORzIbe1N76/hPB8nIRmgzcrA2czvpiTNuN2OlWHQeFmWB459led7rFcNhN8QTDwpHWWrg84PvLOgJVjI+IcxQICs2Jf4Oi+VftdDo8dJ2lDCbjZKG1RlCT+Sa2BKBEkK2jqmJ5EWdAm57Drdd1hKJVKNabcD17G85t8+z3ZZh07JtkhnpZM+Oxk3OBRU9B0cecyYo7woaEKVpLZ3CsI7LjCLilDE7nfdOH5ydZeIn377z7auP3dvd3hMBtM0JZgI8GrwmcZLMyQLRB3ZWjO9tnGx/uv/l9gu72zOf3r699sLa1sxsJMBYQEjGzkmSwApYDGd4npcmH0KfcksCAPUubXgklh50NkBKkSrKsOFwmCNooj74/4HLX6X9gJpXKZ44LqN83ijm4CG78IusgkHCI7zE+iEM5Fanhl8NDPc5jSQfZTJpFg1A2WzD4+xU8rQzCnp2O1kFazfgt1OrI0xSsWKCkBhBqROJJ6INU0fDHowKZFmyjpEIrSh154d3vn3s1Ufufbp9J8U5fRziY0BpoYl4szGCIMusjRx558729u79/fsv7+6+8MYLb8MBvb2e9Hin7TTW8dwBSQhIHOC0syyYKeEt4CVr9nDiJ5YmAxzTF4o0UUtkPuAEBxdmAa5bwubp0iXdaOzKY+ewoGDvo91BAk9cC+hwwk4SJuGx3Olvv3eJH08QBqLZCnylfMKsXzTriIMLlVbCJadL+QJ+Ik66P//LqAJpmQh4ldBNVbLZelNPNxWK9BkVlnU0jtJZgE463/nyB3DzkcfufXZ0Jw44KAbGCf4aOHWgsg8Li0FfMODj2PjB9v69+/v33t5d2zrY3DxKztwNB8Qga3WIYsDjF6VnwUyGox2C4PUCxslrkSU0/xAMKY8khEW2b3DaUY8ZcFIMc7QgSw6rjGIciYjMZfVz7G9F9JKVxr63pGfLvVqjaLrIsggqoJIgop2EQ61qtQp/rtLpIH7LpXWYep3DDjp9uQzGndcz579UO04uZ8KcyupBkBs2hy+bbqbR2MmkTixOrZjV4JCisFLEh4vp0Xi73j4/RWs/Pvn++68f+/rr/f3to70Ux2Cpnjh46PCEnJwokDWH4LRAh+9sf3p//+v9t1842tiZFoJ8IILu42NoRvCiNwlo/YSYQHTc/ZA0eW02FEG+jkxYwiozigHvIK+U7BsRhjKih6WwMyUKEFiRkBf96a/QXDKlW/63erqyvXYGGx8mUl0QCtoeQxAQheNJjPgq3lqdRqNsksCudthqlJC6Z/V0r9d78Mt31VJMy+Zy9XLKACExSkKi6xmRhG8y5nXVlcvWM3FdUTFtQib5fGh+YPaDNorn8SngvP/lZ5+dHNxpTjuBJsO4sJhKgkKUTDkMLEUWnlT0ztGX9/f3998+2thY8rmgADghzLEumpewHhZksLYDCc+xqJWC2zMxH/HHvVL4IbfACLybEbh+6QQ7SfFkKDeGKYtdCuDZS0t+LxrVle2lsf9JO4kcQzM5ueh1C6bhVFAzoZDKSNnKmNY7wLNy+MkhHOQOcuISWFjtdvImJs60WT998OOPlWrXcOppk/jwqL80GKlgjTwcTKQS0xxHNqDa7buZnKxiOsK0gy3RVPq8DTx7p/WTr3744bOTk+O9vZ0lI4i+g6HGxznR3VE1WB9W8ZAtk1FgeufO7r17a58e7W1EAB7t4iwsI2CMcweWAuEwVKkgCkAS7QjqVPTjwks4KKmgLc/S9B9er4VhBW84ytjpqF9agofqFwZ+y6VoDvGyXGnWtGXr7Z8vLmqFYgKLnj41ByMeC7NQm4UqsDz85BMQFFW0A1Op0Kq2sMqQ0zGet2s/Vb+rVAuqgsDOMDVFxm1H8cxkMykZU1JYVrDeadQL2WxWddG47aDvdPRuplnPNqE7Ty6+//4HoLlzNxNPyRyCT5VBOwd8mCe4oBiOulkbC7Jy6aPt3d39tw8O7i5huR7NnnLQNDoPDXdYEn2CKIYlhHWCxDgELCm4RTLSY2HBLSAxstohPEeHZoMekRqzTi/FIxsbEckxcOyoS6/7lTKP37t7ot5MHZ+cwC7CSBSD8ITkBBnhJVUODz/85JMPPySI/kbJ1cYkQofxOj0RX4BOZMcGXRjeibAK2nRuXQuW9jLXULKt9HJSm6zhThQJZrR8WW9rWLNNlr18uFC/5GwEShoymVPnYlMbMEIBZ0wQhC9CzC/9/mhvW2b91evyVrf73fP6e57f43QC0U3Mjny7yO7TpGciPP3K9tLj+ukFtKAIFCT5wFgnFYThhPuiR2zbnFsXg9bD/ATBWS8e2Yqv59fEjoyx41Q2Gg6bFCKTgAp7hLAQub0IxlnDonNZ2BGjYEJSyhIp3BHbvE1pt/JFIiiSSMlexisvRcVOZZQDRqCJGvMBzH8pwBJqNw7J7mDkgdX5TAOfhIKngAdAMEXpSeMIdcK+h0gcALhYfb7UPK/8pzkn/nf9O5iUh4HnD1Bz3cGMHVPM7W3Y4jJs83vAiQczXXESC3Uu+1zbrnyB78NWzapz8zZvAan/NuE0H8cTTyMv8SAngHIO3NQPrjnInmpKbyMAiEa2wN4lEjub8Xg2erwXCqS3YJpiLjcvLy6Fk1OwvojRKnZySln4QlDkKoyOwLxNY9fJK+lI0/RiIu4UgUKC3AuOzqNQiovJF3ZxiinlDIWQDd6zggpBbQG69TMXPG8zCQtDF+QFKwI20n751StX8S9XKdcKqP+aj65cTjCfra7hla3H02nMzlzbmzNkww7khy8/H0LgBJj5R2zUmcnlXK7Myvbu8tn0yLm8+uvK7lINF9F2pqbsjJFqwVYYiyuoKYN7I5vfcbl2RrAVykNBj3F8GuP1dByJPZv9KUWs06pv4ZY+Xgo+lC4X5dNQqUhEyGcWTS+mP8Iq5TLtDtScFkufVSgWM8RsMRcuD4sUiFgPcGHR1EKQf0CTUlKM0ElDc8ljlFMKKHjUkmJM9c5WnM+BLaTKqSA7C2l0BbsEYCLaXcV7oIT6LyuJ/2Xj7s/wObOOgVl4Kwxv7icrdmDmsC+DKdFfwMQPydNMBs1M5hBOjoesT0D2zbVdG3Fhao8xPZJZkWhkMq95JxwIutey/m3X0vTONKQIW9FsFjwSPo9yR9HUHnF2bIKIqTBjFPA8roKHdojKvV1WQOFihR7JiMVDgje6Pd55jVtm101WwtsVegWHRueIjUIFjw4TPOdrwRSBVrq/9AHSHNGhS+SQQgn2C3b8z2Fm4dViJq34ftJ6lfMYaE8xQyI9NhXSu0vHQ5f0meSDvDLrzmQ6bUynd7dnUXOSdh2WubIMOP/6ksmT05/20GyfJGG5BExisphvtrESYOsfqbmGOqtMr9fzrgGXxwsK8VH0yAxovoVpiI+M0aA3dHwc2zs6Pj7ORvf2/SlPeKtFIYAyHr4upvJQX6N855Zhq8EYNpmgmGvTc7mmsN0z77WoLRKJic1B8cQwyeUcJp3BFDPLeQWFpefsPfmhgEYrxHgJMmXQUCgCCND4Ooez4L68twsJG4+hXgnQLAAVAjSJfVbS/2228V8mnOfeXtgS36Hq0+Goa3d7DkUS8CTmmVz5O5wrwPNk7zgWj/+ydpJzkm+hrG9JQCE34nIt3MZ+HLjOGjKoJ8pu9Eno5NuWQFqtT6OtTAe9Bv8xnn8/lY7G9vdDAY990opdGxZKKhT5FBoVMhEkIYHOrZsWC0RcjgIKWZPRYYloNBq1RKaTE22x3Krj85nlXDpqeBaF2CbJN2jHKcUgj8Es0cF4llPLSWFfDKQImoV/pPYCFqZy+G+Q0SjFgBSMMnziakkJ9hwurTCvXDKGh9kjtojD0aMoSUfbuzBQOPsm4FxZRmL/E1DkdwLnyU/Hx0c7R/fWTgE2NpTuzLQkpm+zEnObRMHQL27DtQYi8gS1BhIEXDHWIxb61xOxMzh/8jc0+EOxrcjbb/uDNk/YuGVVCLDYTFiPIuCP3M0T69B0ihhirp5L4yoUcqPDE9xAT6SUyIZ0bB3fihYSGkUYopVZTiu4WnAF8RHJhEcT3GDf6BvqkcmM2GOU9EhBf6DsPNvV+d2Ci6kCKQc2WVBCLQHeNBRchVcRdik05LaLkLzcOM/zOn4r9H6TaPpSWczD8lsfGMEDTiecfQUw/vrrX8wTgJ6e5o7i6ydrpycry7PTM3dqJtfbStEl9UPnilXGmpmZGhB6IOIw1GhBy76wsx7Gync47cXb9zfs76XDdu+LtcEAenW71SQWcFmPl7JIbCjk6vUiRThsVHDkUM+J6SgP5cI+t8XtHdRozVpJD6DSSvpM6CDpYD4ZbDTgxQW8a1RaORhsoaRJa8a60sGBeVhpNqsxEOljswU0ShHgQ9YhjGcht7TYxCynoBDAJQOACDxRYQHMSoaoouJfw+OVcynXv9ee0Ba2AE6SaKP5HOQjcnUngF1N5gicf3d34JnJxftza4fJ5Gx/TdvjLIW+SB9OgDeC9hsNE8IvIaFvowOankwk4uQldqIRoBkCmr8cb2V/eqehNhSwO+xGq0nRwoXMg8cqLC5gCQT6SYe9b4TDVMiZJoXQhDMt/CGHxe1uHxwGK6euV8q0Gszg+vgKnYmJiZEYXAiqTbGcw7dr1eaDA6DZpbqrHlc6+PzKigew2liFnhNlaimsECGz7GqxqFpRzkAPVkiHr1OuocyiQpknQJNPo11KH11sp+fzV5Do/bEYEkQE3dE28XJSJKHABJ653byf451Vn4CTPGcm0bIDPF0jWKove0Sfr4/6yXwJDSpW65fA4Lf198PJURXlX9Rjs9mCfv8799aOjKn3Pt5v8APPPqHJNGnCERbMK7lcHnJ52B426kw6ox1fOp3dbsTUzWHxGga/QPhUqb/+Vq0d1+Kf2sYeuH4f/zoTKhecd4CPO9RjXwDOseG7jnEZ5vJ8RAQmRsYlHPkNkrxoVPQJFLTwr2JMD6oeoRpwFhGPL4XYjlH5EBP1/+WjoYsQR8QBmtiju4PTLKnjVCAbicR2SU53kiUvUlquHK0QNH8vQEn4TOItL59u9o+cJDM7UGYT8uQarwXt0DqmddhvmHVt9pNN0B+gkIlhKhTPxrKoxINBb23DO/d+SelS772z31BbG/Lo2AorrBN/SL0VdiqWGyNuY9gT8djtDosDscAuG7eAN36094neA/Pi2BdEjJmXICyq1d9q6mWyHkndK0M9OqOkWqkdO/hieEyjldx6hn/dCvwYdCqNo8D0s5xSXkUMnk4pBjFdyh5qusVhQzlWiWYKdx9QrlaysUxyg0NOXlxmmlcutFAYZk0ZeI+RxBHghLcHApEjF/BEkYQv3zIaoxzBE24OSM/wTK7k3zIUSPHcZj6To2os02MaN5vAihgofEiOsY+b5+FiyEHoErKWjUAq1NDw5b1f9jxu7zsgOhsMhqDDisAJ+pE1mQ7rrArmpKci4ojavMGNiIdEVrDG3sFHH+292dE7MDhANjmJGhP72mNfdzfW10skz8vGlbKexp46HFYaHhubH7ZpXxFCI1uBEFBMJQ0pXf6KDDqaCgoFsZGOTokiGnKP19/CtRA2ACerYQ/A0YVkPlrFwKSUcZFxXm6gRWDZW9ruTMdhnalUJBtIZ2MZJ6E9CKZweNfKqjOHYJlZPUnC4wEnfjFvrcCzpWXTt1BThgM45AqQWLS1Hndt59kSALozu0NqdsTNdNTicaPYSfn33773zS8pu8ePGIoUP+H1WoxiEYvNtYbRblpNzMlg0BKN2EIebyBgcTvcNq9hovPmzY4nent7W1u/7QKg3+LTDP0q3rhsiN+HBeUeIjXQIm4Oq1Ub7jo5Q8QAwcQuB62PdqmCfUs5JqvvrqMXwrmR0jk6jVbdiA3mG5AlnzH3QiE0o3WkCmNwHqL9G4T4vNBAIT1q6yeEBNwReEYjwQj6FifwRJgkbXpydxngJfHT3Opp8nD18BBwkndun5vbS3oWkk5ZEXwei/MJl3MXXAkhnxYWkM53sDuDCsnjtlgiAaD55VeA02gJGYKBYCDkN4TmZXymArO4bHqL2ErU4HVH8SuhiDcQgWkaHh0dnegcvTnRe4CH3XdIW4lSsGustXVRZVZj+QvrIVhSJklooFUzbh4f6pOzq8T0ilIq8ez7kWvKmYyeMWUl8zqbU1qMspCm0yohZHh5qPp6lZQN1TwIqGdw2UEqZ9LfqHwIe6EX9pWXGe79j4wg96YJnMFUJBxJBWCeGSf8mhjg98RAz3z8NLdyekL6osNzLBEOdjdnsVTHw7G1O+jQxXdwe8iVp56254jkYwnUShScEeHXbCkw7/tfvvfdz6fHxo1ag3cjEogEg5j/2HUm8AXQ04nlIrGbwBkJegwGfii40Q4sH8XHxKhmomNgYGCsC2ASiVvv2EFrayt+erfZDFDVavMYUtAXi81qrdqhkyLvcOkoglgUUnyhiKLSh7RPGStB6EH/RqEKPerxbnWX6usXrlfiuA34ZqG0Cvw9BxdumEIhCNOL0815/LwwfN7e2iEyilggRcwzEAhGkDySiJYrgHN1GTkJaCL3ZLCgdby3lzkklotqCh9YVURXWoqDYmjYcaphYSkPZ54axcBuAYMO01bU7o4EQnt7fj/Q/Oqjn0+PjIEva71BbzCI3zIUjDjsCqZCL2Lo6WJFoNYQsbiDBoPfYjA0jI5OdW5YJh59cqJXO98xANtcPIC7A8uD1q43x8yoMVsHWgewGf80VuObzWqzRWmsE1ZywH0yBFxeOSimopJiFq4/0NiST7ulVXI+WyDg8B3zarVWu6h6+QUcv6uSXocMbAhng17HaZtnqm/g6hj9H+0T37tUMFPUthOOIlcgFx17gGfQE4jHM8DMScg5FEuwzxUsJc7l4sm9VOiEePoy4MRDRbW7uYD9GdCcPPHIws4Ps0fA2Lc9N5dAxbQeB1fXMmlPx473gOWX7619/M1H39zLGVMNDbVeWygVDAVD3oDHaJUrGAIBnSWKhkJ+r8fmbjcYQt7aqamJzs6J4YknJgYmBpvnvb0HROuCR4pL8ycyneQVpUqpUTWrFp9qblaZNWqNFqFUeJ3DFDFAgRKSDiUlqdYJC89XdtUL63Qg5hya+eHuu1rt3ebG+jppFb+uGqmMf53N1FVXv1BNCL4KUi9dPIU7N80r/3hUZCYRJVwPrDNgh3kGPNl43JdcdSZJ5plNTGeIum2ybSFzlAvuIYAirALOXTzM5ebWeWVEbIz9MRwD2oR1gikl4q71rcQCrgdshdOx1B4M8969tW+++fnntbXcZMBfW2sIBm0BWyjkDdos8He5SKC3RoOGUMi+EZj3jtbWjk5NTXV23uzsdd984ubAwBMHA2O9B7BQPNgl8rlEgiUw2bhW3a3qVqnMZpUGhSi6JRH1gfJyJGsa8XI8iOTJYkM5g69UdUmxrjwkU3/xwVhzt7Jbpn5ZVv9+0wuorOqk2CdDa9p3Swr9Jqeq7gJvv3Ihmnkw8d226TSsM5uHE2AGPJFoejX5/WmG1EYukMULp7tzdxLbvji8/fDwELGTWCcZG/ug5VpgXcOQXjQNBh9lJ4QeRC+H8cgOkbojLsdiez/9sgYs175aOzz8ai1njexPGAztQZhmKIRqyWNxD/FxJjEcmUwF/KENb6h9FGD+SOCc6B1FIho8GOjt7Xj4c4IlYEW0hMAdeNqHjG6N9uXxT5q13RpN87jOyK8iq3OVNAEMDNaJxh6XLvFBRdXOENY/tSiprpOZza29wxDOqFQSZX3jW1iuv3Vd2vd8NYRMWLOvvsHGYvNj0gvy+mVdJvaNF9LpSDYbiLjDngBShCcadiINZZzOmW3nOkqfOQxz56ArjO5lTg6Jt+fHRz4AN7vg883gcEsbdmuJEMmHtA45UnxzLpGYSxy54ke5zEkSfwewy0O8tbW1jDXs97e3G9pD3vZaA3Cd12xYHDqjMZ0NRy1+vw1Uyejoiz++NtU59ejo1GgnbLSjw9zx4IOfDzw8AIU7kVprtThDVVfXB/WRta+6ukk7Po4lbwm0rGS5W/hQacUbWAeprKoEdQ98GRzMkJhyXGAb65H2KGHn6np19+Kisq8R6th336+WSoeel8h6euq/7pM+M9SEsyO3nr+E3ryA8cSlr5kfomm4ucPtsXjwIumtHEDL5Jyz1/pnIDc4zZzmcr6Yz3e07DxcSeID5knuhbg2p+d250B19m9u4wH5syqJbMfFcs7k4a8fffTzKqmvAOhhcg143ouZwv52L/A0GGprEUVrAei8xmZrP87aw55QgzcYApxT54+Y6CjBE/b54IPI7uSptPD16leGjNVSna6OXf0K9mg10MUpcQygjm2qYt9AIGSzq4RyTNj4ECNggixn3+CTI2pq2TPVqsEHn9Y0aQ/ufv1MpRTK+Cb8hfT03IKgrlvahKXc9+s/aaqve/5ioftFiT3PKeHiQgLGGXQbPcjCFo8ju5WAn+dQ0c8UFS3s7sLEcjkswiAb5dtPJwyXOLsPG3ZLmGYutWyeM/Qkr6NOInZKugHCn6ziAU48YPnTcVYh38kYvN52Q62hoeHt5xpeHDUMzs+3z7fvB8LhIJ4tZIBV4v34Yx7NKVLIdzz4cEdH783e3oEDFEjaHlJuQpkNNYcSsmstcv5YF2JqN0olpbZb2z2OqNgEeZysTloHK0aRzn+m+tYQzFBS/3zjXfXAg8Pa8dZuiVSqff6t96E9rq9vrJe9jPM29ZDDN5Jzl499SOD7ny+/QH17JoEGE7Q3CnmLJxJbX0e5nkmjol8qqnFltueAaPoIUgsfAiZxZ1z0y8s5fL6dudVl14ILBotPPPJNtJoAnbT++efczoDDj69PTk6CBTJNxk/3EB/bAWjDcw2jKC4Ng9g+GgwFHeFAyOaJhAxP5BPRjz/+2I7kDmeHp3c80XGzs7MX9tk61kV0g292qVQ4W6ExfwtODt96uqurq3lxsevbZhV+8tLiYvcnSlm9TImzngw+bt88j/MLdUJ05j3j3XfV6s6pwQ0lwm0f/2Vo4Z99v4m8F5rHGru7P3v5rVt1z1x/rPE3yq49KA06jt/VKldn08ScuLTwlRhR3uVEDVHRwtjOiLgplofsgptjqAFGJKdE2XJmTAutibsI17pbbyRbjzkqRmuclZkhiXji6ZyPP1LzWF6fH7P3quuLgts4//js830/MP1zF+Mf1Z8Mw19996Nr3qVJLyynzxYIrB27gJRyfWZuZeGTN249u74OMHAs6dT6/NwnH8PJvIGxTwBGykug4wJS0u9cyOVJ//j0x6urIXQ+CK4ImNCUe/I1cvniJqy535hB2uzvngkF/aMETzoLuq6lM5lisa7XbR/1T854kSl5fVo2G1ESEHWoqsJwAs+4tDRqFQjaAQMqUHMReWKjVXJSAnQJkCKJhNvYIZIr4eVlnfD3b5/EVntFZ1EN/qjIVigUpTWd2RQyu5xSqSirt4urxaP20poiTWESVumeyHoCBC0pPSmQSOQykwmnbcsq5KaS/50Yke7eFgx2v78Gpw48Azavd/nMmRXklZPzSIQ+PnU6BNt5/sJ3Z+Yhn30C8oFvPyD3XA2trIS9DMyjK+ia/WxhlhDy43DJifikRx+988670TzKuLP8uSefxPzCy3h6K7QQnPBr4YvoZjPMJ91MFxM8HW6tp8k2Rhf7tGYmISXBs7eeKDt0Pa0qDXLp6YhAjQyez5dwOBy5kt94kt/NVwI9/I2kW658VSnDHldLOjEFmsrCe3BLGWtJKqwcI/NBxhSL9c5slXq6l99RpCjLym6AnS2n0FAFyUZRSiTHEVsR550ak5xfZOJc3rtf8S/NYXKp+4aHnnwDETxk0LMUOP/VN4Bz/sxcaCUEa4kG5uo3Z9dDc+ura+EwibDwM2C5urg4MQJICaauIEnoofKoKofjKJwNfvDBWzIee+z++x/DDF34+ZtT66HZhZWRKXSKtPBBOqbWrGWaxcAPkLJ8A046SyxmwpsTCTsifKURAaB4qk4DtsnqAoZAwodwwt8SOUeOZJOPZBPGs17WKcMtEHmWqkjT0JBJoWD6OzMW26+VWEd6jlYOSFPSByuUfFX9dC8io8rUlO2ZGTQK4ntNZwd/WvBmRyNHVhpfA5Msn877O5r/7u2R1mKQBQWMs76A0xbwoU534eULKwsr85NzqyGAtr4+MT934fz6+irSzxCZYCBwLoTgYVZWJ6ZGgkGry0Wc9jgJ8ZHXn16A3z/7/jEMHpOp+gexff0azrR+dGp1xToygjcEgeeYHxo/CpIytUYWPZyd0/2BGR9LPKo94IA3N27iCTQ32QkJ+/jkZLUaCl4rgHCRaMIH8eX1KmBJCvZkXwYRZBF8lKKlJQtolV9P9rcoSeUUcrhWU9iA6H8a5rfO+6pAuZPEW7g7HY+UPoUv78gTNHJKduOSVVlJWY1MkCf/n76ILG3gZAD6EnMo/XiWlpYnz5yZh/eemwEdV1dHFn2BxXnAafP45ha9s8RXE4KuhuvJwNu1gtrIuMvq6huH4gPY0x9jMuzMmfdfvh8XGHB8BDNPxC4Em/X09vbg7GnQE3iGvTsCJkRLQj1LTzwS5pB9LPw9DyjigZiz3wj/8zua+ClZzThSpT6iTow7AmHsAaTTEkO3fH99N9pDHcjFFVk7UzU4B1iZValQtChaNJrCHdiUITNglBSNIr2lHm9/VaZyT+8vStq5YcJxEaBXSIG+x6Zmp5uU8qL0ewoVcPTytyWSV1/9n3CSlejXsCR87C0f8PR6L3zz1YV15I9zJDSamPDbRx1jaOWuBWyDtiXfEmkdnf4EeeYHvxboL9nPEy68AFUr7C0m7nDC5tixD7Hz+v6pkCto0cNQ0qcs9KdYwdnPoO+tlik/ZEwrFAr1PGE/r99IZ4rtHh9LqBsVnkNOFIYUvpxgGMaTPMVBz9UMxp7h4SNHfp4+MjyM0hL0Hnk76cmlNjl6CahFnaUaTer2phbodnkmrSG1MpOWmVKYSYtKyXIqnDpd95GTJW7Hybc5spbsL2qVXcoanK5OKacVpiq5XL7StBthk3JnyclaOUdm2v5/0CRDdJiywrWVY2fnfb5Bm28Go+urX89fWF6eXJtfIoGg27c0twxX5ZzxjthXw3CCoOjKEQGiYOWh8fFDgDU0P+FCtLS6PvfW+QtvPPk+RmXP/uCyGI3IwqdGrMEg6yl90AqjAIVHkQmOCHDy+qW8fh7eo7Uji5eaSfXjHMAMm03i1tUETwCKMJ5RICgQcLmC4mEgWq8eLhbg/IesqKakBof6FQPOwZPu7mk5avY1WS3wPIjhMQNKQXE4hZaUikC1aFAzqGWrZBvD8mrzxtucro2Lw4eH8358c1hUUbZTKREcEcg5fDnKzZySTvj5k+/U0GL/Hz23YDGL7P2fPYVm7SAqSvPnl9HJhcx4lxaRJdlRG19rWvLaBs+HgktLC6dXUFX+BGiG4QSgRMf7+lywpW+dXfnk44WRkYnV79bPX/gQd2ffClnpxna9BWC6VoCi+HOL1To7uxIMToGWxn4e7xwP2g16mpliZEo846h/17lfE6K0cJCUCGLiATRhKCVcSSNXkDddPJyXNwyZBngyFIQR1zuz3NOqQbcKFeX61HhafHlSQ9L28NYrdgpp2NFGyDQwoNXZ4gtLNjbSqgQbF3/s+fGV4eGfh2txpamW87Zpd9luXG8pvbdEXvGEfLi2R16RuvXa/xfIY0bixtseuvPsd3NeLyaCAuiXeWZebkJZF4n8WsCLSdVA0/L6UmBpcnUhNIHpolXA+Rmw3EQU3tza2tpqDa2ePfbd7OnZYOvISmj1u7cunHnjwncha7tZD49lXYGZdblGpto/tzTj3cHm41IeBFDiKcxPsJUl5YkdoOcldSeGE3gSdiZWxTEKuI0cCUckwUNAkCwurs0TIPJEFfTVoqzBInQ5wUtVZwsuz7VQ4m+LwSICJQrljx3RWItBWSR2+3Mt2Q5mvSIVwdKzMtT8Lm5cvNjzxcbwcO1GzxcXNw4fme7trSlLL3tmZ4dJVCzYUJZUUGKu/Vf8/lIIvfJKTDnccudjxwCnTzNg886sDTzw3NryQNOMx7O2DKPZMqh5QLO85LUHPCHXrDW4unr6A9TvfsMT9Jx1Pd9sYWkx0hACV1GPC66EkHCiYT87yzLrLUGQ07XggliHhO0J0tahZgA6xAOiQqOQJySQGo3ox0n7zQ5xrtiInKi6rroaWg40SVoEdz4Nt6tEtClpVNcxihnF8rzivNrivOE87kk5X9ZZv7/7VQTy+ACUwvKoDFomtjkxYIMCPHYKH8anJkTflIFy+3M2s64zC74m+447dhfJazc2NvD9Rc/GRs+PF9/cqK3rtXcXVZgqFQxlR/FFUWkp1hFi/mGe87LR/Rb8eOUNdz52ai5gd6YgLfJMOgO2yfOeNS8UHHre1NLQlDLgcXvctgAgCQZRX15Aeein32XcNWTR641IxIOv9/W1Er9EwiYU9cfHm41GFDxdVkC5CFBbh6TChAR9a3MzKP2tVHqJoVJ4cuDJ4knNYp1QeOAcPFFVONIkgPLVcVRBYweghONQdsk7uNzavOHivMO1eQC0+MiRvFqc71bJT07LZRWmmrKWlNvuy8i4dss1kdsoOGQVG0UW4raV465/ebzCqFPZilSlJaKdu+9JuuNTkHLjIli60dPzUkXZPZUl+yX1+/l8034Op/bkxYqd27dhl+6fJ5L/th1HlhfImtn78167J9bpcc9M2ryIQgfOz8FyBiY1Gk1DdpNm0G1zq+zuoAvh4+wHSIRGXLMnfoXzkGtIT2fpWWamUG8Zet7adwLeHmaV/FOf0chrDsMZDCy5Tlibh4Z4u9r1ra0AVgocCZzw7tVGI1pDPKlxtLedt+tXVQecxKVT4+LUHXxOIwe+1vQSp0vSc/hLEedNEeLPvFpBXm2tCBZApJSjKSeSmeRyMrZw/U0Y1rnu2q23YaoJdxliMaaMVUNa0qixHs5GE1XIl5fdc0d6IcnZn37m3hfS7wDwe7enp5eVdPI7JDKuqHhY8naFYlvslm1bL4vm5g7XZW79o7J056mA3UPRoCc+M+AL+H2eyTX0GJeb3h1w2jTx6MKivet1OBYRsgd/+mllCoEOWAe3DnLOWvV69NH1RmYdu92oHzr+/Ouvnzh0iCD9/QmWUahvdUEm1patfVYLS6/n8XYJsUJIqAkkIXBFdWZEn/1Soc7Bbj9wKVACPcOoAkyqurfRAG7KZM9UyuRfdIngkCQibmPY0XNrD795uFak7JEpuRu1IjTky1IL46NwfzUCY59X34I1hG1REAralikqM7viidKU2GsyS0SpsftiEOI//vj2O158nLY35j4a0tLd95SWyAwwKgxBbVeXiXbj9Vdtu+ZyRvPPL7//jC/sLH40bw/EN6Ho6Z2ZwSbAnGdyBtx8dwak9QwMDrYgkrf5/A47HIp1PDiyOGKdnUJPrdna3ArnYuEZ6SwtU6xjH2S2C/XHW1/vG//+++9BT4vZeGDI2or63PLMItocrzdbhni8hF2840TXIUATVU1jWHg8h4P9eXX1geoq6PklNKviUOxkMExcjgnkfGWn6hUlyEjqHgIGQ8AoVnIEtY/kHQagog5OR4/s1XeU8pKKwZZ4ys0ZUVtvug5dzeuwdhyBc/Wo0beYzZ2qJzozr7suJl4mL9x61RW4uxRLe7zw8R20vbTse2ABUit3Kg0VAni8DaWpBOvxETHXXd4R/bHpgSA+jGn4GYW6U16vJmrAQ8ogTtBzzvMVzvHNQOE9bjfm/Z2DRdiXqq90hmZHpkbGFleh70ErMkcWC7NxQ0NQdrFOx2bX1THb9c2u19EdOnQIeLqMbJ3OP4FhhLXlpdbWvr6+55uH9MKEXGNzs3SIjrBTCMOJJIgulAJOsVuXb6xO6O8ndjMNJL0ULTHU6oLGRqVM+fQrJr6op0vSSCKmggI1dc8e6h54pYJiKL2gmJSXKlRyWU1RZVZqfAMlcis2ZyKuxCIYOIox0qgkh7m+XtHZEhV59Zbrt5uUqZERV2zeD4h5eAetkHZzRMzepN1Kg4ojyTv8pogjy46JvGrr1suUQ/5iMzdPNG3Sc8v7CJWiNGQDMuBxusHPNSwABZZIocmG7KibYOpbwhjC0uz4iMPun0IfyIJFVQjmOnhDejMT7OwFoAfZLAvoOTv73qHvvx+nM3V2UvlDj29+ou8EpK+1FQY0IVf6/LdDRp70nFAqNJqNJGZi8cQGXS5oCSFwhp/g2qHucVRGAUOprDBxupQoHwHNxgJ1XFwydU9icnLOnrxH4O6TH0HiWSuRcJC9K0oV8bE7MtApugY772i5w83jg3xUXHO3DfXnzKgbr8GQJ6WypIiCfY7NA0HXRN687+b7bo66b+/TjbJXaos3NkQc0TPbd1wf8Vd9/4uyEywvwfnrAbAb3/LanVFZdkwaeNc8/sW5eZ8Xw0XIjHx2IFlvr8e2br0zNbBsD7qCDXbS8xmjs8boATuTPoVGhZEpNnQfPNjdLeFzOAYHi1jMQ4cOtZrZYgc47l1bQwPa1XfivRN9r7ce1x9IqOI9D4UHntB2PPrPEQ/vMBjz06pzC8KVJAJqOFKqosYBT25BI18uU/KVfBFHwi1gUNtQqafm5ORQAalaIGDk5CSSVy4iJsSh8Ejx794UFYkxG6j8Nnw4lUaen2/o7RwsVcEWxGBMBIPdsZlZiliysYm7TTi3vjd23337ImPu223iykzFeRsXOSJTembk1isv49qv+HPDeJOfm5sND533up+jeODDQchB/+L8d3NAFk1O9HFVnQoUGtwqdyBLleUdE+t8TWOjYw5Dr06MrojTTdo+KGmIp7v5jQZDN/8oKrwGv6XPhfa6kMnU4RdhmAY2eX4xeAJJ1OvPW77l7co1Hpd+e07KMyLZPIf4k2j7qJ2dn5uQVp0fZuclehKCUmE/MQ5y9GDjUT7/KIJ6wJmT3NZGuJsDZKva2toSExPb0tLaYBqmu5XdqvqWwnexVnh9Rjya7kiONC37qXsYsk5VkUK1U/MABRiR5derriW779uuw1xtxM03U/BI2he9L/Lm7C8kXJNk+PCPP3IqWvBxIJfn59/iJcjt+MaWEVqZUSkwlW4MLHl8/sX1RT9eMLNR73WrECkXpdoqPYuKwdGxMb9twOCfGNOJtb2egNM5iMkNLUtvNnf39nY0suGRDh5kw2jSW619Fnh8ncPn92Pwa3EeA3vBPpcLgA7xEnKrpNJveTyzEYWQc/08PSCle9xH83ORYf5B50FQkJMKS5mYTwWqXG5jo+ARBiM5ERC2gZkCPqMgDiRObAOj0/CFSTGDQaWqwYoCPq0LGVJGVGyhipHI4JgqlDUt2ThS3ZBZHhUTcU0EuVm1JQJ3LkHXiKuuj4i+b190dHRE5MP7aPc80yXhwrKYTD+WZkZB3y8rlwmXIPilx2bstmsa3D43NBzjRf7F0ITfB0eEXXKP3aZKzc7SeNacgUWH2I+JIpvH3+3Q0nsNozqDe7+F1zxksZjNvQYdW8xmMtlE6pj59GaLOT+/DqVMv3ZsbGKC4EmC+uePt0p5d+XmG3nHecLcahLK90ulwn7hfqednZCLEB6PTTzz1QxiOQuoVGoVlZHD5TKg2I8w4nKAJSiZDF1nEO5WTSOJClO6LS2Rmj/N7+xs0URR7rtzGyqaDYOGqja5jCOpSd0L511TWokPOszAiCcISg4tbdlGoVx/bXTMw9dE73s4JjoigiSne58tfbqrsVGifKWiMj7jP1L23xHdxPNMwNu0ZQAzGj63HSH90mIIlTSvp9Npy3JmFcaitdIwOfHBQmgE06k+5+TEFEvbC4Lq6gwOnf5bKZq6ZibLcLC9ncnMB5hsdj67rl1sBp758FMoeY5NLKIqMIKU6Diy9l27EuKq4qp5B6rTwE7wUyqU6rGW5WjPza3eBBMhaBXgLOAePcqRiI5yqdD7OEbOHrj0HOoeKgga1nHA3MuuSwxHA3gA5jRgXCcryRpIodCicHohvl7dlsaXHzyqSlWkZKcr8LGa6WSeJioqvCUHTY+4bgcl8roo+KO910ZHY6EjGohuSyrc/Yypi9P10hOV5f81P//H+JPU6ya9gfIdTncA9LQ32VSji6uLKEyOjmm1js7sHSmZdxTWO0OIfoKjvb1ur0eH6QMzsZk6zLay9EgTjWaLRUens4EnE+QkLM01As/cfGb7LmE7fQwLMT6MIB8/DiU/kJCQUAWsjQeQCBE8eTCeWuiFg5lLdDYhjCcKn3UHjxpgkpVoZ3ARHTGI60mmJlOBJEwlNQe0bUtT63rzzSAnBDU+Q11vWltbMqNRpdAgLcpUpNYzq9IMnINsg6IwC7eEoshtBhpG52h7yZVk7HViBPT6eFokblY+TEvadxWBFCofGbnj5u3PvNLD6Xpmd/r/mKMN83MyENj6rqfIhnzd1uR2jM6tL5LmzhgBtKYpBVdfG9zu8XCm7vUNBMRTWq1OCxePmJNJR5pI1zfrh+gsZljqmGY0Ltg6s1mtBkETdrWDt+hr+PzNx5u//ZawMyHfmF8VZ+RV84gQd0RHecChy02oBkMBJTIk/Fewew37MdalQl+3G45OoE4GJYHpL6SdfVDbdx3HXZ8orbRsXReasFBpIWdYDCKPMSaBBigYWK+NjBIUCAJDw0MQiJgSQySlKU2FpQpVEzKRKrQ971wpx59cPXrsbNUTekx3reVEp57V83w8H87X9xdaqk6t+k1JAke78ebz/Hl/Pl9lj7JW4ImmB9I7A+GwATwviRJK/vFal4TnZ19O68/IOFFY1N1Z19nSEu4JOHOTDifDv+Hq2FIeSYX7D+5PzUxKTkw8uHdfRtvh5BdSoD8cjEsA0IQEeE8HUxMPHC2+0NBSXiIJ3xMWmYR8fvfN61tOXP/+jbYshsiXcEM/Z7hqtQ84bXPdS71dhVm3Z22rb/3hB+d++8t7t9cibEOyweVYcjrHDGMG7dgqaWTEGhzTEs+D5aC2J2ZFe3DYoKkI9hXcW727NjIilN3aXoE74oytDJZ5GpFOzOfc/am52XAAG+zPEadO2I2Az9nN9l5WgdBgczo6LD6LL6yRKYmRcOl6Ta2y0yjrDId9AaWAE/FUaqJVX6/qcH3piMle8+zB1K6a8bo6V0tHZ6ev6HBhV1pXqf3M6ZZvfPl0yVEu8MlMPZiSmXngY4mFqsrTJTX955/dv4vdycIEsDyMvAkJLTZVFZf/Vzxvws/++69tSaStOX+jN+X69/Hrv4RUyBGIzjqnlqacc33I4try8vqD3/3US3fXrb7jdBMzhTtR7QKPl3ZaUAucAtCgFrkxaAKdnXqZTL+oCFYURIj/J0cWFNYKRQVoZuvTdXV4+MGVMgFw44rNcZs4d+mO0zdnQ5p1Or2MQGFpanYpFMqyg6jjZPdJx7jP4nSaTGYktLZuuLZTWRswiNmNz0Z1ol5KvCQeh+RHLo663t+Rdzi5Ky3Uc6mn5Qst8h4Ldxf2DthPtpw8PcqdE6fKz6oqz6pKz6awEDg1cf+n6MilIJhUS4mldhPusxorMSG1/Ggx+et/pCH//QrFd16fSt55orfrRv+xL34PcjX0OuHhaUf0SV3xOZ54sRnWz63f/d36ECjfCTuhEZKy27Q2g9qzMGi1DqrHwFbb2cOfMW1PQD+mB1C/Xx2heDxJ4XOhEdPZ3o545qDVORUrl8pWVrCejY3aWRIw99zSbBjCjdum1XMMKLLDGZK420v27lGHPRTiGTE1aWqHa/FbepL7Hkso3BHV15EYAOfwX9L/QkvpyLfef2GUyvNFk/mCRmm2n75QbQxnzc/bqQCcfP3LcBbSMktLM5I4pTU1SVxcmpp68IOpvAreGBcjJtJP3p/EFbJ5o2dGqy6A578/Ox6DG33fPZUVt+NE/w+7GNBF7e78Ekgf3EVExcSFLXawl7xf/8Hvf3VvdY3KXHgWLEFwrAfFLADMQUnRxyAWkcWree0E0ICRcLTP6x2isBT0YCgI4m+15+Sk11a0l61capwuw7WXBX1zYf4LAbc7HLgzhzPT6wP6JV/A7Qvl2fOKnL4OGHPlRfaObqc9BL4ujTJd5Pg6hjycIZ+ltg7xHE6vGz50/C/fobEEpK98/OLF0SNfr/qK6zTt+UPKQ0bIIkstHcVnTh89kJuZS79zP8hBu0niJsrUxIOp4i2MUWaQYN7CyGMPc8np4tOjF07XHPgPcD7zyXduaj147r3R+1Q8t4V+6N3P97/55hKe48Ev78HmXhMaT2opMCU8Qk5nl3/42+U5vJF73Oe2jXUawu5VW+eYB9sp0nDid3G0GFF9JwNCPYGAMeqbg1ZDZCq1hctu3RIOHi9Orol4NqLw1vqAIWDgBNwcm16869SPh/HujlAJ6/lNluJyerc4JmgK4x0dpiqjUig3H/pOi0YpsUfAM/3lL32n4fhfvzN86OsdX77YcrKq42TJKJVhjSVAYOBC3MfLS0ozM2FzF6Zy3TZOiedjKSwNxAHtiWf3Gn8I7plCZBD2Y9iC3KQU9gb9Cxi/9jVw5Hz4PVv+zr+/cCNrS3zv/dd27z5x/80l59w95BMBZUiVijuREVAKCJfuhe/98cGflh/0rbpniwSto9NtW/beXO2LAOaYNCxAwFSrt+KYBJ49IhyPBgJuW8CgrVB7cFoLxJ+NCgXueIV0c4VHo1WGDPv9fBvhlk4LmMBLEBsYj46PtpzMKy4q7m6x4+Ydow7yzejxKhdJklEDnsSgnXlSbopw1tUpv3To47TolMOa4qPFxV/mEr7yrIGswi572BIlzCJ7VyXtTyFQ4hpdVW5SUppK2rdKWx50MwvTSitVmfj+pKQDbLPdKzkmsXBx27/oH30IXsFTb7d05Vhv1nYyr517e6e+T+lDZIgPYniCaAGcGNC0zc3a7txxzsEwgvh2r8hhgw7Xo8W4EowKgaR7rg24tZ0YvwLgTdcDKYj2yA2dY/qgIWgt8A5ReJoZaaxozdbVUV8CzDLciK6+vt7vl9eDuU6xSEoVGDPgs8NhiivF4yYHKm7yWXDurmjUaDRGzVSRXUaKJPl4+fxqsxJACeOJXA+J8yUqTsdzex3NlqyarrS2mi5xGbQ9ZPCNGcb7D+zZn7D/g0RMqjTALFRlsAtY3J5fqTpbfuroqZK8vBJBbMj4aEoufaNt4LktLm7L2zsj7jL7xPvebh/l1hNdSye27u3qvf792aWlUPfcL1fv3QVOL8VNQXNVYynvuO+4eYKeuT63fMe2VOTuGwuH3erlN+/53OoxAO3jGeECRvQe8zlm65T1UGzTyPRafSBg9XiXJ2dmZiaGRLWu7tbIyKVpRHSwvU5OP6NeVq+nFqITf2r1xJ0+x3jYFx0vQuVhJ4xHo75owGyM9uRDZcjPr6buaaRQR9KUT0w6jGwOkxgNA2d1/pc+frwqqY0MQNBCD6cxTHx4IKvNoU032LvI6PenZFYeFeu+VYV4JMCsUVUePXUan8/lXGlc24e3Kk2C7JSWkUyPJH47ID15s1hKj44lz7+2beAG2SbzpSH7HML54O76egQiIXCi825xbDYM4Zx7de7GnDvLES6wgeeqB9saRb21WsIlT8TQiVTq9Ap9rXZML5P3cOQInDFAA94bGSJ7HypTKFoVlxpHGkeE6t9ql5HlAKk/W6cgmqcaojcEwuO+8ZZoOOr6rOazDS+Pm8LmqFkjlFyukR3KzydHImTig/c8IaBovlD+Q1+qvnDxwheqWkpcDuPxkoHrXYScB469+1hbqE2bPi5S0KRMFf69Bsk8AGPkLJ+VHD1VCaKqGi6NK7Xbc/fvY46bE0fuhLY/0Q7vx9N31rA+e2DrgSkCTfHoXpoTjLn1X/wW4VyVhirBDDzn3HimcN/d5d/fc36si7gmTK1DRKjCAQXChmBkTW3o1Ot7sIIG/Zi2tlYj75FTr8A49tnW0PbJmekVhYBTsTIyPcInty4pauUcjVyGaGIGdTpdpyHqgzMTdhup70Rh0Pl8LstxV7PRfFyk7WAocJTg5IMnCUqegbO66vWTJfiu0ePylqjvZFZX7sDAYZakd3XduKNPhzHShiSeOXM0rzyXEaPDB7pU2NDMzMLMzKTMzMxSVfE30pLj/v5Wpf+OaiOp+7t3b9l7/sbs7akpyOvM7by5/jtBnFtfRTw3eO3gGXbfsbnvYUN/N/+r0LFQX9gxNfcm0wSYus6A1h0Y9HgjwVhE3zlmqO3R6jXiGHte9S+q+1YjXq8XPCtyFGQ/aDuWdBrNpx4nFwX4Wl26AjD1CKfPFwhHNcddTkRdHo2Gww0NHVSZKDNREpGEUoJRKeBUcgSeHCB1jcIvzDt90XUo32Hx2Rk0rmEr9eHk5LZ5pztd3808DOHn66+/Lt3Jl8c0R+VRcV8csf1A2kBe8VfshQmbaG50MJ5UPjc31O3Yfl7o+m3RKkLj31xeh/D+1ltDpJUb3GHgnPNxwI5tr1NTuc+Ou92H24pmI2s2qkk9UXfnoCcy7Q0SJhn0AlTcypjmuBDPnvr6xaA6GPEu0PlsB8z2nFsrIxM4pls5ulo56o4UQ6jRKQZ16TLiq2h0fJz/lptQIZ2Iy/ej97tcRg3fdsgkwNxQd5J0cQSePHg+1FBc2VZ+sqVBM6z0jUe7u+dL2EJfePgw7Lpup0Gfzp6RkjNffv03fxYP6fzmN69zv6n0Ir58sjx1G4D8f/IJz/upRIHkfWbKZ+eWHE5aGhBjYCQNMSag5uDfAZQ/8Pwd5YXM4L7WO+VMK1r6/ff7PGqE02AYK2uMLCxE8PL6waBCj0vhQ2ukCWE0gic5PB1izKWEJ2E8rSTgTAdMSdtjDCWdiFcNcgMZglsrIiYt0tpjrKJXdAjJzAc9CcqYbgMl7x4euaZlVKVyWPD2yqjLGLCEssprQkWQmlK7kuZ9gUPKaKj4JP16WqGv/PWv8Ja+8ZMvn+GUcI9c3ulvnjlzKi11L905aswbaPLy32D5EE+qqmndU0I65+ZoFQn5fGsSRtL6suSPRMAkCSgn/FlfN7c1ERbbnVn9447u+27hfwK2wQWBZsSmxrdrB7W4ar3Q3R6woqfr9y8uVlgrysiNBJ51lxpRdkRVh65rNPJ8Y36+pPB6JS+1/F1+HSDKPyyrRy4FkPng+MheSkoe+wBJqZzUYsmjzdsR5QvR6CG5xmRx2Mvb7OVZ8/0HspwBubJJ/nLD8fcfeeWVixcbQPMbeVyYn5mUlPnt0lJVKR8kTHv2PPO4ZEoY/ZeH+eyvPvfe+DRo5VNL4MlyKOfSL9cnl9f/BPcVfRfGk3gpNisQxu9anCbgdHY4wk7HHDHNWCcPtddT1rjg1SKdY/zR441Ak6xRpgQquf/FxdbWijLA5AHTq/HW9DSfAKcM8a0WRy5DQik66YZrZbWdiCZP6D6GYMNmygWoYLuBq7LpMQFVNrzMvc2jLx+XDSuNUcyB0WLpOFnk5H926kb3dYdBdogCnkSHuGBykMPnMVVYmFapyuV+4kIIOYWFacXPU1x+avP8p1nXHf9C4T/w3vO797bREAwtzRIOzVJvWIcC8qf1dYGnVwBaIPAETtoZ0NNReWqRlrBt3LG6SuKDWlu9ZR6rVa0OWplO1+uD5N/WWv2gv4eIifPSi62tOaKulENARKa9Mg2cOVd0uisvLvoD0WZj9REAlcQtGy4dJamAxk95VAfIIEF3CCDzJS9EyMkL72lm8gqcor9hsheVFDss8vR0mVmIu5kmq6XDh+3wRZ2+6OWmQ8NHOuwnO0Ih+6ilpeMb5dzxXKlqK68pVWUmpWRAEVEVJcdvQ9EfB/Tfhp0f+NBT/8KAvvDalmdDlG4cyOcd9j467y2vv0VxDWq2Z3Vtkp0JasrDUsDkG3eO+7qpnYlwhk6mzxCIBrCdEY+WHDHMBAEJfECvXihATNF5gxxAZUqZvhUkF4N6esEIZ+P0zMxKO3Hm5exFG4wTl7lZA0zABny1PMX+Ti1ve0BS8j5yAAREVJ9XHhtOXtL34xe4SGZ01DVcl24woupRjdH3WbOxSeb3+ch1ZU0ijmrJqilhdo5TfEaQ4qXgHVzJOnMzuPX5XTt3Prz46Ek8EYOuH/gXeO55atdAiAUnjiWnaMCB5+ry+l3o7VA/0HcOoyxBAEXbwdEyPkcq6LZYbO5o1BXGsRusnmCnqGDUaikw6Qjf1R4s6GA69hMpkwsp0y3qOAJOVH3m6ky7TJmuUAQZMrr/4yVLQzMaL+PwzUo5RymjaDyMXGo4zdVHjhxpPvL+5ubq/OojXwJT0YaTBFSJ8ZRzH6Rp1KURfft8GVGVqcHoajAF6qVGqz8bAa42jhalkbC3FZVw9yvxUVF3ZTlDc12FuSy1Sao8mcG++cdvkOL1P5jO931t29vjuTt+S0Z3t3MKj8RcxNKsc+kOkxdiWEAYTwL6CKgSVhrcAZFTw06fcwsiiC8cDSCe+GD1wqAoX+gNdDcox4sOUuNg0KAY9Pv1Qm0lRHUyJXNt2E7BFZuervDL0nNag+yk/HH/jRvjZo0Gj8R35tNQ59vRetEmyj/S/H5BnoMNUsXD3HwEwwCKojyPbIo/w/m+0Mum4/lKuvZGwSLJt5dUf6uhu2McdY+GAyLSr87vyFOpXq8sVZVXilwSkezNzVSVfoq8nfToZFc8a+YlIB8X0f/FG1Gaf/6p5Cx8EIFnt9OBc+9esvWtrS2vFUSkUB7WXCSiRuNtBgJ3jjPsFrFT0BZAJDmG4IInCLBRqcjGp1Tt1NZgRBEctOplelktiKLJOvIfSDV1l2ZmRoCTqociR7Fo+/79H7KFzkl4WY0jx91DUcBJ5Qu7K8A7okEqjWazueqVqq+/UtV8BC2P+SfA5GlYGfVpJCefjmYr6X0STlheZq4o2uBy+QKy9GFMbsOZrDZKnkfPUPHgieyyRsxyluZxf3lNStw2ynMbYPKIvQVM8fxfx5/xW/bMO1FzIiWyI2pieUur5JDEnYgnz2qPOFb1RnFyzhkWXAU+DVKYNwCi1gOe5oA/YLsjlTD1UL2oLTdarRVUNgialEo9kKLrRJ0jk5dmhiKNWFNaHk3ZukHWyv/wu103LOZXq6sBUpmOO8dWalB0o/njzc1m8yuvmKs7TDCzqkxE9VjPx04L2MqGOTQ5jbJDAnv+iqnYYRp/Ga6KxYz1wEZoIDTlnq1pKyw9W3nmNOnm6TOnTn7j1KidyW3IYrsYvdqAkp13j3v42PkvAlDx22DV+KwIlGZDRVMhAuDuMPOpsTyT9AgsOcIjCTKiSNkN1D6kCWurEFDt0MKQBx9ksz241weceHfdoCLoKSParAC1HEU2ZSPqyCveyYmJc95LI1aFrEKhr5fpaffqtAxP0lNdcpn5wQFU0nmC1vp6I+e4ufm4oMqbGlB2c7PRKJdcEPIok7LNZuk9heTaaEApN7/S8PFXXK7R7jZL9OUGqLcNpmpzdXWz3FSUVyOm2lWnPv+5X5MJvX769dGTJYXPYjK3btvFoijEk4foxG/e+PX4eWJAn3rfU8/P32Dlme3OHEMR/B7L7Q6fABRIRenTw5yVFadNrRg4taBp4K22IBLxBAV7ttPDaMGC2hC8y5TSgzXqoNA/aSWVFVRYy0SbSJEzPTk5AStk8uobb1xdGGws0Mlrs+uVeurPYyJ+r8dUkF26Xs3Pb7oseSSEmu7RIq08Uk/oDFVRixmnjQUwUvAUh+cmofH8iQlnQ2e+HF7tkSPGj7sc3aMm6idmUwNBWH51s8bUESJ2P8Bk8dHiU6dOlVe21eQe3os7FxDCugFAASP3HAlcec9LTOE3zxPmR9whMn9jijgJPJ1Zec5QSV6LMJB9Y2qOEFEUXsgntWK0nWIcHQ61Vq2VyqLBoDoCWJMFBn/w7vIyNSnaI0EtyyfF+CEzHhFPhce7fnd5EjhvvnXu3EJ6TllQR7GEua4Cq/jnF/31xPOAZn4VhC5fbpIpm/x6qeFB1MSzweCnOgXOQihl4Bdj2XLAMbtdepH70inicar5MJs7zFMNiHPRqKaJYrPRgpQwb3g4qTCXqmZXFyvq3y04iggieO7asYVDJX4rK0IBMpZvbsZN23dCFolLeGL7eeK2FMffuzPrtFMHpzXrdNuEdIImDytG1IrAjQ3aCIzILUkmDUEgJRXFGAzNzMCXK9DrcGDLd+8ui78SVC//iQHu2M7F34HzH3/KGAINOaYQrQprMHv9tzeHPGNA5NcRXmlxw673Nxvrmy7LZS9lN73kDxjq/UYLdTpAMRP/1NaShGZfHuZIRDEdcPZcpuapvHxZ6hC7OmWI6kZg2gx1uTtgjh6BlaOB4tjBvdDz/b3sZjh/+PD1+d7X9scDoMT33AKe8dyYwyeQmKh5AiV8JvEs4ckmsYTUD37wgx/94MEnrYZsuT4VcoKnyDOzSrKK8ljuuOoGTh6SfEYiC1arUHHhhjCdPLQiRlJH8PyeabFZpcBQUbEak88C8F9bB0nSfwAVS5UZg4cHJjLY5eXfRa5UtOqhfCv0OgrHg1SXjM1GjSGAcayWw46luew3QLEhUbSYOlwui8tlFt8hIq7hGEUM1kJ7WXs7RT/y1SYATa83KdOlwryQUbwRs+4+I/gaGywdLcxwt7CRpK2tkJWM/SfevTduw5MDHODFvW8n70VP42mo3yAJzuymhRMWhy14+iPQbvbt+8i+j/xnEsMzWwWgibNF3eRFnG57mkqlKnI42DKDkscKS8ECzxomFA13izawVmIrWJlj1dMLujk0dPMHP5hEXhcVa2uR5bt34CsPMUu4eVgKCqZiAmwZ8QX0K60vrU16YCkpFO2KulpBQcLzaAPVUUCTyV8SXbnwnJOkl1wby+rScFB2QiEl0OXcurVS1o6fU8qa5C5ftB77oDR2iF+FaIGYG8btA/3MdREKmC0h/hWfqcM+X8RVnPZe9t1Q5xWmEoGMXUcJaWErqALrbrYISVLJZcXQl56Oh84Azw40P/L0LoYaAOw/d+DBs3e2pFvA+aZDRGiqGrvd6QbPAk7Mgi541ULhDRzgRDKZqI7cvLmmpqXunXjr3IQ2GlDoKjzoO9MJa2g1a4CYlrl27Rz7V8QB1ZtXHzz4I5tZ/7ic0yr3RjrxOGTyCsE6Zji4udkYYMQV2dS/9KLePTc7Pz/ldJgcOEYOxWW/kvgeMOvaqfc1ijTDwBZV0TU282vQmFuI/WWOrJOhDkfRAGtuBuwNppdHS0LjYvNaCbNyXftZkfWufaCJAMbW6rPWd0/Czu3AySOeeQXwlG6E5YOwSYyAIaS7diGjvAHPJxiA55/98e0BWG0QXfIoDqSpWLEVto0ViBPTd4L5RuHfwxhPSdNx4Oplj6BxRrx47IkCmpIkjgWUTxBb9TriCQWZaYTHDsje/OXP//j7n/3Oc7lpbFKU8ghAieitCzMEW7AhaC0JtzeoyKZ1dHs+6/rSuKMT6Yp2WCwBgxEjKku/1A6b+VKjxwPlearb4aCDPC4tEgg4Dik1mgO0KZkh7Oo9cLitxIn1mu+GWpLVdiwxnus7uE/hmUexurCP7GSOf2dMOLcy+CGWT4vV1HijHYC9fVdCAluGnv4ogx+VqkqV6knWXYDns7cHwBM42WCUqaqsUam6fTatmnBoFSyxhRGvCJfGYG6IuocIkIAbPQfQmxNvvHGtwBDwKzhe5FKMeniDZdbFCq1XmjYGyNjh/fIDEF0eTNcteP3ZimwdD/ojgk4/ASfU6wkGB/XZCiKtoGH29vX+UJFvyXnD6UM6jfW4LhgL0HJYxNRuxZLPUWzwMSIEnBDE3nRC/PbtP7gnLvFw5QCnd74o1J/R1ma3t2Vw2THrZ+NiATtIchDKOO4EiIsnQBKmExbo7gQ+20AbhwSeCObBffs/mvntszWlUHOecLC4fynXTsvIEUpLK6RQUHk2bzwMnmtc1wagQLoQEaQkWxhfJFlPap0FHizntWtXr/3gjYlpbUAWrAhWLC5MijPDQCaxZ/DFoZhcct44xxgSiF4bWn7wp3V17eDMQraCABM4J+l5jIzQpJsc8i4MDXlwe3y9Iqh1L8GbZIWS0+mjT2yul2Xr6IeuiOppTpPsRb/B55zPuo0XvX9/dnbp/rx2WFlbxF0SL+yOPzaAtUxr62fj9/V+ZuRY2rsDR75t4/rxOHEl7144y+xfIysiXNyFcD7HPTP4n80oaQN6KCIf+einMlWZn0p5Mv/+fP9UoR1+ZSgtKVOqFZR3+/DdaDmqzuj/AuKJdEIsIreUmJ0wQLzeCAE64fm5awtB2hEiei+LTC7TDF733vR6CtaCnmuP0OSDw/eeu7r8x0n+6k3rInjKshWTI5MzoEl5BFkfUWRfAa4r2flKnVpLKEFdxuFzW0y0OnQ6qlKNUMmghLYrhmUBWIyh6/M3iuZvzPdf7y0KUETu2f/8+ee2sqQ+/rl37UvuzbIXzR+IF2ZxG+5ns56J7+aOTu6WYXyGvclIZjxLp3lK2CmC+cdPLKZi7CPhYFJp5hPhSfDZVYMXnG/LTUqtqWxTVdrHw9qg8EZadd+al9THI7Z6UP+gHkc078aGWlkoexMMzp3DTxuiAZneGqxo9K6vDzGZGeSpoFG9sV3gkXzydO3ctYnlmRlsa8WVVpS9dUgo+uQIX+GX05hzBThvtbdfSVfm1zIUQvdv3BclcoI4QtCpmF5pb5yZvlTXbk2X1cs1PmcbV413cSt5yKklEDVk7PnMc+IGtGe4JWkbl+4gf9ysgL9B1BDOjaG1594lltFue5qhY7H+OxG2EvSv3QL4PbtwUcLDbxzQlfAUV6mI+w2f5Gy9PpVatMTCsrTcpLQapLPEEYazRS8SdszaOj+uhz1TwImiU/3gYdADb8FVliOC0ALdsqiRGhKdIeaxvcCJ2nsKFh56oWsx6dwQUDF5NMPSgYorV7KzrzTOMPMpwLzKlxvb20FzBbYIRZNBucyqDcANCWM9ozJZdt3gynRj+8w1iDp1OkV2dpOuVjZun78+35Y1avLVQgRT9r/wyT3bd2wHUEwjVybuiHsn9pCz4xFAWMrEF/DwwJbARnUoS/vEbafJe1mNuW8vjDpk+XER3S4iqI0M6eCTxfMJ8HenQiUDXUmFNWlp5VRZwzC/rOogml3gxa4VDBYgnXNC3cWCORw8DBAPUafw7B491TqzK6qHz2lVeyL4FM8MHXhWzoqDyfwBgD5C9BzATcxMXJ2w6nJymH+fVKv5jKbxyIroK+G8V6ZR66tDHo8suyxoiFJtcxn96QSqKwtlK9euTQwtBOUaIqx6v7KeijHNt2iACXkyztD587u3cuIwhuLyWJFKIpci1Nzs4u5heS8iHP8MALF0Fgotq7yZlUnmvLA34TluOYolm4+CH3y+hCju6YnUff9ze5KWVGkZkPJyVZWVJd1z+KKgODBgvZPYTgqftvAsplNNojRIu21MTSY+AZ4zVr0/YNaYq1yLjTkvvui3FkBZxKlEJhDMDdd+jRcBp/jgM9BjrBP5JMUZGfEGJwWa01DCrALOFQFsGaNJ0JV1CkjLOrfBqNe1B2+h60NXr057FKIwqqfnIUbmeG8kzAfN2mFn//nd297DXv7dklCityAqeepHcHJ2vnuvJLJ7AS3uIFByoym3wqcmQ6BPQDph1mekpqQm7yOD2swfxbUbT1hhikve83x/W24GfNIkYqWskCB0Cm0nL58UQQwMWaTzDno+xpgmrTlUmsHMN8794Y2ZCr8uAJiur180641Gs8FKggr/4aoIjjbwlJwSQPKxgSfaTaujfZoO0kLB0MRV2GGCUI94xnp0dSMwRujbMS5LtU/w7kWPuWxlYmbBmk2thGIzmRIHSEWbOLaBzdD1Am5ceOu43bHEBwQAjquPtm/eM8brvoStqLR0laEI2OMS9nwsOVmwkQ8+C9OuNKm0JK+Ul5SPxT3C72GV+UnE84VEdj+k8BtJSUkqLW2zj0OZHYQMEmSyjceQRAuRtk0NouyRm5GRoRnv5FVwujZTBgPeX2+ugvt/4aIlescdUFNYJkwCzk3x3IxAsZ9XY8ZyGuhGZkasgrkIhisr8L/Fl0ZGbtWVTdcBma693aMd88AmJ3SA4gTkFbrLMirHV16SUasT/bmNZrF05t+7bd+x56i3bWOWAG+O4kt4PvOenVs3BlVjsHDvOzdI7cTLcMMECeX+lAxBnk+rESHRR1POZn408+D+zOLSjESS+kdwPumQzI4Dn+y//Sxmed+BQjh7RdSVEE812aZHhIMjoktMGY90flDsscAETOKfBShU2D10LPz++mZzVfhbVa6+NVuBNjjtFVi+JQEKfMTqSCiocoQ3mhHWc6TiFtBNUKSfmRgpyylb4dDwlMhMt6zTl2pr6cIp6oIFhk4E/p7aulLGt+XosuX1Mqp5L9VTbDZWw0nMj7Xhaw/VdifH7Ws7kBgHntyvLMWOksJL51GdncqxdPle3NOi8Pl07Kt8gRs5E/YdPJh6MPWDu3al7Nm162xJ6R7pIp9/nVpugrm5QeCZ3ecTX7v3WnwCN/imphS2ZTngy+F0MJJ9nmkALUAugXPO1scR1XpM6tDETX5ur0dwjFsX9S/6P/2qyx01qFkbjQN7zHLGtPsqmEqHT4WuE77fQsHBc8SKpudcIapEQkekX9NCe84IEwWCHjas0/bdc1OFXYUevkDbHjRpa1wZbqJsb45aTha3uJqpxwkplc3v2518YyAjIW7HVtahxxCUHBKobtuAVAKZLwpEJY/DY+cmNKKShA9/etdH4nceKDkct+Ufa8jb377X/thU7He/+JkbP/zx9d1EtdwPlqLKszshy0KJDRpsVsykpwA2N3hiPUETOLkBxjPDgCv70hqnFxhyU+S0trZmv+py2UTXw+OZRBgBLgYmZ4IjRHTjXAVe8YGcAmfBwuQ04bvw6UI2cfwrjTnTZWKVjagM1wb7qCCGw1pWO6TXtbbSURoevtwkl9e/qgHRDrZu5+aZ6Hpa5k8kJhxjD+UJVHm7GBh+lFai+NKnD0/sHZdM7Xy77qWQ1e3vIAg9eGrfw84xeG1a37cl1D163tO/a+ux6yfintkRty0+MTVXZV/qs4X7IMSz1lC0jHDxoqAMxtIuXttqAfykoUiE9oenbAEVbaRqll1vrDKZXDZzBDSBDP1+CCfQASfn2mMHOCd4Bj0kFR9EjCS6x+IzIlBFI1V2mQzjaJTr9ZgaWntlC606hV+ej8w2YUFfzZe/Cg3UVJSWwe347EBn33TGDTZ5t73GrhAu+Nvs/Tyu8JytHOn9TlyRePd3BhAuQ+wNqXtmStzW+Ef48yzV8f69AY1pBB5RZLC79ybllnfTzaDTxrN2EDA5FO1ocgCxYM/bKI5ERMMzyHY0CU9rRWurP2rpMLmq2MdwVRykc8MPSXjy2MAxFjSh8yj7DEGSiDvbr4Bm48oISf+kQBPinUSsrf80ilwtY6iO/9BKI5Oe2UAsa7rCi9xIJEFN1NLN2u0DhI3nD/cz6D6fNp/Vf+CFPSIe5+d5iMRmaw00uQX9Ebj4om1bNvHgldrcLkmngXtnai4S+neZPM9vr+viefNyRFH6I7iI25+UG5oLuzmwrDsHx+gFWyMeKu2icURn6R6GbAwHrybQX1wMWm+tiJEhxWK964LJFbWtIWLoLOA9NJ2g+VA0N1Mk3kw0EmViPxFQz5V2dH1mmr8KTUzUNal1kMKXtesuvyTvISsSc186XYXOn32ZA6qyHuL3qMni6zB1lAzk9reF5qcGern+pbd3gJukEp+Pj9shrjsFgYdGMyaSIg+VLjqMqTmB1K6tsRjz4QcB+/6UlH3beZewZ/vTSSn7dm2P2dqHxuBfrRN4nJWMyxN47j2sKnGybQE0TU5TmKGVoHqaUFLa06cWAir68WODfWIYexG5ISTk5/dLcBoasaULK4LOGQOP5w08wfdxODlXCT2nJRUvuwyEKzMzC6SajHM2igxpBVs6RIGqHeyMsuxWXfZwbdD/YgWpPQUU0JT6oE4WgDGG1G2fzxU+CJ+z53BvP5cd9SYnMNHO0pVYmfPh5fjgxnobftB38gPHYCDgJ9KPAbohZ8j19nh21PNp/L64hBRVTW5aIQT7RNqg/3x9/oZobj5JeP6NsjONabMA47iOo5RCW9ZSQFqhtYiVqisWhngBjnN0rRapoC5clXVyKJkVlQ6YdiKGKsLUQdSBGqNgjKKYxU8GU6PxiIkaY4zx/mi8EvWbv+dtReaJD+1oq6L+ee7TqlEJqipzUe3cALmxgfpDD9OJSJ5TOl8nzp25C3oIQCFAlXEDBU9PM4nIQm/Xnvma9ss8iOzTsOcW08MrhRQwT4ngnx56G38Tew6cQ81Pi95kuKvtA9pC8UBhXFa2NTN97AlFz8iLx2m+i7e9XeghPHVHabSl8XtApo175noGw0arJiVxft8Uk1X+JYO1ZcTiOlUWSc2tlM69WFMKJIybZKrfBXkLRJIKpcwBJNpick/UOQwyPFeQSyCFE/RPCwQUQE38LN26K1Ul/z3mAuM7Lx8aeGT37rlDpLWJkS5oe/SiVw+jQhl7kSFCsj3Xkv68ltL6JTPxeJvEL3Dnwnx3tOJVMkT4P0nXaCtzKu8TgCYxvX9IkFPgpIEeUX/mA08b1aBXsfE8cHnvZpNQM59I+0hUVAvRErEo5XiR9UeYUjh0Mlzm9+nZ/JUucKaL/jevT66vh8O2cEnM79dxZQ/+tLpcGnW6yao5x2TSkAIFzWQ74qaEAukWROFaqp24+pztytVn4gVghHhSoM/GSf+z7tyK6J2sDGG7S0K3aHJ1+T21nQ2DDQ0dPf0MVQhs9MooUTx9DNeSi6SI00p71WV0e0UZFi6Mx+PRPfPzt8bjh5HdpJO/xYwn4cQuAWUi3ISQ9g8qemHCt1fEFuE1gZynDZIRTsC8/3FWM/USzkMe/srhtz0IeyFtj9EofYcod1KL63YzoSVYJglT47JHJjktF4mES8orY34d1zVT1JFITE7tW4xOqyor+Q/8iSn/1IMshpxPKByrtQDLJfjMHPxSPlPjrP49f/I4/yknA3Sa3/vulTVPOqNtV2NlA3O8jJeTNL4LVUnSU5CUGYQjNa01EBXxPSe64nEM++Xt8/23nvtqwtlJeu6YdAnHaUdMYrs1Xwc99raY8fvvPxyQVKfgWlEIoM0ebLinmT0YcCieL0PIbfSGHyYvEqIB9zrmtqOXSJ8puvNzKr5aldiWBEApPDRqiy2yEYZBy0omI+HBRqPRR+e2hgycldNmfqc1BUoY94Sp+qcC0B8mHWalGE/wdNBXZDu4f7/cL/4ni+Swqlx3bjbnaTSKZ5GS7bPZSlp2dwwAH/TwQH19Pei20kH75OdP1m1wlK1/mFUaNTXosRN7FpaPts5I/JnAkqDp1V6AQVJD7lCcrEjSsm+lF8kmYdSHAivgib5srvBIV1iiOEdIBoNOgOirT1NyA9TC0BAuGePewAme/GZvfjJiFGnGL1F8E0jUIsd3HOTfFtfsXDSl+8Nu8xlcToclS2NSpzodqp1AeKr7c4p93joWk3DfpZHpd18+00Aguqux7y9obpng8vV9nvH7j3fyFErJ0dc2Nu5rYKaZ+4ssQ5jlBd8ffpmOz9aafvrV6Njo72BBycLC7Ozs1Pxtjyucef/dkiDCZIjSY1hw5RK3N9782KmmCML7hJnJbHQFVgD0bV556BWR0pAHau69fwIU4VEgZQ6kmg5xfqDXTQep13sJcA7UDcYsGOokjOAphCTLtSXr+U6H7sq1RXSr0e8ym3TcNiOlrDlHg+e5FUph01OU4F9p62AHUdPB/L7GpmP/vEQAn/WdtdP/QtSgtbllgw119XNHGIJ7BAfqZWqazB8MD9NlQQ9/zTBi3w6WR8fGOmrOfR0wcW6GQFKwBJWZUHU8VEiexL36AYlOidhB9JdN7iRPVBFYGg8IgxIQoKPj7pXqasHN0/b0M7AmWQNWDzWTgy+EeatDQbebv+NI9DIE5slKxlMTOXfikGRsDq5YGvRjarpJdqpZLJZLtSaAVINziuVK1Y7UTZWZaPtS6A/otmLzl09RprbcHFvpsWP7/jVRpzkFyWTEi9wYSuY4zXTo5jfmBlofUQamT9zx8Cw3QRgV7ehomuroWF5g6egCXvzh18mMkAfGmRE8KmS0Ld42E4oyKex1r65iynsJKJ9mh50QQSZBUGj8hqWu8SD8OYTVwTOC/wqrV89GUeBzKbao0INvFAVNfmReYdALoNETl91x85NUfqmt8aVwZzqoJqIRgTVh6KUArE1XgyQ6ICM1VZtIj2xBBzwVb5/X27kcAXce7Cs6mJ9fOrV7OyeKhfW3qGBtAeetbru57hDu8oGa+8QQ3XcfO7+uGu7Y/eBYfdOx3fVH32zvpkOry6P4jpgN2ogwJ4h7CCaNe5e66PVYigZWQsC8ulK9WvHBM2Lw4c0PhlbHl2644Qb4M4i496Ik2yjD47QXoj9x7e/+oLkixGvUKT/TEy90F3pWqqNUAVhxszHiQnMqYg5cm9KekoY0AxE40SuXDpvu1KSlSuFNd6mGjoWk3tyC5yn9h6yc+3c8i1l/k01uuLJ2G/lkk3JcWuloFjjVIzZGv8tbWhg9Ga7pbz2AeHf0X1d9WXdDI2vEp0pLd88PszDrhi4FzmcnYCZqO0pRXKY3cMKX9lx+8dLS0hnjoiGDtB+vrkpY+QFYrq4Eqqq6qmDPgHz49KvI9eHQitudR1e9B/Vwv9J9S/UdxYHLGRdgGTSmNsy0djmdR4SS6QqOm2hKHLmJrLBqFmElGtXq8lkzEu4R0G6OEing/tOs1iYTb32ds3evbddBWeFQ8q9IZjjTk3oiyaeQymzXMyTGgOjsfcv9/f0YneF6rqnVjzXu3lX/bsO+sf765QUahS+PFrLQ99kJ3BkZHURWBc6ZEHDe0HXDAzcC6HjQLbnf4AowrgijBsfHq6oCga6u8XH5FJ8eZUkGxO2WxXOFzfc/+9gHFaIzGKoBTl5eBprgqSwM6hnhTCZsmSxY7gQ8pDuBLY8kolk8UKQa52JMm74j7VR7nrwYDiVgPhXJvzVNZEn2FxXv7bPlFxXv+vd9/gWDvj8UbzJjkOYw1Obba/c1TL2yMNzBiqIDR5t2T+/rPLavaZgOnrFjbxJe1jz33J7LvZ6J+yn20h5fOCTMpNjh8SUIuMaXAl1LXVVVWJ0gJfUKgTQAml1V/MUuPgXgIUKjxyeaQ6GVoPvMqrzCt59+ljAeOIVkm5BA664OVldHuZ69m9jSYDUpLjlPYOV7kikvlCv4aYqZ56qiJt3pX1y/U3c+SiCZVt4UeB47/2CeLTy4NQ9/ikniiqyB7HB2QX5xn82+3X5arfIvQTOljaizy/IrezhJJVcCjgwf6GxsaWqYfvfB0rFpJkb7W4/XMLPSfXnU8+rEM4+RCC28ZAajwVc1VsPrDYx7vV53ILq0FAjk5QWDAqgQ+J7VNb4EyrCnO7iCsD/24mOPH/aAWQXrKAt7KbdJXk7w5E9M0aq8viTIjpuHezYiZfTRkDlKTQq7AJvQo2STqLntpM3Dkr4zNf1CjUO3GPZTmUty4SZ6UDKrsf1u+B3Z6v3UQWkOKc7t69vmvYkUtfKvwWquPXnfiHpyV8vc7Fx/fceBjs7+ubGWY42NUywuaDo2drR9tr37VpoquwIhz6O0dhyW1lDiUkBZ8bpD3oDX7YWiAWHUQDCwEgDPCuAMjsOdSzcI88KdsOvbwPni/c3sFKAX6ezC5t6ngdMj3BmPX4C/hW1bLaxwk6e7Lu+eufISO6dyVRiadMWq7xR7DoxwZFaKuE5WjVWj1WhM2nNc6yftBa70pMMJi25hTp5JPLc90k5qRAavc4qzb+/L3fX/7pzpX7r2Zp+hcdfJgd39MoNPMb6ls650urNpet8YTfxTs4yrSPN1lzs01Mvs+t103pEfHYrGoyHWLYS8kPAo6GGvxruC0PjKKnYpgOaswk0CzqDiyJPaozzqUfjR7entpS7X+7ZIOHvEIPx4QqyVAGjm5Z0YYLuCUX+ONStjpxh2kARWeJSndBhaUzUmnZVAyKRd+/zJsN9kklyIUMJG/Qm9LYNa/3WN+HRVhpjpNHNBLhqU+3HbJhH3xfUCda7dXl5ZxHL03JFdnbWDLCma7hzrnG6aYqf28HA7cF51Ht1vEsmg/ohmKIrATiE4ihy61x31jgfGgwGR7HG+B8TyBLoCFH3gTj7ivQInjv79ykZAZpIq2kiLMGnsedujNIVWy4/iZ0F5eQzMnagPl4+YLepLUY8i4EqzQnoar7NS060m2rm0Tt2o5pzR8MY7a6PnqAXNHZuUkPm/5H55/R+A4Hhmp522IwOjNmLIthUVFW0HT40q8U+bIsaUFHa46g21dts67b21DOSxS4OOu6amsY7lWbmYwQWSq25xuz2eoQ+evptMEIcNPDN8MTc8I6NZiDiQCYhdIvC86ELog8EqSmmXI+uIvxe/U+Imgk5JyQW6zq4earv7/t4K0Z0SVl0SB9KQ6GL+CFAtOuO87tnOsgKH1qS+UPSnjAwg8Yi0dqfVek6Wy+kymHTGCHv31v2a87NIYSrBfQLKzWrxKftSUv9b4vkHqdGz0yrjNH1n9kEGErbFn6odyQHOHao0ai8q8qF6lb4s25jD9rYyCebrWSVFXknOj8CdMiwQCn0w8TTF+Yk2sGyO43IjtkGFxoUAskv4UwDlo2DwjCrxn0CboEksEdu9pcGGdarswJl5+qKn3/YkTdElwBli5FihkDsq7lXe5SxJXDOaTeerNZifLDqK4Ew8UYfO4nDqHFarw75efvIzu89psiqJkgQpqcukgf/dVEyWpG6mP/5d1MWvys4mnZxxes6krXh6+vbG7cs7Fb9UClmJJAPFzv2Gg0XF+UW7ppua6meJNa+isR9LdBVrFLq6vMTdvWxd+eCwJxD3xJF1qhIY9aDCnWJzhODGUFdgvDo4LmPWZwieAYS9AlUpiagPJNQccoc81N4PSzygCLmESlCegmaIpzfqvSSa1zrQEi5wOk2qLBF5zJLkMkkccb5Fb9KtRTbEBjkt6NB0iUQTZmtLFLTjdwxj9jK9vIT+Kc7cTN2nGXQGn21/bl/m6aD67vS7fQ9uH06pWo2Cp4gJW/D09rLKosrSzo6xjv7Z/uH54wzmt8vyfBDt8hb2zlDnZHlAnNRHvFCRy/GEusTkgFyXfCmYYuHPqgJOLBGiHlzBECn5UaXY3MwgEqsAm9tWPRJf0Q6agBHLFoxi2oIhxV1gdubhQ+Uxv0mTtdOUcqFmJ2MYpvOtHJzkvp7Lv/bZybWYXmuyaM7Byd+ZkgLmp9Tck/DxzexT+8wC2X9ad3LDBoOZHerI/P7sTJo/D+69fXr7eG6aQ7a0qcxlkyVzpSWHShp6OkCz5mG6AtmCzqYerhHkUdChBjHz9uFX2ySnNCP2PJiXB/MBILG7GJ6g+PM8ArBnF3gugS/IrGDFyO1JfnOC0AizxkZvidOHKkIVqyExaFh1knfgiieroMnv6pLoI49sRLgYTv+bKcukoV+Ahlmtxakzxxa/qduI+K/UaixawVGiUU2yKLwlHZfosLMV6LSWgtP/KwWCac7ZTxujQ5WhNNEj97nFB7MzMvduG84tgGp9Iw37Oga5mzbH0W9qH+ySYqLqxJHuE7d2c+GB0vcFM9FCUuePo/KaPWAQwuYEFK0JoFAXxB+CZ15gaYmQPYqWwBLJ2DvlNkwZRSIPzNkrmT54E/4UBSohwao0nAiU7MfgR8fjATLJrAA96TfmOs+xaLjDobaeo9KaIGdBLBJ55+Siy2FQp+9MY75Ao5KE3CZf7tgi2ia/Q+1SO4z/hUaaSmeWXx0bqRU8yX4C0f6ivZn/YyJWIb85zVTGXtGS8psPHTnQOkA6pJWbYZWN9tpKDgPX9TDsc+TWPfdclnfJuZ7QUGGIShkiqpA34MYxEj9eGFRIPPi8QFQQZt4Vy06+k4Ib09qgSaQ5RMkITwECSuH0uLeQuJ3YKBQHUX5kCIpH8cHYADIwUhLzjTov1bos1BbU6nOsJtKcZn94o+69mANhx3tSqa2IO3D+SdAhvOuYM1VnTnX6/jWZtENlMOsd7E5WycCmNjvR6U3hiEX/ffv/j/60nL4jplWXhQdfapljjSHDzfYydo3m2ss5Ykk6tJXM3U1XsQcp74xLzm0Tj5O6D3AG3QG3FywVUw6eClWJEiVcH4fkLcwrMSZ9DM8IgeirQxL0i9rkGyUk4XW6JyhueOBJWBR2R/hJsES9UdkWRk0zdqdxFKukdjlc2XqLleZ3V2wkwueYeAJ3U7pGnXTgfzfgYJsc8Kea5FDbyYza/o0zLWZWgKoMwpoAmZGZA5rS2iiUsX/v/9SfGZGRydqb5x4+0FNeac7OUNlqy+s6JzfeuEPWqtxy0z03nSdbuy5nMcCZZCrIqTeH3F1njIvEr1aMi8lB3omCkqAi72eNY+Il1RSUvAgZJRF4qXiQ5SOlD5ryIBoiQDjcK9txpAoHf4qN8wqucZnl5HHPG3UbIyPGO11+v3/UbHFYzrEYLFe61tYikcXRUacqXeek+R0VCqKn5OIEWEeZ2aHPcji0aFjfn0Uz+X1HJpeR9ACYQkdIAkDWidDTxAOTBMSZOf8HTnWuj/7cnpsfmd09aVTT4ZBfUmsznnxDBtRlavMW6CZWT96kbFa5RFmtUkjp4oKPLlghZ+xWPHmUpsg7iPIiIPGlF7EX1oU9hT8hCh5vi/1RiOIdT7Y2KeW3L1iGBbV5gJQsgNd7QSgaZ0UYX5QED02Wf8Z5QKff6HPFHGaXozgGujGfz2V1ZmmcMaM6FalPdNRsFXmHz1cwqklXW4tltZIx96/iTp3HkW/T47tv9nwmGkP396kEXa2y7ru4b3tw+nxiiTS+MIdOSm+vLMhO453Rpubm503XKctQ2R7HiNElvIDA8xJ2zEF4OG7vuZd5KZoFg15JJomFh8jV8eSlxOsSbkJkRZR2bulEDglrktGXAWH6TKSZlmwqxKCipJhpwqcvBMXpjc/EL3j5DlrUjrx882D5+sZ3dZFF+2i4tmAktubnOD69C07HqCVdUxCZ9DPxYgLPUwDdoffFYlZTGqkTk1GJ5XVmc+qfds3RQm+ADYVOLSEVk12C5PODpWOl2+POcCRFxQWw8nCZTquUDcQN1ahLbj500y2ACZ04wSUntvZykfWWe2jTYnFCMHhmHpvmcHMQ99UVb5AknKSTBER8JkiMk7hSxPOQklSi/qZkO7DhlN0V/pTThvTTMrkIKTNysKcCaNw77lUQPZfmCs6pbDwZGaG+7suNhU+ur69HYjGaFfyucywWXZbaGJ4st2uytcnS52ajZ4xbr2U6jsjQoaBzpSWL71t6cRJrGJQP/nEVA3/9YGPLWEvlf4Opzs7NVRtic0+Gc1WyyklInbVDZStnfWkPCJ7HTUZO5JzHSSHeXaWM9jOIfp4snbo36F4d8vQWYpUEIlnoKWIPlsnUXBcoY4kgJU0v9osHf1cIKpQCfDMNIL205EsHw4Rw6AR0WBpTEHk3Eo/fEKddioMCG59tRNYWC+yuz8KRtfBGJLK+5r/e4XCY1CmWgs7yQz3hss4RVWYCTmRVbbSvhe0FPh0BP/NvDG+tETb9DrWU9ODFBHRbv8k4sVihBGVKO0Pfg6Vy5rzyP+c3MzRqkiiZKVqDSvm9JX55Ot/Iza2t9x2h1v7VHs4Ef3VCYGUTp0RH3M/gLUPqTAycefZqM1zG0zNErVLccxwojBI2KRFfugPgScIO3uVPQAR2bIx8R2220WFDGgAEqSTJntWvefPoo+8/isTjOBG+RxWfniDs2guYificxfi2RedagXO0YC1iR9ItGqvpwnRzuIRRzTnulE+qEwVkq3EtcnIyzBVtVaqJpL1K7XBqs/1l1EeSfbWnNG8rTcgJNHMg0EyTRyYmvS+fISIZuq5lS9N/559PcefTrDqtca3uYVorjxy57+FbuVO/p3u2/wjHm7iWs4eTwQScMjaNDoVDq1eqAQXz3NsGCZbiUBaCAKZJNKdQQCxRoYKnVxx1YWPFDsGbvXdPPHM34ZKgOQGaYPmo4PkF38kDCn+6494QD+HRy9o+fOnjb2Lv3enUOk1O7NDa6KiVHKjVBbalJ+1PPPHwS2VqwFT7wuuRsN1f4KJWrOSZ0ti8YPER9o0U7EgUjOG/rcGlUhaW+Rk66rDo+/ez3oJxFxLALaUN041FCtVua77YokqGRhl6v718YI6dWjUH7hPuRL6Bb7j1PvZNAOStrOQgmyxhp+yWY/qSyIabroc9zSxcQQ8KqNJliOKLelfGA2hUyS4xqLkqcCK8IUg4UwDtxalnDBbfHgJOqXVOvM/X1xPvf8E+CGZM4gpzokjdZEVYpPPSOxvrn8V8ziy6FfzYozv9ZI5T9bFwOL90sJwGxhL6jayTg4PhyUHfmkOlPUebmZYKnBhpk7NMn1s8OIsgCn9umX+TP+DGDPEwiw2ZsGjfrunpY00NY03sV57mZIrt9lw9wx9FldvB05QtaObW9tT11M2xcm3uwIH6/prh/lmWwXHCer6D6d5uIk2Yk3CzBua8pYrNpzhLWGnpjAsNKawZauYdn0h4D3CEl8CpOJ4i7cwRgCchEsypDBVOSMyJ3rybBcCoTiFOSMKcXwtNKOt0Ql4oGiXsRINecscnG4supy9W4LjaZHK5Ftd8TsulqTRdrY1UsmfFzlbkk2UqTSYDrjpuGuX6tdaUCzPI3gEoo5w5hgJztr71JFYiSRlqWrwJIlGX4ilxP6poP7xpeLBxunEaOFs6WxobKRP32QxyAhV+3ZZ5T8lxFJfZRwoMxtqixl3wd1N//4ED/ezO5EjwQn/3rQqDwp3tx9vba2R93OVs7aMqGYI8oZm4FJDAtRlRlg+8gmYo6pWgPphQnGylEQvvVZhTmeYAzITOfJUnqIImqvOjVwXSr99nozWNO+fCn6JCCZNg0wuufc9p9MWMxdkWh+9K33vr/sX3/FryNzp7eXlPeV3JSImdvX4FsTKj3q/VZaaqSY7IJovEmLBaqzfajAW2Q7HNCQN6OjMZPVbl2JQJJIMtN5MEck7pLthzXxOy3tBSWsqGVVsuqyyLGCcq3Q6aBrPNYGTeYX1d7bDtLair6x9I9H2dh7bk7GJ3933ixt/Cei4uhJO0ewChv4IMHH0wUfhGNs6CqRzDJ7KBABMRlWQn5BVRv/fs4L3yPkSDIkTQybEzEIUxE72JwMiXp40s4LmPCqPifiqKUwDFxxU43/l5zRnpeTI8UjRi5ySc02U0cqzM5S/w+yMlbFKbpKfOXlTA0DC5jDTSysxkoxET1XkAzLQW24tcGcaSZJ8RK0EQ8R0GpjhqM1Q5NNQc5G2GnjOxpbcD6BQr7qhMyCrLWlYzUKiYmt3uau8MXUGOucww0lKyu2egn+b0A9zCuu+rW1Ga912Fcb91T/v8wjzEqRaqHsplwWuuO2M8gHeI8aWNAXshvo1XMd64T9HxM9wi7M3Be1dlPRIvJZdMm7dC+Jki3hNigb44fJgtJWxmY0PehAyMMt3kITwiHy3a00OJP3rZh1ii2GR5mJP4Ru5a9fS0yJn8Mh97QRBxjc6SrTR7upxaEs6bMzJIuiyuUJxqldZcVG42q3TG34ueaUJq/HiDurhx3145FwmXFj04De2bBs6pMQhGpeLDPZTnOtq3V9fMVBtL9OZ8W25+kb2FGGng0MMP1xy5idPg4sHjwt+KN9/OFPEe+LOV1qWrkPkbLq86TyLMGXxFyBtHbYq+cytf4115Yt89rJriwWi6iD5dNzCnQgg3aL7P+iChbz+SzYNoTAD99HHuzbLBAZCrvV4pS1VTMSb96fOxvcJm1o/6fPbOjfKSkhLwdGjkTik7vcjJI9psD6CxYbPIoYxapMgqAfyjTK2xcV+By+CaVDplhUOFcI7UhvzKIjqQ98sClr21u7BFTU2sqD42Pd20cJzOzKPLC+2ouvn5beGZaTTYyiLhhzYGafu8gxj9EZq7H76JOBNLLkK/hywy7icOaHcNhh5YuWsry3mr8kh3SP4HgjlJGSPrAcIaCY2qALsXpryOEyVBhT8rZNKIDjqeYtAnvgZOBVFugLGnhOVNjM/jNxEnsTejjURykKiBzevSQ2sPD8r8lsXlNJbR1i3nI1wuv0WlTrSK4BLxQtGXmzMd/L/pLRkU6ZVZzgy1o4wbHnqHmrdSkCNWV7Ie2Xtzi3MUDcD+lf0Hdz0InmMgunx0eXl2gcfC8fbZeWBdWN7Wau9smz1sdI2Uc/enbsNOP0jpwM2dh26+r3WYDaX3AeRVNcdvbT8Pj4lb1jhQN1x13jUXs0RSAOXexriCaEBSxsi70LhUPSRfX9h778p1FfdW33tmQMxRheRD0Js0H+Mqsdhu4gvhzl8BlJ1NLG9F9KVlXpzYEK7Wyr3B626555FD9bvLy2OTdYMjuWa96XydMRYLM3kQsxktFiqIWHgI0NKlZpOc3EyW1tU+h9OkUTrIslgMYG4pKTBqs+VvIp+kyLdat7fvIEo2uddib9/tt7/bdOzB26eP9lPmWeifqodDqUaC5+xU0zbU5w6t1rjLbCgOV76RP/LQTSMlJQ1zPbtnDzy/0A7hKD2HXZ9drqN41N3f2i6nwXlwdVm2bF7TRSAU7YI9aagH1vHgeIC3Eh2dEVxBX55N2fNs2Sqn8GdiIvtpHE8iIfE12SicEPhvOcyJG/8F2hiKs80ieJ3w5onZ2ZaGzpb10loWbfn0LpfZ4vT5R8IR/HWXy6LRWAXQZNe3CHgy/yAvFQY9/1IxR2RDUsBTPzhZWeaAYYWBKQUrS9U2Q0u4M6e47/Yfm6YffHdqeWFYXMb6owvzfC0Mz8t5in3/uViR5KzOlm0oMxqNOeoUnZyjtNmLpvc1dNS/MDDbv1DzyH38bt5cOFrTLr+l2eU3F9483v0WOF9848VXsNdUxDoa4NnlRvYlYacUOMGZ7qW3iUjZCi87zvFEV/A7gVMCItLzXwsh8YDJQy6FIPYkQUJuyLuy4o6ecdM9t97cgdNSvq9hEN3p0/tGXZY7SSrpIusuewHbVgBUFgiIlIugZ6nTU1XSOPJHW8hm5gNEVRpjed2gMXMzX0K3aAb+PWQAWwx+8d7pL3/8/tix5YX59pqF2Q6unA3XiOKcXa6vPzpW/1/c+c07rh14FWk5GTuKT5bp9WF6wfZyS62n9NhAd83w0Y4DHCGW7VsHYP5Wid73tHKL8nj7HjYI7CFKR9JDbkwwMIh3XygFSZhT5J1mxTbWHrJfMsgOSinGryYGiSek3CGYAidsmeRQnl+AJ7aMh1sU5z0nuocPsTp6d2nLWEOJvSzXR+Yt5vP77Ysbn0dGfA6L2rTTqnVaLE49doiyZpb0y5uyrDux8XyBqRBQgpgYJY0xMtg4qOMlWAqkaVASc11GZvHe29+d/vLYl1MLNTBM+3OI+DzAgiyqdHYe8f+vvbROtbgOqlQV+idbk5GRmsLynHJ7wa6GntmmJzoO1I99dctNeXifEIqUyejjby7PP3e8/a23nnvuObZLdnnx6nG9m2EsEkcQbhM8WiX1DTrBgrDnvXns462igETj4geMJT6d8N85zvc+tGnjuap27ozicPJk8d/lJ7pZKF9evruFixGD+fZwWdi/GFuMXekaXfzmm0iEWOl6HUl5RuFob9gJfjs16RqHVWtxwLhZWSYti5VyNFoTjQ8wMKCqVLFIefmIISXhgSpYChDZUhYhi3Swr+/dd3/8smkZDNsFT3CcPT4vNIx0Hl8+ur3DHTzgfINDV5RrLh7ML8rvtOWPNezDTejY3VP/sHQxXIXeZL5janlqYeHN+beOH//p+HPtD1weFVPkpePmIqrw0uw+gw/uRYkmAiO6PgEUWUfg8T4ZzWTQEEAnlFhdMh9i4RMKFPacmXG75ecF3LIikLJqzdzNHIepDJ8sqQyH0Zlr9pjf5xp1xsxra36Xy3VOepYi3lglMCWNxGolCyMeOr2T+oZOo7TcASYMo9JZdJm6EbYu6qXn4S8dYmmiOmHQY0d/mALC555DALFBON3ybv74wvzy0aNj/wblKXV3+vYNZfbiymKD3V5ckt/SwMq1I0/sZgXC7AtH52fFB5vq6F+ep4fpuZobj7/11gMP3HgxvSI3nDhBKHrLuRSQEfYZAk5xxMfPkOGNigSe0tNUdUYQaVfgFPMuYZGQ4Jk0R0JIOxQIMB6TV0X6Zc+RI6000rYMlpefHDy5sREJx/yu0VGLZdR16ahTa0Wsdqqk5u50OTQWjUqTnm66UGNxmlEMPqNWI9PZie1UPPCN9AXhEZ0KtlSs/5/g3H+QBqVdx5pe+2F5GRgB9Di24s03l1mzDJRHX2saO1a6Df5MJQGqV+lS9WqOSxPQquTCdHExJy1YJ87FldnlKaL3muXlN4e7iY3a+XXBuEffXBAGvfGBE7fON5W2LLee+I20M4tptIzCsBvTKaUUKdSCYKGCHQLV4kKNqGWkmxQrUxRpXSKIgFStGB1IrTE6sak1QtqhxAImY6PxQhNUImbilaExSlCcGJcYE0cxcuOFCmrcfc5fHEdjXD/owqLGl/Od9T3n3HgNIaIYZ/FEFRIdh0yS5D6vORPOJ1NCcDyVTnfRnkgn52MFULAEUSVcvxKJJ2CvdkhkO842k9vOve3gZYdZNLCyvDTVVNba0tJk0NFCeAr8xD3n7YJhqykvrycNevZ5Bu6+qlRdRoGpt6W25BS4Irt2Q64vREyAptaegur8I/v1RIvgWTzmG1pPZpL5OICuik3PcRvj+S/ymUxmnUeXP+P/B3iCqJHhIbhoxdrS3briOn2NVqczlZnYoGb0N9r8bvcIIyXkT4TDYPMm15PRJLNvjUlv3Dk8fMiZG7JlLP5zgzMdjM6nrYMbqzRvcC5HJt9+nTaEK+9DYC9//e2XCd2Bk21nv4rnx2jNa9/7kHPtLQKkEmFx363UAR5gQuH4rXc9+eSTL7zA/l9qRS2TOt2eUlULTM/aVoNaVQ5T/rw99ZCS60vrS2DVqvE2m1paWnsqmtSqAn+Znhkx9r9vKTou/6tSfnCqpDyjQ7NbWxtf5L+Ib+byG14vQM7Orm958/hKnJj77/FULVdC69GrufJqraq0ZfepZjiLJvO5ZUYjKf6uUJIBlpmYPZ+RTKDX443aoj6YzyFX5FA1EyiYdWHzepPxnCvmGul2DF98SOjL94l8AqlyhARylZh+Ic1frtgjxSIhnR8TuTPBnsZlRRMLmg+KcWdSev/jNx564FE+uh8YZ5b6/vvvnaqaqqksNUAQ2WOYRFmW1NdqSk/hkmuge6sNas0pTPQ7hW4ufkddsdSjQS450iuLMf9rGMQT1VeOiTuf3MqsRzN+m219FvuUiG9uxr/MxxO4UPG5v0nO90JWee21XtSLZKyhqiw/VnGSmtE5eKS+RrMxaWM5Q9Qfs3jjrpg/ZrPNsmLNZzN7krd1UE064zo61xwOV1suO5ON5BLJ3NwhpWDspBuGfg4eygFOqsGPCOeDmgc/oh+ExClRP9xuRvuydVM5IptyrqmGL9r/+CEH3dkO+rMR0OX989SGOS0t9TpDyR7NSZzyEnU5lSF4oUigmCOVijHyGhwmTW19fY8QxIWAozCZ/0BS/B28Y4X5dOzTHiu+QSl3jMX8Pl+dzwuYX8bjq6hTDuTsvxbOqTfYxTX+wms1v2YENcUNZUXFJ8OyatA2Wtw2j90t+RW2q8ld9yQRzZDP7LfZgw9MXErN42KGc19cnbKtpq2nWbPevCeXHcYlhWIj910wJStfYClfebpQE9CsgmiBQnclpuvYuRE4dwC96GJZIyNNX45DDyGjy4fvZZdeGdJYDwVEpVa0oThAwkPmvcB1NqCJZSoqL6f01lKrNeham5rKmFJHTV7DPyF8zt/1uf/BcxQ8gZJ0FB8kRrinlvyXnDiejJysnL/Es5XFe2+8dnhK3ypwUm1vMxl9dc09psble15oMJoH7V0u1tWxmjWVy3bPJVwJ/15TyOOGRk/HNtviKB0zRvpQKJS1Vl9wzXAqlnR1ZNeGrzmfTB11JRAFPJTpffijwrwBQiIpCeW52BwgFCT5kCNtDOApgN5I3ECLnQM0D926gpNU2dJUr5b8cMFaH2sgkgOkHBWDo9XSjgSmLMyt19fqSjm4TPxzCrH27+bPiQd6Q3EB2+Jo0pv/4os8axRAc3tudZtXnNK//OdbP0Ullf7aSULJqphcDC9MYurVk3xRVzW6Xd3dFDvoe8d96Ig8GpE1Uqy65Yp2D17mkpVr7q7ggPW002+6wjGT8Mayc33pG5+mXsSdVtoPX1HwvJBw5xqiJnGHkFYOT7wjUn2QLwAUIjKQgvRp51df3O9wyHTqcXZ/reyv0DFfQfQ7RzLEIPP7oTNyToT8zRhANZH6ycUwgks1qIFSLZ69EGuBqBB/IoqFQsdxN17F2wKePh83nzdjs94NzNIXm8C4vckBTWKY7MDAX9931XGl+2OOqKgSnaQQyrQq1ZhlpHv6k4CjkLK7GPYsaQ+Mr6N78K6BBw45Ag85kCJW6N1+wZXXpLOrMfzf9uGbnz4fOCEhXqH0FSCM8I2fhgiKMuAVb0p4JPCddh58KMt8zhdjRCVamQjEFNXuu841Nhk03GfQ+PX8RqP5FdbfUKXbQ6MSWFXnnaLWaHTIKHETv8fjr84OHtSHlWb35AZgxjdXVze/zK9/sbr9HbBy2SG8/2Pip3KKJRFD/u61FyRloDvVWFPpacwEOw45ScdDArv40KVgaT3k7Lh11Om4Trqt8GzOkBa2059+mnzIQIJAonOY2hLcr9fFpkPIkb6uagXQmx8fbn/8Ril6Fhj2QiXh8HrhjcDI7+HJX1zN4CqHgx27kcF7K3T6Fh0dHCcTEFMxP3ZpCwgKTMo3Cg++IVKM2yRjZ5t6alCcJfIrCDXevIraZ2HexW87jigs/aFTjnezGVGc3q319Qwi+t3qJl8hqnP43n+X/jz+D7zUo2buGkgyRViuB29qjHX3H3x+lMIRISfV94GgNzaYej417bz7orPgL7E5TwSLtU5PP4OZedqRi2Sz5PEkFf82jbKC5n1URR6/+XxIzBc9fWN1f/vwhWfefNHD0n2oCOcOGU9QlWW7FzHnlsPuiY4Rmriq7l05+uTnR+Y5U01NewyE6uJJHgdpAeACKoUn8TlJjOiaVAaqdRBiAU1VW1qKLyUtG/JLu5VRgXz+jut0DM/Z6FDdDb71L/LeIfFGkVWu/Nwc+bW/QvMPAopS0e1uaVGplYuzW/qfoZTu93cNQvimUBwYmHPPJoOpCL2bZzCJn8H6pwPqdbI4B9MjGvO+CSkw9YeHz3xaWrEfueW00x6/jzwIKTjEU9lyAlW5nzR0tdTq7oN+qzR+WB93DFsZmQix9GLEnS0+Dzk7GMTQuPLiCx8d/fRe8GxdmjrQOzV1YJKmAzJshDnHznHs6sJDYV+pSlrqS4oINxmoooO7XaZmC/GvM0F3kN95HLfarEjpdifTRGJETnKL9J3c/rkcLQQD2X+Unz92TtGraWmQFSsnnbpTzyoqrmlzByNUjue6hmyeuyhJ0M11uoyNliPxJJNhnznrYVyjxwdm5rr7stXDnWc+c8HFklbux+nhcaO0IV6E3gROGj3YRSSDJsWLuoY8ErdbOTdWy44ecsiOYVYYdaRclz1wzjufzrdMXg0PuamVpFwTkU+LrqSkhKYZWjV3ROtYG/+xe0wBjii+lkqwXDK9mfn+zTVqNvLwEwGTB+c3LBV7RdmOtwVuAyv0K+toKrbNillSJBRDz/kX1HkZkaOVAINUE+RoRc+gRHkpqjR62mz6stnGaauVu30zrf6U2ukkUgL0Z2RY7MPP3OyYkHTJwER/54U3XyAXu1PQpCrC2/7++26+EgCVdTrA3N7ezg9Es56B2bdaZUfUjRfiBbDHyzoMnhN9HQ9dfM9Hn7ZeXbtnTxMNw9Br9kEIOUBGWUc/IXe68EA5Cp4icoVPaeosra1vaVKItYz7Moa6mvdW1Z2qYsz3sfISz388bJHiqSBjMnG+bhYFup7ZWN/a2prNbDKS4oef/jl1Xv79mrEKxukVeGF8cORZVCnawGcetMphd64DWjwcRQVQbrGyjXCYYTdKz5fVMVz9zDVAxibC9n62GoFgpxSbYNWibkG08A0SVMPVkB5lAjLeJql+olfGAgEnJ1193XUvHl3aN4lMNl0/f4Ar39vTy42fb6Grq34XWflyxYVSgvTffChmC+xBJTTt2l2iKZKUe4Un1Ni2t8pcplejSlGnfwQTCHZEFXeMn3IETl80GiV038gr133ji1XxnX74Jx3JhTEsPO3q6dUz476YVjlA3OE0UUFEcE9R19z56N3W9kW8WmrvDsETG/7M7c8Ap6N/+BDZwVS3zGcavjAcRkd2ykdnJ6ud+oeRxs7hfiqi19wno6TlOyhR+f7w4ygBehXYxSN4woC8ztGJ62k96+GLL35heep6knOtBybnl5aemmyC9jW/r7eX17PLmcFQTkRUUn6yRrq7cNpLSpjqXUKapJTJ52qgOQXatqbGeL+/kSmMzbRRaop37xIR/c3lKiq8ozZR/KsaVkYEEXf6EM4tJDMj9ujL71ZlcTTref/xMugeXfFJqsqeU5cryipP1hT9pl1KoQxAV7v1E2ugIxefW0yHA1b+v0+HvCnnfHzRvmzObo8MIJyRDmt1Z3s63D98oSO9uJYOO50sXga4MOseh0UcLwTX4fQwWwv7rReKNrgP1xOuHouPzgTQMxyI9N3XsSzqxY+WD7TuaX3qwL75pfmpXhjyrVNi55f29ZJPKtmFCgVJsp/q8vNofd9DgkmUay0lJUbPq2R8sraqwcNyYptnb7PRx6B5MGUinQYndXdx0fGeq4xQ/JWaLBU6uHUimwgmOaYvvvzy5+9+EDgB9B/iCWxVFVrtmOfwSmXPyspt4/cWF/BUn9jzwPQnDiulYrstaktkqQIMkAeRYSkSnp9fHUglMhkvrgTtiMEZ9hSx3HEYaQTHdPtauBMtqogqXw1f8zTOFUxwPqsxTtV8m82P992ISUJEZcOx3H1B87HXjh7pnTzQOnlg/sjU0lRPVWtvy9T8vfNHjjx1gPlp5529C90pITxpEJIee/aU1hsozfdMGtRnK/lOzFBVGw29ZB1txua9xrZGCw1/psq6irIyfRndSnDAdtScUEHZgHQSDioiKzXjKFk70Mx7M2Tsvvhy9TsAVc7f4nnyb5QbvbmqzeW/32MeWzp87p2VdaKdFYt01wAB0kHjWN3YUGx1Rvrfq5kVffrTRDL9gW6/Nxns4NDcGRkQKiNwgmG7QLq2hhbtVABuFwEVJcF15+M+IOznAZ6iWcl/YI76eWb9O4z9B4SIfKB1377r94Hnvl6sUGvL0vKRI0fmp6YmW1tKdp1HMkQsTzmpOtLJqNnJVkwVTXIahlHv1pva2kiGcaTN2tbV5vYY26LGqMkcHSLZaDZX1rGHR8tSIxWERqkkEaeWogvQuHVDs7OzW/l8fuML4PRu5MWZ32a1+T+Qz1clzbLjKzWbDz4xPT06GPPbu6KVlc2VDbuw9Lj22gpTJf8ZWyYyYu9KAGig+qyLHnzmNEe4r8/icadoi58Y6EtPRJzccMxQZxjssOqcMIJZsC9r7fyMHVwCLLef33vzTUFWZPlC2GWyHR/f4TRE9KHxT5eP9ALiAVxO7jp5ZFoPUKKvfnbk1adI2ZWoMUeFkINCXL1hsh57jl9lUOtrZS1UZYXNGDXKSmKbkWVIUOUsFg/33mO0efyZJEyauOSHM35+4mGS/1glPUeFKgiJeu2p0YwXGPPePL8ErjBFQBRA/14+Nb/JZ1VDjX3wpbtq0CRUWl5r4hVfWKepOVXf2LDX0vUSyy/x6jviE9Wy16n60ksnFmf8bbFUZAS7vuZkNmA6vIbWXFvsE53ZKZgBKZZnobM/3J5eXEyL4KYLp739TTkLyCQOAhEpQScz+qEqPTD+xtEjS5Ot+57ad2AJldlTNbXU0NCzRK2YLyd7elt1hvJdhZmKSiykNtReskeHCiWNzPfKzKYhj0cAhGzod3sTXjjGcN+T1CsSOQ6ED8Ji5VAeyqVy7kTI72mrqVMVo0LFU7phLGrx5uNxbzyf/zL/RSIOoGKPwPOfadCKlhNbGij279/9a7D0Ww5HO1bnH9kegWbm4lKzHw9DEsAgp/tmgmaa4+eoAKZBb9G5miVNuDqzqHiXYJle4xtrncNhRSjXsmvhdHoNwJViHkYfPHksLCz0Lywog/mrbyQnP/7a+0ePzPfum9zXu7Q0hQW6l5eeAz3o0d6pp6ShQxlzI7k7CZSoH5H6UJ1HpaOUGYp6OldpjPa0eRi8JVWDTFfMHwohiTFgAUKlYpnto0DEySoVzCC7ti02fNS6G8x1cERwlYZI1Rv9fmo8CCilntyqYpH+HkrlSf1Ri3Ln/yQLI6UVvDGTra1GX2VPTXezVfQMB1y77EwuZY7ZZu3PpyioAhSfc3OLfWGRywKew8AohXp+1olDurYWDqcFzUUe7UDZuSCQLijnQiQVNFnNM77y6fI8nlHr5L6p+f1LS0eW772zd2qyZbJF02KgybAePEtO2fHoeN0FpAZCohKZm6wrG6sziSR64zmEMRFj6JzFG3O5ckCySpp9Lje3uNhBVVGRziwCGmePMWM62+DNEhLNZpJDiGdmI2ND1UK1S+QTFDgL7ufiP5RP3cpx8XDVcsO5quMHtsvP6LyDuWv2NfZNOAL0zjjTlOE9/hSbJsLbkdXVdJgE9mJakUyRRvBM4w6BqjhMSqAE4O1grhw0KFAWzoIioPilDnLTD7z2xuFP3/h0HsVJgWNyqhfxpPDeU9HS0lNfqtOcrQY9tWGXWokylAwTilROuUajgYtVyZ+ea56aoajlzSUSMXsiHuSOU7PI5fhDDuRIZY5kUzCHkNdcsgsZ3msyM67KFDWbo1HzkM2bz0RhisD+tJjq6Hon34Rkb4PoP4k3fzfxhcBNp+vRFgx71W6NvqKCZJOcorL9e8k3ldmdTiteESOYXnL7R/Cj0j8tZonF0tn4HM4PdxujFAbAcLjfipkPywdoprnsyr3nrqd58B4VKkLKZZfrzj53x6FxKgaff/TRURToFJQFOAtLvfRoVlXUGpjhS2kIgqdame6r2UkN8SyTL0oofzGhheFRe6kfxhhZaItmAIybCs94ro+CBYgGZ+ZWeR9P2HMxkt8ekuEee8hjgtA9VGlm5IrPjBMwZJ6F/QkpzIvorht9SiSfEfTn/k0/rEZewVOJZPVVRnNFc6OxeejOHhXOVGOkL5K79Ybdqq4JRzWsZThSQYtlMUyiec2JGUIOt7MCV3sBtb50e79zBpJFFqj7w+lFvikWSMQVYMGTN5xOufVnLix0Ip4inG+sHF0++umnR7nx0k9II3FrRWvFZCsN2bomNewFbvcuAKU0jE//64YOhWFH7+ZuQxnbdP1drtTzfhiH8Yxc8nh8G1vIBedmu7zQBmIjQa/FZPEMzZI8i4WGTAyc1tbV+Mz4U1HT0JCJajg/S7iCXgryOKFJDwk8nw0K+An//BQdG1+pqzi3uabhzrY7cZmWGBdeYbL4k3FvLBYfPKgNOQMinX2RjlDG7Qzc7WQ3e7gvjP+uREEFRNMA7XCSf80K0wKbJChifzhoAwVRfhM0OVx4Weo67Ox+dPyNJ1cOH2UC8uHDWCTks7YFPC+pbZ1k01OpQVcq1qeEx0lqODZNOqbd7Izrl5svmGrA02Lpsts9towrEc/449vb/OcxnTPiIqEJ53Ij9qAXTpHRWMku/UH7XjOberRsPWIZCgklIiOb2CMOHPAEwQppO3GubB6Tz/TvlsArR1W13+w79yBrAcnJNDPb+fDBFx576YlzR0fnIu54RSgAT3kGKz4QG5npG7A6FtrT1gB6EsIyMIJR+8DMYnjYOdGXJbbEuCvaQMDE+siRX+EIwPxjb8pdX+Cuy0jhlZXlFeBcXv50ZXmZfhhc932XiAmqNeiYNQttTtL0aiJE4a3qausvMRwbMS0kRWa0mNs8nlBXxtKVcnm9W/ncIuZQ4FzEIIlBR4t6uyxVZpPNZtzrsdyGeDZrtTeMoShNQ6bZWa55chZUo0gq4RQQ46VmkltJ/hr22An/5oClSt8M9fu1W+8af3Rwaerey6anA588OjryvCsCb49LPlgZcwTC2ZnRDoi17e1OIdi3c58XJQ7qDMwt4sA7ZwYoNqUHnJICKQgkaP74448Lgibf4MudA8bACZ4O53T3+Phrh+W2719a/vTzFbnyqE/ISkTmu3CIiLulMwuyRzH4ySkmDjIYQFdx7aUxhpKGGqmzhPwZV8oVm82vwlvDw+BwV7LSUpHjnuHp00tkMVqMIZq1TGYfxE9Upw1rTszuJaW05eX4/R7sEaeOFgWhxri9/xLP+cP7995ZprW5XKnI87N0HL7kGrQ/P9rd190xF2SgFcMBI4EBClOIpjPcH7h7IPBJwBVwdva/2Z5G4Ba3kcS+RaeTu65E7WJwFt7s7FwAzh1A5YnvKC8oTk4/RMgHIsznf/Iw486xQ/NH3/hGGIm9hJG1jI5HZQon7pSCtvxtoAVG0uipVB3X8C7DjiptjV2xDLDZMERcDnHXUD1zHIQ0kXCLq49PFcMakcozmocqx/R1JjxCSzJJ1L6xkeEZzyABh4NfRVDNY9o6k7Ghsupf4cm4da2pucHYbMKeubznTnc3DkY6aESanhiY7utDKIMhe98iTTTh0S5rOmC9bvruhYX2gKMvbO3EoSf2gdaX7gNNbrjE7WK7BVGBs4AoX/NROHz3TEF02Ons7r71rssOL99/Z4NEQfP3fnr080+X711ipFKpYnggKhXMOX78jufJYDmJNcaafdBtRH+Ksd8j6sBk6cp0uWNRlOcqumZxZmYNHx7h3J5LBON+S6Mn5GlLJlyukMVmMZow35whG8EoEene6GyU+H2d1g7cAC933zZriu5l5YRWy77If32Y1eZus+HDmaanX+qWMxGY/mQ6QPlo5BNX2wievLXTGugKWNsDd4/cLSoSQ4QkgmhnGkT7oNejHM5c6AfNfgU9UPvx2OEbAmThU6RTWkI72HZ/7v37JRAiazxP59vRo2hQckmGUsPVmhKNRkqTv6v6tEmtHCpH3ZBPR/h5LCtOg1qz2+K2dPlyuWxulc+5xax7FcOYncu5EE963tx2rz/B28Y7PY0289AYiEY9lkYsbMbPaE4xRzbLbFK4MRmaZkwZD1oBJ5X5DP8B0cpz/a7nPbc9MKGgOc1xSsYuFRl1Ryh0iqPDF9bAHbTEtw87+Upyntwq2ryy2TUHT2FidkwNR9BUnn8D9LgjaWXgpA8HPNllAF12Xyu5JLqHj5Cxm2f6CrQ5DWlOmB/SKPX7cZ7oUFux0eSrLzWgPXcARws0Jt32Lk9wMSupD6Jgbr3IaW4ukZOp2m4XbVrA6WrsujNk86yTPMGdN9pmCZPgaK1vfPnlbNTu8iQx68rx+y0hC6rBeMJ/BPTgoHEUMJXLPj2BdNJ9NDriek5pmQFPEsV3n3VHYGA0JU2IKADa5xwLHX2cdBqzz13Hp9wBrVouPrAejyhI8iRJevAUUu74wXNva5iC7lXbwhT+PS2T+/YdIUBiZFKJBlIiBY4SBgFKpz/OpxriF59oUoFPqz1JX2nWMSxZPGctibe9Fm9XzDOzmMhAsOCuC1cGOOkkIvBkfLHLK3gGE/bBEKSsdYsF04OseuiDXcc/IplcF7Xb/UYb/icOqGAf49iZ7/3fEC3zNSrLJQraEyN/992fjIyGsOlZVwfOY+ButlE8Nh1oD99t5YifToJphFxTLgfC4McBMjwhXsISb/4OUb4PmpIYRcAdsGsmJm49dz8dWvW1tZBrZJKngYQm1WEDA6xkN/axAf48qQxskdDL+hcooNLfcepuX5K4W10uzYXkGOssyS6vx7WdIZdE4kPiipEUs97x7XMjMXQrLhBvgyPMho5J3i7mdQ/K4mYvwRTmPRklHdIYMtbBCq0b4uLHmeEnw+JP+K+nYlQ6OPns6Baf6QFU6EC3HTlM+GcCaeC845NP7mYJPhJGP2InWtTKU3itg8ryBHoTREGQ0yl1Ipz9goiCKGDygRJ4EzjDzk6njHw4BDfx4G0NmB8NEJWUl7PtQHMJzTEU14RoLNcdgkApHNkG9Sm64mJKHFodTjiELyDV1o3hKHqx9SfRTgSi+qTfk7HE4pkcLkc2Qq5hBOEk+pwLjhDSE9szbDcedCGrMW/h8oOX3Y7GjEMOyW8MVfqie9Gj0Si8RfFCMfSYqRP+s4DeGhmJRMDzUdRn98AD0x2jo7GX+tIDXm/E2l59x2OfAGVnQDzygBVfKSsOqFgl8YiAkgegcjD6YcIhKR4LoAKpaFMe4oiSz7/jHmapHbyLPcV37S/T1ZdqyqUyRH1dY4DFSXvBHjVcJMIimy3eYbcYK4dMGXiTN7DhUQWBFlxLS7XmU7W+2Vn/hm9MNmQjr+ohS6gxkyQiAk9s0SqalB4AQHO5WdCMkckglzEXLlES8eQHB1Mu8I0nJDn35WZ+HZczloM2T/ehzUYTlB+l4P/P8ll0WUQO1BDYdY9Nj4YymWgwHB4Ysdi6yS+hUQPA4WTGqnNgpo8McnixkNEk89bff6biKZFpkhyoBCgE9fgBBRwRTXFCJXOPnXvosRcON6M0Gw4/ec9lU5TW8X5UhW4NGMjlJfUk5zDvuxBQbYc1letwd83koQznt/g/9gyVlWrVDANQqYfMG9tP0HUZHRvDtYESW+yDDuzhquZQoaurFnuKqbDxWHCQ8dqxYNKWAVE0IhY8wc1HW3bZBxOkTIEwD4mW5B4uFulm0iDB1CB9YI3GoboT/vPRR0Y4SOjAS92jgx7jiNnXkR7oi7jXCdpTAwEJhwKf4JgOumbmsms7MXl7QT454MX9B02OpDslYN8xUIpsCtYoTjaOV9GYpWeG2uGVB+5tNRi478hnYaQ8cooEljNQ/hLJgVi6Kk89tVh9P4YiGop789tzuRh211hh1Guhv89ubG5mtjYy+IzUN4xmNpbhBSVJym+v5hKSis+5gpERNygmCNJlOkjIkiGOjM2JwXe7u0hRIKAJKh2bknhOJSh2bMQQ6DuNzWUs5tz93/E86bJUAU82JATLTLGU1jODXxNs9E8EHv3EKj5Slu5YR8CGs7o3qOTbyW4KoChTefC10Hr5FEDDci4ULAVqQZsQ/9Enl+9s7mnRtdaW7iqv3f/ka1O1BOQkkJSp03LIflAcFut+sobNHGqT2aivpWnC4qcYEeceAwB30YNySyYQ2S1ixa0v4BlmxMrYTNrKWQt+Tz5Iq4YoUCQ0QUY05k0aUbgZfpbxJkKE9KAcQ5Um+EyQ6tsEfVcM55NQnooe/a1latnL919PraryYCoFno92jEQ8usYR5NOSmIn4zamOW60Oam597TQgh/yWO08NWQaGjK4sEkjmHVh3nHu+ym4rPGklQ89ZS194hnijCCv+anfk4P37p6YqsOG6UtKaGt3SyhsNrXSUGkrJfBzH+eTuK11bKlWpLx6sKyWYrzPaMlIoW+VKSnuQPWZJrm9FEz8IuxA6h0LVzsfpFPaZfVGkMC7ZOjiH3SORlD2WQLXirHvdfomDVuMZgnV2GMRcAirWX2ocvEuue0zYeL1ay+595jLd8J/x7L3txKJGAZS5tKn9bfbuuK3Y7LGZfePdBydQnuRsgm1u01DUHLUbGwiXEwhhlgsugljAFJUKVXqxcON3TvhM1rsu9IsfkCK+3E8wRM817rhBOgr2TC2P37W8HwZFVZVOSO+FmQC/ukoKrPo67Dlt1mp9HRIpTTwCRsiFzFkY+7GV39z+7oft737+eRNgN79b/RK7Y/SZojYMOhd+JhW38C5oB09GWZj8yGde6iJeYVp32bFPyKhSi/NaPLNDvrGxG3artdB0izin/mc8T7mtFL/ePTJya/fzHa7Qwe6OrrGqBrPxsojLSSok4OzzN5ii5+qb7ywuI9jn/0mpH6VFZUoGVBgMSq0zu/Y7QNOPQ8S76D7HoUcl1fnqkSMHeqn26oSFzCVnpt/99742/tr4XU/edm9VmdIXWLRrJ/BRQC3Wn1KpxmtSqbU3qLWUMj1S0rDMVkoxnUyQTXFu4HYgod99993PSCnGy5+UGJJewhQ5O78bd9IVkz8F0ihmKYeI5+wJe7Drti5SU+hSSZUGpQ1e1pyxz7hYB5db5qr+v1NUNxgZTUW4KWxFSQ28REhPbj4Amn3uovuNWv2JNVr1gDeTmNvcXtvMzuXXs1I9IjjCXO2UipQX8ARuXmbWhs+//KYPGGnx1ffff//1t+8++9ZTrbWTvS34ScJIYi1MUxPdWL1TjKSqadEQRR5PmFem+MPoVnP52JRNP18NvT3kL/VSlBjy8SCfwQtvmZIG82gDWDexU5kNADV5KK2hdHMirARIdo8XzwlhJCidweG3h0KiUf0IKEU6/gomM1sjyyr1elVRYazq/ztU6n7p7VxjW53jOO6w6WXap/W000rr6arVTYeqpBP3jq2zyjIWYgvF0pg8ToOGOamzFyWRo5LJHGtcE5EJr4gtxoJEoi+YRF1eEBEhE40Q7BJCBJ/f83Q3l1c2/23tLueyffe7/76/379fgqbDPq1fyHMTSaojT3911WUH/ce6k54DnHjh1rHaUHX50kuRxA3mEG89HyyvuUk0nxcwNFrElwmygi3e6dYbT//8p59++fbjX3758OM33/5ouvts1P7M40+E1HVOe3un8wQxn2RBI5EAJM7mkd6WxcoXbKzcq/mdqgNqnWyskEEXh5csBswAkINYrq7+ASsOfS1VasanGtpKY/mIJJfU6JHStdpvL712ySh4Augz9w89M/H4xGhvMsYem3qiPovODyXSmVI25KV4r4TcVuHe5f4rnlQcXMmXJvrCrWnmlScm7paC5xXJwLEHAr0BmPZtB1yeh6KVlY3Hrn0Sy0no/NjM8sz9j6P0GEsJmGjPmfre9EgASigy8ehnX/740atPPPHRd9+9/cShkYXhLlmFfsI5xztPMOfbbMaOim64ck3WrADKwAEyydcsNrtddfDABzaoK6UhVLfGacA1EkAxoMbDHytIa3Wltr5SIqpsbAxkyuVEbHaltizd4t9/v+aZWgWS54BEmfN9/b2FoVRGCiOzlD+HfGGNah6WBENSCuXQ/GP2AFDL+G0T84OB/ltmkoSbV034WzfJ/ObJBVbWG43f3n//4Usfpu5Jy31DsBQiLbkm7gk/L1w74DS79BTKj1Qyk0vv/fjclYdG3n77VWHUdBNkQkAE0o5OkndiJukOIZLODsndt6Z6ch6L3Y7WW60W1QejA3oMKTaE3xj3u0noSXkIIOWYorqCv6+zI6TKO3801rLkjb5QfaBeazzy2MbG4wzEHKkJon3PzC+Pkn8OUiKpIqFCtknAdMqqDswKeXyWw7ewFyK6dPC2K8bLvTc9dMujRUiTu8+x9nCl1nhsQwL4a6AtPSzR0flnMI4IvZtPYlCBULQdrEGXp5suOZLRaKx8/cF9wc7n376vm9VplEGIM8/pUC7sDiod55xokzqyIMl8m6i/cIfNQUsgxHyCZ5j+Dtm1mveBZyqd0KSRBjmuWl/bwpMDumvgnM3p9bW1lftlCqbBWX7kEWzYMu9gAIiX6JEsz0AVqcCrI12vHDk8NBsLa4injf/RncvCugOOPUHUy167e7mHcxKiw9+P2zW6AmHqpiefPOOUJ894+NZrXnyYdQ6nnATLi3OzeHoYJEYgJQ+PiNbPDPk83f4vvr6v48JX30DhR7olLyKq7+w6dEihykSznelhEDV4dIrctWWDBGheM2p36HY4dLCU6Fd4YSF6wn6/P5zXtCqnLnH9KojiiYBzrQnqKozjRq0BnDh/w/E/Q+2JEfe1xhoeHneEV5dhd2GCVRJEVEwA+wOq3W2X7cnCsQWMvUG0JZK842DZiauFivq3Y8kPrW6Q3Z9x8Smn3HX3izedfB2cerjxJxmDrecioo8IE9egivCB6DwVipTHFZ5868qOzldf7YY11yFzltw13H0IwlwHmt/SHOSCUCjtSxs7Zl2pAxxjEaKDPScwZRNxDy4+pPnZ/ZyKiIevrqxLCXOVU5M4fXZQrKoI6cqqXl0V3wSmDZ6Eh7gMqg2JnWr3z2DXlo/UIIMkjhBIJTCig3yPDnYGqrKMml2g/xnHv80tnD3ZsnNIpVkR5/qV2sb5V3113XVX3XPXQ3edctpp113HlIIJKWb0/BcfR+Mp2wGoDCPQwZ15fHTM51WnFrvPvPKFtw9NH2rvIC06kZnLC6/uvrCNSSNjfH17pRJbzBy249wO2TrlcKkhiDWQZePDgZAq6w+9GtsAo2kQLcGFrYZKMkdQWRnCvSTYoAbPGEO6ntONeAp7apThRdkbHEB9hoyU+lJNKLSQFQlrZ6sD9w8WkU+HiKcVndD3Sjy3AbXtnPnZigtH/Hp1+Tcpiz700Fdn3HXaaQIow0QPnnbaKSefIYVOEVCpMfEBJBws6jUQNvp93kDx6ysvvPJdeAtdDA+f0w5PrjPYvnkBB29GI7h5N2guzCWt64lsng6k1Nli0ZQvLoxjIhpPvFiMFqLRTLUuPmmdCB4Y65VMJKxmNQ1uUgIA64SlAAp/TtezuRzsJHCXLjGs2fnRUWZ/paQkJmNlFc7N4d6UprttRBKyjJ5+3J6dTQh5Nh92D08Wi9Ujyw899dBrtzzE3PFJpyCe111wCjNcLFsTK3o+3LtrHkY8cfoGeZHOCAWxvrTXNfX1c1e//mqw60o2eZ1zIVXPs9vPEV7nzsFM49mi5nOBym+N1dk1qION2sBgNJr2x8HKxXZOH5u4xvqTgwM1ysEQjCmOSFutSicNvLOq2x3K1murxPeNWgXIq6V1ObOVOuaWt/VaH8V7UqVatVQv6bgfjAVXmI55mbRxS5masuAx+3CO/csYmOSDVvedvkrfLZyXXvvqKlgOSCcKf8F5l4PnSReccjJkponbrpElbUwj0cGDMUhT+ZJHDvsU79TXV8KdDQbP7jrBxgUybZ1SYDJWojXxNN6YdNMHHK25Wq0yIN55vkaGnUpFfJGIX/On0+loLNrfQ5mo1sAFCaKyZwEhhfPtDauUn+0qK2zqdYrREGZzDp3gQN5Dmd3oc4gOCGSn2my1GsoJetT8q0NDPf1pF1tB+Zhj32sstwl5u27rtbm9Y+9EJ+94ae6lidseeurp2zkXnXURUyA3nHbdeQwZnHHz3dfMjN52ycPYT7bcUki9hvyAtUYz/ZoSmPwAandnZ7C740SCJF6JL5t9zObgOsfwTKBqt7tyJQxcbfVwrWcoWoyliqCaAs7CGCVM/A+A/vbr2rok8fhp0XtE1Em5zWqRvJRaKRCivcRBAqS71VBmewLBpplUEjAx0Vae3CVSz0Q4x/Ql//X+4bmtiOZRvFr1lUf7tdGJiTvuJLS649n3nn35ogtOO+0G7Ci7AWA43H0bFYCjM7L2cUIm89l8K7elTswMxRXX9BNXX3llWzvcBcrz57ASucWcJdtlWIwaEzDobPZYQ0JrDN/3QD0eK6Sj6UK0HB0bhNgtu2VXKDL99sdKfQV8VtYTJXiyXpfLwZQM15yAq4TQpI8i9MBkyB6voRVcUTVnGEpdzTnwQm5rqDIboy0He8Ksh+zV8QZ3QmoO9m3ddjtVTiXyd977UF+lMT9359GlxbeWFpeeZas6ZvS6ky++7G7YH3ceHT+aTJbH7qRSN0Ht/4qJcYhuXK/U0x93BKcXrr6+k7ksJohlVxnNDfHuuyy18V+Ru5P71WvMV21sEClSZGMrr7z0RwdTUZJvnLksUeppkBlVUr3jA2hvyI5uhwQgq2wKNWeOzT1rxJY5OZTl3PyhnNvh0lVVV21uoLcLtJnZRNa1GSQesy/nQNexO86BoC+TrWiJuddeGj2yMXfLQS4vSMKdueOi2y8+47qTzzj30rsPHn1rkk8mi5ORyd7xo3C1Jvpm6NkUymM9fUP9aYdz5L6Oqztl9oUcCcU+kQdJNzdt6CagFpWESCe4XMYjPTY3Q4LYPz+K2UTTC5CRNIMXJ7yu1dn1tVikMD6wkmuFZ6vnLCh4jheLjYSV9IojCxXlkxySVqvDauNCFMpzdtk8byDOg700W82H+FhSsz0C0Dk9ou5mNu4CNOQL0445PDA3Nzc/d8udCOci27x673z50XvPPfVcPPpNdyahP8YjLD6ejhR7e5Cn8d6e8aFkOcWoQH+PT7F1j3R0EsOTEhmt9nNaTD8keG6hymmxqRoMLl/i8PL8/CgRTp+0eft6QHQsFiXUFAn1VWIQuyr1lUJloG++osJtAgydIh5uiGDV7VCFEWEjdZVDnQN4samOsIuh2ebgzFZhy5qvVCIOu50v7Jn9VFyR1p14GjcyN498r/GxI4OH++bn5nh7dikyhbonuTbp6NGDzMsxkP3oQXbUeEaGI1Nej3+h0Fsus0MtOVgoTseH4+loOa6c0H4oiHSeKQPDBPEgZ7ojOduA8tM54cKlqSPHhgbRclhyNNEH2RMvB2XP55kUrFS4e7ROHp/Prg+kNUbf3DpVEjKkWNrrUdwWt1MAskrWg6qbgAoH1A6eBojIrsXEFVHWZmMl/jTSvXdOyHMck11t/yif4ZzFofXPjc7PHx0fnb9jqQiD84vF3sJUmS7r0afvuvnap5emFgIsoehmhFA5NDzNMtQIC/4ixbhnxOWJkHp7nMedCHPBjJQIPoHzrwbLxJOF5oqihsOkl5l0OgM3cSxagSc3ZiCqhVSYDcKOo0tYr+dx37lKuMWJVWTfAhWSxpFoRhiK9Jl1bCR46jld4DS8Eg4fjA09F7StJrJWvFI9LNCH9gxPBiLpf4j9CO527i2K5+xwJOCTldtcjTZ3MBmfZjYDkvFkOrIwEinedtVd70Q8V3ZD8jr7+kPTCpsOu0YWpgN+P20ij9/V5fEHAsOuIDfbUEdGRI/deePObjjNwJ440qEENJl+iyeiAuOgLAlNURthETIHRFkVJZV6sYQ5V6vbl0et9dLqGjWS+ynDMRzgzTjdIGpYVcRS4AReC34IEeXFjOGlqCXXINUTWRHlvfNBjB4eY5UfsO1YiTwRo+ZpdUKP5O6VZHKxnCyML8UjnrOHp2UX/HRYCQwvHLxqfHL6+gvbKRlBnkGvZaI6MAKCXSqNo7NVzzBPNku7IhQ5oc42981t4Wm2aTczJb4RRzbkCHFdAXPDvgRCGkM2M1DkAlL7RXGl6VHVsuSSeQax0VNnrBJaRxCrFJ4oOtWGKmZlU82G3AKhbuWAJmDyL0jrTT6ikaKArbnejhILyO+pW29jMYRFbubdIaHsFvKmo6lkIbkEf7NQeCvCMAZXaxRHhj3DgS7P8OKj96ZG7iM5t7VTOupyUYtjGSJLAog1nba2TgWclSDrZSGFCPOYVgf7LI7beQc2cYzbqM6bL3DocqWsHgoDpi+NC0LrmXghi2fBEY6Zy8VDxkCBizQ9awVQS5b+x/o6tG5pLdX/+HWN3mU0wk1xajggYZRxJMy3OIibpPrBP2NxKEI+aTEBzVXqmr7HeLa07b5bUo4jXISImsRURiNRNtJ4AiOHIuzp9IwEXGrQNbX09B1yq19QiIgA7e/u6Gg7E1YNvK8WgiNW9HZAATEyImNzPO+cI8n79kwUlqY1I5q2aQZYbxLKhwBUS6cBlK4EyMiqDmAw9Jdgs5rI8gigOoBa3JIPZUnLjT+QpU5fS5ej1A4QaLQeJO05Vc3lkM8QgTzPUkzyklY55IJtjrU1NJuo6nsbd3apguduQF0RyhCFKLHfWJnlvJpXCMbD3PIE87DN1TV1xwMH2fRDQ51xN4idwS7qnARFKLVciSs4kmNy646pyRzApEq3Y8bM7ubyy5L0sDcNKMoJ3x0JJHTieL2qKWJ2yXMk/8H46ZQ0sAoSIxm9Cl1q+tWSodZZaiKNvkF03vybNkyjETcBKWUnflW4KP6OFveqbltT463aUFXb4zj+wKY/2s44lcgkVbKxaNo3mZTcaGFyePrsbqVbsbEALXj21KNPvzPNTSSsjA12ntnR3nECGZAcQZA3eWhpF6++VUoyt8PvcEjibjM8tQH2JqD2fIKDo0bEVAHFYpG+UnPTAjYBRHUdsUVIUXwvgGbBmys7BNfSH9RT+gYyPmqnBKN2MiHRd90heGIrNDEXUl8No2TGLaZyNxK8vmP24eCMduxetnrjsUIhGU3Hy+PjR99amoQCryjU2m2Yhw4uMLntqSn8jzIC97ADFTeQRLmRwm38ZDPiruLc9mn2WwRPyybYAGpzh6sJsZsg4szlLNTUQHJ78IMDPUZXSRpx4ry4qSeRm+uQcnJ2q974bb5BLSnhC6HwGAMOWHKQ6BLH3Dsg5oSYq7m2ujVfOWZfjxn5hotTbNdfiBa5P2mpsDAcZHAaA2k5jpA4OBUZe/qKkS4ohE54cjhubhvnJgNT0uSFJ9FxE8VtJ74LUGZ0I3zt+GbNQCIY/LCsO5aRK5eLklGT+73zbwKozqCLqf/WA8CLX7O6WdhfJzKf3aCCWlvNsILbLdE8D27wR5pz+SppQdiXZ4qeOktM0+2tzZ9X31v4/hnQQHp6YXjEE8crvRWdDLuCMswWtIEZW6UWpvpuOmNJCQTbbPDktqIs5HMLOTQJM7q1m2pL5XcSGaK+Y3bEaCIrcjE7IU8Yz87MlaXV0mwYGOqOJT6efMdtz2oOJ0Gk+VvjlxAyQvj8SlWnK9LYYKfvoM/vcKDv4seQYD0fzjImV9IQ03xMsoRMwpfVCbv+CYF9EVBXJDJCh7cLO9rb23t0schYgWskKJuRnK6RxbG+M66aOlvBCx1naHUTk80ehvmwE9Dmzr6deFp7WgXPls1fAZ+yu7KGU4fVIN7Y1iySNmtxmFHcPNFlOICAml8xjCrRkY6Q1ldYEgKijaHZMepxGTtHrkdwZ0sa3SWGO6t5bymbTqWoBwi6btz8/3BkU5mCq2lrsbR7JqPRAhWOYrpcTkaLHpfS1R0Z/mIhetulTyc9ilNWJhlwyKMB3/ZEkQlwU+PNz++o1rU7UvIOZTxglyOfpzSMH5LdPxhOxHP7iLsy16pA6vAr6Lup/+Kt7BYQJb8sGT2O0vryfDSGjXQgtUbljpghT6AVzod5p0qIqzEFW8WweN2yl20fj2WL7dDtPFFiHBJxjsdFqBSIJsvllN/rKQ5PfRHJ3HT+ZQUPJBrJy020BJdtELeh3RWObV2+YUnbjC8QCmCVTbIIEBI7Gm4duypwbeMPbHLbQXZ9paKHhtusTdMKnFKjs+lSnw/VV1dlZdXqxvxgVMvmTPtJIuCjHeIiKvBqDHL70ig740nUA8IOrOg+nuP43k08u9BW8Gzr8lCQi8Qj3aRCgWh5rOgfKU4Vf5zyp645/+6CC4aCDQkFOvT7TFDZZSY3q8fysuswDZN2bNoX+MrN7J4Qxq1CJOTIDjVkcMfBGmZlI9VqLZbzu6yi6ma/wijES0aUsyCLs6uyZ2ntt7mBkBnEEywlaI+g8yQM3mzeMM9qGGp4DBFV913lDXnq6mZpKeRNlq274vFJ2rZ+p1NRPeXJiMdfnvrxx4g/esmtV0x1MNvS2WKos8wT7d7b+1cUjR6AmbV7Mu4D2wZmE08ZNoQMZox3YTORvl2e3V2iawnz+7CW99qMQS+raLvx4NDhjuKEcEzQwzm130YTLurz1hy/BXJ85LGUheHtlU0DIcDPh9H8TFXfZ0BNPIeDhkG0tLerLo/H748Xk8WAN+BZKKS8w5OFH3+emioC6G1xJeBU8NHmop/dsc02sNtav3V9mAK6Wx/KTHYTUHurhWK7rEu2mYiCpGkoCealDLpO225Q19qsdNPsDmk+WZulDknX3ZxWnZ4du5Ibv92vkUbp7hCAIqAVRlizuiuU0/IIs8SuJP40Ro/Zz3PA/HkjXRKhH9/GsmKKEt5gwBvxu1SP0uUq+od7ez/99oupxeQogAYUf3eXk53xbSeeQzAv8P3D2Y2nQBnyOgMkhpuNVYvVdGYGchYpoxA8uZFBTnO3L3hCEmEyobaS9HuMmrvhjaRtaSb5QCt8eF6xo6sI8sxGXUc8saDgCScUDWd3UI4QgZqoYC/ch+ox+34EzxNbuJ5A6fA6qGa6IvF4mRt2IoGAh5do8r1v7mPTwtIEKzJ8w+UiOwKC7bISddsb/V1Gd8pnCM9K2YiqkdUEmD1zyJsZUrE41Qa81s1/S55Ft3VjEerKwNpyX5oLEBlONlpwLWaVU95MwgfHrpdQ+VUIbQNZ3tezxAX03Rmhy8RVFasgZRYzvdf3Uz7Nn5efSosEuro8nmlPIBCQGjFOvjLYd3gwyv6RoD/d+/1zVz7RMb14cObFu+8o9PT2lidHDgUJ7bdC0N2Le7cS901ALaHjWg5IB82xmaZIzkpwayy9YNiDRe+CV6u5UNfc3gmeNdqejfmjYa/Nbag5EsqjiSeHpFN6HarUn+k20c1frmUpQvF3K8zG0ZKKDSKiJnWJ2NSwEsf8D8cVnZwsFyeLxSK+vRiX1RyxbGqQuZOxSEAZTn360X3MYB+aLkw8dtPT9473zUz0Tg4HW4wS3ZbF5HXLoWvN0EnCPYfUcgMt0NdVu9PaTFJI/mlZmsGX3amqDB7CcyBiF0/EEWbNyuzqwGDP3Nyin2kXuyDJqyGTJkCmwodIQXPgWp8lma/fv5Jl86dwmhh9Z1aONQ8ZlmFYOcY/vJvPsA/yaZbPw2PlZDGSLhLMTwGr37vq0+KD2QRDUtGAy9/7w0dv3zestKnxArOyFz89Pt5X8Ds7WzZd01934FvszUacxd3cs6/Z3G12m0uRPBqYUXkRUPOyEwtG28byVKt52JgogaQ4o1r/4Nwtd0QDSk41tdvaBijCCkHc7JhE448L44bKXiw2X4MFXkJCsyRW9SGZzu4ZHKLbRF0KY2EY3/3G0zzcXOtE06g0paiDIqcLQcfcymHNNxDz+ZyK/8tvv1hYoNWheGOj3N95xqN3TowX4u0CpyT5207IbhcL6BbFbBZCbDwer1m7yjo0eUUxBVQ2FdpkaZ3MI4Bz2IZbEkDhfjh0wIOoycU7EOZee+nZkVBOUanIYQGBMgeMwGI2N1S3JO1SINVz3KA1urq+tponMgDiPJwIpjvTrL5L4+Ht4vv+jb+0T7gKTzlHiSsSL0cU96+zv1dmMzHN5fIrk6/88OMXlETPDnhiPbddc9nFT91xG9zPINJ14rZXUkghsxqUghzae4LgaRMDaTj0Ls3nDhK4OATQZnbU5lQUsiXeCbTZKMvJi5XbpKh7Aies2pXGxi239BYVgmEaSxhCixCWDJU3lBfcjRIdAonax6J9tdn1RiUEoAmZYSglmJsVOk/CG0JAOVb4DPt6DmwqPa+8Lzqh+nwwMf3K4fr7v83GBqLcyOp2Td3zCcuQF0cUSIXJGe4/fuCVg6P3l12gtV1MUuWBezJ7yCGdbQc0N3JIimklNbd4I+FeVddcORTVSKIB9BiHxaYFCEBpmDoFahDiWPI6fphOB/TZX+fnkkWXzMkLCcxifNlqms9NGdVDAj8lkHCq9/5ZVviXiOtZE1bNQIRiYDZcKDBy6LCLwvNyzL6fpisxQ/tsCaaQFvbnucG2AVEz5vMQQw33L77y3mfvvfVWgPU+hZ7xCVlye7DQn5IbtP5aQVYHLSoV9wM2zBWJo8eBYNi8Wn9Fc/WPUpR3y89kA3nEt4U0UeEyGafD6JwDEzJawlhIabm0Sr+9MZ5RA7BtUW2zM8zhGQU3AeUgorILLJvq7yEOvd8gg/JhvlSJZWKDMdpMYV2HTLbfeG6LpsBpPFJXG0pUURXN61e1UuPX/mre7/emjqb97z11x9KjQ750Kp2J9o7OGJvVZ1KMFjO/0Vx3DkQ8pLQWVM4h/5iFsrHGsIpc0ny4h3n+3zPpnN2wtETYhiW1Qx1G/IgSpVIiupx1y7dk5a/KfAyNt2qIBpLYCqAkcwdOrzfLUXWgNQlM0g4N+cb6j1TqMkp7f4PRjhi8MqL61GQ6rmEWhPGwv3ge+7cis+o+kOurNWpQfjVvKhxa/b0RzsbDmXR/OB2efPrOxXt7fBA5UjDi+vpgLhZGJ/qLHZYTTUCbnaK0uyVr16RkGTFUTLWmiOizPaNDtdGBjN+RoiyhO7a/C5xQCC02gy63G4q7mcHrWYO9wJDxgC+bdYUU1evVQ2rIG/L6KMVR8hCplCgdBc9C0/HG+vsrUBxna5UavL3R+SHK8wzh+DRyJKnfy7fzJ+88Ahd0tu2bAAAAAElFTkSuQmCC\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json new file mode 100644 index 0000000000..772b3e7b51 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_radon_level_chart_card", + "name": "Simple radon level chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical radon level values as a simplified chart. Optionally may display the corresponding latest radon level value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'radon', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"Bq/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json new file mode 100644 index 0000000000..666a71acd1 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_radon_level_chart_card_with_background", + "name": "Simple radon level chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical radon level values as a simplified chart with background. Optionally may display the corresponding latest radon level value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'radon', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"Bq/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file From 2e3ae4715c520e9195a8c45480ccdc4d14468689 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 15:35:50 +0300 Subject: [PATCH 26/39] UI: Indoor Environment: Radon level widgets. --- .../horizontal_radon_level_card_with_background.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json index e05ece881b..65ed79d5bb 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json @@ -17,7 +17,7 @@ "settingsDirective": "tb-value-card-widget-settings", "hasBasicMode": true, "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" }, "externalId": null, "tags": [ From b4fa0b81ab24902c291311769d183f2f24fa03b7 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Fri, 27 Oct 2023 15:36:59 +0300 Subject: [PATCH 27/39] Deprecated some old structures --- common/cluster-api/src/main/proto/queue.proto | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/common/cluster-api/src/main/proto/queue.proto b/common/cluster-api/src/main/proto/queue.proto index ac373df510..23de0c7549 100644 --- a/common/cluster-api/src/main/proto/queue.proto +++ b/common/cluster-api/src/main/proto/queue.proto @@ -640,6 +640,7 @@ message NotificationsSubUpdateProto { // DEPRECATED. FOR REMOVAL message TbSubscriptionProto { + option deprecated = true; string serviceId = 1; string sessionId = 2; int32 subscriptionId = 3; @@ -652,6 +653,7 @@ message TbSubscriptionProto { // DEPRECATED. FOR REMOVAL message TbTimeSeriesSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; bool allKeys = 2; repeated TbSubscriptionKetStateProto keyStates = 3; @@ -662,6 +664,7 @@ message TbTimeSeriesSubscriptionProto { // DEPRECATED. FOR REMOVAL message TbAttributeSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; bool allKeys = 2; repeated TbSubscriptionKetStateProto keyStates = 3; @@ -670,23 +673,27 @@ message TbAttributeSubscriptionProto { // DEPRECATED. FOR REMOVAL message TbAlarmSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; int64 ts = 2; } // DEPRECATED. FOR REMOVAL message NotificationsSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; int32 limit = 2; } // DEPRECATED. FOR REMOVAL message NotificationsCountSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; } // DEPRECATED. FOR REMOVAL message TbSubscriptionUpdateProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; int32 errorCode = 3; @@ -696,6 +703,7 @@ message TbSubscriptionUpdateProto { // DEPRECATED. FOR REMOVAL message TbAlarmSubscriptionUpdateProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; int32 errorCode = 3; @@ -706,6 +714,7 @@ message TbAlarmSubscriptionUpdateProto { // DEPRECATED. FOR REMOVAL message NotificationsSubscriptionUpdateProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; string notificationUpdate = 3; @@ -785,6 +794,7 @@ message TbTimeSeriesUpdateProto { // DEPRECATED. FOR REMOVAL message TbSubscriptionCloseProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; } @@ -819,27 +829,27 @@ message DeviceStateServiceMsgProto { } message SubscriptionMgrMsgProto { - TbTimeSeriesSubscriptionProto telemetrySub = 1; // DEPRECATED. FOR REMOVAL - TbAttributeSubscriptionProto attributeSub = 2; // DEPRECATED. FOR REMOVAL - TbSubscriptionCloseProto subClose = 3; // DEPRECATED. FOR REMOVAL + TbTimeSeriesSubscriptionProto telemetrySub = 1 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbAttributeSubscriptionProto attributeSub = 2 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbSubscriptionCloseProto subClose = 3 [deprecated = true]; // DEPRECATED. FOR REMOVAL TbTimeSeriesUpdateProto tsUpdate = 4; TbAttributeUpdateProto attrUpdate = 5; TbAttributeDeleteProto attrDelete = 6; - TbAlarmSubscriptionProto alarmSub = 7; // DEPRECATED. FOR REMOVAL + TbAlarmSubscriptionProto alarmSub = 7 [deprecated = true]; // DEPRECATED. FOR REMOVAL TbAlarmUpdateProto alarmUpdate = 8; TbAlarmDeleteProto alarmDelete = 9; TbTimeSeriesDeleteProto tsDelete = 10; - NotificationsSubscriptionProto notificationsSub = 11; // DEPRECATED. FOR REMOVAL - NotificationsCountSubscriptionProto notificationsCountSub = 12; // DEPRECATED. FOR REMOVAL + NotificationsSubscriptionProto notificationsSub = 11 [deprecated = true]; // DEPRECATED. FOR REMOVAL + NotificationsCountSubscriptionProto notificationsCountSub = 12 [deprecated = true]; // DEPRECATED. FOR REMOVAL NotificationUpdateProto notificationUpdate = 13; NotificationRequestUpdateProto notificationRequestUpdate = 14; TbEntitySubEventProto subEvent = 15; } message LocalSubscriptionServiceMsgProto { - TbSubscriptionUpdateProto subUpdate = 1; // DEPRECATED. FOR REMOVAL - TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2; // DEPRECATED. FOR REMOVAL - NotificationsSubscriptionUpdateProto notificationsSubUpdate = 3; // DEPRECATED. FOR REMOVAL + TbSubscriptionUpdateProto subUpdate = 1 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2 [deprecated = true]; // DEPRECATED. FOR REMOVAL + NotificationsSubscriptionUpdateProto notificationsSubUpdate = 3 [deprecated = true]; // DEPRECATED. FOR REMOVAL TbEntitySubEventCallbackProto subEventCallback = 4; TbSubUpdateProto tsUpdate = 5; TbSubUpdateProto attrUpdate = 6; From a3d3bf207e0af641f81c8bc784589c539cd91163 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 27 Oct 2023 16:11:36 +0300 Subject: [PATCH 28/39] Increased default value of EDGES_SLEEP_BETWEEN_BATCHES to handle 2G/3G connections --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index a954178d5c..4eda9fd2bd 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1228,7 +1228,7 @@ edges: # Number of milliseconds to wait before the next check of edge events in DB no_read_records_sleep: "${EDGES_NO_READ_RECORDS_SLEEP:1000}" # Number of milliseconds to wait before resending failed batch of edge events to edge - sleep_between_batches: "${EDGES_SLEEP_BETWEEN_BATCHES:10000}" + sleep_between_batches: "${EDGES_SLEEP_BETWEEN_BATCHES:60000}" # Number of threads that are used to check DB for edge events scheduler_pool_size: "${EDGES_SCHEDULER_POOL_SIZE:1}" # Number of threads that are used to send downlink messages to edge over gRPC From ed00b7ae1cd41da5e42ad01d51710e25899a328b Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 16:17:45 +0300 Subject: [PATCH 29/39] UI: Indoor Environment: Volatile organic compounds widgets. --- .../widget_bundles/indoor_environment.json | 10 +++++- ...ontal_volatile_organic_compounds_card.json | 29 +++++++++++++++++ ...rganic_compounds_card_with_background.json | 29 +++++++++++++++++ ...volatile_organic_compounds_chart_card.json | 32 +++++++++++++++++++ ..._compounds_chart_card_with_background.json | 32 +++++++++++++++++++ .../volatile_organic_compounds_card.json | 29 +++++++++++++++++ ...rganic_compounds_card_with_background.json | 29 +++++++++++++++++ ...volatile_organic_compounds_chart_card.json | 32 +++++++++++++++++++ ..._compounds_chart_card_with_background.json | 32 +++++++++++++++++++ 9 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json create mode 100644 application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json create mode 100644 application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 2569a8c62f..2253099739 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -77,6 +77,14 @@ "radon_level_chart_card", "radon_level_chart_card_with_background", "simple_radon_level_chart_card", - "simple_radon_level_chart_card_with_background" + "simple_radon_level_chart_card_with_background", + "volatile_organic_compounds_card", + "volatile_organic_compounds_card_with_background", + "horizontal_volatile_organic_compounds_card", + "horizontal_volatile_organic_compounds_card_with_background", + "volatile_organic_compounds_chart_card", + "volatile_organic_compounds_chart_card_with_background", + "simple_volatile_organic_compounds_chart_card", + "simple_volatile_organic_compounds_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json new file mode 100644 index 0000000000..f12df49c7f --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_volatile_organic_compounds_card", + "name": "Horizontal volatile organic compounds card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OTYGDjg4ODdNVH64ub1xc3ri5v98fPOzs7iUmnwqLTaJkX09PT5+fnnb4K7u7v41NrCwsK2trba2trumqjw8PDn5+fIyMhYWFjHx8fpfY/gQ13V1dXzt8Gtra3kYHaQkJB0dHRLS0s6OjrU1NSCgoLb29uenp7pfZDkYHflYXZmZmaiBA8wAAAABnRSTlMAIEDfv1C6kOEmAAADj0lEQVR42u3aiW6bQBSF4bRJL9csAwyrsQ1e4iXp3vd/uN6ZIcitWtrIaWS751PijIEg/2YGKYpvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF7Tm4tnM97eepducvtOOrycLl7mvb25y+gK5Hc3E7oKE4ScGYScG4ScG4ScG4Scm9+HqIp6809EyyVt9yXRZr+d0zn6fYjPIfUe59Qt9x+WD0vvofzU0dyj0w1nV/0onEX3R6MRPgd/HxJoHk62/+Q90sOGykP5gaj0ukN3asVK8zDyyYhY+EpGBYu1Oi1kliiyCp6ptD9+2W0P9OjR8rDdy1PvYbukU6g1CxKVloFvg9gPqx2viFIzWnN0WgjzjCI21rTihJyu28jkIpld38g7zJfbBzpF4EepCwkTGfnujUulkDVRYqZCJVstFSh1H5IIAlJp2IdUMhoNSbUv5yiKIuGwGN6V/SOR13WdRx+6RzO1DnSiwIW4S0FizaF7iebbvqOqn3FfNbNfmcAvLCPZ6dtRokbXyIy1PZHSmgv6wfzo4YVDXIK7w3A/Cp6WTpTu2Dch/uze58Ts89PU52g0RI4vXJGJH/FqISt51LI94dT+npJ9lf298ZCQP5ORslY04tVCInfrsSFuCg6TbzSEdhzaBamlaPCKIdqO9FGIe3QhyVFIMB4SaLfY04RnNPjHIe5eRZrV8DLpKGT3yytC4yG062+/FXNFRka/kM1/3pCdEhLx5/6muzIvPeXkKaQw08OukdmwRkJzxPoPIYE980oOLhKypjZGvuYNWXlO+SQ2GyaUy/PFdkF507gdsiF7fojSXEQ+p6aGi5WWUR8i29furqXNESt711qZI8ZDAm2vg2KTPYRsNnHTtrGMaqqbusyndbzZtHE5j8ucKF5kZdlQFtsdcVs+O4Qqn1nPSNwPIxuyk6dJICF2tFMmRPI4ovEQpXXgVt/9Ucj7eJq18SJ2IYv3H2Us2xZNXLc2ZNI0EtJOF20muXVGzxcEahiR5daIe2rXyHCEcqPxqaXcj4qebOOPdTzdtHVmrkhcNvU0m7axbJuXizYmE5KbK7Iot2bHpq7ppbjF3oe89B9WzWJk5/v2ozxeRkiej+3M6CWFUUhOGlX/95+6FwYh5wYh5wYh5+aKQu6u4N/sRNmdfGDgCv7RnssHBm7e3U68S3f79po+VAMAAAAAAAAAAAAAAAAAAAAAAAAAAADwSr4DXzz6NDozanMAAAAASUVORK5CYII=", + "description": "Displays a latest volatile organic compounds (VOCs) telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json new file mode 100644 index 0000000000..338183a297 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_volatile_organic_compounds_card_with_background", + "name": "Horizontal volatile organic compounds card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest volatile organic compounds (VOCs) telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json new file mode 100644 index 0000000000..5729a2166d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_volatile_organic_compounds_chart_card", + "name": "Simple volatile organic compounds chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAilBMVEUAAADf39/g4ODf39/f39/g4OD////k5OTYGDjg4OAhISHdNVH1xc08PDzHx8fmboIvLy/j4+Px8fH64uZYWFiQkJDiUmrsi5t0dHSsrKxKSkr98fOenp6CgoK6urr409rV1dXaJkXnb4LpfY/kYHZmZmbfQ13wqLTi4uLzt8Humqj19fXgRF3tmqjcQRJrAAAABnRSTlMAIL9AEN/GQiaNAAAEn0lEQVR42uzPwQ2AIBAAsBMQw5cpSNh/PxMn8Amk3aABAAAAAADwX7k2V75GTuPZ3LhzxDVm3V4fOVKvB5gpWj1CE1mMyGpEXvbrZtVWGAbD8OwbBBKS0kJbrHTS+7/F4w9nOXHtqXHvPoiCo7wYQb2ZId7MEG9miDczxJu/EZI7bgTDyTz9kv0U0ql8hqcGQKjAIhGvADoTcYcXtyGmglJKTb0FnCIDyGRglj60w3RYr+rmodyGhBqLxsgtfwZdSAAeWPdr0IZEBggLJNZseNxtCIJqAYyoX3fSsVmJsIkVg3EwasIRj7sPQWJsRsVHrGgK5DOE9+PQaYEJHvclJPACdNJrQiHjDCQKe0hEZpySUnS7WoAQs6Z0lQQdJIDsJ9N8FgmtwSBV8bhvIQuLjBxix3+NGJvK61rVELTKWhnr1pIZj/sSIrSc638RbthYJjryrBJFO1arOn5HkgEoDnZ/fmu91QzxZoZ4M0O8mSHezBBvZog3zkPMwi8ICUmJKMrbQ4xplJKY0stDWAW7TPLqkH/smeGOqjAQhf9NJqVVoFCqKCyKEM3d93+9O23XCd5AJO7NihtPsuGUNpvz7XTKiht+87zdvjTISQHw69pXBoktN73IXxhkNShDFr8eSPrxEYz14XlvvRrILhZCJc6p04Au3r8YSC5stVGOZBfOLN5biwdZ5XkFLGX992XqlInt7VG8+q8geuhLuCtj+jsP70yQVHKbN7FK5SmweG89AlJ+GhmcLLqQ3CDi9WbRIEYF3BHinSUqrii+UunXUMGEbJw8AlKeXWjpXEEu8hwRGX+XdERsCOX4TZCV2PCrf1JFwwklSlVuZRYLZZPZIJQxRJbeeJA1Rhp0hx156RMWtOR7IHsRrnHG3xxPkwiVKRHvcyvi3VwQNJ/nANKsZRtAEC8BofZQnndYklLW7LXzAYS8hill2fU5kQOkey7IqDanzO7S0Fg2mbm1fGLpXUjNY8QeoMMWSK0rT6jW4egq5+JHeDTOaw+ydr6dQElFzqWJs5hG80TgqpoFwsGdGKTm3UJheSYYxI4iN5rmnO+IpAQg23R0w8CoKrFiazO7gtlK1PZRkDOiHoAU/4JIv4T4Il+Mwu9E9P5Is1Mt8rgeBemnQdgYd4nwAOAu7bXZy2bieNtmCwUpED0I3wogrqUmWuQJIPIW5DgG0k+AGDQTLfIEkJpPrQuHbdFMVqS9D2IVPAHEEfDtNXYAnJlBWuwGPWIYZLxHdiL/YRDuZO3/0Dx5QTzzqVX7oh0cQaP9XH89tQpaN8axhaeA1A1GpqF8gQrNH/oBBqFxiB1dPYTniPdjnzyy9DkgICOX6+K9XiOpLYGXDJ7spnUs2oNcIu9HOCzAj4CA1mUwpb7mqGVd8rSUzjMI/39FPeIW8u+opR6rx344XMxL7K+iMcg9WdfnvwBk7zl+A8gOSEsEkf2Z/bmXMEtLBFmC3iBL0xtkaXqDLE1vkKXpDbI0vUH+tnNHNQACMRAFSxtOACouwb8/LBC+SjPjYAXs68aQbgYNyQHpoLWujNptTpHf3fuIqPP/WaqsSaEwAAAAAACAVx6ocPyABDUGtwAAAABJRU5ErkJggg==", + "description": "Displays historical volatile organic compounds (VOCs) values as a simplified chart. Optionally may display the corresponding latest VOCs value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'voc', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"ppb\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json new file mode 100644 index 0000000000..d98b64afc2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_volatile_organic_compounds_chart_card_with_background", + "name": "Simple volatile organic compounds chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical volatile organic compounds (VOCs) values as a simplified chart with background. Optionally may display the corresponding latest VOCs value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'voc', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"ppb\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json new file mode 100644 index 0000000000..0ba9f98e86 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "volatile_organic_compounds_card", + "name": "Volatile organic compounds card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAArlBMVEXg4ODf39/g4ODg4OAAAAD////YGDjg4OD1xc364ubdNVHwqLSrq6vsi5vz8/PnboL98fPiUmrCwsK2trb5+fnu7u7aJkXhUmnOzs7j4+M8PDzV1dWenp4hISHa2trgQ13n5+fpfY9YWFjIyMjzt8G8vLywsLD41NrumqjkYHbcNVHaJkQvLy+kpKTtmah0dHRKSkrwqbSQkJDpfZCCgoJmZmadnZ3jYHbxqbTkYHeKLTebAAAABXRSTlPvIL+vAC9A4IoAAAZDSURBVHja7M/BEQBABAPAOIyfn/5bvTbCZDtYhD3Udm4Bw+R6DYN3HjAPlSfgSqQUIaMIG0XYKMJGETaKsFGEjSJsPnt10Js2EIRh+PRN7cVecKKg7pitk3UiaLOSjQtI/f9/rOMFgq2qVrhYe8hzAO8Bya88Y75CYvPpkG1VvWJIm/OnBlCWCLRc3Gf+kIroHUO17QBk9hElW8tvAE5eLu5OmT9EYcQ5AEeGYWdM4w2MPWjTMu4wf8gr0XqBkc4aaNsgk2+56NB4ADWXODE3BrOZDslJpbhRRHJMEtxou5GIGo2H4COcuw7dpmSHuUyHbIloCWBXBFU4vRD9Hs/WkYGGz4dhiNaxPJFUQorwdZUD6/HCn6z2BwyeSHt5mXVsXSwhyBXRHkuiX4EkrFIJ+Ykb7Z01COMFYzMcvO5PpalRti1mMx0CuW0lK14h2MlUSdXLCgPOthDMWcZsYHxbZ9wi82/GxROCnHopzgoSCiM1ZxCm8T6MknGeDxro2MczWsBqHRb+IiGxR7QmQrCQxUhxVfQLEq+JkHDvyfCfRK0QrcmQhKjAxY5EjmhNhmBJtEOQKlLrftJiNR2Syr0nwR+i/UK2JNqS6RDk9EGFnXnf4g76Cf/1PGvIij7sgcXwfYzHbxj5gX98f0Dw9DwIeDj/bjNrSD9Nf9kxo9YIYRgAP2WyLcuNJhmFStfhWthD///fW9qbd7uxl3sQ+tAPkZgo+qmp0mfjpbf9a/fZwQiGpL4SoJVaJG2hn2wTUQXZsqWV+gm5H6d0FlHtD06kpQ7skaf9Z/6rD1mfpxe4FYmYUQgd6ra6/gzasuaCoFZywBk9FVzIthI0OAIU5i5i1QC+5hothf4okc+H66j1tr9VtyJKWlMomhRWuIoo1JS9hZIoYM9mCnkXSRWk7X6uYrLcwpaSg0ROJrI397vF/4j44muCyEg3IgS8cGxhca6LOAv8RQR/egSt2veOwQFUOkjEPoJvv34an/6IBCIpi9QUPWQP/X4GBmciSpU2Z6FWiSaSrSCku4hU6j2iFQICb1JiqqR4WI88ny6j7evHxyPcwIi4xMK8EDMTOLSkFMwbrBkDCLdwQ1dESwvKWaSNWh4ZwdgwF9BSMIIvmIaboFvprmtQxWXMmUYWuANiDnPKdIqMyhQZjSkyGlNkNKbIaEyR0ZgiozFFRmOKjMYUGY0pMhpTZDSmyGhMkdGYIqMxRb7Zt5vWxmEgDMAnC30gNL7YR2EQuFbBUHro/v9ftpJfeRJlA7tLSawUz6HNyFKYJ47kxCitxQlpLVqDkFL0RAjdTygYqapt0CbI7r/CCTE+C0KmF5dk7XWHUL3I0TPlbci5tm1C5JTL25M+JZp3qyD2LV2TKOHag5At1W6VbySG6PRolUbvDSYTgnTpX2gOokSKoUBkTlB3yRRODAr3yVFK6xuERCslQ0arzAZBBcv+wBXznPMZwipolnSTVxAl58dCSJbXnhOGeGzt4pbAv2wYhDDVOaXtPelU6T1ilfikHSI91ogHr1oM4bLrcgMOWyF8x8QK4sUWWmH8u0buCZB3gfg8BsJzWjJk5J1etoKIcV2/BKaOQW4zxgIihEMuj4LIf4NgLlkMMABgKy4BElJKOkFbh8j9vTgBwsMkr1o4QC8BwTLHkE5vU4khlFe9l4DYNBIQ7jYxBE9oDoKY70LcNWQ4CKIZggvIigO8/N6D+L+ckXAEBHVA4KsLIpdeQ5abOTJUcwQdj4Bg9zxErkxWuXenChJ4ct9dtfyxq9acWn9xQQB5wgVh6SpIT4ALdbmOkMYTuZIrDHs+BF8/FrvkvyzT06RR8AWC5sQUDuOTzG6fvj4ASfnkcq6OgZAXCK14QzrirashA/cDRCN3+9WlHLfdgyFzjJGTEOPIqEyJlrjoryFVPcruBiKtTu25HyAqv/4R3CnGDzWmxjEceReFFNUNSlUpL0aEdp7sf4yj1m8HAYLYIS95X+uEnJAHBVlr1VU+p/wlIVfxs29in5AT0lqckNbihLQWv9u7gyIAQhiAgS3Q4Xe/828VZIRO4mAVRAgtIbSE0BJCSwgtIbSE0BJCSwgtIbSE0BJCSwgtIbSE0BJCSwitRpCoFu0YDdbTVd+MjAbz6f8yVs79ejFyHa+ly+6F7VKKAAAAAElFTkSuQmCC", + "description": "Displays a latest volatile organic compounds (VOCs) telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Volatile organic compounds card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json new file mode 100644 index 0000000000..8e205f70a9 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "volatile_organic_compounds_card_with_background", + "name": "Volatile organic compounds card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC5VBMVEW1x9IAAAC/0927ztqxw8+svsq90dyvwc27z9qvwM3s8fTv8/bt8vTu8/Xr8PPeI0Pw9Pfu8vXr8PLu8vOxw8+wws6+0t2tv8vv9Pe90dyuwczv8/Wvwc3x9ve+0tzy9vnw9vi6ztisvsrs8PKyxNC80Nu7z9m90dq70Nq3y9W1yNOzxdG0xtKuwsyswMq5zda2ydSvw83r7/GwxM2xxc64zNWzx9Hc5uy0yNKyxtC2ytO+093W4OXU3eTgPVnz+Pm1ydPY4ui+0tvV3uXmipzkcYbc5+3q7u/n6+3W4OadoKLfME7w8/TiV3C/097X4efr193u8fLb5uvqvsi2ytWsv8m0uLrno7H0+fra5erZ5OnU3+Tz9/jy9fbc4OLs2d/T19m/w8Xr7/Dt5urE2OKSlZfB1uDlfZHa8vrp7e7G2uW4zNfovceorK4fHyDh5ujW2tzKz9HFycvhSmT+///w8vKjpqjhVm9SU1Xrv8nopbLjY3rr5OirvcrA1N6usrT1+vvg5Obt7/Hml6bfPVnx8/XP1dfmo7AsLC3N5O2Ym53p/P3Z8PbJ3ujz9ffR6PLh5efqytOprK6foqQ4OTrd9/3L4evI1ty4yNGpucG5vr/nsLy3q6Hl+vzs9/rV7vbQ5u738ee4y9O5vL7psr3omKdsbW7s/v7l8fXU7fTg6/DH3OetvMSks7qZpqzf9Pjp7O3t2uC8zNSzxMuPhHzj9/vi7vLT6fDO3uTK2uLszNOwwcjQyL+ot77opbOsn5dFRkjp9Pfd6e7S4ejGz9Kdq7KrsLHAt6+Voqmek4uXjYaDe3PjWHBgYGA5OTrd5+7t5tzd29nZ2NahrrXJvbTFtau+s6u4sKeLmJ6vpp2mmJB4e3x6cGlgWFM4OTv3/v7x/f38/Pj69+/Y5+3i2M7Hysu6v8KPnqSGiIk5OTvy+PnZ3+LV3eDK0tW9yM23w8m9vLmmpqWFh4psZF5TTUdFRkfE0doRS6F8AAAACnRSTlMgAO/v7++/v7Cv98z08gAAJGhJREFUeNqslj9rFGEQxldQxCss5F4Wlq02Vp57EEl5VqmustrKT2AhWBx2Af0KNrG4xsbKMo0QuE6JQdBgIglJYT6AKIq1z8wzc3MvonKez747f3YJzO9m5i7FheLypWarkVM2ZdmI6EtYMfq8KquqKiGxQ1iItlYDy8wcHsgpa1HinXin9Qfv3j07/3S++4pPqH6q6fupD1vDw8Ga66skDl3HJboCjOJS0zWhErJAw0pq10MQrx+OQY2jhlYRxIhvkSYNDQFCtD2ZPNv9OJ0ev3mYQrXWLxwSpCAQA0o4KZvZ9UQOCaH+xaK4siW92FKLq8MNaZJJGPDMMczLh86GqKWiB2H9htpbAJnuf3v+5vjkhRTrh2LlFsglh4YiQoJheF3M5WKrUQiMlotjVXGyWPkQGUPvDk/tJylKSpKxDRrBw8RRlI3JZPJu7+33s52joyeL7bCCvRlkoJwppikyhNKSRYSOO+HtII6rIoHNFKliIeJ4C4yprX2qEGiFNyeTTx/2z76fnb6Zfa2tZAchEdOUtWAhZqIERMEdIPBGAMs5CwZ2YqiJqmQrnAM225AkYWsIrJ97jXzj0eTZ7PTs2+nOzt7XddZsNBuKpOIj9oIYMPS0SXI4WHlWEKMUk605Yiu7QdUdQHS+6qqsuRaEsIsNEIVP6/Ne4KLR/PH57t7+/s7J7GTvPhlooAzBJ2iDOwEAtEDtvBk0YgGi6jo0gEfFupVQxqhhM+yLStvj+61MLXtgzUlI2gTPgUqi1vYZ7vPux+OT2fTwcDp7kdazyYKzhvBwbvywHawc8lh5Cg4RBc/v3CZ2QoL47eDn7UE1jIlCIHdbpdhrdkFsaztN+2V6dPT68MPh9BUBWDWmxLeBESlg+OkHk2EYIF8VXI1OTL19+0/axKV+U0JIYuiumRGcPmA4QjayEK9H49F4PNoca35w8B46OMBjkb4bw+O9ZTDyJxLdsfcwm7hwTC+fOt4AO8K9Bkn5495V6JoYCgmPJfC4ma+otVu41hD0erjF0EPu5KWHfphLzGxbKIABU8z7MUCRVmpwsO5IPV6dBGI5VqHhRAZjgfNF4vGtG0CQfhBEVrxrtlElC4cQUAyZrjH4f+qJyUsOFDJmMJS/k+jlAGtCEPvR6Ia3FwDgzYGE4X+C6JmlcgJWroGXmlEQOtOYG8KO2JYQhEcMNEdCSLsSQC7WHRi5+MbM73XHBgu/I2Vnw6Ugvyy0PlmDJ9Lq8k2IoWHBsRbZIvxFY6Xgt9aQ/3mwI94PRchoSLjyWOWfeD43dEuCYLIGQlL47zlBFruiLpIV5VMfu0q0rFyiLqExOKwjpW560ymIVh4E7M0/k8yXV0JT7ITFThMvltEdobg5QFMKG6whQZzDSRyJ4ZIbHfPiRffcOwcP9c8g0pABRgtXVbIjFDc76meHloGg4nM3lkDJGFcB+UmL+bu2DURx3PPhSmAXCvboLXU0dI+hEA/FhjiD8WAoR8FkcUWxCRbEi+Kk0dggbRkN/js8ZYv/AUO2QLIWsvf73pN1UZy0KlW/Ot0PZ3mffN+7O5sTCyicWvAEvYBIwHHoBoEnWcI3bpj21AZDkSHwLCBv30NUI12H77zpYjdmUPf6FvQylfHBzKgzEybJQ58IAg0gTJEC4fiNLwJzOR5fpaL2tfQ++tEo/owmykoCNeP2QZEPyQFVCFRHjWx+rOqnMisu+eQYGdt2y5iDj+buT4yhe22NItddXWMxCDARlFhmn5Jl3hwAIUuoK4ACj1N5UiPcJyxoNasEkEY6xzwP3c2DpSNP60WgLe2ufb1cqc3JlwLiFy1fAYT2XgFxIJAYkJgkdV25giG9dLncu9ry3YUVYlQ+/FkESql5NFKDKFpoczakJnmD1PkUwVvgG0ol5QhU2rcbHUw3LGe23bFKw6HhAMQAEHPET//66EbBInZh7g7ubr0cos+0ayU1grOwi9btpkAubdtuYpxNWGNeHdn2kdmoELhCZqnFSnGiYS2xA8T3tdpWGfo/joCmQBCOA0+42GtxdXQAMqEh0b5ltbjgIbkhDVw/WCu1CMgHcmSJkQjub11Pv4BRLOaOcsB2sCNdqhC8TuIIs+wjmXqlpm2fsYAw7QDkRBkQP/BcrTi9lHZDtQ58C6uRnqu75eMWR5E58geBBKQLCAdd33BQh7AbKPGxbLYzZFUT7/TpTdZzlwrT21UYRg9a6eBxHkZLFQbX2luqZyoW29X2cfmwVlN/UPmvQOp1QSmAoQsSFLvZe8UTm9SxRBNaNKgIzOE9j0KaYO8NOJW0F0Rrn1KL12mB47x9fHh6CpJ8t1+wgKZQcd7hcdgRc93FO21JwYuGBNKLOcxtj0fpfq9ysVo9PyeQD7mCUFoxCbZfeLILkj2ELxSxLlAYnU2UZMmJ+QZBk8w3JwF5U223j0+fg/xjyXyEF2g7BAJ1yZM+ExiVKPahzBWfJI1pDBUDCCRzZQAptjmzvuTriJyHcrLjJ2hYUgEIPdTQQZROk00uzXgLVlDq+mfMyUBSBgdKpGblCEKOQDuoEXYE6hODEUFhn5pJ4nTO7EYLmaa2g88aVhmqASQDRzHzXw8IgmpdUqtCz57su2h4BaqD2IesE1T6BapESNLxZwZR5VqufgiIcABEtAsQcYLf5MaVqGGpCar/khzKSvHj8+snxLd8zhFwoNS52HcdalzsQiBiY6YGpKfUBYamlDr09btK6RdtZuwaNwyF8c4vPnpZWzJ1viFLpnY4SkC8pZm8BAQeTCYh2wVlaMBDwQVPzo2XP7H/RL9POkU5SiFJyRcjvTzFoJ8/PcmX6+UvNXXqf3dPAOp0Xyv/oaqAUKRJS2uDn6/l/QRNElfTLwjO3IrckQd+JGnP1nSxMeJbz8jw8ocsQawVsx+RtotAk4v3WZ9ALD3z1himXkGzJUMkeQc3gLHZfLjONnxCm2BY4lfxnPjBt0Z5uEQDsUkgvY5qFq3V7ts6esCrHYOKxVAtbtRmCTot+C35ssN9YefaGI86SDOPcy/BafOaGiEEGzqyoeKulQhysTy8T7sWTEDZY1Xlw7w4Yr2duyHYzkorBcTK3I0NQtP5QWN29MOYQbpZDP88jWqH3LRDypSH/UxPvpEi1wgOEloCkPLpNuoSIPeH/+h8RyxZBaQJzdxJ73Q5AvGoINczDHUdQWoEzSOIphqplKOtR26An7N/RrkfY26BAQ40AMHK4vXlAFI8+cl3lMOBeIt9i0hFOnhvwmTmrm8Ejz8+z8FJTUeWednXCO1seoUdGDDeCgVAM3tPEDvLoJXbm9B3s7f6z3lXVZV6CP0RSOK4YI2cb6hrFAeusm9hm7q8z6f43c3NlRyROFWd+uDctDjnFqk5DxN03EvLpW8cw73WwdjAICQQ7lqNOkWI5BjEhqBwL2gnRVWJOP3TimJYBom05d5LcWnxBYUghxIvkvJdy8sO8dY//9yuZLJWp+Mc9Rivok4TBvXoDov9ghgsdiBkR8r80RSAlx/jOyMvkHe7QbKKCblffTxZr09WpySJLIkyYW0jBASQD0QBy+cnH8czSWZ6MxV38tRygy5hrNdnZ2cnqxURqOxGxX5LO4hCR1AjMOU8OVK+eskdM2+twxxzVwSOP5yaMW/CMBCFOzd2BdxoRRmyRQwhlVAGpFTqkAWpyoYUWNjyQ7ryW/oT++4uTgAnauHJMcJI8X1+fg4SxJckjp3tGXsv/DsO+7bMcgGBJwyy81/OFSb4Jf95mbnx8SAKAJaQscIRX07O0GuqifHI2r625VpMKSUjG26t92DIx+MiI5ovW7tJWYt2pygCyOW0p7QoipU8X8aE4IIjeYaWlXDEqx3/ePBsLLSeAEUXMhTiK8s+UT+8QM8c8el736Q1VLyR6eVDz2HP87w/tTYQ9tbnmHXJ+DMcMrmgqAWTWt5VzVcojDuAQHsq6q7r6iK9NVMzkglG5kHeN5t2CPf/A066RgMHHzALJRnFB6edVjQrZ1kOJE5AfkIQCCAlIBQEGBKTnR62f2EQ0XUirK9aOY5VkoBkQFhO1c6XfwkJlEGlJKY51119XqVkAhDmKGFL/sK7SkhaH47ZpGvtAwlTOOcGFBuB41B5kAHipmK80wHr9LNJGX9LGykJhz1F2EOQ9VYeiDlvLd1c7XDmzkeEFIR6EMd7mGvRSRdJdThUR0zM6uvU8tG8ZkuXDk3lSTjvuCMROIhCkDwrJe8KgoioIz4ks4YQq1EmhzkEBJIpAVLBEb+cNzLSPSrmSBJBMTQFkmUg+eCMaNKhnRqBNi81pGlI/JBou94OmbKqqmOMEboiWQblPwqiJL+cm7Fr20AUxjVflVD5uh2lhpscKMiSh1bTbe7gJZCp1JB6y1rIn9A1dEuGLv4PTMgY6FIoTZcOgVLoUki9lfRP6Pfe83GSXGqdvuhiKcSWfvred+9iYsNF3QZxaCLYHGXkaQlPABK82OGIgOyZOd8pZa1KpXcNcU5/89K2yENsAqlxLIfqvxzIHV50yCR74WUDCNWVcwh8In4wyG5pFnFonmvnRhfUqhTdOpGcsHFKvmItUhhM0dWQ4RC+86xu+G60Syt3z5xzOUpLVEaA4GoUJeTsDBwn3KvAJZOnoVLTQWyAkuf4H3QVTIfLlENfxDTNNEGODqrL38fHHy8SocAgkE4sGBIRLILs9AV0MrUgAQNkJNJy38UKfqQnYSdGGSVkSPMJkcisrtoZceer5XL59ReHvQRKVxDGgBhE2xMBKYiE5EHwC2DgPRqilBRpyBAc5gGDiNet0rp8hQ9x3F1/S0pgAKUESITYkTkcYZDVFCRcvh5EYZMke5QeM5YYAgBpJjJBth05x4c47j5cXSXj/iCP57PDxYodmS6slV4v3SJ44b/joZ8hvKiszfR6C+Tn7dWPLwlzYPQBOXuISWu1woIOJIXdFxJfWmm7nuINGbIhWOv4kGyBVJfvlnffb24+wxHSpKsjYaVL/RAhwXqOORaLYmBVAMEIFH1wQmGlDCK7JFUDyfM317f4vNb7hDmiSksmc1mgGF0sQEFCTgqQZMLBX0H0rHhDKOl88VshCY64i9d/PkFJOY4EgTYVDBltCzID8iSirXwrFc0hCeEDWQ7B7S0QkNyv1+t7dmQ8KSeT7o4IB698jdYEYa0dFCyrSBKRHhxUR/WkiwkZHT3hkIh0zRGXO3dxUCWAGEtGojjQ/tDGcV5tCQNrzQ3KwKP0S7gxZtZMiMeqhaSeEVdBeV4lYMCGEQdiDGEwCKRI9OZ3MYCs3SeSfhwAoa7ne6H3J6S9oZeE4fKqGnFpPSo7lVba4CCKjHqtgKSEQiXGUlAfDjRZ/KOH1mQBc2xANmnnt4BF2mekAgZsSeAGYQAkrrDoFBw+D5KKLfDFF5iOB5kzyKHWBlOWcAQQWJK1S2skteVLC6MFkv7TDDzW6irLGiAirSxHZRBfXmgXBHJ6ij94agmph2Q7IyOHgEAA4a/y+Q5HUtlIwQ+oBZKlKLCQ+iiSjB2ZEcgMIHWODYgs5LIsgCAdABlVeTKBSgyA7ApHqKsAAgv2Kdxa+ffemiRxjhjzVgwxc8k2LrmZ9owO6iBHIGFHhCNkZBuAdxtnA4ioXVqZeKTsQEhsNMlsBo6/lJtL7wthFMa7NoZOJCIRl4agRNqE0ro0SC2kGpcSIaSLEUTsRMQlNohIiFgQImFDQtjYWBAW1j6KD+F5zvNeZkzH5fz7bzu3zvnNc85533n79srB5eIoRh00oiQ6SyG0drTb+GeyD0Dx52RXKs/hyKypU7k1ExtWAUWJ8l8o6cGDS2DG8RtIUmgSVS9xHlMEBhgLrQH/5ipCAr3wUdGD5bcIElRC+UIhJsq/VC+FikUrJkMdZD4US1YJRJK4bUuQI8iPdruLHBlsWbuFLLvmlqx4VyFLyxwOhHdVAqmSrPkjSRbfZXQQn88gKrQhNnIcOyk8qQb0VH5hAIEiEgTPB2q+0yietSQIzuxBjFgg4UJiHVD+Oef1xU4++5ivWHV6lRMkEwg2GAhIyCBF8CAI5UBkMdmJgseBeg6JEgMr13WX3TSQJXz34vp0JhAhPr734hJ7LWWUTE8VELqHOQo/TtvoWOJcxkNmIMp2DbCqavXa7d6Odo+KDAZEIUi8bxJFSRBysKOYX58sNkGM4vZk6HLk8GQxbTLzILfHXB6O6kWJZO4yJwRZteq0bnAB5xLEtoGEIACWUcPd2wxDyU4MgBz6rUgFiFJ+TM/TPafHpQkWhpYjnK0iG3/W1T6/2Nl+arKonClplSaCSA+6L3+JErM9s7ASXfbzwx5IQmsMjIKKlKtV0XyDno+ct5TjsCF5kCVDvLs9vc4XAzlBhNdTzmd5wR7x76IgtQvvva8EUQueWkrL6xKIzMl08vnmrgPZQhCaqla8SQ00UY8ZHaf7GeUwCjyWMEm4dBgfPcPm19z9Mjj4CteuqkusTIpqZEUsupUIpJkwEdJgPEIgShJYiK/vra8DJEkPICYHbNsuJUgkEFDkIMhwNJ3C5YUGcnV0+ITNtQEIPLhhp9svgMOcWcTdHpNQvXuRMLM+T2/6ggSXuJwax2ocPWmms+ljgRRDa3mQJDM4Qzl59tnzPWjYCUKIwbZtg13R8+q4mgpWfg3HepCbUwYQFVkCEAhw2873DWuwgb+ckadjm8HtSMh302Jy/+EMdoLVwarE+TxpCuTaZasRAINZFMkiCBgAwvWnWme/HIck7V5DGHg+4EAs04MgkYOWRhDZCR9adNca4NfYjAs2wu8DtIshsrEhC0HoJ11FJPL48VDLl/Nmk6FFSiNLZKIIo3RxmdKcaq8/93xLuw0QQgwiiEpvpaSAI6kBkSLMaQutawFkol1wvUdqNwWCnLl9+8Zibb9uFfvNiDAjgUAsLV9bBiNJWZHlCiqqQpD2udbzfq/Xa0AOSXKoMPNG0hQTBB8ojioIM4sgU4FoM6dzFkGEYiA3FnC7DiDIKIFNIEWeJAR5DS/zIZPFDCQRRF0X1TOwEKR3dtPzbs+FFowgnoBWbggjSFYBoYcGkpVBJmkEyVynhSCX2Hwydc6nBkKOZdcoQZIyR1IaN+Q2Qtc0VQRiksSyBZBOr7fu3PHjliMOBSDFklvlSNSeV0B4reeBXM2sKhEkw3E0gVjryDLnQWiQ4E3qQbI0x4bPFMSjSBGBRDvVgy3d93wrQUhBkCpC5KBp+KcMct1AlizyIOUcQVkSiMol9hcIG/oRjkyTbwFkQoUEYoYN16FUczVMKFSkAtImydl1z7cpR/h0oBYkkal/VVGEIBZaJ1IPAvcdiFNEHe8Igt7ZbyDpBEleBBkbCEqyQ2kSZLWaxJIinV67dXbThwbF6DtFFtRwNJsCMccEAl+DIoytOzivV2QMgtv0M4Ox/L4JUW0gC9bAWJ/TlCCaTlBVhFlfQtE31dg52klwwDac/QJFwNHv92tAUpujQwxxSBGGjBTxIFfpB0/8Bg5i22vwcK80Y9D5sp/OuGRjeTfYFTCQoEDMEbdjqmggiYwgzTJIz1BurTRFjGVvXVyFEqhVlwSiUZkAwlCy7pJCxJJ1yngid76wCPKaw5OU8LbakVDUpwChTomvWqq6yhRxcGKFnInJTpbO2QbjCorMTfZM03MKCeJzJIMVFME9FJPTpciUu07gEjy5OcSV953uzEAmWG3tCCYS43jUNHAPGYoA4TIFscO8SRRyAGR1lETlt0NrNbYNoAbtUF1cFQOLOaJstkcaFFlynk3dCAEjB7LP7IWcP88mepYWQkurJ2zAEWD3rGUfWe/rukCwfH7/WIcFEqEQpCzJSaOgKI1+H5pspCJ1HE2rvJkfCnAgtKAISG6qC4XlGfdNszdaVKrLBDL2fS0HcodLDEiB3LDtEqZMIkl4+xhQTrU6rRZIOr2GyYGnKojiSpGlsUUT4fFweEctBHN6OJwQhF2BE+q15v76z+jSeDLNfgO5xp7UeJRTSIIc5vUfCvf8cPjNesOT12nZrB2RJKvlkxSBHCAhCGwjOPbsnZsfBMELvrUQCAwveiVLais4PQPk+SzX52c+JaBOyZmPBEmS/KPGKAxkDXr3N3F0weWZXY0KCjQhCEiEQpCegqvV2KgU2dOvgjgOgtzl1y8isSbE08RROoL4W4iyZcGRABKq4AmCuDsu7Rc/o0rSDCSrnSonWy5JOo3+RuMASIUjCRxn7mosUwBOEZMjgCyoAwn+BZC4j4FwFGaRSGpBYv+XICRRH+xkByQtq1qIK/yBJOYIPQ0NiAS5y7FlaiL/nTk//6JInNa4bJlA/Go1F7h99IOufwdZfVqCOJajYIggnKhZUiQr6IF3y5vgAMgRu2oBQrlQBElqnEiEgT8DScsgaOiBomHXepBw2376tGsd+bTdgzBHut0+ZwUSJJvDYXe5EEQghiAQ+6/kCGw+hnVg89FoNEujfcayHR5FSf4sifVSYGrptzOyYB3kiIFAEimi4IkcZuDA72wZWp4AJgg/iYZeRJAqBf5r/cuEwhmVlLyeI4LQPYJ8OruBJB2CdDkpEI9Twijlue+0Is99ioTqSotlqyZHHAYh6v1TJV6kgT6R1HDwloQgoSv58sH9c4bSIsgehpcUyWgkjyA0P1dV0VSECCBUJLhbxoAY9RSRxFJF1a/G6FcAYV+y+fbVhVdPb60jyB7kORTpHhPI7wmSyUIRIKe3CkhZEX82h1EiSeyp8iHgoCb1IIkHSXWNjp57euHJu4c713UajKtjx/pQJJOJI/YUtVaENSbBQo4U1ZAe8wSpcFl8qUXBBa1PEg2l6BRHO+vOPrrw5NHFfQ2kB+xYdwcUqXCELMCL/uaa5UgMrchBOWT0td6iKPE3EFVsgRTGhNiyt1rrgXLhERTp9rvHut32XnJwc+TwrjsYj1U5RaavIbKkZKpUlbypUSWIIgPL7/sk5dgyI0hr3fr3ry409uw4hkkpSPi9DB/1MsOZldtFKWolkSJRgmW0yDFPEcsb0yoIprriUCpy0EK2B5AOUFY+bXRpe44d6zJHxGw3IKKABYp6U1X7Vcu5vDYRRWE8Koj4IioMuYjXBpm5k1WKGAPOQpxF3ciAQcFG3UgIJd26Dq6E0gRXvhatpZtqaysovhAXvsCdCzfuFFwIvv4Gv3NObm/iJLSxeDKZufM+v/nOuXcmnVvUm6hH+mLwNxUqdg2ZlOzzmw0wWdXFnVIkyLMFQeZM4cxoARyj1Y4e3XJYHHzXAsFppa5zTYcD6W7khImlcO67MRU4Vzjr3UI5hICMrIJUiiDhIUOJDoxjx6qsB0zkkA8PKUtVQQxCmchvG8O6OcRf66u7+jRynBaRikJiq2IbfmzStuM0YlAEaoCjmEGGjI6CpVAVDpgNqVRy2IAWE5/EQ/u2JjiE1EHIYCPM6WCXOMmcQWNLQii2gbKKuJZknDBEEahBVhit8hrbDLpU7ytIz7mFxPa94VNbitVEX9XF0dkRzG3YSwKzicLW27bDKsAgQ8teoAw5dgaKEEbWgWBIcYg7KeO4pnNwHyIbD93XuxctTYRxShMnyuq5YQ6EG8T8KggwkO2QZLzr/qpPNT/IpMEgkP3UTqHuFBJYb/w4EqF0GJbT8YgXvSSym4DIg66AiCZ5qrUKNPQDsVdrbdtPILSxPJqQoi4RZJrGERtALLWXkDCKrF5NEhdaoglARoFRKhQq3OWkp5YcaK5SckkCEp6yde4R1mVpBvfoYm9a7HsuAnKhC6QTWQRCpm+0Xh1kkMHOc+OAoZ+R/1ZA4lgTJK10v60lvpwokiQHObYciCgySiRzXy5fPgeMfiC5VDFl4r3covDZ10WyHsGdKFwRd0AuQJIUCOnx9PLnhS8j+/FsLzfe7ul0bXOnAwh+Ns/mXP0N2yCIHFu6cFrRDxy4cOFCR5KyTxCh5Eih+fnLvaXgPF5/Bi9u+zo2xJkFZM+O3MgISGje2b+ApK4S1yGdWxYoQt0ds2lFpj4/Pbr8/u0hvssQjnWJsasHhG+2RmC860ZA6Fqmr9M+CS/ugLr6W3a5G6Q0NzP67tunt+jwtYtlHeyzbdRl3o1Zf5wEP2myJLzNRkjSitufDaQn7RXq3JzNMYgJBaRUakyc/fbp09uTe7fvHFy92CaYh7Qke1iRHINgfkOi5AQkjWJBzl25coV+lM91hxZeEQqnjqx8IxBSxJm9zV1vbNETolVE7F9BYP1qeJgDOUdVcE5AwqC5lJmcLBS8+PbHd1cP76Z6h+NiVQc7M7C67wXJWZAUykZB5FjSe9eCIJXKiCtTm7p37QZyZHKylC8ceXR+O3HArMOWZ10mN/IAOdgD4pJlKA57iDTKfnAcPwf7Lsket5/em6sV5+czhcnSJKwwWeV2IPu3H0NUwJwjkCTlhZBsHASWFQ6kOh/17r22mZ9/GPgGoYVXB+jH0+oubtBgTpP1m7zbinakH4iIMkTti+gfxCFV1khW/nXNiVu3isb4CDAoUiiWJvFTxDjOJCBOlF1DgUBSp0haE3e03BogsFx/Dq56kR/ZPfxfIHZXTWDY6pliHoGVh1UIhC5pd5gPCZKzDUnaCGS9kgwGoX+PQVXvju0nYZcOVYPQhL6pz81AEeIo5fPjsqmQjCDnhyfZL4oMStV1SpwDSOr0LGMWIJwhB3ZSP3oCgRiqOTezMJ0pQRLoYUEoX/+JhF++T4HkhpFl9XZ1UI4AhO6zkOn7DnP34NPjxkRTjxemW40MQ0wWObREVyEZNrw6OZIKrbQsu9ZWxDbtOQy2lIWhnzPfw3PP2ku4OazoGw8WFlpLJkaOAIIVwdUaliT9Q8qaGfaXJinxSA8YJnaBfLIdu8h9ragbJzrMZJ9MTC88aMdBYFgRZnlmz4CEF5L/AeKaWOcmnOeJI8HHLqICBqHYD+OetTu538/Fg7MLj9tNow0UAYSA+Nt3dEkyfN2VAllblByZFOTLA0CIxEKwWY5ThEJvlOykfj/Hjz+ea5pYhyY2maJEFksi5kiGe7ba40B6dswNJGGOnPgrc4zhnol6QbgbryXJgmPkdd2AQcOgCFnA4+TZeKUyXimXy2NjY6/vzr568qEMq/DgrNIZjcmsLVQWr1bLY0+w04cxHKBCi6lQlgI+btuxSnW8yifilWMycba4WOE9YB9oVN45Mv7rR6VcIcOKxd0/d32ffV2LjdGRotAKkOzWQh6FAQZ8w+Ta9Ym2Cv3Qx5yPiXxQ4hnl+yoMDWaMUZhT/pv3R43fnpjShmaN0kphioJnMIYp7RtPa2208sIiHoRQMIpMK1qovAhrPdhSI09TrTDGLs/vVpZXHhmUcBzsUp9bXH7QamgT42CeoV11xmEEGPIhhlBc9kByI/GFAgbXAyrBvQBluICvr8lJ9ufNu0fKX5qYioDm+9pTPgF4niILPUUlo0Ot4Td4AjwJBcYDJq+JtUmwD0o6Vku1QIEjjgm8vnj3xfv7WBBr4tIJatzqy4ZBVMWx5yG0vFh5AiIGAkQZXEWJxnrq+sRUvSODUcxi8MUHUpD7BEPSGJLg+cv7nmqQIpgl3wTB01xmf8nt0NNGk7+mBFF8OEfua9YCCvCnUcsTIulU/zo7v7JcBBCRaa9548H09Oyzl1rRwWISGGPDIIgkCik/tEbh5PtYMjUBEkWShIp5SA9xHhg0pnngkDL1F7cVQK5JvMALYsAUs5h05slQkL2CfGG+FDGyNrRNgnUM0qA4ggTJm9mb7z7e0hFWYH2ctCdmph/c+HrzvvYSUEAUIMZKS2gRR8g0UmLPiUu38affesKeWwwjnrM0KhQKDnP1e1mpWutaU5FbZJQOFL8EAbyIgQgJQBFcjiLEVyngdCAEUoSt0YgJyDx79QbJEWF71itZas1Mo8aNXz98oROcRSG4QKTBnNkSgIMGViLAB2MqSmYwiadIIXKYot8LQ4p5n51XLLFPE+/mO21qE/eadPEkjlCKsQmdSFMmc+zohDPYAwwA6KWxsInNhYHWE4g2GN9dvL3yItZMH3tx497M9MzTOmaePHoUR5CJ0iZJcKBIZ7YitCSqAhtYsCCwKd7AmwW1yPc7+aC1suHFymgjU4WjPV8xXn3iDjyWiPYEB+7HKEmSO+MFmJhisZBHEOkoUV4SAVN7tYaOkeOPVl4GOFjCktSePgZGTceR0nfv34oT7AKQCIbc2ZbJbKHqikXAoHjSCSRD37B25/qdGtyhlOYxJoZcEADNunAyPHtf9Op37jRJAofCXkReYshFFLA0Ir4EZTiJYoAXE4OIALAmSaIIOVIfn324svwQ7mqgNHVtDhitNm0Az1+9nMeYDgwQLzLx5kxmU2ZbIBj4kg6AUdJsKHw936+3rt9pNJXpVKciiJEE5QqJDZM37+dVs9WC9pGNE+SvIvc0OcwnppSOEkkGYES0bRzgYcKQSx54YLWvI88/fpyPyU2NhfUpVFWtdhPbQrIkmV0uJpFHGIquy+atmU1/ACbirGOC0j5kAAAAAElFTkSuQmCC", + "description": "Displays a latest volatile organic compounds (VOCs) telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Volatile organic compounds card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json new file mode 100644 index 0000000000..0de7c663c7 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "volatile_organic_compounds_chart_card", + "name": "Volatile organic compounds chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a volatile organic compounds (VOCs) data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'ppb', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'voc', 'ppb', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < -100) {\\n\\tvalue = -100;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json new file mode 100644 index 0000000000..290531fff5 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "volatile_organic_compounds_chart_card_with_background", + "name": "Volatile organic compounds chart card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAACrCAMAAAAkajJ5AAAC7lBMVEUAAAAODg4FBQWuwsyru8S8z9mxw9Csvsq6zdeuwc27ztivwc3r8PPt8vTu8/Xv8/bt8fTs8PLt8vPt8vWwws7eI0O80Nvw9ffv9Pfr7/Grvcmtv8vx9vivwc3y9/iuwMyyxNC90dy7z9i7z9q90du5zda6ztm1ydK4zNa2ytS0yNK0xtKtwcq3y9Wvw8zf5Obb5Oji6+/d5Omxxc7d5erg5eewxM2uwsu/w8Wzx9C5zdje5+uyxs+swMnx9vm6vr/r7/A5Ojvn6+3h6e6GiYro7e/i6u/f6Oy1x9PV2tznpLHy+Prx9PXS1tkfICDKzdC0t7nqvshtb3Di5ujr2N60uLr0+Prt7+/g6e3d5uq+093T2Nr1+fu1ydTu8fLz9vfb4OLj6OpTVVXe4uXiVm+8v8GrrrHq7e/Y3N7liZrE2eOgpKX3+/zU2drN0dPFycvBxcfgPVnv8vO3uryusrSorK5RU1Q3ODnZ8vrl6evK4Onf4+bHy83Q1NbR6PPu8PDu7e3V2durv8iUl5jjcIXA1d/FyMq4vL62ubuxtLaot77fME5FRkft5urG3ObLz9HkfZDu7Ond4eOfoqTlcYXh5ejovMbpsb2tsbP+///y8vLk7fGHiYt5fH0sLS7V7ffN5O4fHyDs/f309PSrusJgYmPfPVn5/f7r9PjZ3eDqy9K5ytK1ubvloq+XpavjY3prbW4sLi7e9fvt9/r09/jP4OfGysyjsbiOmqDjh5h4enzm7vLE1t+/ztXa1NG0xMyvvcSgrbOkp6nml6aRlZfhSmTN2eDrwMmxwciZp66Voafmi5yakoosLC31+/3o4uTB0Nji29K2x86ltLyMhH5fYGEsLS3j9/r8+vTX6vDX4+nR1deimZR5cGphWlVWUErn8fTH2eLw5t3TzcnlucLopLL38ebJxr7mr7u/tK22q6Srop1+gYKXh3zjWHDgSWRzamNnZWFCQ0S6sanomaeZnZ6gnZWHeG9BQ0MXGBgLxZ8GAAAADHRSTlMABQf+Iu/v78HAsbBY4s5PAAAmh0lEQVR42uyYT2gTQRTGFUURX2RnEaQGifcGCdKQgISo5BIwJCASvGggEL0VpN0gWqw5NCABERGsB6F48tZzUREpnioqKIj4BxQUFUER9Oo37zmZyW4Sq7Z68dud92Zmq+7P7+3b1TX/9V//UOs3bdweUTzOgQcOThCiUSIRTyAhspB24ORpPJNIZGQDYQdOCIkHayvG6Yev3jx5cuHt7a1Yb0XQEVd2IePkRUjyE320eX0PEYCGyVBIkixMEiFJXTRz7zwDV4YXTMIsMh48efLqIfT26zmsB2K4PEO0wWXaHAKwNrW2b0/wVJwSuAT7gmwTAgYn7Yx1hedmaS9kOG6bnX3zbunRo6Wlpdt63f+uZXs4zk4dNjlIER67wtrCMI4JxhJbcyx9t2KNRJkhdRe6yHh9c3Z29tWzTy9ePPry/o7c+w6L8OvaEEKKoCQMjrgUrjWzyolR1h2eyFLqTwDAkZG0y2zcBdLrRy9evnz+4d0Hx5TfloMUNYY9QdHxRFJXye1MxP5kEkkpxEzc2pRhHlNmmcRWTbXOgHAJcQbStffPX7588fzRs2eZHX+CtHMnRhQp2u2QbGcwtiSTUndyJMyQ6uJGYC2CeCFmrUPEH58xXA9mZ28tPf/86dvHj0vPTGtYLkNkgWSJ1nZJ7j5NDdDuH2m3RGQeojEedo0Fy72MgMiZ15ikr5y5f+v161tax1PYYsmPsGzqr8M8bggUzrVRpNQIS42MEKLCRBEGRBAvsSYEEmHyB1JnqtMXRNPH8Hv/rsaMWVGkB8DRMCIlVKSBkOT2wbNyUoqRmGjvHyDRXVgEokjhtWCSiO1R7BUCpkQIBmcFwVS1Os2qVgcTeTRYvlx9OrDjCZJASTJwOsA+KTtEPlYAaaQq2jv0L8n/GetY38JrhZCUFmk0QmaEEdiDiLGStScVTsvzyOt/cUzaQ9SlFpBUF+gHC2Fgg4xLfK4oE0RD5dkUNc0iQXDJSL7hgMRiIH0SzxkFp/AoA/p35EfWftQs2rMTvQEj4lI8RcYj7Va7QeLX44sj1AioFDSDEqlGpzlfWn2i4fXnmodjDDg4XZda/BnESGzQjNIkBSWFUQgUzc9Ts3BqsVkvzbVpYV5RqU6rKb83ezLM2u75pvD4WOMitVB4uZQSzczVF4JOp92UGqvP1dW9dnsO06vtxYCo1FBBsK9Aiv6FPGH1OOvoAyn6jSffdCl+C0ELncelUtAp6H4ABYvtfdRuYt65WJjXJKfmSuCiVZU3/CIOn4TKGwNR+FmK51qteC4FHundzYZSjTluDABZDOYXaPwe7y8+VqrepotBs0Gr1SY8vlGziMJwsG4BCTiQ+15qyZe2dkmg2oF2aUGJ6veaJVW/epEa+0rteyW1EJQWVGPfaiD5PcX1U888uXCY+13ogwhAcEkJEWKzE3Tqc+M/unbQwe74viaoVGGuGYCqea/ADq4MRfT2fRycxBKZii1sYUwYMcXlPcCxLrFy21s5jSREsKrwWFGwWP9RhpJInRJfOJ1C1Hsr+sT4ffYNj8c3j2QKU04OeC+FkVB2WkACjlajTSMYyoqUNYUXArTKksYWQ/BYnH9s8yFprI9L8VYuF0fHM6YAjXqAhMegMCG2V+irwItM/W7owrA1ohhzmE3tEhp4qD2ISYkUF50r6ibiZMEQLeGfglkEmzzPTg0MJ4NpYfs9SwykO15UwqAMSbcGbUD8s2fIAvnRn7JcDOmAGTTqh7Q2juaAEUay1pCgyRACc2n5DD4fUZvsQn4qRr79YUyxIZdcgyjGgBz6drycdDyXxk5of61LoiyMgFkk2bu+P4SSztJQ+e4Q+BByuNCkKt09fBCx1rgu6SOZCjskSk+UJ086dy6nmulTcuOUvRTaulwLv4BwDIFDM0OUw2z0inyGlDHwWcrlcIpLUax2TdXSeSpOTU3UKpX9M9nx9GQ+X7tTJipW2vlKnvT2VD47NXWnmK1ohnS+UktXskXMLp7Xk/TlGfv+tGBOlijy+rrEk6gs0qjzLKHuckl0PMvhqqL3KnS2XD6rJqjYLk6mJ9QhqhBhjzC5NEG1bLlIh3Bka0WNmq+lx2s0QUSTtL9YPtRTfr5Wvw+IKCon85KVRMTZxTPvpTVWMCmRSwoS6dGDla2pqXSFiuVyEXi1/FkYoEmUi5Q3SJc0UhprlGCekaayB3uQYrHYCd/Hrx7kkmRPZ+cdKyxmYYkGtQc8Sclc1CXSq5OT2QrNVCbKfNf7L2fLady8yo4bpIMzlUqaL04WgcQu5adQfFlGKh7KukjelgMHDpw4opQa5JJn4RweBJt+jgSLWsnk7khnELsQnOZm2x0J9K/Jjx04evTalTPVERV2yXP/DStXBMBBsGBDkdZywwt1PIfOUNhotWwiU1yeIOn/u1P2Suhnev/tEK421G7462F05+hoqOMBqC+S4DCZMYj3fp3It3WnTZqehk2hdhAuQOcj3BkMKnKRwOS+l5JJZkr1B9KnTb1SywNxW0EMj9KV6vSx6kCXLL7MhIXD8CbuIuUSSagHyThDlocBl6fo379vH6YTJ85UUXiKhrnkQbwycx40CGk09PUAi6JIxgLbHSxQmsid1kIwntuOo5D+kTPVvXuVokEuxUIXLM8gpFEo3PH6ukR8fGfVbH5diMIwTmzPOZ1OIyVpLrtGKyWEthFREzfa66M+LolcbsVHLvEtRCwEITaXaHxvrISERFiIxJaIhYV/gsRCSMSCned93zl6xlGmeGbaTjuuzq/Pe57zzrQXEMDtZQxno3idEkUXOJ0xHaV3CQrlI+vrEgWADTxtKQinP9LPU20VSF48/Ci52vGT2WOb1IXaKRx5rVYjpAu1qLVItaNTQDpUO8Y7DqEPqrXi4+vnkr/Td8mVx9EPqcwh7heeX3bwCge7vb0u20aTcBw9zrLrQFrUOoS5FTPoolqrpngHptxj0al2GpdcTO27RIs8FXf+jISqw+IWHvEkkSwOgdVay9ahX0A/ro5TjRESDLFI7VN4ETuAhE6hncKlnzED1c+lIJ2WNMtlrOVEiFeTSHEm8JqttS6gp4uOW6SNQDoEomXLGCk6dup4jFRrLxvIJdnt4ibZAZsOCUCz62W3EwfQLAdJORMSFEXZSEVoRSN1HUtELy1CyLWiSNkdG7FECuV46i9cCj1CZxAlvFL9kDjyXCTKhmlAwp+7TAN3cYgH9V9c0rIpPL60Hw/wqYnEc1xaip+ZVOf3ejq3pUuN5ML8nUuBbfJkE7uSTEqIkkxaXEI8JFyCT0ByG2+5t5ADAA3sUtIk9xJEyI4FVvwiM/iJV67DJyfxqsiHCk4ubFeKxarnWYjVv+LrLv/uEl4K5NEwgqA550ya5SOx6lN6QuCR2CWVQMr+0RCP8N9cChIuceFp3ESgyRmTy/1ceUvqZS8ewFStVinxBMOvNT+c/odLga0vERMwjcYNMGKSFo9CrY3JQOYnp/TKernebCbnJQJil4TIR/IA/4dLPi3EXV3vHM+5mA+iTL5QKMwwRBRDMRyQyk0wOYWHACefFsRJ4PMkXfiPLiX/UjMSb1kyLQlHygFo8+ahArkUWCBmQuE1f3KJym5aBYk3UE7/R5c0JVvim0vtyTDRk0JGo5CoColIaNEQ1UFVdxNvWrWK2wIvD7xLhf/ukvk1VMBI2lcOcWAgIhp68qRjxmfiqkVWoMUouFQvIfCa7slFhXxC4aUxKJVLmqR+L02r74cxWB1l6AblO0NDndVhYyIaHsYZcSgW8f0SImqWEoVXlcTzkNyvSuWQ07ik5ZjwZj4GxRh2eFbEymD1xUT5fGf16vFGFJ2MhhszMQ4tEblULmEsNae6SBWs0xyXvPBO7xKQDB0AZ639nu5X9ZSwItYMCHf5GfgPZmREhkVUGZ0djk6ePBkRkoSeuNTkfKg7SJW5leq0aVJ4/b+5Cvu7ZJwqC7TJD61aNQSmJITH4AgcImYRGPOTwGTCBpgiKjwGsvFQKpFLiYaIbaKGyDfIc0nuXZe40CyVJqKtW7f2kKwfGQ/Dl0+SiDzyaWJ4GD+E5brjVZCoFXcTr0JCPKTNba11GDpAGRJD8bPC1v37gWR+8PQ7dNx5ymlfoUXigJCfJNpoYJfYpFLRnWoZqUIupRC7cnR8XJ7EUzoqXz5SA5MYKaNtUiRAflDo/gqFQUoLT1WMVEA9F/BRhawe08piCYFXLCXiYZogefKiTZCO8lcPEm+crgX7gRPgKtTdqoLRNv0sA2GwCaEVcisUaVosRIiyCm2gKY7IgJGGVuGtUNGgFCQRz0soPrfwRAv6w7Dc66UWiUYOmhSDd7lEfmB4FygczmRMGL/vpZvvbj7gjz7mUKM3R26M2v+aV4FStNAdDxT2hnl+1B2AIDBxTPWQms0STHJdgkMV+LQllUuCNH4aSGxSZzOGTfZGd3Iv0htEeMvCq2uTrzQjhet3TScdGeEDV9DIJ35l1w3hCTQ9WkesL44YSUwaQh6CiWyyfyNjqVik1ZlqQURrOpfkEjBMYiQyqXNpLx333qziCenV60k8Wy+ejEy32itBqfZOt3oBnABE7AVHWGAhPCAxCQahsHEP03m+EK0ED0xqJuNhMRbfpbBPm4BD+1F3Z959lCN81shqc+kL0TESMY2yH91HQqCUME6e7/K/eiDVFUO58tFgEg8jQcolkYCD2mt6Y0mQbHF5G74E6ZogAGliptJH7LNXPMzPY2uE0CYBQqWijqAIR/E4Qqx8xmp5Ap8Ii0PE5xXY4EdthxMnXrHZTBYeHIIWL0ia47vkL4I0uesZIVHrdQ/Pul1Coh7vEjbOhwGWF2xcoNYTIx8pOXfJR/ElX7Tl2SSds0jEZJGWFEtzQJRAgoC14K9c6n589yZ6y0gTjeynLipuhJEAcBMbN/lcjuC6eHeihUkYOjcJzsfxxV2dNWnRRmy1Wya2ySIh8CTxrBbDJRlLg7uEd8hkh2OkCeonBWk9fZB7ZcAALoB9j5AFu+CizD+jFBk6hRZduXJlp5g0tmPtgUx+w47dxiy7yqkXxonHmecgCdHiwceSIHV0g5EmIP5S2SKpblxcsOklxpAgHYnHCfZdS4N0/+zY2RZMQjYsGls+Zo5taLcyZsW5NVetTyubRZI7LwHor13KA2l19oZFYihGymnN6QCyACuxBBpmAUlE4ywN0tjlDwcPouxau8e0Xn7A3L54d/lGc+72uTE+Q+B42EY+bUvEA8QuhQO5FGhGKmRCQtrbaDQmJoYREg9jJBUj0UpIyHBCkkhI7dLBwxsuHALSsRXLtIZLG54Pbdhn9JoVK8ao9OLEo9E01UViDeaSbcLzFESMRD+NbRATI9FxM1JACIKkNSPh6QBIt69+vfpYWjtG2rfh5MXdJrdihV7BqRfqlcg7qr3EvEQmVQZ0SdtLhXiv9dw9QMwkSJC4FJCdUniChLY0SI+08fO3E3vs6dfdeSZze8c5GldPV9xCbTNSUTSlJ7Jo4WBjySKtNpBFopcBxUg3FMRIUIykrUthAP0Zycj9xg17YJIx8YuodQsYz04+0lRYBJsWDuSS/nHeoLWLpOAUIyH6GEnpwEOC/oRkDH48dVRDhOAwyPC1T9knzEsAmjPHKTxBGmAsudeBoJwRpDDE8QOKkehqm0ysECO9xMPLROJdC/oTZTrENB5KvzrDuN2eReI7pZYUtwEpEQ+I8IULFw+SeEGQIIqRZITJvHQD+TfzBSMpDU2ipZM2aFKzHnhT7aiLtLrzBL81Gh8fd0wSgZGQhIltWlKaMwcu/Vx4jPRnaSVyiLBlkQBKdcZIM8H0njs6enk02RBB0iy52uWa1Hny5Mkd/DAHSNwK5ZJIYNwo153AtAREQEok3uKFWBkp9BfyxDEqwCLRYD1ykFQPKQumN+QNz4YjAiCDTksaCtzod0bO7OeFKAzj3JtpdS6QiNg+1BqEVIhmqIitaO21fnaNfd9jjdhjj10ssQaJuCEhEVciLiRu/AMu3PAXeN73meOcmS48pjXzzWjPr897njnTOb7HE2d406fjadl0i+gvWvTq7lXMB1s4mSYRaUxu5t98eOoZpiEjei/IxpDaikdDhyIemgsghIqZ5DtIvB7lGC8tTMvEJjDN2Gj6EFZOzIjq7rke/Hz6x1OHP03/6D24/IG0LLy7QJoNJO1JxqRxT71VezaP2bt887inufwYYfK8pffgERbHJXQkQAGpkU1WDAZLFMRCXIAMkieBPuOEtHz1hROCZvYhFlajT0UVOHEilsMzvMMzliE93MC7irrb7zs9aVVujPfUO7OqU+7omEd7jnnfV7EFc473B5CbeG2HChORGiltb9pH75hyiAyS5yKBiXlOnfWoT1inPnkR0ofLQHp+CkhYKN/z8f3G/v2bJtvEVh3zzkzZCaTd644Bjodea/k6XLqTG+JAwpJE8uqxkUhliQwS9xIpUKb2lx5o8098yHgGmFe+y6ZHm8tWL5tx+MKns97HC4fpJCXfcCiRmmSU884sX77zaG7zktev8xH+nDXvjo/oPSBLGrokoksNJcMaFYkmWyIG8IwZX3iHBDqFrVP4OY16/OPZs8ftuZOaPnEi0iASVk+h6h7jNU7xh26UM+58zwrepDocHeNyju9+5P29bHZAG7cvdW0eD2kmHRYipeIeSXbza11zWyJl3lCHSMgJ7q2ny+LWp1MxkgBBhldP4aTqmuSOH2JI2Xnzjg+scYl9ySZCEgoilA6//xIFJELT5X/oZ+JIlIECE6H+KRDxe1v5erVDwiTZB1SkoG+RskeeHB/qxoPwDB01tElf4o1tjx7BJIge2cJvb30w0FSaTIT6LyQSdezcZdasSa5J0QqRiBoo0oBsn7fv7rkjcQARqY43BJKGqRskIhA9Ml44SFIy3GehWHzt/4uJRYe7VOYGekIwEMnuGyR/fHZAtvuRewcTIQ6mGiTWGswCDRc2N0FEm5JIsZZk1CjUJlOihiGxokQoO80GZxeftCZtQfpAQjZ0m3c8jjTKdQkICoRFiPglodtak+IxpPZxJK7W9qjmRrG8UHUggmCFAQrkmeuCxCDk/VG4BB15okjUKDLNTRikLbE0lsj0o0ZIQSrpEksTUIy+pj4FtIGDhgzHXp40X3dhzXQmX3cYl7Ita9pYde06dNQo6xKTwEzmiZD4TCLKSyBBzZBYfVCcKUh2I4bdaLnb68usjYwpiYDVATC5mGI+kHDOANjUZ0B3d4wnNtGlNBYiKQLLzvVosiEKku0lko0HHlBbfXCKPcrFsqkGoey6WCTUGUtD7JMj5QiaGHk2B2WXBVOsL42CFIlTkfj2sliDNFppUtIDpriDlHQpFowqjn6T4n1EdiSxAa8Kk1Iyc0AtUSDmg0GSdikSjKqLBIMUBFQujttSyLY3EXkNE6959QUsOTrEaQ+QNjmjYcCJA9hm7dl8CBRzTh8wgcqNhxGjhuIxksNSF4VzJSxRk/ve1iW/IVLAk1QtE0OBDoknKvqidaji26tLROIRKDwUnVA5SHBoBB4j4ZEgyUIcrlG+g4TN+khp50iTyA16FKF4CCOUDtEPI00LVqKFsuMHFZCUqY9beKNU46NEKK9f7y3eOq38Pb8+ncu9tkS26hohZZw+12howChxjfLpEIgsj2eQgsgnPU115N4kkljUp09dl1hs5cW5dhPOlL18Olee6eUdj5p3EotElwxBMqZjPSojh8SASOQimcggFJF41WGRQOTGA4hG4AGkdmTKeefWz5zw1MuVn3rTIiLIeNQYqV0tUhBR6d8BhDKz1Sf9j69OInJoVlu2QKHEqNGEijqTwUfhCRMLjxoxqp/YNNLkQjmXXjxmwhm4NCbvzVSkFZvXpYgVNEPKOI4aArGFq/Iz2eZL/K0+L24RWfBMvCt72NFYfaMFKgUBKbd5c4TUBwKTc700AibhIS4Rab13Lpcvn8mt99bncxp2m+X9GDFU48izSD6RaI9uYgzAcVnUpeiTOfVYFgkM6sbN4s3WG1cqrD4wQR0k5aUzEUkSD6pNPCDVvTvPNlbUIRI1RQoCixSIAEJnaJI8+5C55BVl4icId8ZkIawMyxfuh+Aq5Fl9YOosRDjZTomQWvokEw9FJy6NtyhJIqreKCfqKoFB0kbzWF/WBQmSoFbftNF8Nn2Kn4Tu0mfuVluuv1zLrbVXCq0vw1Ke1Qd16aLXUiopvJa4SyNEdCndhMg9w3KNBVUXiQNM2kKLcIx4QyQV8xPlx2DBQQldf7nH3azeL4aHDihUF7k+ZIwTCYr1pX6YKgWkZh6xjWRx/oLk2Z5rAweJONI7LAj7korzDIXJnKOSREWXSM2qthZbqxOEadZ82IR/TqQWscktPARe334jxqfrMAUkqpcMAqM6VA0cl0zgRxcK5pEvFQ6dz+crPuXkdhpMPEfFfTpUrNKFONWNsFja0llcwoQs+fd0qSUW4v36yXS2viO9BkQdXKTAPkVxVikWSxWOxWVmq0HSGvTI42HGQul+68mwGA6zQBAPJFPCqCqI6iDpp4NuNXUSkEbrgAJIwuQiSdkBaXwtUKAhE7lkoUw406fSyUoY5tWmDNvEw//2jmBY4VvrWi3E8sn7LpBJ0QyhxOVqIVLxOt/WKtGtHs2SGYdIv7HAwZ8Wpy/1AxIKb2SDb2pSlPyahkyGOxSHCQ2TXgco+xuDxCUHiREuyoPYJPTasOCDR2RbrEbxJHUoLEU6xJdpoNSB6k5Bkkgf3KIuEYkSj1B7tYXHwb6+MuZ7LpqMGa2ZtEGCaFJJshdGTWkXKzymAPa0viwM0y3yFZc7DhmZsez3z+c9z/a2Zky48hUknJ/e9IBJWByXdBZlbV8yV18pDqr0N09obbH0+PD3FCuBplnhTgG9wSLRomGFm60VRTPNPPRtQhLIVt/2F/IaEX5TJL3hiYEsTlEPbx/p3gI5SHBoQW1fClyi8rByufzlHLR09+7dg7CosPb716Bo/cr27et1xzBoELVl+/YV0Sp3XCyXt227yAPiwosu/bl9A95h6W5zNA5rpGHlJUtWdu4AdX64Y9+ueUQygkcjevddQKTAIIkzERLo5BaW3MOiS1bVmzRJPuZBL+4UnHgIfNTc9WF2QMBQ6FAOr9f/8IMpd86j+jTO/+0SZ4ZK13hz+9aOfafntTiJ1xf32PFwXQrEI0Fi47QUNoFo/8KMJRKW8HpgkBB558OwYtoSoOaQc5QB0o8oX8z7dRXeYEzomP4/kXDU2O5r9u3YsW9N25hLgjQyUXUd1SMAUd5CTDsmkUWqhhXBMUjtppS+HYr69RXmnAtkzkQ3eHZKqhAOC6I8J1NzJM7R09FDS8/T+3bccl2CWHhxj2iSmMB4W5gxRByOAiWs4pmraI00pBqWDqApB1BzSSCb2633/biYhWvdPG/n/RupC5FaoG67HKS2IFrQd4EgOVdrJKJJHpEoEhG0EAoR+fQDxphmbWtYLV8v3l/bCAha+/KQn1QlvO7kOZn8pim+yCKJ3sZcWiAzVojEq7VUDVG+NVJVAdj9w6pzlUMk+Hvo5U1Tc4mhwt8GVr9V/IRKoVmLqo8n7uYu4ZsvQaIclzgZPitI/GOJBIfaU6BKYVitmFaoSRSR5JyCqsNYJgFEi6xunEx0p6qUHZnZL6O7O0FDJOaDg9TGdQnzirTwWGE27BTJYEWXC8Oq4c1SRTYq8eTy+K28UAhAIhUSJVQOb8S2D4QsRdcoSKCa2WSQeiVdyopLRMLiO/F9LldWmnM+E4FUV3DVcgUmlXxXmg9p+TyEgDz8spGbcaY9xT+knMGL00AUxvVuM9qAm4CIZnWlhz0sqOBF0SV60CgILiJWDSUlyG4N9ORSF9SDycX9AwQREeqCeFhBBW/e9OBF8OLf4d1v3uvkzU4qqP3aNMkmbeeX783L604bvIJIEoYcIAPl/8mlOxpJecvNwDvWRQrvIPA46jh984e4a/4bAsGjXtd30trV52cfI1SwKqKUByR2xQ05V49/jNYe0m1t7eHjs/YZzC6RqBZ2YIxLT5AfXCRWh+Kua5DQEgaC3vglGfC53CSb+M+UoJCta0IlSHxADNDcDiK9IHRXL1tCnmnKr798MM2lbDjk/HB9AYGHu42k1V28AB7dRI4bLk7PeKVQkBhLll2X+IcegVhkB5xZqRlrVKYVUX6kl3SMUnbkHWAkTQQmu3roEtQFH2IiTxNpVXllAk6a76IIEo5n3WnBJA4J0d9IEZAWMUHMpBjVQqLOdB44C1GEjGclcbLpgulI5BE75ucxw1C+49l0JMVMLfPrCGQ+1s5dHETHGQPEVMzUktRnEREyIXFfipy+REgIvEmyU8Yjz2YxPP40HnNI24SkyC+zwTTTLNFEy7JQs5g7i1Il5XNTnjdLokAtH40iQNkZr9shXad+BCIz/E4IhofwnMNpWIw8QsJYN1qgCwnDVHMZZ9gI3GSbAaQn2FhWPm/5Nj8jwaZlHXaYLJe6nW4H47fXdfib4ptSgivx3FFAyYCQ4LLX5rLTN802nV1MsOVsqKEkcE30kVHSAlM/nNceYdplZzwav12mgalJ/p4O06QJiIXuFHnoQiDjt2ebJm1wLK2bVe9Copks1ZUh17KS+lykCEgLVuB12KWlAxAhseS9mhh4YDGLBF5b7+/zb2o1kzhEciNVTHE2Ovs4Rpl9KfKCJW3SwtFox3kJHs2v+ysrYJbzYlOGQ1BqHMkP9oAZB7/6kzyZ8wQ5NsmqGCUBw51pCURaTuA9fTe+CSLdlRLrcMUUUyTtzFaP5qFiJanq9ayD6ROSKRCFyWtSyLrbN10kMdpvSfDx9mCCREx2EodJ69/GLy/enrukdxviIdxSQbgVhlUYBGEY4NZLleoNthTmeYZFrKqyrzYHeK84B3weo8o9QUiT4UefmFykf5EENUOxUfKvNSDBh6WINL/LRjr8cry98enWLbQHSHCiSio93e8nQZAPVD/9nPTVMKnyJMvyQZVmSQWCMhsNgJRmoyKtkr73/ue1E20g4T+ggRm8EKj/UOD0KbtHkUtzB9FbnoFn/87AW1xcH28ffnQHF1JAg4A0F4xGlSqynirxPEIaqiztq0GeZsUgLbx+UeaeKtOqGMCgYjDETqVXtR5cafsa6TQVrmCCZkEiJhEbJUzBbVxbYuVTxEy7baSNl3e/f01wvYt9LY2kQFApkEyQ4n5aeWU89Io8SxNC8uJYI6W/4FKSpMNeofCc1uaDdgtIB0/P1fWdQM2MxK9Yjxx6CLyVm6s3P83vn4/mXZe2D739+OD+/ThE6GVFEY+yQg2KkZdsKi8uiyL9jJVeVvRSBJ5XpGn2Hq+/GcM3T8XZaKRGRV/1snt7BMk0QU5z/07UYOLoM0apAyurq6uvddS5gXd44ySQ4FK4l9/XLf/T0pwwJfOaR1bxPsO+7baNJFDCNDMSpKMP4iuAjMffXjCTHXidxbs3PnxZOwekltIyMDKLp5/6lShVGkkfO3xBUJAEalYkt0vpz2b6CiDjb9sbN1yXMDqz/9SrO3Ec7vEUfRBtfGJrnuYFSoQTEyFRgdxkgmZFEibIQ8JD4L3beLF+Izqyo3rQXxs4unhc97nJl9+k6DJ0tmS1efDYJZQpziajmZBE9UVNoN/tnE9rE0EYxrtiQUREFKY9iLCzM2sEc8jFw+qtYA/9AmHx4FEWP0DYQ257ySFfIIeE0EMkkENDSMCGGBBJchCph1JP+k183vd13dUki3/wIPTZ3Zn3nZk18+szO7ZN214UJpEJ4wzJKZNNZXsIbv5/Ut6uyN1MSY6R4s0SpH1C2lvr/BMmzGSr9pjo6Oiodf/RExtfNHdySGAKbKl6E9rf45/+kC04RchL2ouR7gJpfTLZcv5loiIkfObwDDs4HtvHjY+Nh/2z/A9Vl0hB6TF/CJkpe7rlIfrxc5pipNtAuidIW6B+AwnaahJt4EDau/l8OZg3FtrsZAqEaSRI+3exbpip2JdtuyuQsD3wP/C3UPgCrggJGzj9waMbbyaTwfiNn0NySmVGCg6ECUv0SHbhdJf7HaTbt+4I0rYhol9DAtN2pHuCdPPV5C0haeNkSBY4pQDFuwPS00rrdW/Yax08xQFxm0QoEXIiNY4KQiQVZAhev3h8UGn1hp8raIBQ4eASlYyqVg8PqwfcuC5pTvtaLdy2Wa39l+/fHw0r75aTyWre6CudQ2KLcFJhLSrrx7VaJ/F93/ra9z0/8FFz6GmcCKj2lEcJVxRRw2hwpj1Tr0XIla+1+i4PlyuXLuGbUmXODA46kUiOmEojcRT5ypUMMlq57re7zOjleafZ/BIu5oPB/PhMG/MDkuCUfApsABTdxDu6ifedhA+Nk8UwaFGaUHi2zIRgNJjhFevtJmbIFFpTBTSajue6PH9A4d0fq5V2lRyem7IxWahopOs2I7ycQQhxqVDzgMPhaWMMErtojD++OTPm9GInE1HYgLEQWHiCs0lv6IKDTso1HQQIFCahuSJGwXOkilxaLlDCJaFJ/RGZNACKXwYTLHDTHpdZpAa8cSkAkjXwSXFKfuGCPvVG81VjZu30Q3+2mE1NUj/vZkTObgAS4goQIMQBRe2TemTIHjJLMZpK1xc5pBTZxJUSs9D1pdFA0Kk1VSaDFl5yKDRVNC9lLH5vtKzIDCoMdSPmbr4nRBxFSgMD4gEh12b0+dN4dWwNDYpP+9MPSee8223nXLoGe6xgWWBZMsULwFRrN104A0N41flEg4SXGESuMBqq1I5kNsYECYma8LFmpvQZyRthXKy+ByWt2AVAfXNBMViINkYy2qWMoWXEl1breNWwiAgzaS368Um3W4uvOxnS1V1AkD9yQgEvuKR90o5DOMLSGh1iiFiiiA+XEBnFmZnOtQJSbL4BGPGHLpfRpE0IfPugZL1QuAkNbYyHiITtIdQhcgKU3tPq0K7GfTSJkt7xqNs9icPdqzkk5+p1WENCyUwwhcqkXquBCdKKwRSzaCWrjm1AjQRiBCAtfaPiWkwUMnuOUHEgk1UhTxBWaHx7qqRDyoSEjArRLdtA1Ey0ywNDN1QoL4bT5fy+PFIKRRh//nhx3kl2rzFRxuRc+e/lOD8jpVBSb0Z0Nnc5zuZbnSxY09orSlTwArgKJUR5KGCtCcOKlA3b+dVbikcUjy1uBcFWOVIUyynuc/LJpri4tXg20nKpS13qH+sr4418MgJlkNMAAAAASUVORK5CYII=", + "description": "Displays a volatile organic compounds (VOCs) data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'ppb', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'voc', 'ppb', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < -100) {\\n\\tvalue = -100;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file From 62cfd3597178498179d0fccc563e8de47f7546b1 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 17:00:41 +0300 Subject: [PATCH 30/39] UI: Refactor air quality index widgets --- .../widget_bundles/indoor_environment.json | 4 +-- .../widget_bundles/outdoor_environment.json | 2 +- .../system/widget_types/air_quality_card.json | 28 ---------------- .../air_quality_card_with_background.json | 28 ---------------- .../widget_types/air_quality_chart_card.json | 31 ------------------ ...ir_quality_chart_card_with_background.json | 31 ------------------ .../widget_types/air_quality_index_card.json | 29 +++++++++++++++++ ...ir_quality_index_card_with_background.json | 29 +++++++++++++++++ .../air_quality_index_chart_card.json | 32 +++++++++++++++++++ ...lity_index_chart_card_with_background.json | 32 +++++++++++++++++++ .../horizontal_air_quality_card.json | 28 ---------------- ...ntal_air_quality_card_with_background.json | 28 ---------------- .../horizontal_air_quality_index_card.json | 29 +++++++++++++++++ ...ir_quality_index_card_with_background.json | 29 +++++++++++++++++ .../simple_air_quality_chart_card.json | 31 ------------------ ...ir_quality_chart_card_with_background.json | 31 ------------------ .../simple_air_quality_index_chart_card.json | 32 +++++++++++++++++++ ...lity_index_chart_card_with_background.json | 32 +++++++++++++++++++ 18 files changed, 247 insertions(+), 239 deletions(-) delete mode 100644 application/src/main/data/json/system/widget_types/air_quality_card.json delete mode 100644 application/src/main/data/json/system/widget_types/air_quality_card_with_background.json delete mode 100644 application/src/main/data/json/system/widget_types/air_quality_chart_card.json delete mode 100644 application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/air_quality_index_card.json create mode 100644 application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json delete mode 100644 application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json delete mode 100644 application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json create mode 100644 application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json delete mode 100644 application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json delete mode 100644 application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 2253099739..1464ab1135 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -2,8 +2,8 @@ "widgetsBundle": { "alias": "indoor_environment", "title": "Indoor Environment", - "image": null, - "description": null, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMkAAAChCAMAAABav2sAAAABcVBMVEUAAAAAAADf39/09PTw8PD9/f3AwMDy8vL39/fy8vL19fXw8PDw8PD////39/fz8/MjTMf6+vrj4+P29vbx8fHn5+fHx8dYWFg/pxra2tp0dHSQkJDt7e3h4eFmZmbV1dWsrKz/pgBaedW5ubmCgoKf04z/3aDdNVGenp71xc3T09PCwsL64ubI0vHOzs4+Ys7wqLTIyMirq6uRpePYGDjk6fisvOr/9N91j9zri5v/6b9KSkr/+u8wV8u33qniUmnn9OODmt//78//46/z+vHW3fXgQ13/sSDnb4L/vkXx9PufsOa7u7v/2JD/04D/zW//x2DaJkXy9Pv98fPc3NxYszi6x+6esefPz8//6L/umqiHyHA9PT3/rBD309rP6ca2trYsLCzb79TLy8ur2ZrpfY91wFpLrCiDm99MbdHzt8HD47jtmaiTzX7aJkQxV8rtmqj/2Y+JiYmTzn7lYHZUVFQ8PDz/tzBohNnNzc2Pj4/UlCD8AAAADXRSTlMAByDvv/Eqr8W577Cvv6N3egAACkpJREFUeNrsms9v0zAUgBEgceHhxNiOnNhJ10RVlGqp0qpd1a2HtqqqwdjQDoNJTIIbnBBI/PzreQ5ts0FBK91GOvVbE7t2V/ub/ZzW2Z07d+/fe3RtPH549w5yI63cvQfXyj1s5GZaeQDXzH0UuZFWHsM1cw9FbqSVR3DNPEKRG2hlY7IxmXNbTFqD9jWaxCwIMWGeF0BOJYAZERREq5u87TfeH8MMIQS9SpPwTei9YQDUDxwQIWMVV7AKZaJCARwIQiYgxApwVjd51xpY2zCFVV7FAaPADIAZwIRSoIz5DJP86TImwotDMxrUqTgQx7GLJo7YpU4zQhPmiCiibsWLxBWYNFpjNJnjUOpEses5nsM+xw71feFEzcgPXgUOVu6GkecvFSeVCoAx8Tzq4+8yDzvtBy51sa1g12sKv+n53tWYPL1oIowJNT/YZOxHTQfCeBefGBMXPi9nInZ3cxMX8C18fOddEbke/WkCThTCGxo4UXAdY8KcMPxp8iZ0hF8RDrjeK+oLP3xFXZRrlnTtalQH503MnBYsAPPjCAbUZJgIgFIamBACwcpqYlnWCSykuVbXk5aFNI5hKZY3IVrj2bbBxkRh7ueDED7N29Ikq5g0LMPTeYvwK6oowo6A/jcTiV2VicrkAQ90CjqVGp9rqQIJGZeJraR8KckKJmMrpwtT6gBa2ZK8VqBsxbXNM641r2MRqNeEaHyBxEQRSZYx4djvTIKUkhOeAOdEa805PiTolzIBLH3JYQWTJ1bOoDCxk9c6ldjhlKR1ldQlT1+TNMvykkzhC9J6RrIDlZUsTr5aSL8NUw64TvHI6gQymR4kso4T4jWpp1rnbjgmWh6kPMt42UyedC3rXbEKc25zDhxDEQgndQWE2FyBwqI8iFR+qDQDXra1C2nDn1CwmNxrKZNiYbLzlGC6nt9PuOSJUpxwzBFC8BRwpYlS62eiucQ1imuCAtLAucQivnYmhCiOvVfERhWjQRRmuA7WzuQP8PWbXXM2OxIbk43JxmRjAr+wMdmY3DKTvT087RhMZu/0dG89TU6PzmoAvS3DPsAzTCY9WIj9+DGeqQdBDAErmcneBHuOJqOto1qtNoKdrcmwd3a2eFSYpDZQ5oHrsaZXMpOd571naIJDcQoIpiOAQzwtgn9PbCbAA0+ENBblMkFqxuRo67Q2wpF4vjU0Jc9gEckrFxABtAKMBeU02d9CJjtosmOC5hAWQlmZI/6nyehoCB+29guTK127jlstgE51xklxE68zrW/0+9XO8VWY5Ey2LmFCALHNcUmT4xdVy6qafe8ZJzORQTe/OTHuWzmN9hWYnA7BTDE4msfJcAeQvfyYY0sSaM0J15JfMk5OsJu5SXs756llTTvc6AL0B1jRtxov2mOsqF6BydkZwM7ZBJ8cTsP+WW2vNuz1Rr3RcFjsZnASSIRznpDLmbSs6ot35/rYtbrz+0Uo8RRLpm44aNsrm2CMTI6+YAavL8/3zRUSjo6eQa3X26nVcHTmEDshPFCEEHXJOBk/AagWJm3LGk+zT61+HyfUE2vqhpnBSiaj/Z7x2Z/s1/ILzJfJoZlPh7Ve7XA03BuNVo34CybdIgvjQQs1t+e3Wra3x9f1CbIHhqs0edKwOnCRDk6qtfksXJh0rAbcDpOG1b0dJtjr9gKTk+VMNNFKK0D+n0n19yGB8TziW63O5Uy41JwD8t9M2gsnUr+oHVzOREt8AHAN/0rAijxJljfpWo2F106rk9cue2VU8K/ErutGIZ2pLG3SzrtcUKzMVveF+XQ2uKGIDyI8sdB1xT/OroH1/hgW0EYVBEVWMFnwlYNh0SKoP8s0nQpdyqTT6hTJIk4G3e6LbVjJxHUoXEC4XuSIX+UoDc6/UODAlOybFnVpVIEC5sXm7DA4T+QhF41p2Uw8iod37m9N5yFRUInLud9lk4IgIsi3TwEx0I8xmfLxgMyhn8hC/rvJeTwxDeZwOiBzfFbMLVr+PUjmzpW8PEIKRARTaFTa3VTmuq5fAaQiYEbTp3CBaFbn0NKa5DSNiwt/hjmQEzdLucOtOQCfr1POXzsp3IrBgz/A/6sJ5wDFXoKAvyJyGCzG/s8mGi5yu+4EbUw2JhuTWRsq//9sk+Rok7UBEtskiL02Jhx4XaUqBc6llEEiX2Yqk5BKDkkqM635uphoLusqUQnIVGI+SV5KniqQAYc0SOpaq3UxOYeGX1FyjeLkPOsd8QUbkx/t3G9r2kAAx3HcZtdu/DYWjzu5lDOQhCQzD4L4RATNAxGfivWJDmXt1sG6lsH2/tklzLZZmfSW5NzGfQpXEfH8kvgX7kyJKfl1lqeoWUuGaJnlGWr2UoZomKX+vSpePJEhemZ58rz1qjZPn+UhGmYxjP9Co0badgySjo6bqM/JkbZ9iY6aqFXzSNe+RCeo2bGmfYkaqFuzoeGznZYSmJJHMyWK/s8SasHBLYcAnuUQgtKKJQQQBEDHhUWJ7RA4XgclFUtsCgYqg6hruXBJx2UW9TglnXI1xRLCbdsTAIgAp6LTsym3BKEuSimWMP4ODMzhHvccbjE6pHJWNxQWyiiWgIbwXEhyBjCAhQ5AmEtRUvGY5CU5TjkYtR2HCIFyiiUQtsdIlsQ5hrDkfHBIT1RdMrR3JZaw5TGhAl4P5RRLCIcgyLzvIBTCJczjRPCys+Qle5GSJ9ff8ypsUZTy95SUZUoUmRIFpkSRKVFgShSZEgWmRFWxJPXPgZHv+x9QmcOUrNsjYLm8vFyjMgcpGS2zkvYVqqW/ZLIcyZJJ+5s/QpX0l1yvIUvST5frT9fAyN+mqID+EpmQZiUZvz3B9dWHEaqgv2TdzvjpFhjJksm5f56iAvpLJmmatj9Mtu2ryeUSMmdbzYux/hIpP7v8dnt5DmA7+eajPL0lRZN0dwEVqL6E2ExwgqJDfFpZbADECyBKIiAfizbfsRenQIehSH/JZjwfIBn3IyTBx2CFZJ6NBVGAfSwOyaYo0F/yOZnKkkiWjFf4MsV4gM8BgC/RIMFiIEdZkgxi3EdcK/8nGLOI+HkZBfpLkD12QJYE2WPGVI59AMH0azCI+7Ov8yjqz2Y3C9xxmSN6ALwQlhAucqGN+8tGD18S7EoSeYTifozZTF6L6Qp3GAGGFijHfT3BhlwwB7niO+Pv+a0/8ErpmCRIgqxkIEvyG93KCzpsKIMesuzwQcmnPSXLVuu18l9rf8n3GT6O8XGG1TgrWWE2jvsbTAfRTbwIPuMWt7DXg5LU/730zR/A/pI4CII4G+eb/HkSzOO4P58HcXQznY9xy/bwCIf99hvfG4NkAciza3fdDmUhHueu5LR7ikqcAfKuLi6U3uODBHkJikJB8AjFki5cVMEKcXHqnp11Wyol8SIfoe5hiVtRSX5HsuTitFBSAw0l3ZZrvVU4JiXU/Dxpdc/w9i1y5pc7RaZEgSlRZEoUmBJFpkSBKVFkShSYEmUNPesZG03UraFpPeMxanaiYaWhppU02lYaHp2gPs1jGbLPv7Xi7AcB+P0LpI8HcAAAAABJRU5ErkJggg==", + "description": "Contains widgets displaying indoor environment telemetry.", "externalId": null, "name": "Indoor Environment" }, diff --git a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json index b0480bc865..b7fa990e7c 100644 --- a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json @@ -2,7 +2,7 @@ "widgetsBundle": { "alias": "outdoor_environment", "title": "Outdoor Environment", - "image": "data:image/png;base64,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", + "image": "data:image/png;base64,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", "description": "Contains widgets displaying outdoor environment telemetry.", "externalId": null, "name": "Outdoor Environment" diff --git a/application/src/main/data/json/system/widget_types/air_quality_card.json b/application/src/main/data/json/system/widget_types/air_quality_card.json deleted file mode 100644 index a140e86044..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_card.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "air_quality_card", - "name": "Air quality card", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a latest air quality telemetry data in a box layout.", - "descriptor": { - "type": "latest", - "sizeX": 3, - "sizeY": 3, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_card_with_background.json deleted file mode 100644 index bc32e31a31..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_card_with_background.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "air_quality_card_with_background", - "name": "Air quality card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a latest air quality telemetry data in a box layout with background.", - "descriptor": { - "type": "latest", - "sizeX": 3, - "sizeY": 3, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_chart_card.json b/application/src/main/data/json/system/widget_types/air_quality_chart_card.json deleted file mode 100644 index da03d55d1a..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_chart_card.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "air_quality_chart_card", - "name": "Air quality chart card", - "deprecated": false, - "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAulBMVEXg4ODf39/g4ODg4OAAAAD////g4OCAwyzr6+vCwsLj4+POzs75+fnz8/Pn5+eQkJB0dHRYWFghISHIyMg9PT3u7u7a2trHx8fx8fG8vLzV1dW/4ZXU1NSsrKz3+/IuLi7v9+Wenp48PDyqqqrf8Mq6urq2trav2Xvb29ug0mFmZmaQy0bH5aOCgoJLS0vQ6bDn9Nio1m643YjY7L2IxzmYzlOwsLBwcHDJycmJiYmIxzo2NjYbGxt2dnZCq+kPAAAABXRSTlPvIL+vAC9A4IoAAAiZSURBVHja7NmLc5owAMfx7vGjF/IAjAhBUNGBitXu2d3ttv//31oCtV1rubab1tjxpQ+bnL18Lmq88+z9m7dnzqn37s37szdnIU6+WDPexXgFhfphhVfR2WuBOB3EsjqIbXUQ2+ogttVBtiWWvFV7CJKP+zFuWldA3EvQNOuP/TtL70dFgCTC8WqHuPByNBnDOAYixLFrpnpR7PtwY/232Q0DiZN4XelZM3SE2iBxptvMIhdNWeVrVc/1xn0X8CqNGiPI4Htuv5rmGhL1i+l4FuTYzHCE2iCupyuSahqjLphFQQ2poPN9sysNJC7cvKoh8HzkgduzakeQeXWbuHH1/KoXGYgPnfmZ9LY74gfBDSTuadURaocUWV2COr/Ksmp9A4nGrtmVKkflZRt4txAEvRmOUCtEBk3XkH5hVh9vIfCm416EoreZeu60v9k0kKi3RjbGEWqHwDVFRYW2vAAPlfs4Wu0HYt4v8Ly8qYvnZ9HJbksdxLb+HwgTeHJiZ8BBay8MEXShsJt8QDxAiXspPNLLQRQgmIQTpoQTyQgNBZGpmAkgJUTKFClNIalitGRXVAFwpGQOURxwrkJHKpaqEDu9NKSEjmAgaGh+pUKJAUg9TENOoRhBKgicAacoQTlABwIKoazvKBwiaIvjRSGEYcBqCAdBSkV4C+Gc6nlZQ8QtJBSK3UBkmJq77vbSEF5KioSUDYSVclFDlNhCkFACA2GKNZCEKL6QigNmVpWOFZCTqYPYVgexrb+AhNjGGABLPhN+DEIpQChMCZrKLUgMBADCFrCgRyEloChSFWIAKlMAV1JiwEIhNIRJStiAUekglZThaD0OScQgoUxwAgIFZSDmKOdioBNpyAjXF0qmIDmO1uOQUBFOOXEImgsoIZwtRHIYCEXJJajVEE4TrjVU3UJSxRdU1hBB6DUEZHFlM4SZLwbOOFh9AZwzIGQmM9EMc4hQ2fwceXoL+qz/ZC/keXWQDnIqdRDb6iC21UFsq4PYVgexrQ5iWx2kpdEET8tmyGi4/Hq+enDi2xD3sxYy+nyu24WMLpZ6+HQgk1Xt+LrEnT7Mv56fnxJkZByriwnuNtejpwUxj6vPI+AByHJ+QpCJXuscu82XFyN8+AcIY4wzXBfHAFz3kJC5fnZM0NK/QHioQ53rjyPACwogKg4FWZkNGV0Oh1/2DAldHYMpjoIIhZ/EwDpzs4NAPuqlXn5qXn6/7BUiFt8XCwa4kQtoiNev+jE8LTkI5Mv5H13uE+KmVZoyYOYXNWSdw88A18vcQ0CGteDTxcXKHCWjPUKyfDP7xWAyEA3CJgI8D96hIKuP29fb4R4h+P5znOK6daK/NzmAOMmLQ0EuYRr90AfHPiFm9S0dCDJB3VLfvA85nQPxD8hnc/NkIb/bOxPmRGEwDHePl90khBs5RETUQru0arvdY3b//+/aROkearSz6gAdnjYjxDDm8eNLTMYZK9HV5R+RtLMisqvV71vrM1QiN8Bjla6KIoOgmAHZqngAiraI4HeKZx8OJfsnYDGsKsyGkA4PQi3DcCEED+JHBn6TYI1BjEuIDOu+pqt6/FoWq0whMnuaQbJ4XKWpUMiKYyL6wABDgoS54KVP3IRpeqIUOX05MnyQD0/1+WeFCLLqZgngKauqbHVcJNEgREj9N+Drr08yP+FqkdMXiFInk6fyKN0REY6LapHKvmP5VBQrqTZ7OBaRZxF3XTYil1vqFpul7jB9zvliNyJVUd1ky5tq9QgUS1mq1fApOyqi+YgSAsaufQ2+wUuUFxMB0sfF4jFFzWz5l2SW1fXpMgXSmTxbl1TUPCyQ4SgEgFvGeps36FK8gLUB73cau0Mv0jZ6kbbRi7SNXqRt9CJtY0fEZwk0lyFh3TLcERmAcReuTkDQJXZEMIhAhEznRXwkvhDR3VokIhoag1KoiAk7LBK7RBSGmDFICJqDjp2xbc4VNgoRFQkag3omnZu2ykbryvArPLBmY2OPwm7OI9S7w1/EVu5Y8w6KUM/CFoGVe1ZwGZEJxQsIzNE8iOmJHpK55XhWfH6RkeONcAxqj23bGzvO/akeknBqO96EnlnEMydji+IQoenYFBKa3+EII7NGeKihwsUOzikyyimodTAok/Gfl6TjCYDDjWssHIZO4jOKUG8KwTRXBiWw/+l74ASH579pMx/jzRwSZVDorWOG/14xplDjWbigiP9RRfJz+nw4+fE12X5a+z6+Z9uV9v1HJd9/yOYvh58rIpYFgSooIy8PsEOoTvjAiZtZIVKHomYnU2RymNhH7MzVH0gaEanv6L1BCS3nLlSOTHR/fO/RjIgcereY5jaVGqYccpXc3u/1y2lDIvvuBGqNJwi8fA4FyjShzhQXF5lbNaPdoXc3KN7YDHGQeM9s4t3h8iKBucHKvRH9dy7chZoUKtRpYubhpUQU77djBWdITdveirlDcTERnnBI/K0lgeONQtDTXlmmyekjr/8ykUjfv/lARRpYtxZOInYm9A+3Ng5z0uYDqRWumYEtpvbJt8LE+Yv/Gnk15r5MpPMbdM+4/isR4ZqOLtHaXZRepOv0Im3j1YroBpRsfx0S8NszRG+LcCJt+LroRAfkv76pIBxch5YAa6NrBiYP+KaJvKIR1CI6KQmuy8j/YgADgzPjOo4QlVMel5HuErBS6hLGpYj2jRj+t1heQdAI6ogMWATmchDUIgMQ3QXhvhsZxkCfkimHqIqkCGdkwHwQ0cjlaAC1CGeIdE2PNiKavxEhiLjwkyIEHACBtvbhxiAxdOIz0QgNoEh2lzEQwhC7MeIS0EmsGREroTGma67r65F4KKUiwHTAj5ghriKIWYzmkCJHMQbHGrhC7WQuLwIdh/n/EaufEHuRttOLtI1epG30Im2jF2kb2tUVXgXa1duW/A7gaYTvxK9PvwKTUGi8f/NO6zpXb9+8/wXK//trVazw0wAAAABJRU5ErkJggg==", - "description": "Displays a air quality data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 3.5, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'US AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'US AQI', 1);\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-aggregated-value-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-aggregated-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json deleted file mode 100644 index 895b98c57e..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "air_quality_chart_card_with_background", - "name": "Air quality chart card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a air quality data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 3.5, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'US AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'US AQI', 1);\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-aggregated-value-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-aggregated-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_card.json b/application/src/main/data/json/system/widget_types/air_quality_index_card.json new file mode 100644 index 0000000000..5041a13350 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "air_quality_card", + "name": "Air quality index card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest air quality index telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json new file mode 100644 index 0000000000..4f473d11c8 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "air_quality_card_with_background", + "name": "Air quality index card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest air quality index telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json new file mode 100644 index 0000000000..a49ae839a0 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "air_quality_chart_card", + "name": "Air quality index chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a air quality index data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'AQI', 1);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json new file mode 100644 index 0000000000..804132c639 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "air_quality_chart_card_with_background", + "name": "Air quality index chart card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACylBMVEWeoZqxta85OzcAAACmq6QrLClUV1fExcPFxcOnq6TFxsKprKbr7Ort7ezq6+nn5+bp6ujm5uXo6efh4eDb3Nvd3t3c3dzf4N/i4uHu7+3T1NPb29rj5OLk5eTv8O7e397X2NfS09PY2djZ2tnU1NTV1tTX19ba2trU1dXw8PDf4N7f39/V19d8wyLV1tbd3tzQ0dDP0M+nq6XDxMHR0tHAwb7S0tLc3dvZ2djCw7/W1tW9v7m+wLu6u7m/wby4urWprKW8vbivsavKy8o4OTjBwr6srqm0tbStr6q2t7LGx8WztK/LzMu0trHIyci6u7a3uLRDR0XExcNKTErBwsE0NTTOzs20tbCxs66mqaN1d3S7vLdnamZiZGJSU1JOU1KHh4YcHBvHyMehoaBUV1ZRU09FR0VAQ0KusKtMUVCwsq2kpqCOkYpqbGlMT0s9QUGtrq2qrKdISkhBRUNxc3BFSUhsbmulqKKZm5Vtbm1KT08oKCdlZ2JeYV0sLCtdYFtXWlmvsK+rq6uVmJI6Pj2s0H+Agn58fXxucGxcXllKTU1ERUKhpJ1XXFtHSUXExMKgopyXmpRzdnNSVlWipZ+Rk42FiINzdXFgY15VWVgyMzJlZWRKS0c/RUWrraiUlpGSlY+cnpmanZZjaGZPUE1AQj8fHx6oqKilpqY8Q0O+v72ys7Kio6OeoJp5e3pjZV9ZW1dFTEvAwcCbnpeIi4VQVVRUV1I9PzzD1qx4enZfYF+8vLu2t7SMjohaXl1tcXA6PDqUlJSSkpKKjYd+gHtZXFtXWVV7fXhNTU1CSUg8Pz8kJSLMzcy3t7dnbGuhzmi5urc2ODSDhYBNUU6Ixzmenp6HiYaEhoEvMS7Z3tPG2K+Zmpmz04yu0oHV29CVy1KCxS7L2bqUyVDb4dXT3cjP2cO71pqazFyNjowUFBPW4Mqo0XWlznOOyUWm4T2WAAAADHRSTlP+ICAA77i377+/r6+bKBXcAAAmnklEQVR42qTZzcsSQRwH8I2CXqc1jdo1kyIU6tKLLWG11VNrlr0iD1Q8sEgLEnWxU3gR7BzYoXNHg6gOHdWLnTt06f/p+/vNTGPmrrv13ZlRo8N8+u6oz5O1fduuZw++tS+9HbVlRqNauzaq1TBl6rV6vb5Zb3A87wpCKz25jMG5RNmgSfE3trYebGGqXNW5/fA2BueeziPKHZnHlOfPn19/fp3z7BnNZ7c4N+W4efP9zffIy2svr127du7cNWTvtu3Wtp3t295nr/1o2q5xRpAsBoZ6A0NBOMxZAZluTDdkDOPqj6tXf2BefUhhBpYmExhyz0CUAwwNAeXWIuQmAsT7ly9fkoIctOzYZu1ptz/W399uN+5wGQsBgBDEaGxqCASK8JEMigGIqmTKCjhY8kPVAcyPhw+JQojZDIXc1mX83QgcGEqCaAWiHAhJzsmLstvC9tsj//qo1pD//matS4ipwzM3lrQohnaAAIeP4ftbWz4QWxKi+sCERAUO0wcjwDCNEIIW3Qe3IRtBH8zgnFPZQZBRu/GsJtvA1lEF1QGCirmppEAdD+PQDJ0tDAozVMAwECgkhBU0WKIhiD4fWEliGrmFE/JSnw8waD55gkdrRKldxt4BqDMATxigER5d2D0cqEHG3FXaoSVA+Kwgh4HoIzK7PWs2781uK8bS+SCGhsgBiTkdFDrnEgKDxEhIra1OBDeCobO5uUkKDN0GQT5yFTpagWn6UGXghFxVEAgg4TrU+TCFLB0Ptpg3LV0IxUAQdiBMIYg+2a0TR/fJ7N+/H5OSw5SPOVo5eUz1LJ/HXBE7JgfsAytylAamSqmEsSZOyZE50VAUboRTt0+uSbmMsSYuXSsjkrOP5j6MVNlvcvom3oAZIg/HZvHk2iQT1OLGSNYxJCIrBLmvIeTAOBq7fQz1wFnLWaVgxxpLBsei5AQYuK5ZVAc+LvbHMjBpSZfMdZhKMsVAHOoDFKvOASRWYhwnUzGyFwKFSG9ghoHQrQXJGgjtnSxpjsdqBEaaZLqt/mjkCSQIII2VkDIiJYl56sQejlZxfR1ogtYMDK0wjSCoxAJjE3MBMh8EJQCU58ukXHbG98syUTDoO4tVBH4vLD/1XZ2wZZ5Gqd51M51yTFqWIaBYDa/u4dN7AXLxZGfOlZCmNB5g437ZcSrYdmXsO/1+ueLgNbcBSOGp82VSqLjlQgG7x+ti4SmeFIthJESxKAo0YhQ0kCwSZPmMcCWAkMPTkFKEdKNpRVcw6c/L5XGlMwjwR50JUINyGJX7nUowCebYuB/0gkEUzt1uxBB/EAah2xmEg0iE3eBbYeB3+jHHgmZmCRx/nhGO5UGCoSEXO8jw/iRwJCSMpiFBQEDQBlqREKdXmU/KBHE7fXceFscFBXF7gQh80Y3w2BqIqDtY1cg/KqRhCYJpqe+DOX0mog6nyxDsuj8Z+wTp00tanxLE7XeKQT8MXQ0pjOcTOPi1wBgXRRh9G4RhKMQgTHybynTWsa6AgGJJx2VAZIYRR53u/iSKJl80BLdVhVqZzN1JJ+q6HQNxw3G0COn2APFRxQ/RmQx+JEAyvvFiLkFkrCsEuXw5V5bxQ5mn8mXQo907GuJ2gsHYd3vjboAzEnS7EuKPv7jRwF2E9IJuEAmcrM7xcTEK/lJkk3ARNJYZOUBeKQhyGRD9eVFBLvq9SexnH2pwV3zLnfcTv4z8//HQCOYYScFALjOkvJh50FsW6OmuDKoqksJNo8DIjljughUEecWQVwRBLuWSf8pQjFgHkgYBAC94kFcKg2lgBSSHRqCAxZI/d8dDXJeHekhKCoZqYy1A/fvHG5hBDjQCB2IBkQBxuYh1EXwlG8zXkUQKK8zTRAen8AIKlAIIJ79CQCNd1kMQCUhmpCIwgyHcCCSIJR0b+Zh7KncsYfMYNDWhKpZy8Yw54Gb3KRHxlpxhUCMUDdn4sxHTxbHN78MVBp8BemGIfVd8WIYMs/+0gSu5CEwTbkRKrA0OILoDxJzqISz5qXv+dKtZmk3zs6+nj838VvVn1XVbzZnvt0Tra0v43tD2PtifvB42fcb37TPNXkGIs58OnvF7drt3MG0T6pwn9GDKMI28eweJtSUlqhFzMqTlJS0z9+6xr6fpoXVsWL3rzsRrbNg77XhiaDdFq9oUZ+46HhrxHPz5jYuo4qCPv9IUlTPNindEZCgjFmIAyxCOhd80Ixt5l6IQJrO8ezcPQfVrCZDW1+qh6l2hIA723rR90QakaiAHLw7t3xD/YLviFdIcboyk5GIceUBQyTs0ImO7K1N6Pf3qtmavjxFE2K+nd7mRYVVDRNtrCkBu2ENbQlrNYeGG3yswpN37cBaQ9ckq4NBvOg9DAcc7NMIBJC7mSGPwkv4jPA0h3gEDLbGBI3+KHG/evbOuJkPYkHLz2b9QsYBnHCOHJVbBkDccQCg/VkAETb54ZIxhZD8XOV4Sk5eOZQhix5RBkoyFMCE7wkT2kOhQCoa8ffMGMxbChWQ3pJIkCDDWF8ICDXn7FgxA1H+K2UuA+NvpgtCxbSwHlyXZDSZrjrY2LEE41kMZe/E+MgTvF+t209pEEMYBfD9AatxMWhc6YUVRwSK+QBACOQV8rSC5qNCjB/EF1Is5CUXsRQ+2oBdBmyJYUntqD4L0VDwpVKEI1Zb6hq/4Hfw/zzPr02abdTf6n9mlSbd2fsxMZru7lvEhig2pu7eiE5FiBSsfvpuvKQIls0K7ghBpe0Ihnucx5OjJk1R9bnxEUAiaPVzuqQ8Xe2o95eoxvPWkWu2p5YuVCiD5ahkQv1zd11OvtvJZh5R2AUOSg1nREeIhRyV+TCGQeqVWL+crAa16wyiA9NQrh4NKDanUi/5hg5J77F/OvTIJhu5mtY6ojRn5Qj70vGmvDaJRSHH4cFA2h/cBQoWHVmW/g+yomhxBcHZiXuVapqMhDqEZnWIcJfVGHjVfCKe9aa4nJJ0gQflYAE15WCH1y6ZWrjJkx1SZIK3c49xU7YlJ1x3pZgNqQiCg7kDCaaTZbHqnENwn7gAp4LMJJSgE2KPgLWOwL+Y5OYONisnt6L/sJywXWbqCB1OiApE9IKQQyHGy+BnXiti1zlprf1yBGkNs6qYXNGpwkGZzhqp3XJIakuEqbdoVggHYpUoEUAgYCCCnqZbSCLAlQ6QH1KBJQKCkIxAiBtk7w44J77QkDsmhxG/KJFFSXSzQgaRLdQqCCmIQKGYmJrzzEkC4oUqglymvOGf9064gO9Q0BpRIUegAQTz3kFcpp1nf9AyIzalPnJJargREDEqIQyaoPxqASGyuu8SaC01C89WQ7BBAIkIhjQaqx48NnusSwoi1i1RHQ7JAlrdMUUiD4x0hyZFztisGHATg+DISOq1wsZVZDZFjLSaly8/vFceo556zs9lvhImD/jVfnrfyfdc+antkoGy8EIjhH0K/jyGjo6MNjx9KO3LIZiNIqDscwlJKJNGAgV1MwPII0zWCfzH2B8Ux6vHTwIcyQJQhDjIEEpbkExZkX5PvniACl4OjnBuePCL4ICVEETI7wCCFoYhEpkqbZh2ihHQp8TUKucHxrkisDJpkBaowokleKoliC8UAYte0MeaIHlrko5DMhg0hNxwETwjR06fBpihrb6KuOwHU7qBIdwhDIn1ipVe0X6J2CEFGIR0klGSNLwBNMuQAohBusUbfjDmUIRBIKCpB1BEhDMIHReG2cqsdjV+kTRGIh4hHD3JgAyRdosWNHKJQCRKTCEPnEh+oEtVoRJQWAgRDzkiCDA7pEEwPBxhAcRCd836MIYiBMAx1Pv1TFDIOCG6JolwzaKJrKlX9WoNXToGKCRIYYYQDIlHIpx++SiKGQ4S9vb0k+V+U/vHx8YfYPHdT1GxeE9G0Rd8oRCOLHWjdQKiQTyur7/cs0uBCcQ4+dOnmr5ukYAgOVso/QiTeBY5COrdfIXAQRBgSB1n6uQcBRAc+f7QtLa/i7Zu9EhyuU6VLSukP5O74XcS7gDuJ2ABJm4JCeGCFUZcY83mRHe9XtXHUH28X3uNdB+kjycDuAe4W6hMkdeNLqOvTDwRDcNeKqknPEEgJEO0ScSyRY3H5R2DXQoIFVgikDwHE/ZBhCScFYsNsZ8ZFQOTWlaGBzw3d8IqlKoQBiMxfgQzI0KJx9XMp4AETnY5YgXxcYEifQFRCx0bx/2jkFSLfFEUHyEWJd5ty5/aWggtxZMMehaP3ViKJzxAOzRCCmM9o64JMYv39mCELq8tL4VuC9EnIwXNFB5dioNGXpjfs640O2LoVu8FBeWHbIXduc3YXUgcMhVCiZWQBs+MzDTGBSNyyuR4CiUx6gqgknv4diHx/cOj6VKk08miyZKcm7Z//Z6IQSXaIFYjGLKJDtix9WVl5qm2zAtndBkHYIytjZ8uOl4iR/ph6NGUnh1o7rR17V3tnEYHMUZkDxEMBJINCe0RjzAc09ctX+fh9qg6GhAopioRBGFvJkH31+/U6IINTg9YCMvL6+euddgSSCLJtbn6OQhfksU2Hf2t/m6PtTMsgT/dEIZFC2NH7VCDFYgRhiUz3iBJx9Ivas7PPnu229t3QJCCn7dg3O4TOqI1A4iDzc/MUIDihXKh3l/Rc2/U8vICiDAdRBmeFBV+XlxdpKfkkDvLCoRBEIAyKxpam5Kqk+e3q6CVjOYAE74bsrdPWjozYESvZOj8/S/GadHdhuglILAXGbRTfTZFQHApZ/GAQ+qhdIUYEQbsZUpQAQqQIopR47n9/0bKSYKwVBGO3vuH4SuvbZGD5J7fOcu55clV+Zm/GP9fo3JeXgvWQL/Qi+ISFfNVGPUIDq08hMra4axhiEiF2zDmCDtk5O/vmzey9e95Mky+eZoL4BJERIxBsAvlsWEInVhaRKUKOokKE4rqGz+iTKHGGWQ+5J/EmKI2Jvm4gtBSwZAsiECYFtMT/UAiaLZB+ZFe/g/QTZDcgLh0J1gFcAlRNRSEN1MZvSu2ltYkoigP4fAVJOgmOYmw0gYnQFnwhuMoiIMGFNi6KEaO4U3AhokRRA1qLC1HQFl24URQKVUSkvvCJiigVwSdatVoVH9/B/zn3nJxJRqv9JzpjnE7ub869c2dG/f824O0gBZnTNG/R1I9YCuSTtCOVwogwSD4PCUGwDkghAqFXJCoQRjz82fyXx18iz7wdLkv0QcB/PgxA35/TBqGZ4m2IFe5aH7Q11LMMkkcmv+KDt1+/fky+/SiDxDCuMmYwRjwMAYLiHeFHjoDoYw1bOpstZljo2tcgEhrihVAuut6LA12rHTL2ddQfHQvGf43vf1MQSDxxR/e5ciJx8WIi0SgtTyxfJpBnBzjeERdAYrG2W+IQk7yjts4JU69pev8CxuTY1++JlorkKROj+/39o0Hw8+N/QRKaZLGcSDVKqRXlxHL8X8kEZ55z3PPoQZ1C4pkWxN2O7P9Bi1/oIp+w8iEOGd0/OeEgow6SmFKhWb4oVSym8C/8PYvmp4qrFDLzwD2OBwclOT0HTyMdIglVIjeIxPmORnyntU+xMTI2NjYx+vZtEEyMK0QscYZBUggg+0qlUnFVWJpfmu/O+zOBeIB4p9zzreT0HLMMwhI8SJmD9+cxZnx494nb8Z7uT9ogweREkByfGJ/YP/bT3/+GhtQfKPyJMhQS9vQEy8NwX1gqPQ8XBUQDhBxXrlzx8FBoOhC57ZEJGw6XgvzW8frLly+jr7VVbz7ydMOSycnJ8WSAjGP+mEwmP36cGB9/XQBEwgArQyuCHJwCp2dmGNJHqXDmAzgIIo+FghlyR/cvCCIQkijEgk/CyABWCCQWH0lC5Hd1FGhjDTPicYyUOebgVyiZSY6+vj5AOIHdN+OlB1+WRlAHQagA9I5GJnuToBkhSyIMu9bqkmu1KcMKYQAhIVAIzuIr5Bgc9I655LWN6tHfLFGHQlz+BElEICRBmozI1S9VJPVPh4QZdvgKlMVgwEGQzQTJzp5G9KKWIa1lIVVrd0mJhCnNW90uWnYx+l+OEBCrR0fbwVvY13cUjm3esc2c7P8j2AEIC5pRB0/2bRD+frFw+0UCSAjIlIwWRfMLaRf4g4MMbkM8IAwyawqAVUMhxlCIPRBtaQpJDCJNgQTbOkncYsNcFdKt6CfprelGOeA46N2A4tu3zUupeQZpE8kdtTLiEMQgboaMOrRLRCV+F5qjs+kfFeKwIY5uzBAOOLTePQjFwYPbvRsugEiarY1wnNLCg1gdCsGrHZKikEPRYACgzeGHwG7jOEXnDlEgWkkEvzmN34NywLHdu+sep3TOmkZ4ejAIHWNdZQk1ThNK1/5rRbQkVhanMkdkaIjDAgg7tnh3XTLThswxCBJdQ3c2hzUD7UDrbVsZIypJucZbp2JIy8+DzjtYghgEji1b1nqXONOC6ISt7YlCEL6O5DlMnnHHjmYXF0TQKolHpw4xUHzHSOIllDXOQZAXLyDJcPP0XjM9tUMh6Bu+xjlo79xhJI4hB9I2BkqWNK1BEsOEEnZgc2dgR5KzhOMvWYN+Bcd57wUCSiatkLSLLuMMDg8Rn2JH2X2JSArcCm6GHwuapXyCcFRjiPgeuBoW+sMaduwa8o5z1uekgZlzW+duGH6SvvZkQ1qjxrQx3cMqiT6qEghW9foBS+bGJcbnmvwxPHnoeYqLrQwLIOhYuwSCLJMWPt7QkR5OD/tb040pbz+1IElJpOpL6DhrOsSHN3VsQcvGBFE02h0lhAWbyqMdKg7ZQpDzQ96zl5z5cpG34clwrpF+gl+NqRzxi/OIqh2SbE+zZTy0yMEU/s0thGEdq1UQ0I2NQtbCcX6Phycp9DxF7oDTuXS5FxB/ONFg2rnGisRfINbCgBvFawg3r9UR4BUNd3WTuBSiAv5txQo+VUS7VCC5fm5YIGsJMrTHO+AyL+FSftLIXRt+krh2/XoCAYcizVcGHASxg5MP7Guwyq0zSKBRDaOjEKW03qGtqNfqD/s3rjJIEMk+7A7vx+wYGhDIvZl/uXS7lmgJOwgSsiOQ5J2EV7UkOs/wx0ZpetyS5xS1GIKyotK/YmP/Q6c5LIfMctEtHmOkoyB7vHscQCQJeKYKHIgUpOlgCdaySBAAIpGC5LN4RTSR4vnsUE0HXlgRB0+D/irWPLzdo1+lezLI7j0DXj+C+3eFKGcKkfSsJLdQwhK0l4I1g3QRJCuJSHRliWyqEkXBsc1dkSzhgf7kZKV28jm+JqtflzcICrLHG3mA18jIQhprqfZMAUFByEEN16MESGdnJ9orHQZBOyIQbJVFA7SMVpJY4Djppg8bH43qiUq1kUVYo5BdBBm44I1cGRnB/fvCOUic8ldIB3eZ9b3cPN0vHAhDuvSam1owcud5o9TrLNrJqHwyntzGFnywqnLSb3Mg+efVWqVaWpqlCKWMc+/QwIUBD88g6Pa9u6PlFBih4IW3/FJIyJA7tcqdrEsUkncznc8zQPLw6vrq1SfqtdqjZmHEwRAnsfzRESTlR5Y+vrO6VlnfS5Y8p3wek8gAKtLHOdpj5w4BNSHR2BABJF8ZWV+v9iqEe1YmQxDqW3ijIN39tdW97Lt4YmenSMSBQCLXXiB03e6XmCN61oVjKe0IltUNUHjElHHu3XMBFek7So5BQJSiFroMj6cJQUFO9GZ7qyiKSADJANJJo13yov6wkYWPJfX1nVlnkVYJRNKFjSXOQfOmOGQ4LsUX8K7Wl3hHBBkC5P79C97Ro5AMAiISWXJVWiShdTWCJINeR7hzoopDThKGUEm0dVsf1l9oh0MDztbO8ir1KdIBQmbNqvpt34JLdGWYA7vRYDecIobInsuX7zOEu1Z7SOIeKuFXy8ARyMiJLIWLwhB2GGTV3lp/NxqSZQdlpH6RIdgYEDnDNSXoTxog9PqweWIQh0mWOggqMnD/8mVvEA5AulsQVpTuNa3poWD5uFiq3Vkpefbq6jCvbFiBbFi5slgu916pHyqVy+UiPuXgLzacvkVrKzmyVsS2nL5XpbKFPsVfFZGVGrcXzRpIGMIVueANDvZRCBKntMWKgiFSrfIxRdBneaRQRXILcKxw2rpdqWz1EVeQjKR8YmdGf0hODM1uWHtqBbH7J+lVSzHMZTe5TI6iJUFFuGsBgs7FED/yMCGqiT4WFUmhwz9cw8iw0EgBJJdbsACQxsN6PxAIQzIIiDCWas+5e/OwpbYoZFWlX+/SCGEMnk7BEEfOZRkkDrJyaGj3wOVNlxmCdw8Lok8T4jEITlqVatThipJZAEgu87hau9m9hBroINqABaCsry/imnRqPxfIyTM0MPykDg6D5KUcUcay+cuoJPjxzpW7AVlHkG2D9O4hha8Og8THPz/j6fjNpx20NhFEcQDPh9h6yB6c3WQ3i4alwRhLoacIQgiCbTcnI0aNnixBpCAaYr20RbR4ETFepJGENqh4aLFCNEJEpIIiFaFfxv97M5NJ2uq/tknTTXZ+efNm3W370TzPDQ7fYPmaOx2G6fzru3MPzFAkBApFufZNPosekwuDBfDvaFYuVIcdgCiG0AqK7xPEBaReX63+2ordlsmAoBAmXCD6MBIwGBIt65nvKhAtX3efhu3nz/cwOh07pRyIT8mjTfg5PsIQSGYrfRAs/rQOFUS3GDM8TgAJvYqGtKoEWVkBZFRhjWquNlX68noaT63lCAM0kRAhPj9/fvd10R2FcOMA4qFYzNmstIV08Dy3advoIzfUKMMmh4H4o9VIIoAIBWmsVhe2YmDcgQQQw7BGJbVlmWYU9QvH2XGiEPVTVIi0kSDo5433G6EvcMAegwAQAoJ/dIs2oZHJ6UHdbi1HGWs8jJAQODSDHAEYFHoyIivya6EaW7mzuLiy8rFkRm6uJZj7nD5OCWp8jGy+smjqU/dqC0NCLwg8WrYYAo6dYggQNBs83EAyN8cQkvCmVytrlomRmIIAoRlwGAgyhMCBrBiIxcl+n+TboqXD1WlWoifOyUJl1mYIr7a41RAvSAZBSKPTwXaYVgQkCBz4ObWJLx9JY9O1aNn6D0Q6EDgUIx4HpKAhjd7qrzmG3Ly5eKdkHJyuv8mv1hm7ZoALAk+iqHm/eYwqwnMeFgokeACQZBD6bsI4wKNycDy+E4ablcunNzin5+fX7n892qGXLDikwjhIUvO5dQBprLZQkUWGLJa4w80FjrbVtikvlwq2DEMm0OxPvlYKx2yXD3FoYC0BJIQDEkCGJSGvdCRZgi+QXq6MJFpTYzcKcmgI9sMK46DM1No+986VBpp94VYrBsZFXKwrWWMBgyApFUWBhC/p4sBuU0FCBA5dEkwX7AUQAUhKzwxuHAjxAx1fyE3jtKlqJ85QpB2yxeSkYgdDHMeJJz1ZkcKAIHOtGK5vrV+8eAhSK3bwKjp01sSX3njVOqEgaTjSOoLeen63Ak9MKX+KIHDw7pUkTiXxeVOMhiH2SLgeYzMLDjaYcjhIMmBIeKqx2mgsXFiI3Vtfb95bv0gQmz849uQ7zzjU+b5NFZG/vNEQRcEXetUhBHOLwjMDkOG8pntHQkzl5QgMhFvMOCQkm0VJpnlJLtRbq5haC7EyQ9Z3xy8GqjNkV2Z4MntsgitygisCRKAdEhLEOZ4vT0/onXDxqB6BvKFWYYjj4Bu5whGZ7bYJjUAVJHnAAUjOwdxCwsKlLUytxw9j5XJ5HSkeuBiYMg6KkqAiamqlUJHQA8SD5wAk8PnsjzIlG0dFjQSQEBCe6TCzwp1CEkpj6oGC+IfqQZAsIFyStVtfGlvXH28TpHyvWS7qp5tXUQYxpDCE/yyEIGkUBAFESwxEYFyw8EAwZANREyrta4gneDP9/0+l0cdCuWRpglIoCApP2Xhcffvp4fZ2bKfMyXNvHnAIhHfBYcgJghyXEI8cakUdh0CCkAYQNQwT0gdm7THnXXp3LNEHdc8bc2hIDtX0BZbfW9XrX1pnHwPyrF6uP8ub63fGoWMgvPwCciaFJlQHuVBK8ICGTPvDJ0GnVppRie8RhCUhRsMR8os8SzEH9SMhOSqJXH9PnX1VbbR+Xo/tPKs3dur1vO5oRPeHOCDREPw+zEqItIYEEoLGw3ShAVMb6rf3aIgHiMMQbtmQzvhMBJZvgkyJf0MmCULQ86/+AIKK9HZ6vXq9d172Z3I2ITN0GMq5jG1NnEToolZCbHhBIQOCgVA3OArCEgS6pBrBKIRbJJdz6L6Oj8/paSIZCL4hh36+YyCTDhYKFxV5GNXrVQ3pAUKSqUyHNKVEIl4STtcRIuf7OcfZFSJe6mTsrDg+++P4hGPZbnq/FjzIg5CHJpOZDLNFT+6JIZpCukOQJENygGDjwIPFcCBhiEUQPpMyECIg6BFAckmeWld+/nn7prUNSG8w2BkMzgvuzlIHjs5Mx92f2TvfPyXSP+Z3a/P7m3tib+Zz5tyH7tRSe2LzQyfhpru1IkE+tLvvZjtL3XD/ezepIMG0lvhHQgIJQbAxHSY5hAmYIlyGuIIcDHFUsiqTeOvi07Smzd8C5MXZG7FBb3C/9wgQlhAkMbN01V16sJv+S4j9s7YNhGEA94fopCySrQgNh5BAmFDo5EDAQ4Ykzl5H6Zh6t0ktrcbpkMme41rYgoKhyZAOIdAONYZq8Hfox+jz3h+dL4T2dSAQ5MDvntO9d1cwxjYE2di5k9l51OoVx8cL+3n+fG6zItxmLddtZcVRduIXZxtv3hIQ2XRRNMOF418QXb7PJR4ulAgiu7rxkgsHQZx9crbvn64Gp7OyNh4Pf4yH4y6Gj0MOGlFav7AWzpYVnsc2j11AWOEU9kV08Qb3cI/efC+qA+I//kEiRWt1lK6iot1jRaQgNEECAfH/AxESy5WifQ6xCdJAIOTYgZCBV4SrQsfF5t5afHo6HdxMpwShkhArS9NGnqf1o/nSW26CICyWi7Nt7zdbpKm16vXO64W3yt7VkZXvZ5HrtrfZKsqzIlj2lla1FFGBIReA1yAOIDEgqt+raCRkjyDkwLzTDgMSWzQeJ4PR3eV1p1MbjieTMSBMrbJyyaItFC/mIRH0O3GDiJKnJUwD1axXef6djuPSAQgvnIcCMTFeTwRdbfevSEVJ7IaE6ECa+CgGIJCEjoV/0/5adkblr7I2HJoQksBhw6HKixlKQcQ5nFUQCxW1fDyH3qASkRUYM9xYtZxmGJNEO1QoBDmgM5neOFN8cBuQKGpaNIgfDsvZuuzXkuEkQShdpiUqEC1RkD0Dwg1CAhVjOxAfxSn0kLMLwS8JiUMNUR4pwdtOqy/y5JBqveIEIUHxL5/9nD1draf92mSSwDJpM+ZVEB0IjSoVg4USQSTInG+hCFIVdUSeSJND+GlOQZwXEKeChDsQx4DQVhIQX3ZT8UIRJNKQkC8V7bv+7HL05ZpD8NNldIUJgYIIBvUqclBViVAgCqIlTGxoTYj/EiITgzkOCbLbsLXkLSQYLbnv1QsvAFQGZPAwfbh5f0gQqi5PxDYhGGf0XSWh+009s/blaLkSArarErF0g3NfQnQiCmI8UL0lNqWuHQikqSUCEtM3Pt+P1g8367KW3H5Lbm+TLs0dE+KrkicOcVErIF4gE6Ex04mYTc6XzziqNMRViTRNiJ5censjW6GjXhJVJMF1yqjT79/1PxIEnyT3PJmJcGgISkDY37rtWDdtIIwDeNSqfYg+QNUXaF+gnrqdLDpEDS6q7VOG2NI5FylACIPVBqx4iIcKak/BSCyNPYC34qHQGiRLlIVX4C36PxNKUNtPl0SYgO7n/3cyGHMPgQMQzPF/kHsJHvjwIPBqH7JdI3u1XSeIRLzM2j+o/w0Rkg+yVJF6/dKBOhx6COX27QOIaB1A9iXbRPB+5x7y7CEEC2ofIgqQP7tUzHnXWs+K1tps3IegRJh/XvfuHK+2EBwNi8KOeN2SWb/b7a8AUTxYhvkbSLbv0v4Fwb1/EnleQF7s1oj4H9H3exARyDaRYjvqrzWyU+4kIhIRyC7P7SLZHgy3kpeXoRNWGt1+CkhZLReW8SGugvi6qZvT8YPCRw/i87mvn97jCuFf+ObJj8Pz8/OzPM/HVzc/DsXfcf7x+80t6ujLbS7O71+dn3/+PB6fnea3eX5yhXsO3339jluo/OOn06NN3eYnJ7k4t5bjNCEGLn69wqno05vPh+Px1Zm4E+dBb4vrL9/Vj8Qb8/q7y5E2iS5PoumRn4aWVKnN590DTyl7CiCKp6rTqYpX9RjX2HQsqloVA6UMFfX628nZ1fnRZasZqfF1Z6TyrNquxjzIgjgO6uU44IMBIQExZMNot2VNWxqyFgwUxtlgMKCmNaMBtawZuZty27ZmNrUo4ZxYlkUtQohFXMa47Lu9paZpeA7GdUKc0A/dxCaSlC6kbmLbdnc+T2ohS+bMd5OUrueNeQqIgjFUBEQded+ui1KEAbOEot0uIMoGcnZ214o6kRe3OWckyzjLeEAAyeotbpqDwDRN3ZcNWY4FpM0AsUxqAWJi0oQGQWCSuwvZTlMbRTljliMgDuGWq8uG6/uusYQEz8EIStcBoaEeOtKqUcJjQrvRdWorV1qnzCVUWq8aNRxHoNhARCTeZAMZ3kvaAiIiQULDzuQEhUtxptEo7nijUZwNDbU1zLK4Wo3r0bFFIKEDkQhjAtIrElHb4negWVoZyQQDk99Fhp3SmT2bUUwUgSAtSySic0Z81zV6kMiyzBEXc6hv6mHiJImzWklJIoXJopY0Ft1wVXN13UnWpca8dvAUXYNRQNBak4eJAIKfbSJe81sdZ4kvWpE6HcZVzngWZASNBYgCyIibqBDd5ftib8aGtpSZNjCRBUVYM4poBiakgLipjURmpkikgDhChJ3vF4kYxrJsyEzuMSLrFhIBJNSdkkhkUUJvNSBqVOYOoU4NS2T95OCRh6bqNJsYUdTsTCad5nWzIyDHMECCgSoSEZB3l62pOi1ncQxItmTliSISieP6RRuOGWYsWsvwudzTyjIHhBNdpiKRUdQOUEjkomdvComQAkKQCG5wpvtuAdEKiGzJOvVhCH06022nUUpKUtKt1dKUNipSw0mTynzdrzw6ePzo6QQCUZPLixZEnc4GAgJKJLIsWssD5Ev9S0tANB555TIWO8eCDLBEACkTtJZJMCdAxKL92WsDYprH2NloIzOkYAZUQEYuVjq2Uaq7jGLNh3A4lDi+D4juGz97miwgPiALR9IXqe84uu13V2mpW1p152nJcftuf5bW+qX5k0ePfwM/A11X2WmYLAAAAABJRU5ErkJggg==", + "description": "Displays a air quality index data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'AQI', 1);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json deleted file mode 100644 index 056a6c735f..0000000000 --- a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "horizontal_air_quality_card", - "name": "Horizontal air quality card", - "deprecated": false, - "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAnFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCg0mHP6bDv9+Xz8/Pf8MqQy0av2XuQkJDOzs73+/K/4ZWsrKzIyMj5+fnp6enV1dXb29u2trZYWFiIxznCwsKg0mC8vLzQ6a+enp643Yin1m6YzlPH5aPA4ZZKSkrn9Njn9NfY7L08PDyIxzq33YiCgoJ0dHRmZmY9PT0vLy8+mqJEAAAABnRSTlMAIEDfv1C6kOEmAAAD3ElEQVR42u3a63aTQBSG4WrrZgIzkHCGAInk2CbaVu//3twMEFBR2mXtol3f86OBbNLFC9ODNlcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr+nDm6czPl4bb93s+hN3GBG9ecr4eHWj6B2Ibq5m9C7MEDIxCJkahEwNQqYGIVMzGHLIhSmpxyiJgoS0cBHQRRAkAU3il7WhkFux2grHo87DWVGSKKWIgix8LHnD4DxFi0UShkdlUDV6AvnZph7vsnfLg25u731LErtMb4k1o1P7qUbvCL/KEhZ1srKkRbA4l0SPISVZmFFm3D+cwwU/uzgvv6n74CkZphAmXdjb/LLnizkxi+f6MHagi1X9snbk3NWHjoYwux+yflBZFRJUTSEZRx0SlllQhRg8K4/GEzocsepd2pxPaTBkJ1b2rfVF2JcXCtHs8Gc42XOR342GSFs77YSkO9murGN2DpuQ+wUFD0kVckzu65Ajp2U0bs4XuWOt9vvBEE8IWT/TDVdiU48dYl+FORoiWnsy27trnInK+ypE72TfDHV8/G48Ph7LKkQdF5QFNEryWUhJPdafQmx9SS83zxG3X3JPLzGruUPeWMjpc80jb+ebQtLvVLngD9SjjG+KRuiT3FXreyyE75yzkdSx+cmVjtPLTT/ejYT87MCve5KypHG+ECt/K3JvLISXjhA7q7ckrSpGrxfZ3CJ79GskFz0OvaC5PteV2I+GkNzvOKUp9r4IWX3wnhXifZ13fO9lQ3x9xpvxEGY74tAelfO58G4dUBHDS+uV7MVmKKTd3NbHmGSZh3pz2/4Qqe2ItnWcLRwaC9maPSeqKRqgYvrJ6A93W/+2sBMWkbyEdMNcUjXdtJvzJkTy5ZeMv9CbkcdHjYc4nZxvoLasYxTFKWlRRNHMrZ6YUcT7cRBTlKb1IBou19+NfLO7mPqxP5xveCqrW+Bs+MBmGflN0FexqT7k23leXZHnLK2TsC4hSeKmYejyVkFFWqyjZeEmSeiuY3cdEbmxWq9TUq4euOGaBnjVd6OVbNfRL+fiO3rabdqkOeLU3jOvGXHSM0J2jinsLsRdqtCN3TokTlLe5ufi1C1CHTJLUw4Jl3GoOLdQNMSTXv1IQ6Se9jeHj7IcsenGoyF+nu+pFrhp4S6TsFDVHXHXabFUy9AtOGQdhy5VIVF1R+J1UA2SoqD/STqHl/mHVRrTnyVhSq/gRUKi6G9DRU8xiZApQsjUIGRqEDI1CJma2dXNO/gzO5G64TcMTOL/bv9NxG8YuPp0PTPeuuuP7+lNNQAAAAAAAAAAAAAAAAAAAAAAAAAAAACv5AfYigaXSHbHzwAAAABJRU5ErkJggg==", - "description": "Displays a latest air quality telemetry data in a horizontal layout.", - "descriptor": { - "type": "latest", - "sizeX": 5, - "sizeY": 1, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json deleted file mode 100644 index 1965615e49..0000000000 --- a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "horizontal_air_quality_card_with_background", - "name": "Horizontal air quality card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a latest air quality telemetry data in a horizontal layout with background.", - "descriptor": { - "type": "latest", - "sizeX": 5, - "sizeY": 1, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json new file mode 100644 index 0000000000..c8b5d12e1a --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_air_quality_card", + "name": "Horizontal air quality index card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCg0mHy8vLQ6a+srKyQkJCQy0bf8Mrv9+Xj4+POzs5YWFiv2Xv5+fn3+/KIxznb29u2trbA4ZXV1dXHx8fCwsK8vLzn5+fIyMi43Yio1m47Ozt0dHTn9NjH5aNmZmZKSkrY7L2enp6YzlOCgoJLS0vt7e2dnZ3U1NQhISGmKTEOAAAABnRSTlMAIEDfv1C6kOEmAAADrUlEQVR42u3aa3OaQBiG4bRJn7yynEEOAh7xrEna///jykKrtjZK2iZDMs/1QWGXD3sP4OjIDREREREREREREREREREREREREREREdFb+vTu3Wifb+/fO//2S9VxH+HdU/efb+4UPoDo7qaHD6HHkI5hSNcwpGsY0jUM6Zo/hmSJGB5O+FvAylErbAsHlpVbUGgU+c/REa57g5CFGDNxYhzNS4U8V0oBVlisttWGX+Up2HZeFGvlQ0/ZllK+zrYtvV8f1IpnujgRuxcOcJfZJj6OXQzBAjDFxFH4tK2WaZdPwKpAHhYhQn8/Lwu7GrXLQan2lg6xwlWIh9Xa8h9W2yK05q0yDBEDB+4sMfCbmSSHYyvOBnqFRpt7xD0NGc1VqEMs3VTAX9chxTa0dIhfzW0f/DrExje9a833Vol9NXid54hhLvCDm8gh68ATEReaI7uN26/2roZ4bm2zEw8LD435OiyLHyF7G9Y81yEP+b4JWcN/CHEIWesQuygwL9uE9CXDkWksl2chpsxkWm80V/xUjKsh8tMShkgGzS+Bp70OqXfC0lfrVemvVuutDlFrG6F1CMF8FVp5OK9qihBXeeLA83DCPAvZySJJdIEhS1RikfhayMZsxIh3mSEezqknu3r5ZcQv1dlRaEWvZyfiLC6ELGSHaZ3gHK4w90LIuUxctPK0xd/KRIxsJkn8fEhfTLhivCzES+SEg1fXl35zzTwf4ugLIxHvRSHxtH+UxXhVx3s9k+mzIaYk1VocyXTABlrShHTqK8pSpldCZtJIgGlz2EIE10JmxonNpRtXPf4+oPAX3PoTdScm4P0xxBNZeBV9FlxJvDqtfz3EOUpkgdqgiVF4TFGLIkS9QA/0EAEYW2NEadpMRE15W31xMkOcemXnIcfdTGb6RWZTRxzvQsi5jZiHkDwP0skkqLaGGKbDUTQYBnk+CUaPwSgCgrEajVKooJ4IJiO0Fk9FxKhXNvtTiPNjFW79yWY6UpniBSE7xxD3EPI1GKhJMA6akPHXtNquxsZpMJzUIb00rUImg/FEVblDhfZiL27e0YbnuY7M4va/R7IkWaJhBekwGOSTodJnJBilw4EaTIJq7HE0ngTQIZE+I+ORpSfy4RCvyXOm/+eHVTrG875OUryNfw+JokuTCm10IqSLGNI1DOkahnQNQ7qmd3P3Af5mB9Rd9cDAB/ijPaoeGLj5cuvfv3e3nz/SQzVEREREREREREREREREREREREREREREb+Q79h0E444zJWUAAAAASUVORK5CYII=", + "description": "Displays a latest air quality index telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json new file mode 100644 index 0000000000..88ac73bc03 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_air_quality_card_with_background", + "name": "Horizontal air quality index card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest air quality index telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json b/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json deleted file mode 100644 index ded7c3aa4b..0000000000 --- a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "simple_air_quality_chart_card", - "name": "Simple air quality chart card", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays historical air quality values as a simplified chart. Optionally may display the corresponding latest air quality value.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 2, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-value-chart-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "", - "hasBasicMode": true, - "basicModeDirective": "tb-value-chart-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"US AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json deleted file mode 100644 index 0d12e00f36..0000000000 --- a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "simple_air_quality_chart_card_with_background", - "name": "Simple air quality chart card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays historical air quality values as a simplified chart with background. Optionally may display the corresponding latest air quality value.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 2, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-value-chart-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "", - "hasBasicMode": true, - "basicModeDirective": "tb-value-chart-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"US AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json new file mode 100644 index 0000000000..3e83976e26 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_air_quality_chart_card", + "name": "Simple air quality index chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical air quality index values as a simplified chart. Optionally may display the corresponding latest air quality index value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json new file mode 100644 index 0000000000..4e05bdf267 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_air_quality_chart_card_with_background", + "name": "Simple air quality index chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical air quality index values as a simplified chart with background. Optionally may display the corresponding latest air quality index value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi" + ] +} \ No newline at end of file From e996799d318578c0fac7762b580022dc4d3097d8 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 17:14:17 +0300 Subject: [PATCH 31/39] UI: Minor fixes --- .../system/widget_types/horizontal_ground_temperature_card.json | 2 +- .../horizontal_ground_temperature_card_with_background.json | 2 +- .../json/system/widget_types/horizontal_radon_level_card.json | 2 +- .../horizontal_radon_level_card_with_background.json | 2 +- .../horizontal_volatile_organic_compounds_card.json | 2 +- ...izontal_volatile_organic_compounds_card_with_background.json | 2 +- .../json/system/widget_types/indoor_horizontal_pm10_card.json | 2 +- .../indoor_horizontal_pm10_card_with_background.json | 2 +- .../json/system/widget_types/indoor_horizontal_pm2_5_card.json | 2 +- .../indoor_horizontal_pm2_5_card_with_background.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json index e3c564e861..288150a435 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Ground temperature', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json index fd5124632b..540398dad5 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Ground temperature', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json index 8821cb4a43..0897a44fca 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json index 65ed79d5bb..7f37e96933 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json index f12df49c7f..1f4c86df24 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json index 338183a297..92618265fe 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json index 6eecda0f21..e2fffc09fe 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json index d1ba92cdba..c4c1081b27 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json index 1d05a49308..e2fe5eb634 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json index 15e2dd67a6..c8479d0df5 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", From 7e44b4ff18a856dfdc07b4f8c846b4ed206dec3f Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 27 Oct 2023 17:48:03 +0300 Subject: [PATCH 32/39] UI: Outdoor Environment: PM2.5 widgets. --- .../widget_bundles/outdoor_environment.json | 10 +++++- .../widget_types/horizontal_pm2_5_card.json | 30 +++++++++++++++++ ...horizontal_pm2_5_card_with_background.json | 30 +++++++++++++++++ .../json/system/widget_types/pm2_5_card.json | 30 +++++++++++++++++ .../pm2_5_card_with_background.json | 30 +++++++++++++++++ .../system/widget_types/pm2_5_chart_card.json | 33 +++++++++++++++++++ .../pm2_5_chart_card_with_background.json | 33 +++++++++++++++++++ .../widget_types/simple_pm2_5_chart_card.json | 33 +++++++++++++++++++ ...mple_pm2_5_chart_card_with_background.json | 33 +++++++++++++++++++ 9 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json create mode 100644 application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/pm2_5_card.json create mode 100644 application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/pm2_5_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json index b7fa990e7c..cdba1b55af 100644 --- a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json @@ -165,6 +165,14 @@ "simple_illuminance_chart_card", "simple_illuminance_chart_card_with_background", "illuminance_progress_bar", - "illuminance_progress_bar_with_background" + "illuminance_progress_bar_with_background", + "pm2_5_card", + "pm2_5_card_with_background", + "horizontal_pm2_5_card", + "horizontal_pm2_5_card_with_background", + "pm2_5_chart_card", + "pm2_5_chart_card_with_background", + "simple_pm2_5_chart_card", + "simple_pm2_5_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json new file mode 100644 index 0000000000..b138a18c34 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json @@ -0,0 +1,30 @@ +{ + "fqn": "horizontal_pm2_5_card", + "name": "Horizontal PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAkFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4ODv9+XQ6bCQy0bz8/POzs7f8Mqv2XuQykb3+/LIyMj5+fm3t7fA4ZWg0mDb29vH5aOIxznCwsK8vLxYWFjn9Njn5+fV1dXY7L2tra243YiYzlM9PT2QkJCn1m5LS0t0dHTt7e2enp5mZmaCgoKdnZ0vLy8j+senAAAABnRSTlMAIEDfv1C6kOEmAAADWUlEQVR42u3aa1PaQBiGYar2yctmc2gSciaEk4Da9v//u+6uiFMcEVt0kHmuDzG8Ycbcs4TDwICIiIiIiIiIiIiIiIiIiIiIiIiIiIjoM3378lzG1bX31Q2vv5sOL8OXF3hXg5sAFyC7GQxxEYYMOTMMOTcMOTcMOTcMOTdHhcxubz3MWqC/h3c7243OyWshkT9VeDK+T5f9+DewWWOdbu7taJQGOImkyn2Fw5SfYE/i++qIkFhE9HQXkuJhNH5IvfESHjZ2SZY/ZziJXAzd4aC5qP20utYSvRkyF6tWTyHr8Rjj281stgTSNYyR99DiBJRI1OWicZBeYU+Uq0Tmb4bU4uS7FXGbh2WwRL8OAAT3uL3HCfiycv9Pbbvs30QlMLppZ28bkfiAStwEiR/Bygut3gpR8ij+O+TXBkss1+Of7QY/H9beaUIKF5LAEXGzGEgKewLyA0Zc23Na2ElemY0r8GOpjl2RCq871aWupVJzibEfEov2ff0YomMbIvE0F6mr6ULmJiNBvToUkuSxD5vtwj9eJ8YieREiooCpC/ElsiE1gIVUdrpAJFqLfyhk4VYif/up5GQrssq15PshkU3YblcaJsTtFuJvp6o6/PTbiWHvF3X4DJV7VGmJXoQsnkKUxC9DnEMhyq00Ps3KPT5i8fdC1POK+NK9M8SJReydq2L6xoUd3O0PArxfLHO3ItOnkG67SrVE22uk0HhviOPnEZCI1NgZPcYEuCvhZBmyYWgHQ2QAJrMJsrJ8PGAGxydFInFeiN5dIzqf1zYkFz03ez9MQfX+kJ2kFv1XSN+HZZqGZq9BUzZtNmrCvk/D9i5sMyCcBG1bIgjdgTBtcaypFpFCPYeYWzYEc5F6ZU65EvUfIbu3abuQcBSk4SR8DJn0pdk3s0kZNqkLGZalCUlHkzQwuU2Ao7kX8l0IVPI8j6SALk74Nj4sm3DUp01gVyRsy2YUjNLQzO7aSRrChmR2RSbtzB7omwbvtQvZihYdOi3Vh36wKid4XZ+WMP43xBerwIeGZNmhgwH+XZ7jiariecSPul8XQ84NQ84NQ87NBYXcXMDX7EBwM7jyLuCL9sy7Ggy+Xw+9r+766pJ+VENERERERERERERERERERERERERERET0Sf4AN2T4354zjDoAAAAASUVORK5CYII=", + "description": "Displays a latest fine particulate matter (PM2.5) telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json new file mode 100644 index 0000000000..7eafc28272 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json @@ -0,0 +1,30 @@ +{ + "fqn": "horizontal_pm2_5_card_with_background", + "name": "Horizontal PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACKFBMVEUAAADm5ucjJSg1NjqWl5hpa25ZWl6Dg4dKS1CusLE9PkHFxcnf4eFSUlYmJyvj4+Xg4eLi4+Tg4uLi4uL5+vr6+vv5+fns7O3g4eJ8wyLp6erq6uzj4+TV1tb4+Pji4uPS09PQ0NHU1NTOz9DNzc7IycrKysvOzs/o6OnX19jLy8zr6+3k5OXd3d7b3Nzn5+ja29vZ2trMzM3R0dLg4ODe3t/Y2Nnl5ebm5ufx8vL09fX29vbf398qLC7HyMjw8PHk5eY6Oz41NjklJiktLzKGxDczNDc4OTwxMjXv8PDt7e6MjY88PkEuMDMhIybKy8tCQ0YsLTDt7u5UVVfu7+9WV1pFRkknKCvU1dWzs7SRkpRNT1EZGx4dHyI/QUO2t7iOkJJtbnFnaGvz8/O/v8CvsLF6e31xcnRqa25SU1ZISUuJiox+f4FPUVPExMSnp6mio6WTlJZZW12qq62YmZtbXF9JS00pKi1eX2KfoKKVlpmEhYhYWVzv7++Cg4WbyGNLTU+Gh4pkZWdhYmUwMTS6urt2eHpXV1dzdXeQxk2JyDq2yKCam52tyIuBxCzExcapyYLBy7exzJDFz7u00ZGlyXifx2zq89/Y3tS+yLSv04GLxUIWGBvQ2cbJ0r+9zKy4yqK71JuzyZegzWiZzFvLz8bEycDE07LK5amUyFODxi/x9uzC4Zu6346r13Pi79Ha68TN277T6LbA1KjV3srP08qnz3WUzUon6lCrAAAAFHRSTlMAICAgICAgICAgRCBAz8/f37+/UD4zgOAAABGiSURBVHja7MGBAAAAAICg/akXqQIAAAAAAAAAmD26fUkYiAM43oPPFURvGmrsXQUuVpS4N8KSXgR7MxlD2CC2I/fgHNNNbc4xdBPxz+62bGj0ol7Uq/twHD+O4+DLIQiCIAiCIAiC/Kf9v3VULGby+Xw2Bed4y8SKsUxqc7q5n/tQKBQOEweHhVw2OYFycH1KMo5PsQSO41WIIGio0aAoiiTJ60R5S2VLLXW+q1arlMtkg6Ap4uH26tUZBouFqq5VFUSuGyqKBuSV4Xmj6cDqOl1nMPU8QYKYmSEN4cwYgaJF0ZjjfZ/nzB7bel62m+2nFy4E8AlfF03dFEXetn1/PPbtkxLswNKOrZCk47uQyo9CKlCZovEqUcVuLi4dph/0gSzLwNQnrKuoINRWC0mAIY7lWNORJwgCw0jGLDCYeAxmKxmEka9znM7N2cdWu/nW6SxZW1urWsSL87lo9iamzsFS24atYmnvDPvyIUTcsRPyu4w0hK5iOIbX63f3FtNfAxe8k1q3vUlDURzA/QK+84FosaWQMCJ0IDA2xSBkkQk1IStttpIwi6FUHjJgQDZAMnwgvNiH9n9uW0NqjRr/Jb03bULOj3Nutul0VquVBka/89Uy+uveSJ8ML4c3d5PJSK9+cCDY9BaLjdVqWdf44RV10JVPjl+jHaXa1NiY25Yy0zStpnUbt5/U6XQ8HVNz7t+DwX+y9v8Hgsnae8MDkpUSUuiy2jG+XquqIjePay3TvFas7aI3H+l3w+HNZDSf0FxBsF6s1mD0+6bRsgxjOVCUpfpJk98eH7//dqJNLbO/scZas9mU5Vr3tqGMxyqks5nW1e79g8ML8Vcgz/F2Hw3BtyaSiWRk2B+3vqjK9VI7KXZWi6/NgdVf63N9jm6M9DluQDFJrwcHnSEMogWEqg4amlwsnbwv1catzWpjTbvlsiwXAZmhI58ajVsoarXiT8ghleYUUqlUTil1yud39fo7JwWfHPmlUDh9/oR+ghwX58++3/R0ff1hVF11FhimlVm9uWpfnONzft5uX3w/v7jA2r66umpfXg4xbCPIRh8Wa2S1MjfbjmFsFvod2lddbY0OsjVNEwevv8SUoT+yC+EKz1gePcLHkwd+eUjXQ6x0c3d0owXBFz17xfLx6PFhIJvNZ/LSQTAYSyWlRDbAoee5XA4nMke9P8zFOY7nUUgmk08kJCmZTB3EgsiZKApCOpQWggdJKZmKielwNBoOh9JpAcGbiVYslREbwtcdB11eBy6PYYfiZnfPHI8cx8uXR5U9lMgHMjaEOVA/JC4EjjgcPDmyzOFAwGAOBknh0ZkQCiMhB4I34erbUrlYdjrC2Q4g/q4fMLi1Y89I9NCJ7QAECoLUn+6jai6TjIliMCXlAzwHAGJDEIJw5MhnieE6wGDVonIhGDvAIyrddqTtN+hPE5CiA9l3IT6W3w4WW9jKTP4Q5GOhgr+Pe/FsKghIEv3g4pAQhd1dB+86wNh1oNZoWBDZnFHtIUoawT4aiURuMVq/QHwcuLwYZ5Ro3T0trsMLOXpXP328F5BioiDGpABHVQNjJ8eCRxwg5GAMdkDssYIjEg2nBZGOiwuhEIOieDrif9S9jIc/Ja4CcRZPR0hCDkA+nz4/zKfOBEwWNYR3/5FAGIW1JBDI7/YDEGd4EMyWiNinAsGNGC8oy3JRLpdcCE2V/0n3xi3emag/QNCPH3TW/UsacRwH8P0R187P1vC8fEjJcvlQg8swuxjJFsXAoB/8USZNYbD5UzRkcGQmZc9Jtuy5VaxW+/v2/nzvLqTdPtgV/tLn5efJ0YWZSbm3O4yCzAYjYS0mglcMB1dGQLizHuccEISimGkHeEhYYjsQqNNgKBQC5PPYxNjEhIC4e/87604QJligzrF36C3RV5MYkIEhF3aWKrYvRzgOiiUBRThc5sayHPyDxJE5Xli3cAiIpRAM/xRLvrz9ju+UDHG7rdZyQuBZymTiUiknSdGapGVKnDfe0p6k71QRdsgvhnkoYv2vzfSCiER/WLMgLkjMAYHDhnA5zOEWAYpdEJsBh9/n9zPk4zR/FbMhzOig/Dq/2360GLViKmqMS1K+IBWK+RpyNXJF2Z53PJ0h7FiQB/pc/OnHAQmK1DApif44O3hV7WzsHd6bm9eCAGyHag7GeuPEdABhleN0ZWXXJyShT+l0ufzOhPRC0bl6b4ioemdfQ6MoVXJGpagZKUmT8lyS1HzJRvAvRwgcozMvB7pdSFBD++ODVtH0GNtgBA4xHt17hKjeis1rOQBB1rO2BZAtaok+gwHBjrV6XadlSNBdc++zZVTEggiFLdkjjstta9SNgmFIRiZfKqUkqVjgCuS0Ss5EWI5/hwSQNx9eDLljcZ6JcCTBqaAxoqiH5uLRwIjfE53d7lEVDpMhHKJsKlprVqxcRT/myfdAYHVVaHlz95S2fELyLV3OjndC4LDikkRcswIWVIQflZSckqIFGanLta5MzdEgZDZkVB7mlRrBhEeC5kkIeNRE2OXmdcsTfkjH2GB12scFQezv44Q8tB4U3O2zwzOl1VIQB7QRfNU6CRy0D7zek8YPTIcvubmk7wqI/2s6OzJSBsTNkM5B3yYzboRDQLrwqOW7Ul2pgjGfy0vzlYJmba+nDH7HrgggyDCRwMesBLApvd4eBY4+dohbfkgXGkN24ACYCBtrgxaV6MkSES2Szl+zFutwUJPf2VzFA4JkcmWRVn1CMpeFZFpAugHhKXlSkSsx6843Xcbf/HLoKoQNmeztc2uAJIJqYAr/NBSI4rSjp2BAxGI7VdrY/0NHYPC6IkIPARL1wNBo6KTzKdSPXqnrYLU3ieqr7SZtgXGarF+wA5B0tpxNP4PDgoj4eX1z/vxKOKrbmHQHCKKzFA4nxHQAgt074A7zXYgOJpNJXyigRmL4igKCpmlxxC0hmjvmQQ/aEE8P0drgYJt0b8DToN+qsk513I0mrfpDbWoml0nXaYUdvLU4/rJr5r9Jg2EcNx7RRKMxiltRgritwhQVNzzQqkApdQIFx0BEwIN5i7o5wHtRMB5RvG+jxvuKRhP99/w+b9tUsdFo/JHvHLSVJf3wPM/7PkfHsC3JcK1vzBIfiOMj8yxzm8w0g6EzIDCx3RCbet/s5as9ywika00Xv9Rhc7djzwAD5PZ6YZHn9y9y9z0eDy27HIf16jp3uuMJF+pWuvGKNOt5CDv8DS6k8F0XuMtKNyDWrLl3FcsvMCBYxADRI/0jMwXC5NNH8/RERdBTk1/MoUaHthnuQKW4vs1pd3uW2eZ2LMXmhQjxwqOwQHnZMuW9yT1b3eu9yH0BiQYyFyDzn3AP4DS45aXzb5Cnzb/GhfiuNQDpZiAQzKGwFOVAOpEQBN21CESP828m2YnF4DBS3iYZ0UHmIIy165Gg0MqFUoSW3rm2JavbsR6DA4kV9Jx7Ch97xt2kDIuBzCUQum8d5Dr32NFBFxARBghxAIO0RxDSaUGzCECMrfD1rFnvn382LLLRwDHK2qSzySLJpLFckTUYx8lkH1IURLzbg5yRsvhegIBDKwWfcV+9XljkqQ7yam7PVYB0XuEu8TyLkQshytcNEJ6BkDmwCpIAUkk3xQj0+sMnhDy2QwMkg98keCxOm/rN+3wzfW4e15xuiw8X7AftM302/KfPN2vHylU+J1GQOdYnkfjOti5esbDdu8RloyyekhES43C/4rhn999wFxfpIKFbt68QyC0udBtHoc4b3NWO+RoITzHCQMgchEGZfD+6dxWyyBw9Rgy9e8tdJAwdxOJw8LZSSclYLEVL0Vas+zJFxeFoKHWrUgcKb0/W6zbLRr6wY7DeKBUH168/yYSKqo3KQ5C4QQKD2NmKxfY/CpIvF+ECbx6pHATCcRe407i/21hq33ChjqvcDao8mK8RCN+lgTB7qK6VEKNRHaRJd16/A4FhkR4+s7HUbectMwnE7rApdr5HydhtfLEBEMW+COvmzI2NTG9xcWn4ZGFhkrWUYBBwsD7wnHZ4l8eNJgTjgAlYMo+t5NFd2kNYJsZxPTdeqDm68vLeyyfchZ7QBfIslrSTupiYY3VqIP3UvgPIHMhqXhtqIMO8rchnHKViMgMQpeAqZpKZhoJr1rq9pFjIIr5CwTbTXhheMFgsNgoZZoo2oMCzCMQJkl73Inev3d7LMDwekACEPI1OXS4kxgBxaLXGpQeP+cch7ioV5p0QyBhEEwhpKByWogkd5BeZ14VMLrvpkqVuH0q9GwRwLSLZ2Ed9B8iJng9tgzAIMBgHBDBcIy5mDx2EbvsyR7rQoRbmhMZ30VqlgzCO+aSOqh8gojkIcTQX6/o/Cmm8mIJgwWpb2NfWl1yLHQQUYFE5AEJGob0QefAycNAPyivYByAs44Vu3dJBlGtXT99+wkzR3YlLTRxkEDCw6v2MX5INEBO3+onjp4LWJHs3EkXqsKKPykjUSFeFiEeg0JayCc021mKgZp3brRlkHqudAEIkiAhV9OWTQTQOXuVgcERBqgYk9Og0EJMq9y9BmAlZUcj6wTsYCOPQu+FYuojDRtuJBxgQAp7kWYbSkRUgajGrFuS8evP8UjKIeqiJzAEIVR0jsiSFNZDFJiBNUfJDstgEZfR7NRISOJIGCJHQZsLKqx60DYmCancWKpRlEYcKAqkkCm6eEk3yL2Ki1EprOAAD/Tn6JDQUAIekgixc9ef24k+lLXsxznQOgGg20UJkNkCIBL/E4WHNwh60hXQQCEc2rbhVG1fqequB8Pj2YRAIHEy4oHMQSNEPzwoExswhreszWXlnmXuWWb5ogKjORYsWMACiWUTnmAuxe3aBAyCMR+tWa61E1pMjEoDoBlHUyNBBdLdiILukmixpIJjutPn+YBPNr4y0kUnPhn8GAUeSBfoC3SIsSUHPFNZQ+wouJuIwQLSWtQ7SbYDwhkE0x9JBBs/IiUQUUaKBGGOq5lmb9bfjqb4F1tlsiLu8fYWz3etZ1LtkidfGN4rFwuDw0a0Ydg4ePYYB57Gt+7ZJsaCY33Xu7Gh8b3WkmsqnTuweiQ/sLfcfyEfKGJ/FI4FIPC/HhCgaVZVcLvfw4ZZcUJTTsVgsl4vhWED/SpbQ6Y34/Ri/hcNyTUhU0kI0KspjtHkbpM8/zYeGphwkq3O2dUHb7BXe9t4l5DsOl7cH6RbGUJkjhzGZOrR5w+F9Wzcf37m/P5wfxUgwmxo9MEDj2jPVcnbPQHWvP5KP5/PxQDBaC0SDglgJxnJboFwwIaRxDNGZgJlowh9Hnxc//kgkXIsKQlSsCCLeKwbI8n8CgSgDsbbNXu6m1aezq1HqbNSLJZikMLyBxp1bd27ehynahuPlwNDQ3v7swJ7ReLycyp49038gO3DiQCCfouFmGHUevttaIpEmjlgwJkgiONgZzgVRFKRICgOqgCxLMmjESq0mR6NyTRRQIU43QMDx9yCQ1UpBYHW6PW5bZ6mOeeDwYAYjwYMHj+w7fOTY1m07N+zcff7U/t1nT+TLI9vwfmBPanRgZCCbL6f88uhA3h/3S0FUR2JUDvsDAm49CKo0XAputYVEDicF8nvj8QjyERHDajkhIsol7OqymAhOHTOFQPQQMYmRphAxEYW1dYWdlUo93WsAkhk+eAgzTUye920+fOTw/vPnzp/ZTiPyoWz/+Z3nMHquDp2tAiTul0V/NhLJxqNCRQrgFiORvD8RjJHwSj6FSKFQSaTFMI1y9/prQrACKAmWgT3wi9BJ49GHGdN0kMX/CkLXre0uj8u7aNPSRn0wkzl05OgRMBw7dXzfZkydMTjfXT277fy5cmRPuX9gZBvmz9WRs0OjkpyOyvkz/YGKKEXiYjoAg8jpIBHkYngDBiIeHIBLBCKpUQzdKTICET82QawJcDhwTAUH9H8foZk8ebzxnMxEXfSEzISJE8aNnTQOD8RMINHDMXhQBk/KTJg0biyemZmEYwiXzIVP0B+on/3pg2NaaqmlllpqqaWWWmqppZZaaul7e3BIAAAAACDo/2tfmAAAAAAAAAAAGAXULMIp3OHTJgAAAABJRU5ErkJggg==", + "description": "Displays a latest fine particulate matter (PM2.5) telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaAAAABcCAMAAAAfz5G9AAAA51BMVEXi4+To6err7O3l5efg4eI5Oj0pKi0vMDMyMzY0NTg2ODsmKCs7PD8+P0IfISRAQkUtLjErLC9GR0pJSk1OT1JZWl1RUlUiIycaGx9naGsdHiFWV1okJSlDRUdTVVeQkZN3eHqNjpBkZWeTlJZ+f4KKi40XGRyHiIpsbXBhYmV6fH6EhYhpa22Wl5mBgoVLTU9eX2JbXV9vcHKZmpxxc3V0dXfd3t+en6Gqq6zHyMrY2dq7vL64ubqwsbMUFRmtrrCbnJ6kpafDw8WhoqTPz9G/wMLa29y0tbfT09XV1tjLy82mp6kQERVcMhA+AAA1IUlEQVR42rSaiVLiaBSFnQVZhIqGkKlUisUgBWFL2Bp7scS9W9//fea7xzDopLW7ppljFmkWp/Jx7j3/zRz8+ZYOXuqPt/Tbz+j3/0N87u4/4+Dgw4f7b4/Xnx8urtbd0ajf7/XOVoP5cjmfL+eDwTgIovFgEIw70/60w0Oe6gxHp92JabO+uXo6v7y4OOdweX51s94sJpNut9s+PW1Lpz0+k9+7egNPtHu9/mjKnwjiKIpnjbDVChuNhu2tlu979aZTLZfLlVLx+ITt5LhcbXqzNI54dZrO7A2el3i+7+vlnr07Rbx/ls7scziEvOggDyb72cHhh+3fZF785Ilkx93Pdnv98x+lN6NnNDr+8eeHD5++frz+8vC0aY+mEBoNl4NOp7Oar5aDQZyaZmmwPJt2lkEUjceD5bCny73Y3NxcPQO6tF2AJl3DACB2AwSOvvhk4IzP2VlnHkRpHKdbPgLV8r3EcWqFUhEdnxwesp8Ua3W/EQRjvhtRHBsCqMAH8fK6F/JeBJQG9DJA9lE/5yAh0TFH6A0JRqYtDW37kBBlfBBHAP354dO32493X24mvenZdDSadubjVWe1xEHRzC5f4rpesBwO53MAYaHOsNfuosnmBj2dYx90frVeLxZQEB8BEg1zkCwkPv1pb3QG/DGG2ALi0DA8Sd11qvA5PkGHR0dH5p9aEqbB3OwcRPAJufQChNeQ5/P+kEcZZxHiNaA7+LGB9JN30GtMHHZwdHhtoe3pV+2T4dHR+PzzTQLQ/aevtx8f1u3+9AwNBwFXZBBQ2Ga+x5VwnKY/7gzhFsVBZCWu39M1X6zX6yv4PD2xX1l5g4F0ai8Qn+lUgCT44NHpEGcGUQAiu96+sbGj5zq1WqFQLh4i+ACoWKnVwzjAy2gcpTPDkyT1JOHkunWVOjEyPAJkD+ADoP/Wgn57z0E7ROglkL04aAt8B4jtgAoHoG9fHx82bYrPcNhZRjGFLEqDaOa7CVWnUKs3BtkTsFt1zqxVtY3QBkCwodJdmX221e01ING0x/Dh8ZD+I0WxLrgvQPzm1KqFSrl0fJjppFgWnwF+Xq2WATxxhsnY1JvwkZkwz04tBKAfO0je0em9DpQDpRq0s84W0n4MlH3SvwChT1gIQL3RkNIWzWaBXYy44TWdpO6UKm4rWOGsTszFspAw6gPIWHQ3VLgnAGGlhQCBrXeKdoBG2K2tovf8aLiiWFmpxI8NM4THJTUnJQCqFIsUN9hQ3Yol8080WK5wb4d3zVoeaFz2ptPkgH8SFTniQTozwceKnwlAP/SPHJTno7P0ChFcdueXjPbXgzI+O0AIPLLQ48Wme3q2otrPGmkUW9P1nEqlWSieOK14OYTPmCfoBauzXq93KhiTNd65QetJVznAOEgGxRoQXW3a74FLD6yELq3/0PTnAzqcShQOSMMsvz2zQcVSueb6jQjD8rfhE6WterPZdKSa02y6hiHxM/uElhbkHUzG7r7hoNf9550KJwdp/zcWnXKhbS8d6LetgYgGGaD7+3sjBCAc1BmQ0WbE1dBvzcKkVqg5xcMSV6lD8BqHXkiaWw2nXPAucY0SJ0BZtp5gIaBJGaD+cw8SH+AAiE6GdWTEgRmohQCkvk6Aq5SMjalUqjT9WTzmq8HfJkCmYdKs1ZyaVK05WAkQitkoNMw4zORiL9f5CQflIQmLTu9JqHJB4dclOsjC2xbQBwG6J2gDaDQmRs8B1PC8MA7rfFErJ8dNu0jT4XzmugTeJR2o12tPFjLQGveID4AWAqSYYEbSisdCnADR3tB0yFdgbKEZpwKo5W/5AKhuPahcKpbEp2z1LQ0GHYstS15sfAqCY8JCdUSVEyGFDfhAjd2MVjt420B5Njs8GZ9dhnshcdjhybY9OohdeOBj4vQC0OW6PWw04mBsaw3PawQNao5zdFJNLRSMVnFSYdUxxkD9PutUA7Gh9yy08kGLzWLByUofJyOkutZHPVBhnqGtfyhvBmgAqFTO8UNOHiGbq2ohrgwj+BSceiuNBiy/4IPpZq1mtVIuVKXCDpDnh8reJkpggn8cfdL3HbTFk4ckQNn23hI17yCk0148JEDqQJKxEaDb6/P16aoxiwN9sWes3BvUuOOTWmsJkf500KoVkjCer8w/bboNLtpsJtQ1gEzaPFhjIB5DKAMkPvyiSmf5kEpFvoYPgDBS2gAQeKhPBshtYiGqnABVmtRTEuOQ1KdVbSupAa9QAJEdHKyCEh/ZCkqyCAEchBcP3jbQH9rfGyEgjuz5BPeDHoR+2UF/mnMyQAS4T/cY6PHz1aIftBrxmGLicxoHceo7xYIfDW260InqVbcer3gAGdzSPu1aScM9OKXLg7UBWqCuSUHBmlAWD8w+Z1pKgQc6NhcIrbgJUMtStus4VsDoQ/inBp9osBpioA4LZmtAZq5KAVUqAGq6yBykWOCipsHJmhQQD95rQNk6nXPePzp8F8+WkTDt6puOe4txFuCU3bYGQjZJeLiaTGOPqhLNGrOIlep4kPrNQj2dn9nactCqu62UgoMzzCxdThkKQNi/qRdBDmJIeJD6kPxjfJY4J1OgDgQg85B6EA5y7NICokp9w8zzDu/iTRRDr1nDWiXYwEeAwAEhz4MOZW1rHKmAvusg9KaDdmh2BsrjyTkI6bCHOifgO0BI8Q0+LFPvLm9oQXV/FqVpQAvvMDC1GU8rmg8pTvM0SRoxA1OmcDY/mFjOprDBp2+hG2YA2izYFLXBIz5aCYmPsvLA0jUhwQxEUvS1/uEYaq6m8mQWqjbrPpF+zMzCoAZx6LniUzIToYLFbAEy98AqgwM9wRGg9xJcNonknI9wgqOjtvwS1TCw5xere6hvrwHdo2/G5+vHu8sNbYa+HASUfQoLcctvNv2QOsOFjVosSQYsTo3PDXxGbc114GM1r6s0h8xAwDFpCsdJH9bpGKEVXIgItgoKNMgGjOZqmt8g0rF9/WuuF8pAHZva8crEdSqlMnxsFx+VNHfbd3Ce+FTglyGqHrxlIOHRljdQtonOW3o9PtjzmDRbo4pNVt3YvgHo4aq/igkJg3l7QkshVofUDt+3K0WPpux1LLu1F5BYsMzRWBQYBLxed6O0vVYbUnWTc3gKUdqQ1TfNWhnzZHysxAkQu5ddagEiYPshBgKQ2QerNQkIcg82AoA6kBlIEiDVtYoh/C4gPXi5AMqPsXPL01zCzv2w7bEF7e4zGB+xAY4EoOvP5+3pajxYnfVvbogA3LDxqPAwolszguOZqSbSVDE1oHUGqH/aP52s5R6eEZ8doP5U6Q1A6j8AihSx5Z/Ql3kSDwkQFQ4+ZhCXZghLGqHmdQn/DBkzB7utgtRzmsbGJD7Ak8fsBQL0Co8c9KMetMsH+ZCQo7X/Gw3CI0D4R74B0DYjXN+dL9ojbsV115fnN+s+k9E6sxRqh5PM1A2mVDKaDjFafDbgUTkjwy3MPeARH/4lA6R0beH6mQ/1bQsosoRtbNgTJTEzUA2REAxQ0iKoKElqAGfcBAhly1RnB0h8KG+SAP28g/Il7sezg1cO2uMqSH/fZA5S5xEhfjVA15dPN5NRb3H+5eHifE27CF3Pr1M0Cm7Kcr4/ggRA+hO7adBdr+UmTa1ZCj3nA9C9BDTqbQEpv3GxY5uGm4Gob7YYFpgERs+dpMplrZDUqjWXkBBZZWW8Rv9RdCjDYJvRqHFyEJLtKqjEO6H0hoPYX0eE7y5S5ZndOccI7ayzZwf9truTqhYkQBQ5+ADo8SP3vC+vNk8Pd9d3Fzdtkm3di8Pa0XGp4A/OSAfYZs3wZqIlKF5BGve0oTPBWJubTXarwQApwGV80NyqWxyn5go1IC68NZ/EBY9vfOrwMYOUDk8g5BAnUyganib+sPiNEGwkywUGSOzMWyWmD5oQVfIpLkO0k/igPCFhyXegXbjONSE5aF8NSIS2t4BEKOtBAPr85eLp4svdRwLdpDOPW24jTcqHpao765CtxYMrL4dotQMk46HZDsg2G6OliMAm/cNnOcYNKLb6xqmhWzaegcE9BGXjU6tYSONGd5Exj+vb4kgTbt1cEAesgcRHDoJPdgsJFZmy2h0kAaII1t50EGw4vH2jm+MbQ558A2Lfo4N2PUiEXgO6u8NDn68/Pt7ePZ2Ox0S4NHT4RnIvaNSeyDHdXh934I0FcAAjM2WjBJjBJytxRkgBW4BWy7HB2QKytqJY7QEGQMBBltOKXGVuowqQTVG9xNhofSQ+GaCaALHzLvHZ/v8lh0cZoGoG6HVMeKk8ntcO0i95RC9nohmmX3PQwVYCtHUQeDJAEDKpxl2D6PHx9vb2y2Iaz1zHnWGgJqOejlxCpyFSIyDBBNGLBKit4TZ+ApAIbReq8KH5cP+H4pamMbJVULq9LwogWcdEGynLA38dHRZLDEqJD9gHPvUMUGEHyOTAybApup0cHR2eoMPjUtn4oFwPeu8mwxsDnjfncPkx6cGv6oWDFOIECH01AQgu5IS/aTnXpUSuKApbqSiig8hd5CIgCt1gcxEqJjPDXGJqLJ33f558a3EIznSR+SM72t3iJJXqL2ufdfbeJ38+6v6lPxyXKIa1s0eZVrExHlxp+0PVemDfzLbnSk/KYZBwHxtA8nZhYGRT6Om7BqGaTmUGHEJtboQBF9c5ARU2mcgnA6DCUa3pSYSWbUO+KJ8XBOQ3zxeoiJxuglrQ/EKzyZU+39pl58ztRwW9BrQzwXELiPy1JbORUICTTm8HbxDBxQmQw4SeHvnridvj47MAPT9//dhd1Outw3y11cwUy3To0AnmAIWgHmBQeFNzZySNSEboSkbuOqxHXojMxx2G5RBAbHaBo2D9kXxCm61RLSlLyYSRppylkAIKQh1FxUROAorvvAFy+E9DgfAAg6ieoiC+gkcIJYUdCrJ+dliEXyooPX1g+bxJuA4XXJzCVtuAHp8QkBX0lTz37e94Pq5jkSbnp7lKA4s9AIGqCy4MJCNwKXcJkDsKSXJzfW8D59k3L0RhDXL5GihT8XGw7cSxTTRF4LZTyeLIUsaxgrgcWwMAUhL0ZCJ/KLBZ35CJaSm7SUCnCGgNSGXw8KufFfRj7CwipKtw5pIaWHT46a0AEZutquUeCK0BPT0TLEF2cteL5SLCwuYvT9pUNMfxIIlH95qZQzdWzkiFtcEgNErjEflPtNY9bwXYREidgjFoXBu1fnr0apXcGuKDS5uoJ6j8ZiPGm/cC4iUGjOqHC1AxLEBcvOEJNQVEh3iEp1YToILrdFkFT1tAB7YIKQXtENCO2DELZzxvCCgQ2npt8Fg9SOcj8fDw5fOAGZpKflI8qZWZXauMO4MxVZ4BBc9kyYqvUqoHrxKJCT59Epxmhq/Mx1nuhkRImA/GwBVst4A0OFVtg4dwiUCASFpBFCjHRWk94Q5CsbuUU9ryx37/0tiJ+QiPlqBarekhraxSJToy7v9RULqIsF2CUgZuS0aXVA1OgN5YQo6N1RYe6Hz49umFes315z/u+oO4Ti2slC1FCKi+XNYrzCTQqh52ehBb0jWIY7UQEjCQxViIyHnJwBbB3dUuiVDqijXcPWdqqsM+FUAUBlh1NMMzrRBVWW1MwiFLuhsI3ni6ZceP9gceIDUzf2x1uFzqtmvhFO0oms0mU1pACe1yYcocpFqpOwvZZmM8O6o8jjQi03lrBfEQpq7cC3pippQdEGPVlHES7WqS0SKa9NqlvIfNpvN5uTIe0sWbRuoP9OYeU1N/FCfnyfgbyWjQBc52fJRPGeUGj1s6VpBK4pp8B41G4C2OMoByevkoRrOIJQBJJtQSAOT5+FKLBGdZBUC6htWnWTtzKMVp/dK3Z07k2A9+0QpKCyhl4ByvFZQqIrw9IT8EPk9PtglfWXioozFRuMSIkcxoYC4bkyovtDGbjXu5xnRWnZQbynuTaA6fGFEI0M2A7+6gHyqpYVAEPnw66gzhs3RPNLRQZ1Chr6TQE8/y0GHjGZqjOTAcIqAWgLwGlfSJt6ncwyqDVphv1Npzdkmc4c1lsmFWgJFu/PQ/CtpRJU2lN9MJ375u2bw9HftsAP1ui0AwyPPIPvXxn/cfKbJhiqOoM+IND+Jx1ItnlJNn6tJVStnqhH4mruGYPlmlQ3ZLGMWNE2SSACgZxcsYIiw9OAWbtwGU1D1dqAiukwzqogpQOwDaDsOV1nOiHnEDEAVTO4WcLbYnFbSncbXNJR3fMqaAdMQHAQmQY3MTqJSCUojSu1RiFyKuPxbi9kFondvCSMLTn++fn+ilfnj43OVdzueVKEmuENByNh0s6XwX2/jgaZEdUW59YOcdu9d5XyZBAwbatWqmN0l4tnjsrbU4wQl7PVx00I/4jBmC037VQ6RWDk/ISDdDKoUHpbOTkN8a3iflD6Gy7vPYIQhQxnuf5qUiALLPdgCLZzZTB2kBbfE40nh83a2grYPbA53gEezebBBIbSrsvH+47yYYgP60x8tHQP15fd5d9maUmXmbJfJLXlMCslqtasSuiJQmSjeYA215wqbVW1PX30Qu7sF8PXNIbpPPVmtHmlmfHgkKEir91Kjyc1t2wB7bG1kWKj6xLVMIkBEhIOFBPMTFBYSMCDb63qhJCkoLaIvoYMc0aWoPFBClOkICtAdCm34341acCPqKvf501x3FY8apZnTlElXQmAUYzaNqnrfUaFPGZ0nAVOVYx8vRnD8BkUQe2x27K5hoMQohv8ClM6RhbZ0t65TgwvGraUhq2uEwbmWjEMQkYmpsu9ODhwQPOCfmA6HQ73aSU3ZrsvhcmM+GUNMBtxoC8oD36zXoBzy790C+pE9rBU578m9pCWEPiCdOPX74559vd3hiKWIUkYfihAm42Zz/7ButbENVzaMCL+hQM9HF6nS2SPBsSSIfrbrBZ7VUndlQDZjk5wAEn2iIgMSnRxnOTTrnuDLRMgESmPmEoz1OcDm5Aw3qeB+LfnLHhUJGTMATAIHnFDwXF7e3F+FimyBCNeIMFbEEAfG1glK97jSeQGcHonQf9WA/sZ6LU5OODPfp4dvHzx2M1oIdJ6+QXSlvt9eo46pzJ7nKtJ0/bp5njgToXXE6r99g0hKc9bV6dsS6FXRNlpN4QJXE2h1p28OBqyX5rd5o+MjKMHIZruQOATlMYAzILGBUxWHjpekuIJ+o55pQLotTOw/TPFwEiM0p4oFMiCChAIgHlU5P8XIpBYEmpaCUyU7R2SoowNknHhfkNjMJcgcvD3/0p0pG7Pp1Dre9uLnpVDgR2qieZybTSS5bOyNt0OPMl2ZzXBu7UAIslHUYQ1DlTfKRY4Ab2U58dEAYg71cxCipwhyXT5fyxifuLoAhbHIkG5sBFqOJqtp5/aIx1RjRTOtPhjJOYYOHm5af09qWDxEyHCFCpDqbOBVedyoobbK3EoLRDkR7Wn/SiAyIPSomjimEm3q50lv0sdbVBiWY5Go0LGPeWu9OM8XSu+Pzs9vLmho0xcYwuUIxEo0mSj2+6BKp8GAMkgQ05sPAlndAxDyqVHoCNGNN0dkQjDQccOsy1ZuBEbcdEJYH4svYezXFmQs/kRfAj0EmY0g+3EV6I14BOnOYEpfmZgk62qGgtIlLDYuk8exVP+kU5yLC49f3H1/u4kZRw9f9eqPEAHv96iqeFkk2x6SWQ72Q2uq2qSGOci++8lzivSj59KP4dOETL2zqHJ4S7jAupQrPEv3wut0DArrtWrkIhnWpekK/FFCbhikhcIyF4yiiCuotyJF5DQKQzAG85A4CIF0CHxxdSHQ23I7THQqCyY5pkXBLHRn2V5DOvvVDrHMc0/IU4L4MGH5rD/v9ebtYYqx0eJ3UmbQ6yRRWZ6eF2tH5+enq7DzfYt40HtxzCpVhKzW3tetBR12VEvrDIYsNf3n+eoSDmxOLzpL6ToUVRvpRPvM57HYxl0VArlWXNHxIsdStuCx0sIk4ewaPAVvOw4P8emQ0XISnZhY/AeJnrg7kAxjCdYUwiLBLQeklKBXp48L7stc/b1YPlOJocn9JesVWFI/mswkna9r1fjJuszNkC/h9dXtxe5Q9rl0WTnJlTm1177+8MFJ6ZzIsN7g31bNpadcpzmm2F7cRBuRNiE6351F1skd+HVac2QOHdzrqcpuJuzr0D/Qx7k58xj35a9rfWOYjWewtHvu0S8isVisbBKPRbf07CJmPYqug9DhcOsOl9GM46TOPewZEbAD9BaGHm0Vj2r/qzmccHshXhkmnV81na7er2+/fv68uzk+OL08PW8Ue3YXrv184aH99k+DkRihFFQMCHIsFcBa6er6XmsGYGHKPiHqPAkKDmEVTRuBh425P6GELjqqbJuQE1xtDlIPlGbsx19bc9nHVzdsdAVopJCAHhFh8FPzefIRpq6BfD5T6svu8/X71g3VLlXsM6PH5010yjO/+uF5G7dK7FgdNlr12PnOx+r76TlyeZzMX58xJdxKa2jppf097QWUCUCRUSAkK1R0KbqiGK7zA4tkDdKBBRR4wB/IfWOdpVc0EXJwoUZggcbnszPexm0ESEH+7Tr0cF3jd4UCx8QQ+p2xF4cO/H4S2gPQrt+42gHg8SAvoFZy0idt+pRS0/doLIP7BP61BcnHYhOcPL/fdl2+f7pM5i3I7GnKUgFlF0SFWZ4VC85JB9kiHTj7rNPfVCBeATIaxx6lw0lpssAMoZtHHHyxkqHsSDvrBuEPF872ahY8aRdetDwnwnB8pYBAAwa2oHRAtoyL+5Ag1rOGwL/1viSECIPAI0LYeBxrCV/09ApSuwxE7BBTYpHqo+9ePjdtvr38gwTHwq1Xo/cdP3/788/2X606FemUjwh+3jy9uN4BqF6vVca46omWq/+vLfRfpYKLpIVAI1amUuU5Y6a5aXqIjK2IiRux1I+1AqRuozdOoUBmgtSMz7XKnHLS2lUpiEGKcjRVpopP0VeU36BWAF7RjN3DWRE/+QCsQfAivPQ7bN4Uh+aeDtICg84uJbN+3bHzfOyB5y397O/e+xKooDHfjooLcITxyGaQGELmopDWaEVNWfv/v0/O++xyxGKg/Ou0aVKrpF09rr3ddD7/5NgyCzW+09CDkHj78/PGPDy+9foPbp7sY0zGfO8WCfL7V3Z4tdPvf9DzU0JtJnclophrEgpDrdigE3iIAkkNSP3UkSN4jQrSpKmlNJYYQ7KhWDR/sw9k0AwKRl1ZU44y2zEsHRElUimRBVuo93kkAbVV2UnAQnACoBaAdD2QftKuxd7e/vIGjk2p4is0EaRB3EVtjq1GEQzvpz398xIIA1CkUyV5eN0rlU9OxSjjFDXSWqx5HfaUYDgoNLsrdXHv+DUBIg7AcZsKNh3Rr1BsAcv1HCRwFO2gEf1dSsQfng4C2+DKgiv7EhgBEr6JbTCXbYmkgPNCwAYkZGiFouMSCIJ3wwSqDHennT1sQfA5MPe4ietsjkhIgNFw8exE6esznDx9y2d9/JCe3vhg2SsfVKKq358fZluD4fJ2lClRvT27CYrHhVHWDFUgmKGuVEzyXNcOQNJqP5OYw2FprkKtxBTVurm42+Or5U3fk5LIONs2H/wP8K5vT3GMNhqrPKSlqZW3BhuQ/U0SU5EmFx+eNugY0R3B8OerLHgva01K63wNxUo1OZTShCORSqvTBR9DQpkiv7y/ccL88PG0ulwT2pSolmUxWUYZ88Bkhaq1QnI+HNwzSq04UdYlSJmEmy30JeuFmw358w6Eg+u1urbnARXk0zvvFmDfVV48Hq/GjACAf6TScRcvf5KUSgvqOmz7KJ4les/2g+coQE7LEfmQ5ifEYkLt8XPRG/e2quN2x1G38Y0R79EHKhIwoEPLmMfgASI1WAsQ1R0fPO6rWg2Z3PGh0yme5TKZ8dk6fc6cbdardaY+meeyjHc3JqLFVCamN4eBx0BSmFI/YK80zZWZEQyY0ARH2ODXKmJFypOg0Pn+NMJZ1BSWXkQ7fVvKZcHS/2YKykmuGAQg+dfKkKDgl4mLrsba28VgL6sSgeHXJe8eEDvTD7SJ664LSze7Y9ch0ZD3q8oWPAdGo+MvPP9Ot+KSGtsmUnXDTWj4fDZaFsop0zWWjM19eu9kAJV6r08E7ncDBa8tW6tS5tdzuD2VSSpMOwONOxcECBzTX8NW8WQdQUaW4Ytzq3opjSbsPUtBk3NzSSz4uaa2qJM4GTwg/1Q+CoosJmY8o23TgI5uDjY8vun0WdOCC27MWIe0EaYhVbTzGQ47nZwDB5+EBRALEQr7NO/Ue9rvF7uz9qqg1ZIjjLkXUvse2h9OI1Yf4HSo/AJp5e1y7TUqHILXvNh/JbGa0RnZA7D7yMkCvmtBNJ/txZSenJtCy/Il03DlRzulJmQydAPHiujY0QkbnVV9Lv71NxCksSpp5cuGENm0D0vnUergDQdAn8zzp289WysEHPOYjQEwNPwDoQZSeHx+1sfRu87K+bC9mm4t+gV1Xta5EWP36Uv06sz4lA/q0aVpQ/zwdWsMBt5lXuqC30dz2SKulUgikSaW21RbiFVT2QLrfXLz2Jjji1HMJZgNqZQlUg4M6cvdoXmLNIPCEMp8km7AFpBjq3J4p9Cxs7YcvlnO7Km7/SIO+HOiWT5/Q55+Bx3DCgY8AGc/j4zOgaF1kL+y6N7u821xOa3y+1bm6bMZUuREJs9sRnn/GIJAAqZatlM7I7VREqm3uOm8sc22bt3FBy4Vn7SOuOQ/6asLEHYfyMeVzZ6ZDEENZHUKcpPvN9mMOCD19/m8BhffhIxiG42IRgOyAzIdjFbc7VnewFrRrQdBJE8/b0Ac69juyHt9ydkEfHp7ho/nU+xcAvVDqueuNltHtuFtyzpltvxdqtu6rhK0ZB4m40eoWy6HkczsFyUpy4Rab4s1rI6NgQKbUM8CRJZzVmT5JX2BBj1kiixHCC8uyiHCOzt5GJIQBI+HAR0T9phsR1BtS1klasXXDYZsGpCMVtxsFidO+WtCnWuHSjH+2GtvKDTgwgQdTjhAKGu7DL0g4+DyIz5r1yi/afjBb4HgGdcaq6eOhcV51U4vp98wIzbRcdjzV/mwlsVU5tU7gTKaoN/GhJDrQ16VbfV1FLQDGfGwhZQjIiRgTEsG5OMp1HpkjAEJ6Jxm2E8U/Tgy9BeTSj3wPhEzHfHwMSKph14IgcqgU9MmeuPTrp1/9KuMRG0+XPJLd0bHG5o8H+Gjw/mXz093L0/3dxfvZdbO+Gi6q+tSq7fbs4kptIQyf6H6b3U61u21AImGl7ZYSB6oC4X76XtlMHs6rXlQWDbuTIVTiY1froedMYz4WYWc2BUbqSkRLUZMsD2V2e5BWkh5w3ClA1nA+SQrilY14+GYTmkQ2fPav9iuaznYD2e7ivjQBOff21W+62gRH59FbyO11kNgaHH7SwYI2NyzwXWvzL5/51aR+XCkUaov+7IJKN6W5iYp09JQuVOVp0lXfH7KG93oydG1IhaDpyo1BY6/0VZha1wh3J+iDjHtzpKLtT4IB8SJPUlaWhwux20FHyFzMRAGOO+BEy/bzquJsdiIRxhnKsbS2qjMcuAHo7w1xu/ZzuOU3fXltQN99tOvh6PVBONb3j8+62fjZl9uLtpJv1lTk2HVAB9Y3Vz9Na9w4xag/vLijjsogyXCm4HTV1ia5hSZOtfxAaYWZW+iVKaWI6jmtKS+Ldt2zJKX5XH2ptORYI+BgnFBTCoA45+tWhZP37mV6vDScJVuQaosLo0A89QGKOw8CH0lvQlfR0N8PTR9bjxFtLWjv5FZC51MeaFtETV9hA4i5xkdwWBgA5B5vAyFsKNxua+2O5xeotNr/qkdDIgtkSf0MZu+1G643m0hFU2sYLaIxd9cABaBi0GjojVa0xMmGeGMaBNyAbh6NaGfUhwigjJveXaHzHCp8AMRHfSLNXahRLSKFV3BpO8ScFa4wIEFRPPhDX3nR8e0ox1U2EF4BJJw2Ho75yAf9Y63OL/tb5lOqn/6lPAcgbbJaPz3/8r3uOl1pgiFAD9YH3hzPGxqw41kMXHWbn3oIgfpxc/XO3b3qBkEQrL6ZjZuRutwk0fT8jREXH0eDXPCB0O1EnQiaLSmRN/BYlu63QiwO7O9DYU0fvTx9JV+YR9T15lpXytXmfczCiBk52WMiAU4CyOIBkgmgbLxnW6ND/hfZL322O9OwryFul43xpEXoy7fa4zt1KL6w/3X9ZK8DlWeIyIakGmxC8OGnZwCt1ReifXC94bRZn15eaGFf2GV5PXl/0ac5y23WxDjqPdD4D9ZDczaB0chJudUgikgdHFexGy2GlchWfBMsKKNeRDkMxahK82S537TvuqobMCu3I1vjk8eI4GNAJhTDcQ3VfDiyGH212PYAcdIfLMKHLWiHzg6llPAE6ebyj1hJwrF7h41HrNy7f5bbsd9ZE/UASCrBgFAOencNnyvv5mN53Gj4TvvgvJDvmkTdJQZUX2rtdZeSHPsPBt5ehsLDA3EwNCXjmlWtqbAu4IKreaTEJR5HnFn35p4mbQR5cqlRd146kmnJtZRJyGVUBM+dnIasqI8B2ZoMyDeaM3TyWLAJo/nOl4uQ3JMt6FBT9nbw8VMTdSkqOPeFqIpKggcJx622vrqgUffm5UHKOgykbu4fYwvC9fjw3h0uiO4DnYv3Q02dwsfNvNMFCYNRt7tsX2uZ5Xgaeg6mGBCAxAc6xEM87qGmGnddN1umA5+qXJG0loQ2Ic65+ICH9hyuqWONPlYLOctoqqblfMG7s11s2JblxCUBFQS6RYTYmE6Y0g/bZGM+5X8UcXsMCDThpNogLwWjUeGP2tQnBHoCxpPdEFpBM6kAsvKWatD88IZI6EYryu8QdPf3/EAfKZhmlmjtLg1uUQ0+0/FC++BXftbSaOaRrYknUeEz0ph9pJbejtbpSGfrirN4U5kHgRDq2KdwOkUiZPyRlltBQJ9XCI4LRxYJ/BwXfqApLMmkiQBxxCeYDlYTdp3HmQjzqQQL2p49lSC/7CDyHykSgowLdEEhvAR/gwv6QztFHBYRD0kloLYfpbFZ18u9Bia+4evmnjfRdDc9Df9AgKXMkTKng2s2JNPcTnZnQbq60YceF5wEAgqB518s6FLkIqx3tGO8M/fGnZKH4o4UAumcYy2WcbrjgFZW8xAw6AKv5LGC43KW6+5rsYGQATlGtfd5PS3xUY3COXAbjwHJ/IKO2xms21sJMp2dk+oIQ1Ki+0EWJD4/k39jkRVbeZRX4E0jQxeYxFrb41Hb1tn8gXlJ0t1wewkQc/l1rdurLkd0WA3QcYSlU8TaACjU6SYWcOR93Eu6bEZgkeUwce+pEg/GWZpJc7kWBB7rMnE6Rayprg0fbZZHRyhGEhofeyve8TGcuISk9J1PAgdjDIPGdkk7FnRot8iu9aRJyIzcXeUtVir7AIhjQL85chUf00G5bbyLT1qbH/zMJtINmFVPs3Ra/zKKSqro1MhZr7Q6fqR4VM2iZN9uEXC8TdwKn7FXIeD1vZSXekMXQGFPCIBCkBKWt8TZUFd9hIceIvLWurAAFL8Lo2T4B4wcI/IAg/DY6xhM0YyCPtAxoL9Z0MFE9m5T3P9TRLW9OC+K6xGg37QX4Q9Xg7Af6NhowqDPy3rNTxDaSNThl3oWcDM8zLhZ1NxVDdfj1tE2Q0XjOr1uehaHctlkSvtt+Iw1Rie7caO1vJQntzmS0Spr2w9hNyAQH7cdhBailj90kgmKfwIgW084wpQAyobsqvBwzIYj6+EuNSDg2YL2uCDAHJBwqXmg3TRcMCEdv2pt0m9ccNqqKD6YzhpA3tWLeNPdxtmsAfSkBE9/4p3xoyVPeiLMz5TU2K6HzzXp0G02ATGm5jCC0ogwaDCFjy6+hWbjjjsA9PMZozqCIeM500KH6LUSFFuoubV0uxmQFNwxmuHIqdTXdoRzd4k6NtXbAuSVf7AJKzGBw6+wWkmAjjhSdW8t6EAme4/9pI8nMaKwTFFpHt1y2soj81GpAa39qESPd11fbe437HC5Qo2L2hPv9nS/DWe3RDb4+SxNPsyMRNdTqWzNgDNrtZDcbnDlTa4XjQVFBi2xaqi6UKpHfItLGo/nhXzGm2LDptEjhT8tNS0qmYOvMZ4fT7PYD+dIM47g4c6L8eBuqODFBT5Uellz+l48z0sJq+EISrIoDjxOyv7Ngg5N3+/6oPSvuG2tDityoU54uN44IbONfuPlKc4erJ/YNqL+0TurOQIi6tp69uKYkigGgDLOHh3VliNVSfU4xnpdKw9Iyy1pQ4DPsk0qbjEmTtXqlrDoQJsWu1VEQv44rIDV6jELBMqoEgznif2cYT9hTpgMApIu0QYc99DLjqwN4Oi12XpOkGdYfMI2RvXkxwYkQIct6O1+nv/dAwXfJzHnnjgRApD42CGpzP0ogR1EtowIQGtxwoDg5YW+73noVYPbrSrxmkNwIV1rywF8NIIwZiKLzVWMngJoKtOhjooEh4+mhP1srKVHgpB/qpYKUEeCzsXR84r7qE5jQCi4nH2H2xotD+Aj84Gk60EhNBWfsE0OQJ0SR55IhASpKP46tqnPDqzB3JrPnuVWqRLC+8i6BQk+HPI9gIGQCnfO7kDlkRfwWGhvsBte8EE6SDrt7Jm1G1TavIiFm6OVPcIy8PvdaDH1kGKXWy7iRiMsGkS8DoCFakPsJQ9eWqjg3bGX0H1UDW1XLsApsfmmM/HM0/527jkZkJvhQOILTuUJjkt0CPEwoQciqUPx0VcRSTb5+VjFbc+O/Ryaq0vfgD6HkBtJwwOccEOsXUZsc3S3SVzLgkLSVJecbjYFqAakfXzqVJw2ase4Bj42DKJUbyzDcxZUEVKPvJZQjBcc7jutOpDAnvPR1RuR5oW97K2mj7JUcsKHeMiD2voN1aEgPrEWwB+hzNwblz85k/0AyBeaj4frvNDKnQteKCursduRFRmQ8EpmJ4AOdiOAZne71bYSlD6hZPclhBjVshN6IF6FCgcu8FGWFMEWolPOXRgSRnPTB0dswzKLUuXbE2QRHYwDqAwizfp0ZTAR4ShQeHugzgOx42c/Q24OGFe63a/oZ2DMQ0+82fhzJPbPe5fYaw+i7y41JLS44L5WkBRK3sF8zkNXfNY6D9RcoprPMx77oYSQUwgxo7fX2yEX9H8akH/vsOHXfHz8fC3VvJ8tDDgvG8WknLWzB/Ejar2Zoqf9vSy8WjBTGnXyp/TPZwpkeBT/4F8Y8o14dlpR09m4HbWGUCLCUyHwmg095gxtBx89K1jtVo5Xa+YjPI7xvbnqqBJkWcgVkCWVb8nQjeXw1Qk3Y3E3gl79vfV1R66mIOsRH/0JnnhJWainJoAOJ+J2G37Tb+T5ItQZ/L/Ha9deeJj6LzofAqF73WU4HANyXlQrXZgw8Y5yUtjDdgbdlSm3zs6p19THZAr8kKUOyo2mhFqez4YwZ6ANIvVaV3ESXqehukGtCaZkuN6PyYKVindeau2tpF6W6Fr2dvinwvsZ9WNvFx+0UOOm5No3iAwIKBZtSRqBV5RbsmxRN6UTFga0q+EOD6am74Ekq7/cLuQhX6rjxS8OVkEEo+cnPeyH0PRFeCziuNW8fAdQ7sOuE0eqJeokXyXMuV1pqAQd1sRWBoNuAXPIEKWKTzPToUJXrOKdNE/HQqzIW8s7SZDf4XsSPfRjCxDZHK2Xb9lGXODBCdmA0G8YlY/Y2e2Iknvc/BJ3zxXNB1A6RdFy+jpes1SRBelsAR3Yz7O73/evpe7/HJX29elfmSy8/M504IRQcOuIreheTTy9d+oHISYlVqWuoAkTP3ymx76r20gFGvd0RqvZ7HYcOWavaQfjFOHd5N7q4Iym43mx0EBJy/PU65qxr8aPLbOnwGKKUCplKsyYqEjqkKaiUNT1a1tPWG+gEkMrToWeobF5CVN17ug1Gyff/Is/QW86vE16h2Js0lAKoFDF2/FBe0aH0zWgLWR9cWQqRCRKOTTL+wEApLVjQsGEqDQ83uNubngS91NIJkhZ+1EzVzTGUf7h2RrHOf23jxmaWxILaS1IsyE5HSkAwsMs8D8aQV1ypTWX9HLziZGBsdtWtSFTzir4VIW0jB/R/pxsiDcT1yNCwiMl7ZgnHLX76GgJDUfXm3yPB/d1+AKauLYgq3THb7zfHDQw1TnogxJCu2m4FHoVkwUl/pYktgtB4FEmzvMMmNJX3wlQ6Pd9Vlvc052e9AygRwG6As6V1DVdigCarJg2KR6p0EKgw80FHD0vDQ2ntZYMNHK0s9nzp8opaDcIn6FllYwGe8u3+IDjPoTAx1k4J9p8XODhIw1KWnh4wy9xWzaAg1+pHBFJCVBoPjlO0gZBtVVCe0I8HcQ34Xfc35VtNG84xXhS80DQEfskAacUqTzPxx+YpeO4zvArXkjlbrVeqV3+wwcIvVchfK2CKlRmP7GlYoYd+fHO71bRUa7Ec7BIDMy9k2rOJacOEO8RnTfceu3HM2NQCwa/LKv8aCxr3wxxThYiWdLXrTKfoPFwKM55OMFeqHwcAqKQs3YJIuHTsjXgVBSJOQsR8CSpHF51wwlOvmy7sTzwJIQtdb8F7cljp9iJIEBGn6RIWecLHqeug36DjiyHtl95IfeWPm30JJkrh6gXl5Pry6urb4YzzntRuq5nszx665qAZtl12obEDrk0hFmpgMtZTNuMoEqwMcLNJN5xPqP0S9GPcdb9Bg0MR2DoM5AX9wdn8wlZUODlNC3kEVNw+C9yEvOJn7bBP10Kz68RFY8Xc8r5uH/HgHg7REBxududwvu7so3m9Zu/n3RWVXCssIOpfkYS+3ecUHjqzGtu9B5C+g5AL/eEQ1d0HPbQ2Nq+s9JDHt/NNC7nXtHVGN2sZxFXgYOg7o/IunHX1bVPDKvhr0VNpF2He4+noNNdPcczdZQQw4mTsHFV+ySoKieckxlGffoKOx2F2vPwY+hkfDu8UM4ZhR8mVAN5R5lqYfAlVsnHNdok7sknjIxVwdMhFbe923ZFXGrbLl//7bIhraog/DGgB9e2w4CJ4iC7nTXy+oZ2awFCu/Eo6NtLBPZqRH/VkDIQ49rk1pqlIoB45DkNb5R7Ij9JQX3uXvlK6wF/2f9vlwu1RkN50WIYRM2eYhLWVDq+/bjr5Gkk0RyCOkvwKqpbYeLev+Khx7ISqIpMY0CZ+BFDcjcBEHwMJTkg5VcM6LAFbSGlHwMZUJI+cJbUUaoN6CPpUWUQ3AUSEjtEp7wo9XZD7KMEAs083wwZJGHKlIb4hR54r0bEazYrZfQ0OW+/1nNmvJscodClObshX6TbJ+N11rS/R6xI1ExRUeNzpxWjUZeoCwRKxZUNKGzcgVC8OZ63dMLV5tAoGaqrJKlrTq0qzaZ3ffd5CZbZCKK/A5kNjJP9Fxa0uxzhizQJGVIyzk0QpFffcOr25TzqioONO+TX5N7UhM1DH7nWaMXWs4E060PjYZvJU1BpWmG8kJVEg/6l9omMGEjl71loSSwZUmXgKPXUOnbLuQ5tInqEPTmFjGVVJd5znTspZzrJBKTTnlZyp8lDF0xnOxh89nq9aZJVZb6iHwjt5iD4ZCXYXfKWTIj3ANuwYgdUSUYdDlrQvlpDingSue3r7TcEAspaey85GtKSFTngUS3uho5rjkTBZQ9GpN+QBeqOF4bRKExn3bZHlOtqbGQElVLWYy+BayDfyPtEvKPpuSJSuHJ+QmRSzhbriwF7aD0jrNSNkJyeE6vypxKhYZbEPVRJruCEH17Xi8HJfCphZOsEyAbkhzp4Q0zFdyOywC2kysF5ts4nxzGfGNFfLejfrvBLf5wbhQAgYlSXGtQiIgFHwoAy3cvGq0b9tDknSIcTOg/JwhGkMigsQ2FAAR5qjl8xdjqKMplSFw54GFLYgJsuvEQkVFUbqLecRrK9ZqLEEEmjmkFTI4+9wfe40jrHAWXiwSB3i4RINO6A148uOQhR0tarlIMHILLyQBkA+QkP4YKzWzsqJGGrhUKyKMHf+peU3KGu0t0dV+kb0FYsOA1HLESoqjype3iYCcKMnl50s5E38Ope/A+iQH1VWp7IXBAKmwcDuOugXm+ohWdczR05Zi8hGGqdqM1MEGaktl/9WkYl3H/sbEqkFhqKf3KKL1WXLuWztI5SBVJ1TuH+diG5QCDBLbuTBlKneSTuxEf8XD4tyIJ8QcpIkt1/pQAIo7K5mIntBzQcwfoTdOCas/81FIkAAAAASUVORK5CYII=\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_card.json b/application/src/main/data/json/system/widget_types/pm2_5_card.json new file mode 100644 index 0000000000..c925624c81 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_card.json @@ -0,0 +1,30 @@ +{ + "fqn": "pm2_5_card", + "name": "PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest fine particulate matter (PM2.5) telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "matter", + "air", + "particulate" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json new file mode 100644 index 0000000000..8ddba63104 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json @@ -0,0 +1,30 @@ +{ + "fqn": "pm2_5_card_with_background", + "name": "PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACKFBMVEXm5ujj4+cAAAClpqjm5+ejp6sgICDr6+6kpachISUaHB7g4uKsra/6+vr5+fnm5ufk5OXn6OjKy8vk5ebp6err7O3r6+x8wyLe39/h4uPq6uvt7u7U1NXi4+P3+PjS09PJycrg4ODu7+/Y2dna2trg4eLV1tbW19fd3d729vfMzM3P0NDx8fLNzs7Oz8/b3NzR0dLc3d3X2Njz8/Ps7e319fb09PXw8PDIyMkXGBza29sZGx4eHyIbHSAUFhm6u70nKSy9vr8gISSIiYszNTj6+/s+P0IiJCe2t7m4ubs3ODtWV1kwMjWFhomvsLFBQkW0tbc7PD86Oz2Li40sLjDCw8S/v8EuMDKWl5lERkirrK4TFBeen6CRkpQRERWys7WPkJKhoqSZmptcXmAqLC+NjY8kJim9vsAgICGxsrNZW12Dxi6cnJ5ISUunqKmam5zAwcNRUlXExcaDhIZOT1Kmp6dwcXPFxsiTlJaAgYRUVVhqbG5LTE+IxjmVylGpqqtgYWPq8+B7fH9jZGatrrCkpaZ2eHp+f4GJyDvW4Myq1nTI27LK5alydHZnaGqt0YDa7MW63o261JihzmqMyj3S28izz5GLyj2z24CQy0eb0Viuyovy9+3g6dbT5b3O3b2415HD4pzi8NLC1K2tra3F4KSbymDc4dfb5NG/1aXW29HC3aCw1ISi02XV1tjG0LnS6ba+2pvq7+XN1sLI0rvT6bfV57+3yaFaDHeDAAAADXRSTlPvIADvtyAgv7+/sK+vNgWpSAAAJiJJREFUeNq02/tPW2UYB/B6S0z0lF5Y7aGUAb0KjAJWWPilNqgBKliFIpISKEqgCC0XC2NbgtxGYtRossRp/EWzn41/ot/ned+37zltYaPW77CWbg3ns+d5znsunePVV153RBCzNkEZlz3e/xJXMGhGevz+eGI8FOu8O4T03/N039/P7S7s5nL7R/e7++4hfZ7uI3pNJJ1OWTM1NTU5OZlFVlZmRd5+41XHK2C8tAP5bw4TDjDgiN4dGrw3OHjPA0VuIYWkYdm/7/H09YEGh1BsbGwwZAqxOqBYKRZJcTE7u/TaG463GjuaY7RdH3KYohzj4dDfnWD0efqIsbCRmspmJyenUhsLOdSkG4yjI7ysHQg2nyCsAIMdUDBk6aT0ZuN6BGVaYmAF/nMxw58Ij/zdebe/D81z1H2EYkxNZldmiysr2cnUAkpyH4x97qsNUpCDAwhCDPx5JEuQi4ulpYuLk5PCaw5ivFQ9mkFoCL4wHtRVoSiG4x4Yu7voqTQY2KKlC1Amp9IoCTNyu7sLIHBSQkIMVQ80VZEdgCClUqEASNMMNrxkuCDcVbG7mO8jsZ0pKFaKF0snJycXswTBlCBwECRFjI0NgggEQ/RwMAJtVbosVS4BeXFbNVkKOyQY6YknQn9H7w72efZ3U2Kjigi1eOlkSUIQYlBnCceGrgbVgwsoegp+vJUUl5cFR0OGq8UKxGX2xMdHop1DtJ9aSIl5Fbsc2pLS0gW31i4FYy4Z9AUIC+BQ7wKCHVSNy1KpUijkHTczkBYgREH84zFi0HxnV2y9cVm4LJ1crGSnUqiATJohFAURDH4nK0qVSuWyUCjgryGft0Fcd8bqM9CijPUmfe1tLpp3zAkG/i7WQ5X+oaHOaCwUHk8khkXilgxj3QmHw6FQaGRkBG/t5KW0v393qSCTz29bIB3vdsk4u5wiXfTVknR1vfvu6HvvwRO44/N1dLTrdCA+n+9OMhAI9NZkbEw+CVCSSbxXvduNpBRk2wLxQqAgMixqIYQdSWxKvYMhSJ3jOoibErwkRSFvg/hIwL+6tKCVBXlfQVRB3G4JIYZ0BF7kQJQDSecRMMprjuqYj+l6MKS1qYO4ORoiHYgVUt9ZeLMF4lnb3oZDQcBgCANERQBqLaRLQe7ov1GWwIFIh9hiXRAV4UjaGws7Q89amRjlNTsEYYhqqdZDBqgiXI82hB0MSRJEpx5CEQ6CSAZDyttryKKDHZSBLl2PZhjGi4eE91qAsENKdGM1hmiHnnRiKAgki4sEUQ7XmJwPPLZSYJ/2eohorHoIpxGkXUBEuqkYCiIX8zHpaNmgQ2hoCEsIcsfHDj48QGtxQW6GIHUFUZBFkQfLAuJCBtR8NO8wxIP6MuiBNbq3GMIOhrhrOyvZCKL3WR01kPvKseqQDFREEZpHGFLAYQO/ICE87mMBXwc58ANVRbCGBK6DiB1ZXWe1WSuytvjgweq6BdLMXtfQzwwCMEcqtEVKuLUYAgdLGGIfdTtEfKcKYu8sL1VEFWTCAYbIwO26ytAMQzv0cxmeFDuknRzBIEPcN0MEo/Goe+WwLy6TY8bh0pDbFcOH41IfttKHR/E/ejGHl/CLfhsRfWaF9CZREDhMExIFgaRhZykE10NAtMPrhaW7vPYAjrmZgyrEO3B9PX5+9v2zH/6o2dUebiIZv7O0uUNbW9rMOA16bY4gBp4iOX6LkGDY5Yh4yQEJ91b9sCuKZXAQvc+CQwWQRXYcXzmUA5Brcvr7O5SnP9g6CxC/P/d5BoLNHDZ8ZxNP8exqkwvkzJzjionPMiY066qzTLrkEbQPCSt0GjuwBNkh6CxynJ05pON6yOlTKDh/WiH4K8cGXm06UYorwzm0mQHkyjBywCDOnXV6ZJOQiM66Q50VjER6eiKm7i0NaRBiwFG/iPCwE+Tg6uyJQzhugHwPgsypvSJ4PJxHGdbnfcZh5jDD03H4udj++fnN+XUefenoEp3VzpAeggS9tRDkBocedQ1BY61PHJ89+fGFkL/e0XmmhsRADlGDnc11o7I5NJ91fl7KZKgE5c2swblaH1qn4jjlsKtR586SENeLIUkEBF2QmtZ6AMfB8dmPjxzsuAHypwXyVDgMCVlfL+doyv1XmeymDxAnlcfQwTdKojtLQnRFIElWN7rWQtXQjjrIfVmQQ0BguAnyjAQqot3Vbkl0DSC5zcyhQZD+qmPo0McQEe4sMeoSomcEJZHHWowQEA3TDi5ILYQqcsUQ7wsgv1gc3xhMYAogvIkEcX6OJgLEP79TKpWGjHLZ8M2f5642/YKhO8sO8bZVe4uDBcUSqgYYNxQEEFoLMSEvAfnZAvndehB19bl4nv3cb5R3UKFzPKWUjfMrlCSziWec6iKCziJI0OwRELW2QyKiIXim1kAVhtRIjlbXZ44JcngT5PRnWgR/1ZAfeNP1wcdLprqq02qodlo87GpIZFjCIB++NEM7ZGyQgytIfrwe8hetg79YS/IMHSUE9OvlGexAQbizNIRKok93hUb3klK0I9KhIFri3Z+bYMiTJ9dCTr9Re9x/ZE2+l5MOxO0c3FiiIGpE/H5REq4Jb6qlMNbxtsWtIxzefex8sfdFJARjN9B4HfzLaZw+++3p0+9/ls0ExG1SdYwFeEJQEHJISZAHniys0b2kGPbUOlw5qsjx1fHxsUM66iBP9VyoxaAJCDvkOW5STogJB0tkUVjCGLXt9ploVBHpcOUmZgA5npmRkLYbIKKZmjDwn68bEDQWbiMiAhNhCQKN2tja7daUWodrd4YzgfMR6bi2tU4JwSv67SEBN0HIoerhlY7h+P04PUJi8qEFSXTs81DfW+RQkAkwEAc5OI2H/Rfa+H9+e/qsbsKLCcOWaD2kOy0ckbBaCoNm38l+fBiZSOBmQWKYJEFx3iujRfJp4xmBgyATnLm5dQccClJ/GvLNnwZyKkQ1qcTocdTkh1Gjt9xLz0bpKyBfBaSrzTUaSM+6fa5YAo7IUf5BGoS+oRm+4eHpg2Tkbtzv8kYTcut4/LWpfti1I7gLBL7WV1frIDrGH6ei0X/gVR0v1ENilcnKaKCSrrj3y2mugeFJG+Wp5xXDjd9KO4vZwr73Mj8YXztZvMefFthOjY8vbm/P0F2bcn550p9drazmgvnC2pQ8ldfFEQ7smqVDStSEBIO7c4DAsbzswIuNIDwXcjx+5lWkriLUS+6Au2D2P3ebbqNsIFDAUnYbeXOy29mdHvB3ePK9C0V3qhRKXdKnBQiyPxfunMG9p6HcYHbZ/8DTk8/dLwT963GcAAuJVzvsy6F2UAgyM3cjRE0EP8ER8K+nDVvL87y7YBrRYqXXClkLOIuJYicg755MTeZ96Vnv8+2TkxUec0COlsOhA9xCi65WKsvxiU5/fje1ZJqrMXEGTBSvvshdA2nT9eCKYEC4tRpDhIHDhys//2HUQYYCgdHnw6MFM+YxpjxGeRQv9heNdNq55k7mk7l0Vzrl2k7e2+5IlcxUPnT3XhxBRYZj6/2DBDmaC6Mi+dnw2oJnNda/SCuLkmiHr6GDIeYCJn2dmktD3O9Z26qKAOeaFHFTdTi6VCwmArhZHjDSFRrw55XJnHNt8nKwa2D2MpsbXchnC2bn9mz8+fJi3zAtHie5eLy4XF6NRmMjS8uFNX//WvnBQk+2jBaTBy5q4sViT5JrHAyZ491WQ4i+ZqDWwtsdWq3doSu94vJ7r8/tNelWbjhBjh4EozIcxqyHwsP0wn7/4OI+vYoAosZEHxdbCsIM7TA3aBXh/xzKoSH6AFcbbnesOztACjDguNPeFiQHILz8mfxRJ7wQohfQSZFYPp8SDA0RDp922I6wFCMSSR8czIg4lAMQ7VCS2wcOrgYp+ACro83V4x8ehwOLn2gbLCf++DC+jwSD4qNoiIDwjFSvQWpI3e4qCAaSUpCDGggD9Jw3Aaky8BkBOiV0u0zaavQVtpvXb3ncCJaLNgsQ7WBIvaOdFda+AoPeljo+PoCFrjQqh66InHU8NlcQdoCBi55weIN8cCW2u402SJ6043vaMgHRDj4DFo6ay726r5QDkLPjg2Pk7EkNhMvBv5oMIJgO1EM42tvEhkZQDV7fGIKX+KoWfaMh4vzX4khC0tCBtpJVBOT46uoMp4gOViiIHPPmIfIaL0MCSXkrJCjvhdB6ILfdFA4+jtQO8PhEvtahFDUOZOoMeYJT9kMrRJWEPU1S+DxKV0TcgBVXr3izhIy3VxdEO2C2OXxMB0Io7A5k8gmCayiHjywQVQdpaRoiJXxOqD8wQ5fXGSIdNCDs0PNRc89EOgBhg2JoBw4Tsj8ij3766REgbgXBZuhlpGkIS1R3JVmAO+aUXkDg4G3h/ZfoK94gQOSNBj0fgIhelBC915UMZOXw0aNH59+dn/9khajhYEazECUBBRIYBgZoRUGBAOHZF5POu17eo+EsiyBWh48ZPCDwaoa1reL0xuKjn87Pv/sKEoe7CrHuc1tBgYQQo6O0NkqHN6guYPNS2ANGYpwXmZ6663UdNzmYkUjMnn/13VccC0TVooUSKN5HbcihFhV9SEVTzocq4XFAIqZwAKIZ3Fc2BhwKAsf4xXdfbWW2MhkLpB0QKkfLKJBwtAMDYlZHAvGzIxQChC+n8H13feCux4MUGsIOZoTDJ1tbD/cePnyY2ZIQvE1UpDUUVRN2qDUFAyJ6iVsJwXMBSVQLwouNYsChGbaC8Occ6aS/9HBv7/FeJrMFiGAoSIuiHKNUDvEZLTcaiw8fEaIgBEHQWSiI6CwVKOzlqJ0QcgDy7ePH36Ie3FrtCENaFtFZrOBLpaLdva4InYcgUsJ9Pj5uG3VEFkOPuYawRJRynM5oYpfk2Nra+uo7C6SFBQFEH8j75F8vDoOHQyOx2AiGgh1+oiDKoSD6RFDHJomLnsTli8LO472H5ACkXUNa7MDaoa7AIxiQeBg/OxYKkUNOiZh8PuS9ycFhCpeECkKOaOHbvT3se78DpP3/gsgPMCqGCwOSCMGBgoiTXr8+mapvLO2wUxjCBUFto52FPex5t75CWgP5CF92iL4hokaWBwSNhXoQQ4QdJjteBiIPMeEQBYleoqvQWVtbmdZXBA4J4fFQu1CT/q2CuOIgHGJXWj0n1LcVhMMOwXf0PbeWKkgUqaAWmQzWxIcthzglRN/E9QqHXy0aw7yyI4rB9WAHUoVYGRxVEDXpsRggqAW+9r79tknIRzeVQ0LkbXW1AXG1hMTjBOkREQ4aEO1giMsaq8MvHZwSjlAymW8f7+xUIR0tqQg79F1DOm7nEeXDEYaISdeXsfR82ByNG0sPiIRUcHjy7eMvP/vs49ZC9GdKVUkAkf3AG4DwISJFHbvXN5YekCBSO+jjIVUQQPb2dr78ePqTDz90KIeGNN9eioGIktCRezASkUsxdQSmPQSJiDoJYUg7FMqhFYj6hh16QDiXqMbHH87Pf/21QzIY0hpKl4S8L66XBuWP55+v1hEOQ0RBrGuhhsjIpZAdurEo0fzHn01Pf/HBB19/4GAHZbRVZyJVyChBXBFdjhjdSogBwmEIdxYknDqH+pg4M0R/WgoSjQIyPf/F1x98/fW8hrzXQggcqiJB3u8qByBUERwqEoQLAgiiFHpAePsRPDBDnYTUQD7/ZP4L5BMHMV62Ih+9iKEdEtLRZtJ4SkgnIgoyLq5pywvv9tghzEBXwQGGLK1ydAIy/eGHn3zxyYc3Q25hs8+HhAQ6vIDInw8IFwTF4IN3dgAiY4NoRwTRJ4Vq1JiBAuc//fjj6elPvpj+uHkIEPUF0Qy+u55s9+IQi8P/1g0FGUFBsEXCoRl4Yocoh2LoehAkyg6GYNw/nP708b+snFlrU1EUhfMLnPXWiVhb26I4FVSsrYSaAWIhJAgxqOBQfTCKFHwQNcHgSwaxtZPWqVWxdcRZ/55rr3PO3d6Y6q24HKqt1Pux9j57n+GeCDkI8n8ShBAKAkcoTA078DplVxdA3IilHKbqNS9UB+fo5OCQ5TAE5HIhk82lkzePRjb8K0iiZYYoB0/0Y3eEwSFbOwCR0LKlXf1QkJYcaoefH0JBRU8WCgitdObqxbAgifCG6OqJqewi9L5ypwBBwGFakyCIb0jzGlaPWzKxceUwotClbBKBlc3cvB4CJIzUESVxjTyEqojZIUffjj5uuLmCbWsGoYIg4GiB4XNERXvO5nLx4aFc8nJokMSfrdHeRDm4DsTXJwHSxvfYZfTd3QaM1m+aB7Y6A7VDOViMBIOvuV4bGorF8vHs5ZFwIInfHr/y7c5YZZExy3EIiNklWb2tp9OWw86pqQUUOVPrKCUR1RqzBNFa3mftIIcBsRg7dpzKD6dix+LZwtVwIM1AYw/NqdNKC0cgx8GVOaxpLTeGsD954XkN2csVBV6gJ8qcnEmqfrIgttmkBMMWkF9BhodjAMllCj7IuiXkiH8WuPj897JuRyy318PIWt/WxwxBxzjhlWQi4m99Bpxp4FuWi0B1HD2BNKcIYjkQWnHkejKpIOsAEnbYqgDh/rOxZ/gfJx8riS3r5OC7k1v57qTs7TDVu2BI75uiN2F7X5JAArLeoLyrziysqBW9eqC76vPzg7KOUGczmUwShSSXDICEN6RYkQAD0JiCaI7s/31lrpNlrLt72vO+cnqlc3cD4r99JyDj5HBDFg0hhlpClGiUBTGdRmyFDy215L3nvecfJvU8moIYDm5PgWG2UZOJ7m7XV5S9kvD0AmXvm9nGFDkWZhsLDDGQ1CeKXnkBcUUOC+K3JQaE+U6duVlIAiOX/Kccee9Obz0UkIQDuYOAI8d3OPWEu1PvmLuzE543bQrAV897hEEYGV96MypfnKmtr5U9aKJmkqUKu0fJQQwTWqyDRgbE6UwhmcsC4+rIv4TWA3dKHk/yUR0hiPjxFM/1SjZ1AEAVAWJCWyIrGt30WhDs12aFR3jXU7Vao+iNqh06lxEZGCU5mU1nC4XLIxfPRSwGQEL3JZWiOMFcua+fJQibdwGpoSsZlcednibONBN0x6RX3hHd1PXCg8pzc4DhH95V8eH1tm2vxxuo52WvLNlhw4ocNjHIYhkYXVdyaE9Gjt66fStCDgUJpWfyhA+LHH5VQRBERwnP+AY9+7iAcLj8gMjaE+3qEJBRCSSJqneoGgtFBNc2WFgcn8IYPA8OxSCIzQpHQAEkg6i6dffG7aNhQYL2jNmwwJilYmgpSJs87ZdOiXAQPdq1E4I5H8CxW75U2wzN4Zuw+NUB3d4+WzLfd4oYHHZdg0VHlQBD1h7oSuHmyLkbN+4eLUSIsVRHJKzl1+TzxUEksmZknO3oFhC5bmp7yStHN6HbahAEADCrCgz+4zJG46l6uTQz+kY5ek09Fw7/6pEdvvZcuTxyTvwopP8Ikmj9mW9yDPgxzv6zniySI0z1cgfUvUlAtmxZteqH5EpvX1s7QQRAQNohC9LmJh+QxfBroDCIdjnJXy5dvXj37u2RTHw4ABKybZz5Zfh9AAIrguyzIK9WbwbIhARGV5QgIJn3itHuzp729QSR2QZASnx8gjgOhGOfFg+ITQkheB/aTkpITh49d+voVSzRxSJACB9a9OQxC7pN+knhUBB2WQRZsxwg8woijpS8eQmsbQSZklmTgLQFQGybqGMVfpLDYGx3MiRnrl8fuZyMDx07tiQQbbUqLis87XvxtyI44AgL4kokckmeByDMkVXTGGLFEAuCpyZIT08TSKeCuHGWfpBjlZGQILpO3sTSLxeE/gSScB8D+QJHXB2sI521NRGsz+AwIGs3zOLDCyw5924qAgQBgfZEDEF/ZUHaDQj0K4jt28nhMExckUNJ4MjZpCxsBUDWNoEkFi+JDxFRFVsY6+Rg6/7SQ8qA4/N7AUHLWAXnVM/ezlGpIywi8zCkDWNU0BGRBWG/qyBNHL+DHM9mwQGQ4YjjWBs6R1hFJuv36kUZtZb5nbuAeO/vPcCnAYKm8S0+lubrZVZ2ticfaEgTyN4gCHNdI0swyNEMAg6A5NJQfCiWiliOv4MkWk2s7oDDHQ0QEKpKEMwM33lUSXqtrk2IrO5OnJFtBkHRUBCdSSmIchgQ5dhzViYj8XxscCAkCClUlfp9ceWe+AEMcx4LIMW6TICfVKtVAYEnMzLlq4FsvOMLEsUYsg0VvFSaEiNel0plnh2YLpXmhYMgrTgIEuSAVScLySzG3gup/ojBUJCwelx5bF/BJQUOyAGkunXjk8/mlgN718RmtMErpCPsfISGpU+GLH/VjZWPfpjNOE2RjpYcBFEOTqwyuXge0/bYBeNIKJDEYtvQ9mactwDZKOI1B8Ix94pnxz5JIO0dHx3vQ2ChnisGtZccIoLYkq7zQFvMAxwA2SM6jjQ/hn0FvyCGciQhLAqhBxz48AriLiyqedW3a9Y8+VRE/Mt2Dxd87aKCS2qcn8PnFcTt5FgMTRCXIVucIdQ1rKHk4/G8K4hLDi1XBvkqMd7XBghDSzkQV3PMfP5W4+ug7UwQPi0zgbInASFX15WDIIYjmCEkwafPp2L5XDadPzYUIcaiIAmtKMYRZ4peEOJADghI4HacNXOkgB+vltvTpeQw27udvgREG0Zy6KSjNQhEi46k8nFs6g7lYxFwKEgidIr4hnD1iqdJx+7d+4Q/k8OdaW/UJybmZs22mn+3LM86+SQdlsQumtAQcphqGByzGFqUoTqPLZ4kNkNThxRk31K2E9QRk+tyDSIHLyHRo8cq+3Ir90m4J2pJOiBu8zJtNLCcDIgxxXeEQFsE6XQ8nc4NXeg/dHDpIOqIqyF6nSNAHEcziCxvMawwP5EpKz2xINxWtFs5mL84EPTv1hKaAksUApfQCsmpdDYbH071DyjI4smuaZJoGnu1GvockjD+yxIqXp1JjF5wiLAMLOKBISJp864cCuJ6X+UgyDX0J8Ox/oMHD/8BJBFmO4QkigEOvRvHyd0tu/eXPOY6MDGgDpVyCImtiBQtIQo4CIJEOYXQyqcOnjh4KAjyF5ZE8+irJAcggxG88c5ibPb33igD0suprE9CKq6IqqI6w9VSohzbr2GjJwaOgwMBkJDpEeAgiNohEHo8hiIHV38JYMWFU87IeylCKEaU8jmY7ArCwJJO/ngu3z9weGBwoBkkEY5DMRwIOfRWTIiJQVmOrigEAqduiDg+g6VQBpFxgxiQTRH84pTkVGzwUH//4OBgfwQIS3JE7SCGbumAgx0vGfgbrKAw7HKjhyDm+VUECVqhTrjsUAoDIhxcXzoPhlRq4NBgqsmREK4oh8UIGAIQzXHdDQRIt8lxG1EBX1pjcMkHPxxHUwmhflJyPq1tA0EU/xS59dZboaGH5iAkGeE6MRgXo1ggcmgxRdUttx5y6IfPm9HMPo1YC2cgJAQf9ue3o/m3qzPkqKq6LFYDYh5qxmEYpgcDIfzCfNymzPpucqxVOOgOJgjngk7BBOt+mfg6goPUZakc1Ucfv1EQk0M57jwO0sf9mp22FGwyAJDZ+MnkIUZIeGEBxKXgFvtRqtVb5FrJR8LCY9qYV+SBfm5qGIf4Bn58Vs5k0EEEhZYaouQwDIK4bxBC7WdRFpBjHHo6+wODd97yIKKHejnvSigDzI8ueHbuJJ+DOQhJqAe3VpYDitR1WSGV7weCUJGbsixYnEHzxK6muWKKQQ4ERJh6CdN4/EUSViCK4BimSA6kqqv90PfSRQmK3EgShtD2MuKEMb+0mtq5LMNBMmXxcm7LSOgkSxCvPCJHsvN2RKnbjVUVtlY+K8mDOIdN01UPYPA4KMxeNu63JDg/A4vcWYgNE4IIgYMwoC85tB6BGsNYbzbFEiRSrGeL1j8BiAmiaohnWH/K356ePERDiZgebcQQyPcWg3pUZKJQEBq95cvfpgHGbySNeRAiEMAYCMKIfmcbi7vKrw5hsRx2CIibkJhZfIz9UQYQgiz0kH9fmn1dbIoyghAgLwQ5HCRxmCDgCFegzKmjSzuJZ4tCkQP5ar3FhSDkgFyXfQ2rtvtm1UdoRDCDixjI94nDQMDhc0z5qhk1NO4xWnj2GKbmHtYz/YYFiHcgLtqc2499G55a64KQgtm7P7EcBIKkY3u69S12294hyCcaMVY4IkgakLztDl3THVHwZn3k8ToIz5BmQaQsX8wFOOBnsMggGEYm382bctz/OR12zTCMw24O8rgKQjEmPUIMERK/1E0QPqXmCeE1jm/XOSBBMPMQgOxQ6JbjoX2OiqxHc9ZSKYYwqtPZOXKanIIE+kvYzLvnpxMTBkHCdgoU4JhI3prttjlganUKILd4CMsQ75r4PWcB8U6ig8ji0hKt5FNHZxWyoGA/jhRiC1UM5dIdT09D//T6L4Dc4ulUJAjCVqJ6u4FYAmhm65yTCIchzD/jIICgEYIov3YtWtiH08tLAFmtQMIpa0ZD42A4tPGZg3jTADYls4JiJOxbsfxg6ydyRB6jAkjf9cc2gqwKEjESiAZ13VfkcBIUtwISBn8wLFZE8f6brBoASiskCYsg6JpEFAIhso/d8+v/lk+tlZo9NhvCYVhPe2PWCxIFUUXCHuGYJvWoZc0umklCDsWAXZPm/M7YGewkDAVR9A/8Af4AcGOiSS0QbIhd2IQ0kqhBujCVlQt3fIDxv71zmfHy0mq5QQ2pix7ue+PM+GDKDY6d3VdVfeYeOdnmYMADoiGRvivtDUs8ak14T34/0Y8CiYG4Y1KnJHQUtyEVHalf1uvVqq6r85aWQIBgIodAlL8Tw5cWSSYTrq0AgYyElmjlCYTq2yB6HmHMtFtVLeuqZbq01K/uByGHWr2aJaKlRQ4d4LNNwBeYIIcDQejICUgw4Ic4dL8uPU26KPNij3yrHWrQddujZIgOaYCIJDaIiZawviCJDLmEIQKhJan6Obog73uoLGZ5Pgii6BvtH6cYadrOiSc8z37LDN77IyQRiCXgsdkB4pY4ike2NDx0DZF27bKc5cjji0EQcQQIMOJDt8VBElri/wXRqWkWrwAhCdeVcQgEkKnG3QrqL5DHAp3G0lwRyHQgzRIIONLxRXorToCYF565BwgsoR+wwzgIwvr8GKG6N+p/QH490mX9/leWl+2mLbYNQEIX/xqiMj0Z4ZRwYG05SDQPvcjgJvGX188sqD5XeMb3lEMgJNG10NMcXa282c7liCwZBFFe4iB6A8sx1/IMnhIIBUOMgxII3UpJImALJEHk1buHLMsWTbPIiz1BXKPpjeuaXx5obW/jYZ8141PnrlBvI7MdYwIjZmPaqFIbj/mJcZMckHecGvn98fz2amPYfuq6ut6mYSgKPIDgBegQKmhoDzCEhvgQT3NtB8+L4pEGvKRhXcjSla0NWkUY2cI22kpMDMbT9lP4jZxbhBAC7iZFdSPVJ/ce22njczZW4Zm1DU8gWE6t9vsZ9Dqz7XdrBxtv1zbQQqYC3QMYb+Cv1c9Wt7cPsqzbpQaISWZZC9GH0ieiD3HJ1iI0l3/Goe6knU4nZYxrRUD+jMm9700c0e3Jb/x1jECPJns+Gk9m5uZ23iytk8Pn8pe1rL/Y6marWYsOWX/3hBSiTo8GVdVsDptlEkV2XFVJ5Fnr2aLwLBYTSnCh3GozicNhMwzCOA5wgxeYNJWMiZ7reqEyKlDacXQQhkoyKQSjHjOGQuKMc7xyHKdDGFInBQ7Hkfp/QCYTxMRWcrZ+d+buI+y2m8LCsH77zoOV9RfLsJb88uEtXUwSE4W7wXNoo+4ej04HA4gwFLZIbDUsPC8cD5OksB5t3rTWYilhhPLHTYv37LAsXIw3xgh0ME25dJjO6aElLSVzUqb8iDhgAMRB94Uj6RwnBQZCwhkgARAB4QJfPvwjILt5jfaYk4zUjToGoEYduaHRtd54sLL84gX5Y77eoApYpIC84PEJaaiNDjdJusAiiiJ0Q1sMCz8Mo9AiLR4Wd7EQ3uZR0w+Tyg/dgJ6rFA6C4ZIDC9cBMBtJfRWBi8SYXGkhcTAGJeRQNjrAIwg8I1CgCPv1+8ifIECFqVtTs40bV69fm8IGwmnMxI+/o74a+GqwMb3/dHnr1Qc4xVF9E5B+Hyn5tnc6ghLcEQlJQD0mod1C1m/b8WDgtV3XVtaNjabPluNR6dmgigIRBLibiDXaxeTrwryXcxZEAcYhRxoV53Q+w5vSGDrJKMnRcya41LqnWYdCMPZvIIBybfZeY3pupn75KmpppgYi1zC2TNYV92s7T9dfffqwtnHQzQ7gj9OCvCB4ejw6gvQYxeagSqiKfK8YW284KD3XQhYnaedScs61t9mM4ihSBn0MfCGN5IxJI4iycZCrwFXS4UYZKbSRqTPJA6ccGMFRcJQGCfAMeUyl0T204qQzf9fWtal7j2sP5/dr0/Urs7fvz+9gPNqZ2A/Pz83tryzD5BNenavdRfAi6z7/fLJ3cnyCB+03oXQF3RjoYgyLKPQ8L0nwPx57buCVh2XYzlVPa7ccNUOthXbQKx6rFDWFrk14IOLA9SLNmUaiFIYA5IZJiVxoySUDHwgTQHFihWRa4RSBqgSmMxf+pDnocWX6/dL6+tLLBzT31lbgpLxANrFvYLEK99Wtd69h27e90YXtByj+7eR07xg1BV2+w7KoKEhdqbIgOmhSRBG43tZ5krgxGNEO/KSZ9ITTkXTBDXoEHISJSour2I98o4EozhXdZSiqp15PaUmURs6wGhFIoAZvuAB9WEqYhLx05uzvlJCmIAhyb3+L3Hp3arV5GMc+W996tgAH4vcLsH4GzUFyTAoHrV0I6O8uLn4eHY72TqHKNzo9HFqbQKGkpKyUSRglZTUce8hJmbiRdXsGjA0iP3JxEVmK8uCMpw4VD1VX2uFaBaEf5JJLFUD/IEb/JbFdGeDgnLAT67UwmsgjJYFj1JyfJ1vz38U1USW7+xKz2rM3qKiFBdhbb31ZhkvsyvuFJfIkRnyF5RKY8RGx+/zzHuWCtNPKsvIwFgEJlLvwwtpyQCJeQ+zwOKp8P1YyTVOBq6sZ+CqxrhA0WKXUH4boONqodi5QODqm+YYDntCTI4JLOnICIzglIqVGGr2kunj+3A8SJEr4gI5dBwAAAABJRU5ErkJggg==", + "description": "Displays a latest fine particulate matter (PM2.5) telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "matter", + "air", + "particulate" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/pm2_5_chart_card.json new file mode 100644 index 0000000000..6a5e88b70e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_chart_card.json @@ -0,0 +1,33 @@ +{ + "fqn": "pm2_5_chart_card", + "name": "PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine particulate matter (PM2.5) data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..61b1966e6b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json @@ -0,0 +1,33 @@ +{ + "fqn": "pm2_5_chart_card_with_background", + "name": "PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine particulate matter (PM2.5) data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json new file mode 100644 index 0000000000..f50dfbf9c7 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json @@ -0,0 +1,33 @@ +{ + "fqn": "simple_pm2_5_chart_card", + "name": "Simple PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAhFBMVEUAAADf39/g4ODf39/f39/g4OD////k5OSAwyzg4OAhISF0dHTv9+U8PDzP6a+QkJDx8fFYWFjf8Mr3+/Kg0mEvLy+/4ZWQy0aIxzmCgoLHx8e6urqv2XtKSkrV1dWenp7H5aOsrKzn9Nirq6u43YhmZmaYzlOo1m7X7L2n1m719fWQykb4eF0NAAAABnRSTlMAIL9AEN/GQiaNAAAEq0lEQVR42uzPwQ2AIBAAsBMQcz/mYP8BjRv4BNJu0AAAAAAAAPivXZtr8akln83lXSOunH17I2uU0Q8wS2Q/QoosRmQ1Ii+7daxiMQhEYbg7A2cQncIiShQJef9X3GsWcndhmxQbDNcPLHSqHyxmNDNkNDNkNDNkNDNkNB8RInjLqroUoGnBi2qALKaCg+9TXHJfiKx0+bx5er8zQ2kAEilwa1tjQBdt4BBHMoZ3CAAzqOtvGimZBf10TLjsrpDALv8K2Q1qsQJxoeCl8SgVqvqAS24LQeSL/Pxaygo1b2guHRNxHl1ZlxoN19wSIpF1I+nxDjHTDVALTKaN0jsUp8qAK+4J2UkHyQUnTxzUYErpIWFd8a1koA0Z4klDyPgzJNPQQ9aYUxLUhMQq5nDJPSHYfICy4lQdDsuOsG7ITsR1Fc4D3tEEl9wU0lWX8RwfsaI8ygwZzQwZzQwZzQwZzQwZzQwZzQz5d6F53+TxIWHhQeXZIeK4FEAWOnl0iDLhUKI9OeSLPXPbbRwEAujbZITBFzABX+vNxWnU//+/nZgs9taOam+1riPlPGAzUIlTGEBxzqL+97L8iUUCHft3nTyxiAjAE7H4aUVyVoAnZtGTidRF7lcWDEjEU4nsEsaYKIYrq0/3JxKJhY7yQrC6y4riryadbVgkP4sq2A1Tuu502DlIPidFpuNviCgO/5GAaRowO4LDf2qJs0onx4enynKRxiDacpbLxSgYI1O06cO/j1jkPrfWPrCDxyS6/keRPWmQiplhwrGdjNpTiekX50Ssg35CHkPN+i2+3YcTzVjya74IR7wqCBFP8CUNhjBGSQ6AHw/Pidyv/hkTQiYBY1WlWZJFmWDVbq7IO+KBHim2MIU6SPAY5Hd7eQDiIJXrtE+xgWn8OVGz5GZSsAC+IM+Sc+b0j4JF8TyRELvRXTD1dbfg3MMiGgp1NrLrg0jDpigPLd7nkafG7GEace7PCBFECatiWADNjyhmiSh7Gww3VI5FqLSpwbtIiWEnYruYoSaLFFJcAbSopgfCjv37WTOx+Bv9TlTzkr1BvJQWWzUW4YipIoG7iEHViRgXu1IHS6XEVkqLMEX3JfXbzBNRJd44wFgkdGHpRCSW4JYW+KZuRZ4Q0TYwSVJRsY5Ii6YJSUaORKiw0IuU+D4Qcanltl3+/q5gGpbBt1mU7Fc0Y5ESP3oRRT0eiDymcJvvGiIXbL3PZ5HTcEZCLJeLCAHECiL+v94MRPhkjqQoF4tEbs9aRYQMQgBlBkvr1NWRStuN83IT4dRhoUic3W+AK4i4IaepRWy8iKujszTdu6T4fqHIrvIea4gAL9Ftn17EUPXqUwXt6SbSIl8mUgt9BMcqIoSSkg93MaorxfmfW5W6Xce4HzHnikrX7h6THLWowbOGiMeLgIc3bmMzcAgPsIRoeG/9eZEWzX6fusW0iIxl0PPzItz4/Fko8gYjVhbhYQgDZNOECjbGVn4Oeom8RLbKS2RrvES2xktka7xEtsbvdu6gBkAgBoBgacMl/aED/wKxwPOumXGwBlbIboTspiMHrIPWejKqB8yD3r4i6j5/S5U1aRQGAAAAAADwywcmOfeID1PhnQAAAABJRU5ErkJggg==", + "description": "Displays historical fine particulate matter (PM2.5) values as a simplified chart. Optionally may display the corresponding latest PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..3b3c1cdc85 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json @@ -0,0 +1,33 @@ +{ + "fqn": "simple_pm2_5_chart_card_with_background", + "name": "Simple PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical fine particulate matter (PM2.5) values as a simplified chart with background. Optionally may display the corresponding latest PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air" + ] +} \ No newline at end of file From 86f8965eabb4735eb7176aaaefcef5089d76a6c7 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 30 Oct 2023 12:21:30 +0200 Subject: [PATCH 33/39] fixed thingsboard.yml --- application/src/main/resources/thingsboard.yml | 4 ++-- .../thingsboard/server/cluster/TbClusterService.java | 3 +++ .../queue/settings/TbQueueRemoteJsInvokeSettings.java | 11 +++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index f04cc4bc38..4f51cc7aed 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1270,8 +1270,8 @@ swagger: # Queue configuration parameters queue: - type: "${TB_QUEUE_TYPE:kafka}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) - prefix: "${TB_QUEUE_PREFIX:myPrefix}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) + type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) in_memory: stats: # For debug level diff --git a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java index e81aaed39d..4b199e5654 100644 --- a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java +++ b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java @@ -33,6 +33,7 @@ import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse; import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; +import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; @@ -50,6 +51,8 @@ public interface TbClusterService extends TbQueueClusterService { void pushMsgToCore(ToDeviceActorNotificationMsg msg, TbQueueCallback callback); + void broadcastToCore(TransportProtos.ToCoreNotificationMsg msg); + void pushMsgToVersionControl(TenantId tenantId, ToVersionControlServiceMsg msg, TbQueueCallback callback); void pushNotificationToCore(String targetServiceId, FromDeviceRpcResponse response, TbQueueCallback callback); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java b/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java index 25f3244079..15ff55972d 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java @@ -24,6 +24,9 @@ import org.springframework.stereotype.Component; @Data @Component public class TbQueueRemoteJsInvokeSettings { + + @Value("${queue.prefix:}") + private String prefix; @Value("${queue.js.request_topic}") private String requestTopic; @@ -38,4 +41,12 @@ public class TbQueueRemoteJsInvokeSettings { @Value("${queue.js.max_requests_timeout}") private long maxRequestsTimeout; + + public String getRequestTopic(){ + return prefix.isBlank() ? requestTopic : prefix + "." + requestTopic; + } + + public String getResponseTopic(){ + return prefix.isBlank() ? responseTopic : prefix + "." + responseTopic; + } } From 59dcb88502b16187e3f611567ce41fd2b254484d Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 30 Oct 2023 12:23:02 +0200 Subject: [PATCH 34/39] fixed thingsboard.yml --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 4f51cc7aed..cf81e28f39 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -806,7 +806,7 @@ tbel: # JS parameters js: # local (Nashorn Engine, deprecated) OR remote JS-Executors (NodeJS) - evaluator: "${JS_EVALUATOR:remote}" + evaluator: "${JS_EVALUATOR:local}" # Limit the number of arguments that are passed to the function to execute the script max_total_args_size: "${JS_MAX_TOTAL_ARGS_SIZE:100000}" # Maximum allowed symbols in a result after processing a script From 4832b9c1223d3b22fbe2ddfa67ef655694c15041 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Mon, 30 Oct 2023 12:58:10 +0200 Subject: [PATCH 35/39] UI: Outdoor Environment: PM10 widgets. --- .../widget_bundles/outdoor_environment.json | 10 +++++- .../widget_types/horizontal_pm10_card.json | 30 +++++++++++++++++ .../horizontal_pm10_card_with_background.json | 30 +++++++++++++++++ .../json/system/widget_types/pm10_card.json | 30 +++++++++++++++++ .../pm10_card_with_background.json | 30 +++++++++++++++++ .../system/widget_types/pm10_chart_card.json | 33 +++++++++++++++++++ .../pm10_chart_card_with_background.json | 33 +++++++++++++++++++ .../widget_types/simple_pm10_chart_card.json | 33 +++++++++++++++++++ ...imple_pm10_chart_card_with_background.json | 33 +++++++++++++++++++ 9 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 application/src/main/data/json/system/widget_types/horizontal_pm10_card.json create mode 100644 application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/pm10_card.json create mode 100644 application/src/main/data/json/system/widget_types/pm10_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/pm10_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json create mode 100644 application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json create mode 100644 application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json diff --git a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json index cdba1b55af..ea545ac988 100644 --- a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json @@ -173,6 +173,14 @@ "pm2_5_chart_card", "pm2_5_chart_card_with_background", "simple_pm2_5_chart_card", - "simple_pm2_5_chart_card_with_background" + "simple_pm2_5_chart_card_with_background", + "pm10_card", + "pm10_card_with_background", + "horizontal_pm10_card", + "horizontal_pm10_card_with_background", + "pm10_chart_card", + "pm10_chart_card_with_background", + "simple_pm10_chart_card", + "simple_pm10_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm10_card.json b/application/src/main/data/json/system/widget_types/horizontal_pm10_card.json new file mode 100644 index 0000000000..5f7242e7fb --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm10_card.json @@ -0,0 +1,30 @@ +{ + "fqn": "horizontal_pm10_card", + "name": "Horizontal PM10 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAllBMVEUAAADf39/f39/g4ODg4ODf39/////k5OT/pgDg4OD/9N//vED/sSD/+u//3p//0oDOzs7z8/P/6L//x2D5+fnIyMj/6b//qxD/46/b29u2trbCwsL/2JBYWFjV1dW8vLzn5+erq6uQkJD/tzD/78//zW//zXD/x187Ozuenp7t7e1mZmb/wlBKSkp0dHT9/f2tra2CgoIEnlQuAAAABnRSTlMAIEDfv1C6kOEmAAADg0lEQVR42u3aiXLaMBSFYdqkh4ssb9jGNjY2OyFLl/d/uUqihTYt0IHSIfR8kzCynMnojwyBgQ4RERERERERERERERERERERERERERHRv/TuzetY7++6b13v7oPp6KZ48+Lu+859jBuQ3nd6uAWfejcSAoZcG4ZcG4ZcG4Zcm/8rZDKddjFpgWYNZI2d6OLK7AvpB4XCd6N19tCMHoCPL/gymqJ9al5wnn4dFv52hCNU4OMV3y7weEgiIrrYhmR4Go6esq6NmUwxXePlvC1JxNBzMwrdSOGglcYrhWidz4+GLMXK1feQl9EIo+nHyeRbyASjs0IC0YN5KBpQdrQUDwflyS8hIZSER0NyccLdjtibp4d4E7Je4yE+a0PcbueisJQl4Ofiw1EK5lC5o36hYEe2u28n3QxU0Ie18LQ6FqJkI/k5ZP0Rm5D45ekLzmeX74lNmskclhLtrrbEDGd2AZutejazA5nZmdBeitrm1Svp/+mO1Ngnxpl8pZaygAnpw92+DlnJLKi1eG42sSGyKBYmoi60hKjNRkpyKMQPkwC1WFrhUuy6xMP+ECWigML9TGD3a+CGWgJ7/Gy+dS7FoZCZ2wm3gXNcjgoXWsL9IW7d3269mR3uugM7VHXg40DIXAwNqMEcF+bnovaGBLsQJcEvIcf/ISoxZriwwv413R09keC3d/ZCttsQijohBCsR+7trrzhy144fX0/E+FMztwPa3Nby7Na//TP6dgmJ265vS9YeTglBEA4AXyTH1tDFmK/HEk6aIu1FdqKH1ByPJ2OkZbk5kR5/UKslT0LPLt/XkoRawm2IDhfucX9pR7l4piA4JWR3/eqfQpomKrMsMqMKVVm16bCKmiaL2seoTYFoHLdtiThyJ6KsxWGBFtPi27Xb0WJ3YeeSezYESzNeiWf2xz85ZPc0bRcSDeMsGkebkHFTmrGZG5dRlbmQXlmakGw4zmKTW8U4QikfG/52ZK8x/8d5+0Crk7/3NP5zVFbRsMmq2O5I1JbVMB5mkZl7bMdZBBuS2h0Zt5/tiaaqcBK1uw7qZ4W+luCiL6zKMfZrshLG2SFirXDRkDQ9dDLGyfyw3kWFyWLAl7pvF0OuDUOuDUOujQn5hFvQ69zfwNvsQHxvPjBwA2+0p+YDA50Pd73uW3f3/pY+VENERERERERERERERERERERERERERET0j3wFxKH86witj0MAAAAASUVORK5CYII=", + "description": "Displays a latest fine and coarse particulate matter (PM10) telemetry data in a horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json new file mode 100644 index 0000000000..13315c949b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json @@ -0,0 +1,30 @@ +{ + "fqn": "horizontal_pm10_card_with_background", + "name": "Horizontal PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest fine and coarse particulate matter (PM10) telemetry data in a horizontal layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_card.json b/application/src/main/data/json/system/widget_types/pm10_card.json new file mode 100644 index 0000000000..943c8f5ae1 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_card.json @@ -0,0 +1,30 @@ +{ + "fqn": "pm10_card", + "name": "PM10 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest fine and coarse particulate matter (PM10) telemetry data in a box layout.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "matter", + "air", + "particulate", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/pm10_card_with_background.json new file mode 100644 index 0000000000..ac01cc445f --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_card_with_background.json @@ -0,0 +1,30 @@ +{ + "fqn": "pm10_card_with_background", + "name": "PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a latest fine and coarse particulate matter (PM10) telemetry data in a box layout with background.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "matter", + "air", + "particulate", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_chart_card.json b/application/src/main/data/json/system/widget_types/pm10_chart_card.json new file mode 100644 index 0000000000..173e1be850 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_chart_card.json @@ -0,0 +1,33 @@ +{ + "fqn": "pm10_chart_card", + "name": "PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine and coarse particulate matter (PM10) data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json new file mode 100644 index 0000000000..731e6220b7 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json @@ -0,0 +1,33 @@ +{ + "fqn": "pm10_chart_card_with_background", + "name": "PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC91BMVEVOTU0AAABfXV9iYGAnJycrKyvz8/NZWV/09PNZSUP49vb7+vrz8/L39vb29fX8/Pzy8vH09PP5+fn4+Pfw8O/t7Ozx8fH19PT9/f3v7+/q6ekoKCjr6+vu7e7My8vn5+fl5OTg3+Do6Oje3t/m5ebj4uLk4+Pi4eH4ng3Nzczv7u3Pzs7u7ezl4+Ln5eTg3drr6ejS0M7U0M7R0NDPz8/n5OLh4N/a2dnRzs3p5+be3d3U09PFxcUvLy/i3tvZ2Nfd3N3Y19bk4d/c29vW1dPb19TIyMmko6Pj4N7b2trn5ubEw8Pq6Ofk4uHc2dbT0tDt6+rS0tLV0c++vb28u7zY1tTAwMDe2tfV1NLy8O/V09Hg3t6wsLDW1tfW1dWura6ioqLd29nX0c4fHx/MzM60tLTg4OHa1NHp5uWNjY4sLCzg3tzX09CqqarV1NTQ0NKVlZWKiovKysuysrGsq6yfn5/Y1NHY0s+3trU7OzuAgIDY2Nimpaba1tO4t7iop6i6urrf29l5eXg4ODidnZ2SkpLHx8dzc3OFhYSDgoJnZ24zKymQkI/i39zRz896enrCwsK9u7mZmJmJiYh3dnZycnFqanEvKza/v7/4y4LY1dOxrqyGhod+fX27uLf4tEebmppvb3U1NTXEwsCXl5dwcHA/QD/CwL55eYBUVVTl4N7HxcNtbW1ra2tzc3lkZGpqaWhYWFg2LS3i4OHJx8VHMi3Kycd2dn1kY2I6MDJNODHExMeAgIUxMjE7MiyuqajQzcrHw8K3tLJgX2ZOS0tFRkZCNztFPzXm4eDMych1dnWzq6irp6b5wGVfXl1QUVBRPjcrLyr647/62KH11J18fHxAOC/4qSr17+b779326tf137q1r7COjJZNRj763rCgn6aHh474pBzt6+yzs7WRkZr3xHJJQENdWVgyLzr69Ov35sr12aymnpxZUVT66c7KxcOYl6L1vWP4rzn4oxv50pL3v2P5u1fj4d72zo75x3X3uVT3qSoNVLLHAAAAC3RSTlMgALXv77cg77+/rxlLpU0AACwFSURBVHjabJTPa9NgGMfnr4PgwYMbuOp+uNkydnQoaAsDIUVzGi29mJkeFiGFzGRJoYshLW1TUwi0Nq0UTEadXVSmOKHoYO4wcQcnbKfeJlSY4GWg/4HfNG4y9Nskb/uSPu/zeb/P8/Yc6zmd5fe/LDx6/pwkY5FIjCzHYrFILJIRKYgWKYmW0vEKz/MVXmMNoWiyrF2ryrKly7LMJiVJokVV3dtT6/UyubZGzM3MzM3NTIxP3D8izBJraxmaVn79+v7t24unj5++ePH+fXUru7WVXVoq2SZvhNNKPB4PKxLH0Q1B41m5atsrO5tOLpQIhdZx5TYdX2JxMeTz+RIh/F73QYlTwOg5sZ1t7u8uPN/Y2Fh+FiNJslwGiJpKMYxIQxJAlIYG8Zpg6rJdNJqCjME0BYs1GhzeYVKqmsrEyh7GBEBAguSnpv6CYBIg0T1a6bgkL96XHlaz2dJW7WHWbmfbRUGr5DmKptMQLVFSnC0Kpp2tyqtObn5+HiyL675559Nmzvnk+DwBxhtP9vQcX1mRG/sfHz3b2CCXl5eDZCFYJsmIyqQYkREpUaQ5jgOIwRusYRbtUtvSmiwrFHVdZ41KkgMEo2YyGYD84QAIhpnxfx0hYtHo3h7d6YDkg5xtI89qrVoq2bpgCkJDEd1g7sYwDJVuCoZRLGWLr+GIk8vN5xzH2dn55OQ2PzmJIyDQqZ4f26u6W1nPfv5cbrUKheAAQQYBgli0iAsR00qyaQisZsCPbNUWeJ6t8IZhmgYfFjNuIUYi9Xo9hsICAYSMsf1dUyag7oBJOBIFiLoncZ1fXz/Ytm4W5aJty7bOaprBJulMNJphKIrBKNJ5wdBY3TK3tl++3HEWc5tvt1eXVnYWkT04joLAkpXVFX3/yYJbWq1Wa5koBINkMBhhKDQHbpHi4uF4HkWF3pDldnXLZps829T4SiWpKDSTKcPDWL2MvwEEBOAorBUIojBHzIxPuFgzHgg4yntqhOLQc8nv7DfLYllLBkZbN7RmA4UlZqIZFIIK3Igo5S3L4DWrWNt+++b121zI2YHmF9dz6JB/QHw9xWrV3N/9uPBsufXu87tWASQkGYwybnO4hZXOV/LJhmFaum7iIZeKWqNRqfD5eJgWRUaNxvB6uRxE6vgjBmw8HrC2ACgPBBjdTl+LqZSU7KTTnYr2XZDbdimbrdVqJVOrIJxEcWgNSeIoGJLi0kl4LrC6/fDVUru6vZhwNudzISiRAMC/IIpls/Hd3dTzYLBFEO8IgkA6JByREJaSlGSlmc/z+aQhGBbaRLCEShxnWEOiqZSKA0HFOYfGIlwfy64zJOQiBWHJAEgAMgfBDhwhlNLpdJROk/32VbCrSyuva69fVS2jEk6nOZpSkrA4RVGZWFThcLzxertoofQs69VbB20eCvkSOXiynviPI3Q4maZ3Pz7amPTfvj3oaXTUPzwyMnnz2rXpuzem8JmdvoYvUzemZ6dmp6fd6QeTI8OuAgH/6NDQ0Cge/q6GIPcxOHip39WF/v5L3ZBD/suXh2/euouTDHSuBgaIYJAYuzI7fevmzcmRrob9Q3686H4bmZyeGhsbH/g8MD42hmNCFbk0DmZFSafDcVeo+VXfIUgKVjILkfpoX9/ZQ/WdO3+xt7cfOXhco3gis0vdzLrq7b148Twu6FxX5w/lTSHama68gH0IiZgX+gdHhy4HAvfuBS67AvjoYH9/b68bD7cXEQOEBLA+NiBw1d3WW9jUKxPjY6AaGzhU/BBEpWk1Wo/N9p09AnIOiyKOBwIBo8vRhcDtrektfO78H44/XAcgHskBxwEInAnAyi4JrHM5utviydsId/RAsLo/MHznOsoD5eCCeByHyh6A/GazDnbSiKIwAL/AaCSZIRkDMiJKAtZgICEgCSUQDaihRGNIGQeb2ZGUmCYujBvTaY2raurGRV9gFl3xDGzrK/U/c+7cyy39o6yGufPNOedeXBe7xNlzLonoFUnxffAXSWKHxUnLpfWYnKSArBnsAIQeLZUFJJ+PmlJz2Ih2tzRdTW+y52xv1tvt6p1HDr0eyE85I2BIiIyEqLBDEJRDl7ABkZAFB90yS7MiIOTIEkPeQ92rkC6g8PQAe872qN2FA41VKSK65ErOCBQ40XLCgbW5IpZsLemIirEIWLJEldBiyMbiXskQBCXJx451duhDVoiqBwgVZGez3m1eTslRKZfxKS0aBIdy4/g1hhgaBBIZdmBNtaiSMEIbcZW4HHJ4d3jOHfSrcJgi6r67VupDaf2khoLkR+1qixzFSnkwwOYJC1M0yCtBLs4cfn9R1IyoyE7mzsEF+JeUmBE5EomEhHBfaQ6xTxMjS71KXwZVBQWBAwUplQjybjb61Gxh0KkeB57nTckCyj+Q44vnBg7zXHIB4jgEIcnnIJj/3ioHj2D8CW3z/MlNrrm38xfWmCQRr5TnAgyKhMjxwIOxg8MMdiRFyEOXM4RKcnJS6wHyvtv0pnh6HGStO6/T6QwHZdREh+BEfsDvicyCw534T7Zt0drfgkFj/jjwJ1vWdBKY4zC4WjNu3erE4aXFVsMMdqwiEhJruVEByTEjEzPSKIcWlqC3qLlQk0zudDaqo7lQiells9nyOsPhsE8l0SHPxw36scoQbqy57/vnWBy5CSzr8W3gv92nr8MAa4ZHRtVPGHNXQEybHfg299UqQxRD7Lti6wAFH2Lk0osOulzR7UKhsGtBUus5p7NNULrVZrXbrbaGH5H/tVbjED8VvmTJIfasW0DGAjL59TW4OfDHoR1cBVhJQMKjeFOlwIEIx8oKQQwFUQWBhBGSYbNBTzwxoKC7envY5+hwr1O6rYN+v1/+UVyCPBxuFCsbG1laGctjAF6ufT80I0gakO/31tT3JuPwPMCKDEmErnzdUT0MhCEriIKYCxCm8GmE6AxaW+01iJCkSjVIHLHVzUbt1rDf39+vLEP+UmY2q01EURx/gcmQQFBy0XRsYso4KkpiqknEiMWg9St2HLS2VfEDqQh+E4kUQeimoIILxbUbt7p26QO48Al8Ef/nnnNznJkI+k+aSVJ67/zu+by3sEer2aoaj0V+VQwekT9AleuvqEqt3Vx9s349fl60IKWjH+pHqw4EGOBggWMC4jGHgogkizOGBFZGasw9e39R5jotqgdznfm1y8vnD06xSDWMmsNmaFzGfHDzZ/HBOw7jCkBwI+XVm6tLeD7HlATyaX39od6nply8gsNZREHAgRjJZHHNc3mph+3c++uCOTApZ/XdV08dX7jcHb7OxwiqDEBaDCL6/J29387F80Gy6ND2eolXXDlEYhD9dQUCCEhExPFnH8Nj0gg5ErsIiBP5S2MmIM0proWaT08CUQVusUlpCg8cPs+KW2W3Uo4/Y50WQzgghoAkUSnHdjwwKINkSLio7BWTzpBrHV/onifPyoJ0m1GzGUXGy2UOmafoKQZkK4XMKoQWAHKXSYRIF8sgeBBGjgMMkIxYUhJPUKRAcsO5q48YOf96WosybIUI9tBMEHgQnshTlURkkAJI1BXYEqISNyhZDkDYINe+ki2tHDoeg2iogMSBNHb1x6td3pYIyeAH9M2BIEYUxEreyio5v3FXC+ICPAOigU4YAFFJC1BkKQeTeHlNAbGuZWMEEpBvBNKMquRbCqJLkvJ+EeyBOLAkKuVwcQ7lOfYCRDEkzGlA4oCyFtFiBN9ikHbnlG1WbEm0ZhnQEcQ6WQSRPmSLaBpRp9m52wWxn5JGhWI0KmIQV9F3JwARGlyVI5UCt/vTXUtI7FAKQq3K8YWF5fNCMkhnrXCWOBTEec3s7ea1nT6J0upEVV+l3/WMBLojWemnt5AMItlDQYDCjpqX89E9tEs+sn93+17nBkgufVxGeU+DYNsFjsiCWAd2E9iXpFFqmMTvz8+PgjiuVDdDs5Ikwf2h7/fjJIkTv/EyroyT3nh8v4ZjvUbJm/nwci7YWDxVLgdPw8YoGQePT5ZZwuEoBKP0p59O50AKR6+yf9+cBTl37NICgRwmksGXL1tbW1QQQ6otoXEW0XJBl5fkVrFf63ZrhVGhltRWzG18jmGhWpfemJEfbA5r9rteo98seSc+tOuPdm17jFt4UjHjcCNYpHHxgNIcEDB8zKEkOQ7ZL+44c/rQ2a/tzo0b4Pj4bBkch8kiL76AhEEo+Mm1itnyBvUa/tjEBQsSF4KkFhjcMt4WAIcLQPCtAzEnmp43M7fUWpwpLhFIufs22KgvFlWZbO5ibSqI1FTe9s7eZQ62x0XiCEmDLZJ1ragKzRRZaY7tO1d6sR/GIwYpjza7hjA2w0JBQMI4NhZkpdObBQgssrRWX9ogMzwpz28sEoiXFVOo1LlSmVcwdpgzzq/mgcF+FbI0Ruwe5dFsNuFKQrEqpJT9LAmNM092tz61L3SDq5RDKeQoTI5S5tqdDsJ8DZ0W+vjIcShI1CKQkwAhTQg4wecx8hIMWtTM+Yl2IlkQnkeSdz5AFMNSwBi02+UKgq07l0MpiGqRiAzCIELBKMrwTyByGxMC6kDSIHmrOAbF0BEEA+eM7V04MD2FzTodQAACEghpUSBb2UMYBCCMgVvizP4/HOpWV6jZlEyrwp3lQXJKb6rkoJiOS1EBYYouU4QKcYs0OEqyMRJF2LQbWSOQ/AcGlGoVmUHktpC6ncloOoc7SEEFPN24g0NGOchqZQ5+heTFe5IEO74zmUTyd5Ad+tbgp8EcYg5IariIN1F8sJFnYYIUiDsoJo6g3aH/y1BfpQ6VlsbIb8btPETGMI4DuP+ZbexrVta5WIvBmnUf47bZlpFZktuSc7ZJyQ6tW0SOKCUrVs7CH2yNzJarJGcJuaP8oRzlD1fJH76/53l+85vHM4OvY995Md6P3/O8zzGvHmhbBMnuCJb7fPG96rCcfvJ8uOfqFPQo3IaCYPjg7jGDHQJRR1wRV/JnRf5oVyXkYIZdDxfSAVMUVK0wez3KZ/t9q6fCU+GVe/hYzvN5Vf3L/UXtfPGCQYD0GL4IkOHDO2BmglmJSBxHrqZlS0w3Vw61rh2GjYY9e0Kh0B41kLuS+VIRlXZpR+ZIgWsPdopP9Q0LrPdWeuu9yoDnVQWK+s8t8k1tV164rcu2vEWt57Vc1GJj50WBeNAs6LiL8FdrceC3IE5BdDnIQZvXI+OAhCZTymhuZSCYUlHsigSx94BN7nZ55GABO7zyor1V7aZ66+MrAanyygniBSoVZFvhtil1eRtbzsOMbGPnef6KIDUu6elKIgoKH8t4YkN4EKRVrernalsRW6Q1NdGokihHOpkQtVU/bG4ACNcBSP8qr8q/MhPSvzJeVLlXVaTNojmzCdJiY8fK/lWAQMJlkMlbLkcmAxCrHMVYC44cp1JfX19bW7MgWkbTEu0wXcZaWPXDDTo+d06AGTbE7/foW6ArfuCbn04FunpeUUGBr5WvVV5ht54tO7fs3CLg71pxMT4DEB45OM5yyaqI4zCbDCVdxo6cA8S0adPGj1+3TiCU4GBKEPWxFlbxuXAAYgkQfMFBjvhUeCRE/F2rKmcg/hl+K+aC3fBpw9CQnqoctDSvGD167rRpo0dGIhFIamsSC8oACYqDKGoaHw4zJE6Q9rYD4YN8Lz/fZVB41qquYoaOAGghKPtvdlPiV4LUc91eAcyt1GdtdaNHjx45MlJdPR0SgRBjT6gMx7iPhWAhSFhvB+mKtLEZfLVKAojAfPxLPOVlB3oGHFZj4oJkiz5rLaF4VjJwFmYlyKBqBBKBoAjBUFl0AV4QhqqyNrzcbNABMqdOKuIJhEtilcHLOsfCqF4AyD8nVbz1IxEHGhYc9LE6zXRJUVpaumkTQZYkEpCE1JASranBC6KESLIWjuUEwSMZcTyU0UYcJm59KMIQB0MKrE0F7geWQ2I7/OToFcCnIZ2wDoyVQrEJDJJMVxLUJEqXjnrUJJYs0ZTByIZj4fABumvNodTVMcS98twQXI5xILp/OCXgDYbWAsGfdCBol+oDqiG0MJ8Qi8VKY5QRJEEv0TeuqEoCDiXRbeteo5k0QkEUhghDJL6/FoQlFJuhfj1dAfVNhSFywyowH08VYkU7acyE3ZQJEybsHgEJGhdRxi+phYUikMEa8v69QFRFhOFlOhyIWWYj7LAZfM12uB6mJNaAzgWZuHQAQTiQUEkMZR0FGnJI27qXOrZmzXuC1FEGtcrRjjxxCMM4BJLRsUWQp6Kv3DrHFXEaFrYYCKIlY1iiLCRBoFkiEGpcV1PHjm1RFVGOilZOB7ErJAa5Pm5aohBG3p/hswJx6zFkKVrWrTEc07ikz2N0ZAocWnK1cXn4fRoydmwry8GVsF32VZmLcRSEzBKrHogMpZmOARYEAUQkkeksQUUM5J7a1QKkrqICkFEMceJKxCEVkWKAwRaRc5yK2I4BcEzKdKDbj0BM60K0hEvCEDVppLFn0ChA/tPhDgXMYISE6bkgqmGxg8rR+5aCnDlzZswZU5CYQNISC3LF7P1ip6WiYlSXAjMd+ZuEHcwwNUEYYkf9GfqOw9wFkX6uILoWRCEHQWKmv4tknUAGX32S0pDFXUAZVeS3p7o8UbRuxsYhFL6gHB3cHXw4GQXBAJLuH4BQFwFDQ3abarDEYFAThuD2SxVpBKTb4iI80VksEMx2TaQcAnHDDr5GcbgRiOwf0UCoC5IuiXIIRMKDioaUaQgKEiYInkwtKenkZ0ZmHAdD3Aji35DWtiNADlREU1ASC4JpCmtYoiA8RVnLC6sSPF0ISAuuhhX3hsVFkDFaHSmFiITh6R8cgWgHF4QkoKjbr3bwMAIHoiwjpCJqijIYUStEtWWqny8EhBlORVghI4D6Lif58NnHx59ePtMMDXn25tGbj1JX45B+rqdYkBCFLJBw24JDSwxEY8BQs+EazOrJIZDiEvW8Z0tLIAwXkmvsftHwtTvl+wuux8cGdeLpozTF6h+agccajIQsLEE0hCXMIAcKUpsgh16zH0BU00JXL2bIvyriOvjgMRgmj7XjU/rM/Yw3Si/FNAMOQCChmJsXbl0yICoJ/cxjSUQVJEqQIEGWG0gxdfaibtkgWStCl55lwHjRHWn4/u4Xff3oozNP6czPH/TlW75ArIkJpRcaFygi0fdhbYEECNKYepg1PEFUSbCJjXk8QfAscZeSYoK4YYglceJDqBUdpN94kFoXnflOZ/AezyF5+4HfyHKgFnDoqgS0Rjcv5NatP6YpDoRKYpoWIGhayF+blkhE4VPfxPGM/vV9Kl9x3TQmPcWZ/PzmzZs/pJLghN4+Mkt8OBjCCeA1JPr+RZRJaGLcvPQKq5p3VdS6V28+LA+bPlKMdOpqQzypByXniJ0+fNHQ0PBYH97HdeMOqC6/OeXDW9VL8Euqo2sHd3QS9KQoC0H4VqyGRyzeIxEeGEMhOFYfpy5CEE25lzIfT5eop4k7CkQo2oG4Djs8i/EoPyDAH36ELw/BQL507/4lnwsiEEQj6IU8VtqXb8SQ3KqfGY2WTdgdwxhy9sbC69XVl25cHb/u3i7eEAqFriavXGlsDIebFXdTz+HaEJk+uhJHYSdfN6l86iufNQT95ym9k9yyAFESzeDABYhVkz23b9++CAgmjtGzx65Xr7q0+vT4+s079i0rM7nb9ORJKkUQ/VR0HpqzBRGG5XCv3Z5qfrhPAHQNgjzXEDrFFWmth3RI3KRLoikE6VC5+fjxgRNiZw+dLS0F5OSpC8c61G8/t2PfgjSkqSmZbAw366YeKC7Maw4H/lKWOA4pRk7Fo/v3f9DYcbA54kK4bfE2mMQct9EQTQEEQ8rZfef3HRk4MDb/8CFAzm66tDVyadeS2n379+8zrevug9cPmpKpxmbq8W6CkCI7hBXC4N8iL+hnXDDylnqGC4EkcxihqujH4eFABKIlZl5/58SpFZcGzqKmFYsBsuLStVP31tVv3pzYvwBREDiaNKSzhgABStqRuTtq9YiMG4I1QQNE5enn7BApiTzmJ2nFI4txDOlDkNGnFl6+CIjKBdy1Tt7YjrvW7VebjyYMBA0reTMVJkihgSDOrFci1eDwS87nhw8f3n+q7lYuhCWyX+xK2sgMUhUEmXb+YgkgQwlSWo3h0OwJ1dYm9I7Q1SSSAqQr/lcN4uOmlRsily2xT1Ane/4WNbEhdEPGG+v3ZAnCEnn6XCDoIWBgL6J4EkNKaVAZrwMJ7dBHF5TdTSabkjvR2VENhjgVcYrxr3Cb+mxBGtBx6J1FwhAEDAYRRAb3ARoCx0ByDFUOhmBlBQhKEiVIU+POtr9pufMQGcM4DuDz/ztYNG7jJmcxcuyumGxtFm2OEeM2EYMi5zgiQ4iciWmyNK4k5Ur2D7No7KRcsdbYKYpyhxzJ8Yfv7znm553XO+PId1lCu/Pxe37P87zvvO/rAIIhPGhyMVA5OwdCK+Fd+csjXhBFRawQDkEgAQT1IIeCwDGxcG4hLjiDQ0Doszo/T5DbmH7jlUGHukFSV4R7nRUyGQT/S86j+/fv35F/9UgK3qotCoLffc6qyJeUckSe1igJQ6hBNKSLGFhDFWMwORgyQ0BuA4IeacUQ09zL2w8uhkZYJbSzinBrU7ejVw5wiejLPmpcL12vrib9qmnD9850+nWq5nVBwfsvGlKQgczWEDmwhpf27i/ewqJ6RAVk9c7r7zC0Ro+WkNq4CZK1e+dymBRWC37z8rFeQIh0X/cK2bCNR7fQVz2A3X69A68jkabpGuf315EPr7+la9JPtUMfwYuCQKILUli4qPvgK76oryJ6xTug4vykVdHozj5Vl5ctmychWNvjtSYIOxDLoLKDGJRP4sAq8hWNTS2CwCb+5DGBqEUEJP20fjrS8GnKecBZ974gUlNXk8p0CRwMQUVw0Hu2X7+Z56cv6u4tLZnWO+qdPzg6+HLFgKiv9ETVtXnzCCK3KFYIL9naYaNQEvw09EquEzFUs+jcwD9UkFcEqXvv1BDu+MyspVpEdzo6ZFJX3/qS0t7XfVFvdPDwikvRpdPIAAlBUBIsJQzhemiJyZE3d1EMUZY7hsoD+ScfI9LRGEfCB+p/i3yI1KQlxAkIO9TIasGQLmfFjDV9bXnJrkWLfdFo6Zhz3nOHLi33R0erYItCm634FkcreTdBPcvO1zKq8ubBo7t3H73M/pM7L6UD5ahL1eGc0ZeaCObeOmdByplKOc0OVyv0epl2UEHklaW+UlwDceVKtBy/lCz1+0Hwj/aXjy7vXRWvTSaTg1o6XApiMMPi+MfoFfZpfSTy9FtKXyQgPrGjOZ2GAAQFIYfq9Om4L9QnL+YY7fOJC1P88/wyuGqoCud+z8QZUp/r8Z8cCJ++1skUhDe/A3+GzEWH9AeEgncQiYGQYzxCkmgyLs/Gu3CQ5moFSH5HA3z8hYOXQoaoipgWdRpYmeVQryEoiITAQJFv7ZKjpERIog+T4lAXEBQEEN6YM4PCDPGJAlAzoxm5zB+5HAwxvfFIDLMDLaJOAqPXCTIMEDhKQEDAEBA4pASQ2ni85SCHdLSQECmwMJgCBee368EFMVcE4Xv8hAMFURA9aeHZAqJH/H56/X6achFAdEWStbVxvPnmcElIUwUBAT9UTAhmcMwVye+wQvSxYWsXObgg3Ox054uvZDydThHzLQKIHw5/ETV7bS1KcjGGiog7+RvaHF5w2GFOvj43O0xXjmc7WmgHILIi9NgKcQsPptremYwu9xeNLyqCw7OtqrqysrL66FFUhBztURH6pvYKZjRDsuqS38EFMVVEO3rQfyc7REU0RFwUT//5IGzDxaa4WhMQBIxt26qeVRPkqkM4FMTMsHcAgg+tsWcg7JAxXxPENyU/oRs/B+p6yA1KJwHRV/eTAwwBwaSlHIBAUr33BSDiWRsNc0NYocIQW0q2gyXcIdLRQw4LvX8nB8IVwdgStxoThT6VFxHEIy5tvl5ZXV25Ze9ehyjIQDPEyFkPc2wg2Qf/FgckPLBQEFEPtTnhgypRkaEEKVESBAURkG19AVlzplJBWkgII/INKyvEXqIcLNEji29g1QUZ0QYOBempIZAAMkxLRGgRwYe4QbRv98VHw+LxbY4WgIgeYYkdBPl9CBdExTK09LX03RRkoIRoCZodEg3BWkLrxniKWgxxJyIyPxyL0ePpHO1l6kNAiNYej9G+uNgYWuwx3O5R9g6G2EusDiuEW6SNloCiIGiSDqJJUBJIVHz4HdWnL0Hw9rR4qB5DDASQ9m5jnzG5fbHhbr7PKJYMQyJsHYhtQex7XbdINw1pw4MLDq6IgJBERULKCULX/QaDsHBFDJXWbsNtdO60jyAgIfbVYIlth1gY3CL8NBcx+1olgKBJZEWoJFO8Kj7h8Mg7Q0U9BrVUEJzXUunmRh2GdEZF6hcb44Ri5riVthClzOVgRtPsVkc0hCUEUd1eOhYQLCSqJN7BGjJ+1ZIl8ub8VVAgdF6rBcKQ1ugRNwaX22N4it0NKOOgYIeJoSB5lxBe1OFA2CEhcp/UXkC4Tza2DLRM7Jk2XEpU4ACk3LMeELpbIQhF8Eylw6WP2e1nqw52I4u3KLb14DeDm1puFFG9jh5RJYGkTEqEZkXs/JRJ+0/HoLk3X1DwkyQCsrz7T7ddbDnj6OGygYDByU3J0ejagZgdgKhelxBdElCUZXPQ3Um0e/G0/YmWsQuLh+F0o5iJpxCkO0MGXdwSx+5XJBck75xl3x/M4P4wOTTELJk9u6xsc3Bcz5GdxJqIFC44HYjtHj49s6bIOYtmrYvh0NFkrQNfidL4j+rBDCvEOu+ywwLBdxYQHlyg4F1dOALH2tKzds5CgoBSvCARSCwYrtZ5v7qJbE0Mzzk9+jBJkOY5Iaqh7Vp9/XxAcjoA2Xdk4eHSffv6mx2IcABCaSUkCEm2Bg72IggkoPSTlMITe2KBC0vQ+qgJ7X77AkJPbA0nkw5UlyHMsEbWILsg7QKBje0sDvPAGnY8cOTC8auhQKgj32vIDhMEEjxjZ+DBwMGyXvLhaFhNZvVTFmCmXkC7LKdjrfGg9PZUJZM4QqyudqixyhBMQuyw9In0MGRjoksoNJwZ1om3zcJBx/uLkdXm6gU+wLUUhCTrN23aLBLYXFaGZ3EpyVmWoCyiXXbIB23RMTtFQZDGDcjA1bApiYbgQxWkqIExJ7DCZXsstS8UGqc7pH9ooYY0YQdDNoRPnjx5irK1jCGdAJmlIR2Ignbpjp4XK3z0IYUgTUQAER/2DkWgH3xUtXEj4duFQh1+vcEadnzQwjZ83fWYwBindlDMBRkVXC+6ZAS2jwhXhCQKAkoHSIbIvb1vim/58zcJCUGAaSQBoNhHtTdBVIoCsj9QlDmWcSVH1TDTlHU46OWK0CLSGhCd8Ek41PoOh4KokswiiCqKloDirbj5PPHs2TNAJiBNChrlAOiHtHRrjZOS+N6uTK6e1M9pWh4OeVpQ1BSKlM0Mxxbh9SBtZfC6bt2SL40iJ1Zc+IbXhs8rYsPx8sQLXIkFfOVK7+TJ9BBApAgZlQmOcXEvdZHct1SgIomEghQUAPIXmT+oXabNXXsCc+RCSBXRo8p87w7SNrSdJy391DyRUYElmLZkSRBdkYx7lm4UVRKgiVLxhvLsmYMYfwbhY5DQnIwDWRMKFWbOYrWXowrJenoA2kRB4BAQJQmvQ21NEllDOCCBRWhIgvqRRFLWPn/+/PTpWwmHeobeX1TEmB9qJxWqPQr3BA+qDlmEuYqXdD7fgNwLdzZDWgvIpnAHhqjnBwoIUXRoPAIiRqIsytAxN2/ePH36+fEfld1riExhGAfwQSFjBuu+MW4ZWbfcycgtt0TWZSTr1rZlaDEuZdCaXHaYyG1HcstkJ2Rmh9LaotxSSHzyjaL4qHz00f9533Pm75zXmeXfnNV+cn77PO+5zLm8PlH8F4RHvIl6v+vq/JFEZgEYC9BVYNBBCHL3fQlShRGnHQ21s/Ro4zCTkgiFURQpiRUpSvR+W1vb+wcliP//HbEEGcqBzL2bODw8Xtu2VBxk0IHM276bh4zWZqv62DXtoESXROKUDKNELNH8/WJbGyDW811+77GARB5Yqedh4girIK4rwRdmz0ZXOerhvqizZftGDWFFCsfo4DCBxKgJugsQZlkuXyi2vX/vk6cmFIQrbmZWTCeVSNQPEweSSZBBB/oqzjvgTYd6h9DZV2FdENuxH43lBUHoKDUXIZlcLo9jAZ/10IQfDr3PK5vB9YnZ+iBxRO2y8jfcGQ7edBI+dlYcCCCqsU7gJxlw/CmxETZEJISkMplMPn/fZ93K6+exYCmVoT76X4el4UHtgwYUJMOCkEEIj0tMSJ9FtTWAaAfy4X1fA6Id7C0QILEhkCzSkEhT6u3bVK7gCxKiHZREB0T1v67LIcNSsxM3a0d4O8AI0mFAINm9fdGm0l77xDE0lpbQQQglCCBWSeotCCaaOJrKEGIrWJMBgCjWZnwdRIhkWn0iY/SVsx6EGEOkD5Kv/SP7+xLCxtISD0jNPhty9qwbAoOztxoBsUMHQwdS3sEruAjfmcKX7RHCAQIHSyIGQlTAGDas8SMgTU05n/WMnV8YbC7FSQ5NtsOghAw6zIL0IwQOE+IYIGQQAoQ4bAkWQCB5m/mztf68rKZ+GRowGAwZlFgOY9NLiSeEnUUHYkLgsBkSjJGjTamcA8IzWTC0xpF2HOa3WOYIIQQMj9YixJTY5WAapbNSeVdFNIb7k/brYUmMxqKCDkDosIYIIdz8loM4FLoiTW8zmULKAVEMDvn264GYfVXOwZFOhwkRicXgZosON6QplXFWpETApyykghBXY3n3lfcIIQThEeMQsyJyEK+iTy1lAQQlSaXyAsEqEMItl1PjUQ9CvDdYZLgcZme5N1vc/BKC08RpIxC9BY7INgv7dkBEEnBDmDIQc4Tw0J0ML8ffhzpChycEEkQgy46K5OhZN2SEaisNCTgV4Uq/pJelWNC395AhLoh5xMtyOCHeQwQQl4QQLYGCWfYWvZXJNPnUswiERLEEhgIxNBBIQhIIwBOsHOj3V84L+4dX+UdG/BVDxgKyem/Fpk1Q9BzWO9BvQ59gMFzJelDyzw4DAgorYkv0CKFDDhpTmRwGuygI6SFHV8kRSVn61OEKz9BDPer6bJ5b54/OTYbnRiIjNzaMjSxo6A7IuSkC6Xtu9KJBB+bUBEcfWiMS7+HBqSA8HC4IxrsXRCSEILkUITpR9FV1dbJHKFIJlIbI5d2Bdf6N4apIaOPgPRV7W1ePAqRvQysgPRftXKPez3qg/6FqlqN9B+JgGGcjrnNEnos4zxCbsPnN5XNuCFa+T7RHsgfWX0HChwJ1A5P+aBCXeUdGquYqSAW+rOi9Gid2gCydPmjN0EYFqZ5Hh1IQAgcZRkGoMCCUcIfoOkNMmRDsDBtDowPVuAh6KFTdYwSO3oPRUGjgZlwZrYyEhlehtSr2jO27bArGyM6evXcO692737nRY4KjG2uC4ejo/mXqUQZCBSHOQRJ2Qyg5l88rCSFKAor5fQlaq5S/70AaR0f7lz+TshV0AMJ6eDicJyT6WgklGpLNZluyuYJ7sBsOSZAOQuhAKrkjLOsgw8Ph2mjRwVMRK4QgOVdr9fgbhAoem3js0A0GHSwHGTrtOrgbMSsyVyCXLuULTgg+BsRhcTkQJ8N0sBxkuAe60VcmRAoiDERTLAcgLYDcL2oIj37LHvJ6OfiSKbOriHA5CHEyOD5EwYKocpQgSoHoimSdEKGUKYfHE/vm4ZWxsaJDK7w2vHTw6ISN5ZDYDkAuIem0gvAw3iwIGYyrHsZ7hz3KQQQdxv7jPx2ACIOQChbEVCBOhung8CjbVQbD28EtlpaAoSHsLMnuS2kpiYbwpN2ElO8raSyOjvbbyqmggxAyCOE1K4nDEU0Xi+lL2XTRV/rjVnhunfinx8d+Bax1iZxrww5X98QMDXOM6pXQ/z2uzWCRLJVMxwXDjTpq0jBJ9WRkl4o1/+OiPZJFKo2PEZkDE7OuJr+kEZTk5Uuf64U4/EvLmqsbD2WF9bPA6q0l8rCpPGqKJwjUfWyTJ+p3vuIJepk99d7zZbdu3b59e/VqfFafP5+8cQNz1cqknHV7kRpMRSqT9dYfOYIPcviwzAl8/Ph+LMdvNl9obm7efQL5/v0zEot/jcUxEfHJa0/sYFLhRy0tclRSSKeL4kBRAAnq8BWmKvhdW/pLBeRlq8j6qrF4TmX5r1+AzAFE3UQxxXoLr8VYBoY4Ll9eLQ5RNCDiqANDAgWiDIsXY9LM/TpgYE5VQWAC3xO7LcjXePwiIKcAgQF5dEcc2UwqAwgGh4K8LBbtiigKd9Toeaw+Ptog9ydUyeX9lXiaa/y4M1uReVeuyJ24eKNoaIxAHj78aZXjstTjvASQG1Ag4qhBJRAgVAQhyxbNEEizcpw+HY/HgIh9/Yo5a6+dOoh7Ok5qCD5ISwtmds0V7gtE16P40ldlvyHLentLL9QAAKujUAF5dFbeqCa3S04d92vHjhVr1SNC6oUeYxDUo7X1YSvqcQsBAtEIzZBS1H3b664FPoBsOW5VAwo01W6UI34ay4lYPB6H4skpzLx7EIsQpBjyswUSnEwVCEFrdf3j/MH+8+s3LG3bNnX+mTPr1m1dp96RKA8HLVyxVr3BcuKMZypoKBju3QPh+XOUolSIAwew3Lhx4EXdp0+famqu6mIIor5+cSlCuHDTqgUYcMQAwHIxdvHaRZnLF22FfDx63YY8QtBa+TzGSAEQUIqgdPR1ruK3nmip7mgosajxve31kgliuCIPBOEBRpRg0rOJ2vAGsUa3LoTuJ6z7iwNY9r7Ye/UFEFevPn0KgiBUHVCJ/RjZ6CdZQABE95QwpA5QXLt28qLMRyz3CokDEwmf1WMcH0kWiALGCAIHhkgnn69D5276Wx0MErl6JZ0lFdk2c9v8CWBcEcIqEFCFGShE6FkrBK1vHv78iSJAIM10+/b582CgEDBIriIwIO8W/1j8TgG2YMOE8XwBXXQclWhuVjMmY3yr7RT6KXYaiLiM7lMSVEMM+CHft4sh1fIoK8HK30fQUpIHD7p09HX4DVg1KPXAgaf2AAAAAElFTkSuQmCC", + "description": "Displays a fine and coarse particulate matter (PM10) data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json new file mode 100644 index 0000000000..496e6dd53e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json @@ -0,0 +1,33 @@ +{ + "fqn": "simple_pm10_chart_card", + "name": "Simple PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAhFBMVEUAAADf39/g4ODf39/f39/g4OD////k5OT/pgDg4OAhISH/9N//3Z90dHT/vEBYWFiQkJD/6b//0oD/sSDy8vIvLy//+u//qxA8PDzHx8eCgoK6urr/x2CsrKz/zXBmZmb/78+rq6v/2JDV1dX/tzCenp7/wk//469KSkr/x1/29vb/2Y/dngZsAAAABnRSTlMAIL9AEN/GQiaNAAAEoElEQVR42uzPwQ2AIBAAsBMQc3+mYP8BjRv4BNJu0AAAAAAAAPivXZtr8akln83lXSOunH17I2uU0Q8wS2Q/QoosRmQ1Ii/7daxiMQhEYbg7AweGsVAwkRAkCHn/J9wkF26ysNYa1r9Suw9UtLcGpLcGpLcGpLcGpLf+BURwl1R13oBFNxypegBTAeCdqaB5dYjsjOk7c3RuZYLSTgEpcOEaa1zW2P6XWYdEksHfEABm0HiuaTghkxngmSGc0Lg6xPMs/YKsBrVQgDBTPrAPggsaV4cg8EieW0tZoOYMS5xeApHAkkk63BAzzYCa52S6vASykhGSNjwguFKDKeUJSfBMaFkd4kiDT/gTkmi4ITDbHNvfv5Uzkp2HsuBbibiaV/g9I0U5VSsAiQwZzTshlUpsv2HGE+W9DUhvDUhvDUhvDUhvDUhvDUhvDUhv9Q1JFhhUXg9R7rPTwPxyiKPDkexhezXkhz07Wk4UhsIAfHf4J4FAEkgQlbKUis6+//stJhS2U6FwwRRn/C80RDqTD3NIqAGLfCPN4qeGnNk7+RRZ+syQt5z6HNj5mSFZNDbjJ4Skh7T/Go5E49x6NkgaMcYKN3jmB+9Rh2eDRCw5RndJkMdfptn+Iek5OaZfb7kJy6MsC4gm5tYqCDdj23DaLH8yxsYfKyMWuM44fxsWwXFurYfw0gJaeUutAXtaZLloQ98jBazgU6ve9UCH/HPtziemkFsT10O4BrQFBHVRgLVAY352cDQPe215g5haLFI3Tg84T174DxYFRGmSs+wtWAy5QUsnaIk4cDEUAupnSI2QvsdITgQ9u1hEvgbyfGbjxeJrxuIkylmyFAKcqItFSXcC79pi4pKaStIQDe4bXFbUpZLGn6QEanqUd3bsa6C7zmkxt88NijguAqL7addgcbEPkBKNv9ggl9A3VP9mAR0CTiMdFlACgOahBVA6l9BaTcyYYLjgecaSpTeI/LgC0gLt8FWEAP8GcfUjNHrIDaGDWNenYYVF12W4IWpg5vdTQRIVB1qYIL8uhdTqBCiah3BAmA7QQzSMg2jfdyHitnuVaKS0mCiRrR91NYCGz0Jcu+ra0kOkryzv7z+6QBCVAGz9uET+bA1pQ6Wh+TxEwdIIuaHtIeP5J/fXvG3N1CPHphAf7or9MgM5QY8QA00TkLlHju0hbpzuZfKuVcKOkBCntZAgjzaFcCAkXx5OYNy8aQYIf1gjAnItpGDBphCyrs4rty4aoHQ21UPcsdFA92rdOC93CIemlZCEJbQt5C9gRQNX7FQCQljX9hB/DPgTtWvLrl+thBSdY2MIhRpd+h2r6tsDRAP2MpQKbHmHNODrIJFzbF7slZRm3PVJPhqB7tgYzj93VaYFKj6MmLsnGfe5f9vesf4J0UNoCK/J1YimKqxoebxjR5AGWikxvcWfrY89QbiG336shnzQb0N4GNJ/kXUdGtpBfv+/KC/IC7LvvCB7ywuyt7wge8sLsrf8a+cObgCEYSAIGltE8p8q6L9AWkDiQRLNdHAF3BoyG0Nm05EbpIPGuDKq/791fnb3EVHn+lmqrJ1CYQAAAAAAAK88ZP333TfpRkYAAAAASUVORK5CYII=", + "description": "Displays historical fine and coarse particulate matter (PM10) values as a simplified chart. Optionally may display the corresponding latest PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json new file mode 100644 index 0000000000..fdf7ff5d0b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json @@ -0,0 +1,33 @@ +{ + "fqn": "simple_pm10_chart_card_with_background", + "name": "Simple PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical fine and coarse particulate matter (PM10) values as a simplified chart with background. Optionally may display the corresponding latest PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10" + ] +} \ No newline at end of file From 9f7d642c0cbe94ef3f1ab89f687b897d689c88f6 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Mon, 30 Oct 2023 13:44:16 +0200 Subject: [PATCH 36/39] UI: Air quality widgets bundle --- .../system/widget_bundles/air_quality.json | 70 +++++++++++++++++++ .../DefaultSystemDataLoaderService.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 application/src/main/data/json/system/widget_bundles/air_quality.json diff --git a/application/src/main/data/json/system/widget_bundles/air_quality.json b/application/src/main/data/json/system/widget_bundles/air_quality.json new file mode 100644 index 0000000000..128bf9d9cd --- /dev/null +++ b/application/src/main/data/json/system/widget_bundles/air_quality.json @@ -0,0 +1,70 @@ +{ + "widgetsBundle": { + "alias": "air_quality", + "title": "Air quality", + "image": "data:image/png;base64,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", + "description": "Contains widgets displaying air quality telemetry.", + "externalId": null, + "name": "Air quality" + }, + "widgetTypeFqns": [ + "air_quality_card", + "air_quality_card_with_background", + "horizontal_air_quality_card", + "horizontal_air_quality_card_with_background", + "air_quality_chart_card", + "air_quality_chart_card_with_background", + "simple_air_quality_chart_card", + "simple_air_quality_chart_card_with_background", + "humidity_card", + "humidity_card_with_background", + "horizontal_humidity_card", + "horizontal_humidity_card_with_background", + "humidity_chart_card", + "humidity_chart_card_with_background", + "simple_humidity_chart_card", + "simple_humidity_chart_card_with_background", + "humidity_progress_bar", + "humidity_progress_bar_with_background", + "co2_card", + "co2_card_with_background", + "horizontal_co2_card", + "horizontal_co2_card_with_background", + "co2_chart_card", + "co2_chart_card_with_background", + "simple_co2_chart_card", + "simple_co2_chart_card_with_background", + "pm2_5_card", + "pm2_5_card_with_background", + "horizontal_pm2_5_card", + "horizontal_pm2_5_card_with_background", + "pm2_5_chart_card", + "pm2_5_chart_card_with_background", + "simple_pm2_5_chart_card", + "simple_pm2_5_chart_card_with_background", + "pm10_card", + "pm10_card_with_background", + "horizontal_pm10_card", + "horizontal_pm10_card_with_background", + "pm10_chart_card", + "pm10_chart_card_with_background", + "simple_pm10_chart_card", + "simple_pm10_chart_card_with_background", + "radon_level_card", + "radon_level_card_with_background", + "horizontal_radon_level_card", + "horizontal_radon_level_card_with_background", + "radon_level_chart_card", + "radon_level_chart_card_with_background", + "simple_radon_level_chart_card", + "simple_radon_level_chart_card_with_background", + "volatile_organic_compounds_card", + "volatile_organic_compounds_card_with_background", + "horizontal_volatile_organic_compounds_card", + "horizontal_volatile_organic_compounds_card_with_background", + "volatile_organic_compounds_chart_card", + "volatile_organic_compounds_chart_card_with_background", + "simple_volatile_organic_compounds_chart_card", + "simple_volatile_organic_compounds_chart_card_with_background" + ] +} \ No newline at end of file diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java index 87e1b097e4..ee045976e7 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java @@ -535,6 +535,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { this.deleteSystemWidgetBundle("status_indicators"); this.deleteSystemWidgetBundle("outdoor_environment"); this.deleteSystemWidgetBundle("indoor_environment"); + this.deleteSystemWidgetBundle("air_quality"); installScripts.loadSystemWidgets(); } From 5ede741892fa8c76e447354847f6294f3afcb995 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 30 Oct 2023 13:44:17 +0200 Subject: [PATCH 37/39] Optimize DAO layer for Widget Bundles --- .../dao/sql/widget/JpaWidgetsBundleDao.java | 37 +++++++------------ .../sql/widget/WidgetsBundleRepository.java | 35 +++--------------- 2 files changed, 20 insertions(+), 52 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java index 96ad4bd299..85d7c35618 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java @@ -30,6 +30,9 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.util.SqlDao; import org.thingsboard.server.dao.widget.WidgetsBundleDao; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -92,40 +95,28 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao findAllTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { - if (fullSearch) { - return DaoUtil.toPageData( - widgetsBundleRepository - .findAllTenantWidgetsBundlesByTenantIdFullSearch( - tenantId, - NULL_UUID, - pageLink.getTextSearch(), - DaoUtil.toPageable(pageLink))); - } else { - return DaoUtil.toPageData( - widgetsBundleRepository - .findAllTenantWidgetsBundlesByTenantId( - tenantId, - NULL_UUID, - pageLink.getTextSearch(), - DaoUtil.toPageable(pageLink))); - } + return findTenantWidgetsBundlesByTenantIds(Arrays.asList(tenantId, NULL_UUID), fullSearch, pageLink); } @Override public PageData findTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { + return findTenantWidgetsBundlesByTenantIds(Collections.singletonList(tenantId), fullSearch, pageLink); + } + + private PageData findTenantWidgetsBundlesByTenantIds(List tenantIds, boolean fullSearch, PageLink pageLink) { if (fullSearch) { return DaoUtil.toPageData( widgetsBundleRepository - .findTenantWidgetsBundlesByTenantIdFullSearch( - tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + .findAllTenantWidgetsBundlesByTenantIdFullSearch( + tenantIds, + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } else { return DaoUtil.toPageData( widgetsBundleRepository - .findTenantWidgetsBundlesByTenantId( - tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + .findAllTenantWidgetsBundlesByTenantId( + tenantIds, + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 13aadf6119..61a447c3ae 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -23,6 +23,7 @@ import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.ExportableEntityRepository; import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; +import java.util.List; import java.util.UUID; /** @@ -66,15 +67,14 @@ public interface WidgetsBundleRepository extends JpaRepository findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId, - @Param("nullTenantId") UUID nullTenantId, + Page findAllTenantWidgetsBundlesByTenantId(@Param("tenantIds") List tenantIds, @Param("textSearch") String textSearch, Pageable pageable); @Query(nativeQuery = true, - value = "SELECT * FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantId, :nullTenantId) " + + value = "SELECT * FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantIds) " + "AND (wb.title ILIKE CONCAT('%', :textSearch, '%') " + "OR wb.description ILIKE CONCAT('%', :textSearch, '%') " + "OR wb.id in (SELECT wbw.widgets_bundle_id FROM widgets_bundle_widget wbw, widget_type wtd " + @@ -82,7 +82,7 @@ public interface WidgetsBundleRepository extends JpaRepository findAllTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantId") UUID tenantId, - @Param("nullTenantId") UUID nullTenantId, - @Param("textSearch") String textSearch, - Pageable pageable); - - @Query(nativeQuery = true, - value = "SELECT * FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantId) " + - "AND (wb.title ILIKE CONCAT('%', :textSearch, '%') " + - "OR wb.description ILIKE CONCAT('%', :textSearch, '%') " + - "OR wb.id in (SELECT wbw.widgets_bundle_id FROM widgets_bundle_widget wbw, widget_type wtd " + - "WHERE wtd.id = wbw.widget_type_id " + - "AND (wtd.name ILIKE CONCAT('%', :textSearch, '%') " + - "OR wtd.description ILIKE CONCAT('%', :textSearch, '%') " + - "OR lower(wtd.tags\\:\\:text)\\:\\:text[] && string_to_array(lower(:textSearch), ' '))))", - countQuery = "SELECT count(*) FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantId, :nullTenantId) " + - "AND (wb.title ILIKE CONCAT('%', :textSearch, '%') " + - "OR wb.description ILIKE CONCAT('%', :textSearch, '%') " + - "OR wb.id in (SELECT wbw.widgets_bundle_id FROM widgets_bundle_widget wbw, widget_type wtd " + - "WHERE wtd.id = wbw.widget_type_id " + - "AND (wtd.name ILIKE CONCAT('%', :textSearch, '%') " + - "OR wtd.description ILIKE CONCAT('%', :textSearch, '%') " + - "OR lower(wtd.tags\\:\\:text)\\:\\:text[] && string_to_array(lower(:textSearch), ' '))))" - ) - Page findTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantId") UUID tenantId, + Page findAllTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantIds") List tenantIds, @Param("textSearch") String textSearch, Pageable pageable); From 34bd57b7268fcce570af1f73f2e3cf31b90f86e3 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 30 Oct 2023 13:49:56 +0200 Subject: [PATCH 38/39] Fix method names --- .../server/dao/sql/widget/JpaWidgetsBundleDao.java | 4 ++-- .../server/dao/sql/widget/WidgetsBundleRepository.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java index 85d7c35618..a5051a2747 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java @@ -107,14 +107,14 @@ public class JpaWidgetsBundleDao extends JpaAbstractDao findAllTenantWidgetsBundlesByTenantId(@Param("tenantIds") List tenantIds, + Page findAllTenantWidgetsBundlesByTenantIds(@Param("tenantIds") List tenantIds, @Param("textSearch") String textSearch, Pageable pageable); @@ -91,7 +91,7 @@ public interface WidgetsBundleRepository extends JpaRepository findAllTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantIds") List tenantIds, + Page findAllTenantWidgetsBundlesByTenantIdsFullSearch(@Param("tenantIds") List tenantIds, @Param("textSearch") String textSearch, Pageable pageable); From fc6325736982ebdc48e177d3fdaa6f7d3f22bacf Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 30 Oct 2023 14:00:53 +0200 Subject: [PATCH 39/39] Fix null check in text search --- .../dao/sql/widget/WidgetsBundleRepository.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 94bc043e48..72bfe30222 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -41,19 +41,19 @@ public interface WidgetsBundleRepository extends JpaRepository