@c8y/ngx-components 1021.67.0 → 1021.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/core/common/bytes.pipe.d.ts +26 -10
  2. package/core/common/bytes.pipe.d.ts.map +1 -1
  3. package/echart/charts.component.d.ts +14 -3
  4. package/echart/charts.component.d.ts.map +1 -1
  5. package/esm2022/core/common/bytes.pipe.mjs +47 -18
  6. package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
  7. package/esm2022/echart/charts.component.mjs +50 -3
  8. package/esm2022/messaging-management/api/model/backlogQuota.mjs +2 -0
  9. package/esm2022/messaging-management/api/model/namespace.mjs +2 -0
  10. package/esm2022/messaging-management/api/model/namespaceDetails.mjs +2 -0
  11. package/esm2022/messaging-management/api/model/namespaceList.mjs +2 -0
  12. package/esm2022/messaging-management/api/model/namespacePolicies.mjs +2 -0
  13. package/esm2022/messaging-management/api/model/namespacePublishers.mjs +2 -0
  14. package/esm2022/messaging-management/api/model/namespaceSubscribers.mjs +2 -0
  15. package/esm2022/messaging-management/api/model/namespaceTopics.mjs +2 -0
  16. package/esm2022/messaging-management/api/model/pageStatistics.mjs +2 -0
  17. package/esm2022/messaging-management/api/model/pageable.mjs +2 -0
  18. package/esm2022/messaging-management/api/model/sortable.mjs +2 -0
  19. package/esm2022/messaging-management/api/model/subscriber.mjs +2 -0
  20. package/esm2022/messaging-management/api/model/subscriberFilters.mjs +2 -0
  21. package/esm2022/messaging-management/api/model/subscriberList.mjs +2 -0
  22. package/esm2022/messaging-management/api/model/subscriberToDelete.mjs +2 -0
  23. package/esm2022/messaging-management/api/model/topic.mjs +2 -0
  24. package/esm2022/messaging-management/api/model/topicDetailFilters.mjs +2 -0
  25. package/esm2022/messaging-management/api/model/topicList.mjs +2 -0
  26. package/esm2022/messaging-management/api/model/topicListFilters.mjs +2 -0
  27. package/esm2022/messaging-management/api/model/topicType.mjs +9 -0
  28. package/esm2022/messaging-management/api/services/messaging-namespaces.service.mjs +83 -0
  29. package/esm2022/messaging-management/api/services/messaging-subscribers.service.mjs +55 -0
  30. package/esm2022/messaging-management/api/services/messaging-topics.service.mjs +48 -0
  31. package/esm2022/messaging-management/c8y-ngx-components-messaging-management.mjs +5 -0
  32. package/esm2022/messaging-management/constants.mjs +4 -0
  33. package/esm2022/messaging-management/index.mjs +2 -0
  34. package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.mjs +43 -0
  35. package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.mjs +36 -0
  36. package/esm2022/messaging-management/messaging/namespace-list/namespace-list.component.mjs +51 -0
  37. package/esm2022/messaging-management/messaging/shared/usage/usage.component.mjs +68 -0
  38. package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +81 -0
  39. package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.mjs +220 -0
  40. package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +137 -0
  41. package/esm2022/messaging-management/messaging/topic/topics-data-grid.service.mjs +113 -0
  42. package/esm2022/messaging-management/messaging-management.guard.mjs +40 -0
  43. package/esm2022/messaging-management/messaging-management.module.mjs +72 -0
  44. package/esm2022/messaging-management/navigator/messaging-navigator-factory.mjs +55 -0
  45. package/esm2022/messaging-management/navigator/topic-details-tab.factory.mjs +33 -0
  46. package/esm2022/messaging-management/utils/backlog-quota-limit.pipe.mjs +32 -0
  47. package/esm2022/messaging-management/utils/namespace-props.mjs +23 -0
  48. package/esm2022/messaging-management/utils/time-to-live.pipe.mjs +122 -0
  49. package/esm2022/operations/device-selector/device-selector.component.mjs +5 -1
  50. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +18 -3
  51. package/fesm2022/c8y-ngx-components-echart.mjs +49 -2
  52. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-messaging-management.mjs +1225 -0
  54. package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -0
  55. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +4 -0
  56. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +17 -2
  58. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components.mjs +49 -22
  60. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  61. package/locales/de.po +272 -5
  62. package/locales/es.po +271 -4
  63. package/locales/fr.po +272 -5
  64. package/locales/ja_JP.po +272 -5
  65. package/locales/ko.po +271 -4
  66. package/locales/locales.pot +240 -0
  67. package/locales/nl.po +271 -4
  68. package/locales/pl.po +271 -4
  69. package/locales/pt_BR.po +272 -5
  70. package/locales/zh_CN.po +271 -4
  71. package/locales/zh_TW.po +272 -5
  72. package/messaging-management/api/model/backlogQuota.d.ts +14 -0
  73. package/messaging-management/api/model/backlogQuota.d.ts.map +1 -0
  74. package/messaging-management/api/model/namespace.d.ts +13 -0
  75. package/messaging-management/api/model/namespace.d.ts.map +1 -0
  76. package/messaging-management/api/model/namespaceDetails.d.ts +8 -0
  77. package/messaging-management/api/model/namespaceDetails.d.ts.map +1 -0
  78. package/messaging-management/api/model/namespaceList.d.ts +5 -0
  79. package/messaging-management/api/model/namespaceList.d.ts.map +1 -0
  80. package/messaging-management/api/model/namespacePolicies.d.ts +10 -0
  81. package/messaging-management/api/model/namespacePolicies.d.ts.map +1 -0
  82. package/messaging-management/api/model/namespacePublishers.d.ts +4 -0
  83. package/messaging-management/api/model/namespacePublishers.d.ts.map +1 -0
  84. package/messaging-management/api/model/namespaceSubscribers.d.ts +4 -0
  85. package/messaging-management/api/model/namespaceSubscribers.d.ts.map +1 -0
  86. package/messaging-management/api/model/namespaceTopics.d.ts +5 -0
  87. package/messaging-management/api/model/namespaceTopics.d.ts.map +1 -0
  88. package/messaging-management/api/model/pageStatistics.d.ts +12 -0
  89. package/messaging-management/api/model/pageStatistics.d.ts.map +1 -0
  90. package/messaging-management/api/model/pageable.d.ts +8 -0
  91. package/messaging-management/api/model/pageable.d.ts.map +1 -0
  92. package/messaging-management/api/model/sortable.d.ts +6 -0
  93. package/messaging-management/api/model/sortable.d.ts.map +1 -0
  94. package/messaging-management/api/model/subscriber.d.ts +28 -0
  95. package/messaging-management/api/model/subscriber.d.ts.map +1 -0
  96. package/messaging-management/api/model/subscriberFilters.d.ts +13 -0
  97. package/messaging-management/api/model/subscriberFilters.d.ts.map +1 -0
  98. package/messaging-management/api/model/subscriberList.d.ts +7 -0
  99. package/messaging-management/api/model/subscriberList.d.ts.map +1 -0
  100. package/messaging-management/api/model/subscriberToDelete.d.ts +12 -0
  101. package/messaging-management/api/model/subscriberToDelete.d.ts.map +1 -0
  102. package/messaging-management/api/model/topic.d.ts +52 -0
  103. package/messaging-management/api/model/topic.d.ts.map +1 -0
  104. package/messaging-management/api/model/topicDetailFilters.d.ts +9 -0
  105. package/messaging-management/api/model/topicDetailFilters.d.ts.map +1 -0
  106. package/messaging-management/api/model/topicList.d.ts +7 -0
  107. package/messaging-management/api/model/topicList.d.ts.map +1 -0
  108. package/messaging-management/api/model/topicListFilters.d.ts +12 -0
  109. package/messaging-management/api/model/topicListFilters.d.ts.map +1 -0
  110. package/messaging-management/api/model/topicType.d.ts +8 -0
  111. package/messaging-management/api/model/topicType.d.ts.map +1 -0
  112. package/messaging-management/api/services/messaging-namespaces.service.d.ts +52 -0
  113. package/messaging-management/api/services/messaging-namespaces.service.d.ts.map +1 -0
  114. package/messaging-management/api/services/messaging-subscribers.service.d.ts +30 -0
  115. package/messaging-management/api/services/messaging-subscribers.service.d.ts.map +1 -0
  116. package/messaging-management/api/services/messaging-topics.service.d.ts +21 -0
  117. package/messaging-management/api/services/messaging-topics.service.d.ts.map +1 -0
  118. package/messaging-management/c8y-ngx-components-messaging-management.d.ts.map +1 -0
  119. package/messaging-management/constants.d.ts +4 -0
  120. package/messaging-management/constants.d.ts.map +1 -0
  121. package/messaging-management/index.d.ts +2 -0
  122. package/messaging-management/index.d.ts.map +1 -0
  123. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts +29 -0
  124. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts.map +1 -0
  125. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts +15 -0
  126. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts.map +1 -0
  127. package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts +17 -0
  128. package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts.map +1 -0
  129. package/messaging-management/messaging/shared/usage/usage.component.d.ts +40 -0
  130. package/messaging-management/messaging/shared/usage/usage.component.d.ts.map +1 -0
  131. package/messaging-management/messaging/topic/topic-list-view.component.d.ts +38 -0
  132. package/messaging-management/messaging/topic/topic-list-view.component.d.ts.map +1 -0
  133. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts +21 -0
  134. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts.map +1 -0
  135. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts +52 -0
  136. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts.map +1 -0
  137. package/messaging-management/messaging/topic/topics-data-grid.service.d.ts +13 -0
  138. package/messaging-management/messaging/topic/topics-data-grid.service.d.ts.map +1 -0
  139. package/messaging-management/messaging-management.guard.d.ts +12 -0
  140. package/messaging-management/messaging-management.guard.d.ts.map +1 -0
  141. package/messaging-management/messaging-management.module.d.ts +7 -0
  142. package/messaging-management/messaging-management.module.d.ts.map +1 -0
  143. package/messaging-management/navigator/messaging-navigator-factory.d.ts +18 -0
  144. package/messaging-management/navigator/messaging-navigator-factory.d.ts.map +1 -0
  145. package/messaging-management/navigator/topic-details-tab.factory.d.ts +15 -0
  146. package/messaging-management/navigator/topic-details-tab.factory.d.ts.map +1 -0
  147. package/messaging-management/utils/backlog-quota-limit.pipe.d.ts +13 -0
  148. package/messaging-management/utils/backlog-quota-limit.pipe.d.ts.map +1 -0
  149. package/messaging-management/utils/namespace-props.d.ts +10 -0
  150. package/messaging-management/utils/namespace-props.d.ts.map +1 -0
  151. package/messaging-management/utils/time-to-live.pipe.d.ts +16 -0
  152. package/messaging-management/utils/time-to-live.pipe.d.ts.map +1 -0
  153. package/operations/device-selector/device-selector.component.d.ts.map +1 -1
  154. package/package.json +1 -1
  155. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +2 -0
  156. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -1
@@ -0,0 +1,55 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { FetchClient, Paging, Service } from '@c8y/client';
3
+ import { omit } from 'lodash-es';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@c8y/client";
6
+ export class MessagingSubscribersService extends Service {
7
+ constructor(client) {
8
+ super(client);
9
+ this.baseUrl = '/service/messaging-management';
10
+ this.listUrl = 'tenants';
11
+ }
12
+ /**
13
+ * Get the list of subscribers for a topic.
14
+ *
15
+ * @param filter Subscriber filters.
16
+ */
17
+ async list(filter) {
18
+ const headers = { accept: 'application/json' };
19
+ const params = omit(filter, ['tenant', 'namespace', 'topic', 'type']);
20
+ const url = this.getBaseUrl(filter);
21
+ const res = await this.fetch(url, this.changeFetchOptions({ headers, params }, url));
22
+ const subscriberList = (await res.json());
23
+ const data = subscriberList.subscribers;
24
+ const paging = this.getPaging(subscriberList, filter);
25
+ return { res, data, paging };
26
+ }
27
+ async delete(subscriberToDelete) {
28
+ const method = 'DELETE';
29
+ const url = this.getBaseUrl(subscriberToDelete) + `/${subscriberToDelete.name}`;
30
+ const res = await this.fetch(url, this.changeFetchOptions({ method }, url));
31
+ return { res, data: null };
32
+ }
33
+ getPaging(json, filter) {
34
+ if (json.pageStatistics) {
35
+ const { currentPage, totalPages } = json.pageStatistics;
36
+ const statistics = {
37
+ ...json.pageStatistics,
38
+ nextPage: currentPage < totalPages ? currentPage + 1 : null,
39
+ prevPage: currentPage > 1 ? currentPage - 1 : null
40
+ };
41
+ return new Paging(this, statistics, filter);
42
+ }
43
+ return null;
44
+ }
45
+ getBaseUrl({ tenant, namespace, topic, type }) {
46
+ return `/${this.listUrl}/${tenant}/namespaces/${namespace}/topics/${topic}/types/${type}/subscribers`;
47
+ }
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessagingSubscribersService, deps: [{ token: i1.FetchClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
49
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessagingSubscribersService, providedIn: 'root' }); }
50
+ }
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessagingSubscribersService, decorators: [{
52
+ type: Injectable,
53
+ args: [{ providedIn: 'root' }]
54
+ }], ctorParameters: () => [{ type: i1.FetchClient }] });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLXN1YnNjcmliZXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tZXNzYWdpbmctbWFuYWdlbWVudC9hcGkvc2VydmljZXMvbWVzc2FnaW5nLXN1YnNjcmliZXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBR2pDLE1BQU0sT0FBTywyQkFBNEIsU0FBUSxPQUE0QjtJQUkzRSxZQUFZLE1BQW1CO1FBQzdCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUpOLFlBQU8sR0FBRywrQkFBK0IsQ0FBQztRQUMxQyxZQUFPLEdBQUcsU0FBUyxDQUFDO0lBSTlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFrQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRixNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUE0QixDQUFDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQStDO1FBQzFELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVTLFNBQVMsQ0FBQyxJQUE2QixFQUFFLE1BQWM7UUFDL0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3hELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixHQUFHLElBQUksQ0FBQyxjQUFjO2dCQUN0QixRQUFRLEVBQUUsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDM0QsUUFBUSxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7YUFDbkQsQ0FBQztZQUNGLE9BQU8sSUFBSSxNQUFNLENBQWlCLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFVBQVUsQ0FBQyxFQUNqQixNQUFNLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxJQUFJLEVBTUw7UUFDQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLGVBQWUsU0FBUyxXQUFXLEtBQUssVUFBVSxJQUFJLGNBQWMsQ0FBQztJQUN4RyxDQUFDOytHQXhEVSwyQkFBMkI7bUhBQTNCLDJCQUEyQixjQURkLE1BQU07OzRGQUNuQiwyQkFBMkI7a0JBRHZDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmV0Y2hDbGllbnQsIFBhZ2luZywgU2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXJMaXN0IH0gZnJvbSAnLi4vbW9kZWwvc3Vic2NyaWJlckxpc3QnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU3Vic2NyaWJlciB9IGZyb20gJy4uL21vZGVsL3N1YnNjcmliZXInO1xuaW1wb3J0IHsgTWVzc2FnaW5nVG9waWMgfSBmcm9tICcuLi9tb2RlbC90b3BpYyc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTdWJzY3JpYmVyRmlsdGVycyB9IGZyb20gJy4uL21vZGVsL3N1YnNjcmliZXJGaWx0ZXJzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXJUb0RlbGV0ZSB9IGZyb20gJy4uL21vZGVsL3N1YnNjcmliZXJUb0RlbGV0ZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdUb3BpY1R5cGUgfSBmcm9tICcuLi9tb2RlbC90b3BpY1R5cGUnO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTWVzc2FnaW5nU3Vic2NyaWJlcnNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxNZXNzYWdpbmdTdWJzY3JpYmVyPiB7XG4gIHByb3RlY3RlZCBiYXNlVXJsID0gJy9zZXJ2aWNlL21lc3NhZ2luZy1tYW5hZ2VtZW50JztcbiAgcHJvdGVjdGVkIGxpc3RVcmwgPSAndGVuYW50cyc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBGZXRjaENsaWVudCkge1xuICAgIHN1cGVyKGNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIHN1YnNjcmliZXJzIGZvciBhIHRvcGljLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIFN1YnNjcmliZXIgZmlsdGVycy5cbiAgICovXG4gIGFzeW5jIGxpc3QoZmlsdGVyOiBNZXNzYWdpbmdTdWJzY3JpYmVyRmlsdGVycykge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7IGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nIH07XG4gICAgY29uc3QgcGFyYW1zID0gb21pdChmaWx0ZXIsIFsndGVuYW50JywgJ25hbWVzcGFjZScsICd0b3BpYycsICd0eXBlJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QmFzZVVybChmaWx0ZXIpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZmV0Y2godXJsLCB0aGlzLmNoYW5nZUZldGNoT3B0aW9ucyh7IGhlYWRlcnMsIHBhcmFtcyB9LCB1cmwpKTtcbiAgICBjb25zdCBzdWJzY3JpYmVyTGlzdCA9IChhd2FpdCByZXMuanNvbigpKSBhcyBNZXNzYWdpbmdTdWJzY3JpYmVyTGlzdDtcbiAgICBjb25zdCBkYXRhID0gc3Vic2NyaWJlckxpc3Quc3Vic2NyaWJlcnM7XG4gICAgY29uc3QgcGFnaW5nID0gdGhpcy5nZXRQYWdpbmcoc3Vic2NyaWJlckxpc3QsIGZpbHRlcik7XG4gICAgcmV0dXJuIHsgcmVzLCBkYXRhLCBwYWdpbmcgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShzdWJzY3JpYmVyVG9EZWxldGU6IE1lc3NhZ2luZ1N1YnNjcmliZXJUb0RlbGV0ZSkge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdERUxFVEUnO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QmFzZVVybChzdWJzY3JpYmVyVG9EZWxldGUpICsgYC8ke3N1YnNjcmliZXJUb0RlbGV0ZS5uYW1lfWA7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaCh1cmwsIHRoaXMuY2hhbmdlRmV0Y2hPcHRpb25zKHsgbWV0aG9kIH0sIHVybCkpO1xuICAgIHJldHVybiB7IHJlcywgZGF0YTogbnVsbCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2luZyhqc29uOiBNZXNzYWdpbmdTdWJzY3JpYmVyTGlzdCwgZmlsdGVyOiBvYmplY3QpOiBQYWdpbmc8TWVzc2FnaW5nU3Vic2NyaWJlcj4ge1xuICAgIGlmIChqc29uLnBhZ2VTdGF0aXN0aWNzKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRQYWdlLCB0b3RhbFBhZ2VzIH0gPSBqc29uLnBhZ2VTdGF0aXN0aWNzO1xuICAgICAgY29uc3Qgc3RhdGlzdGljcyA9IHtcbiAgICAgICAgLi4uanNvbi5wYWdlU3RhdGlzdGljcyxcbiAgICAgICAgbmV4dFBhZ2U6IGN1cnJlbnRQYWdlIDwgdG90YWxQYWdlcyA/IGN1cnJlbnRQYWdlICsgMSA6IG51bGwsXG4gICAgICAgIHByZXZQYWdlOiBjdXJyZW50UGFnZSA+IDEgPyBjdXJyZW50UGFnZSAtIDEgOiBudWxsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBQYWdpbmc8TWVzc2FnaW5nVG9waWM+KHRoaXMsIHN0YXRpc3RpY3MsIGZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCYXNlVXJsKHtcbiAgICB0ZW5hbnQsXG4gICAgbmFtZXNwYWNlLFxuICAgIHRvcGljLFxuICAgIHR5cGVcbiAgfToge1xuICAgIHRlbmFudDogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHRvcGljOiBzdHJpbmc7XG4gICAgdHlwZTogTWVzc2FnaW5nVG9waWNUeXBlO1xuICB9KSB7XG4gICAgcmV0dXJuIGAvJHt0aGlzLmxpc3RVcmx9LyR7dGVuYW50fS9uYW1lc3BhY2VzLyR7bmFtZXNwYWNlfS90b3BpY3MvJHt0b3BpY30vdHlwZXMvJHt0eXBlfS9zdWJzY3JpYmVyc2A7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,48 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { FetchClient, Paging, Service } from '@c8y/client';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@c8y/client";
5
+ export class MessagingTopicsService extends Service {
6
+ constructor(client) {
7
+ super(client);
8
+ this.baseUrl = '/service/messaging-management';
9
+ this.listUrl = 'tenants';
10
+ }
11
+ async list(filter) {
12
+ const headers = { accept: 'application/json' };
13
+ const { tenant, namespace, ...params } = filter;
14
+ const url = `/${this.listUrl}/${tenant}/namespaces/${namespace}/topics`;
15
+ const res = await this.fetch(url, this.changeFetchOptions({ headers, params }, url));
16
+ const topicList = (await res.json());
17
+ const data = topicList.topics;
18
+ const paging = this.getPaging(topicList, filter);
19
+ return { res, data, paging };
20
+ }
21
+ async detail(filter) {
22
+ const headers = { accept: 'application/json' };
23
+ const { tenant, namespace, topic, type } = filter;
24
+ const url = `/${this.listUrl}/${tenant}/namespaces/${namespace}/topics/${topic}/types/${type}`;
25
+ const res = await this.fetch(url, this.changeFetchOptions({ headers }, url));
26
+ const data = await res.json();
27
+ return { res, data };
28
+ }
29
+ getPaging(topicList, filter) {
30
+ if (topicList.pageStatistics) {
31
+ const { currentPage, totalPages } = topicList.pageStatistics;
32
+ const statistics = {
33
+ ...topicList.pageStatistics,
34
+ nextPage: currentPage < totalPages ? currentPage + 1 : null,
35
+ prevPage: currentPage > 1 ? currentPage - 1 : null
36
+ };
37
+ return new Paging(this, statistics, filter);
38
+ }
39
+ return null;
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessagingTopicsService, deps: [{ token: i1.FetchClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
42
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessagingTopicsService, providedIn: 'root' }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessagingTopicsService, decorators: [{
45
+ type: Injectable,
46
+ args: [{ providedIn: 'root' }]
47
+ }], ctorParameters: () => [{ type: i1.FetchClient }] });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLXRvcGljcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvYXBpL3NlcnZpY2VzL21lc3NhZ2luZy10b3BpY3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7O0FBT3BFLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxPQUF1QjtJQUlqRSxZQUFZLE1BQW1CO1FBQzdCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUpOLFlBQU8sR0FBRywrQkFBK0IsQ0FBQztRQUMxQyxZQUFPLEdBQUcsU0FBUyxDQUFDO0lBSTlCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQWlDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sZUFBZSxTQUFTLFNBQVMsQ0FBQztRQUN4RSxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQXVCLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFtQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sZUFBZSxTQUFTLFdBQVcsS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQy9GLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxTQUFTLENBQ2pCLFNBQTZCLEVBQzdCLE1BQWlDO1FBRWpDLElBQUksU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRztnQkFDakIsR0FBRyxTQUFTLENBQUMsY0FBYztnQkFDM0IsUUFBUSxFQUFFLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0JBQzNELFFBQVEsRUFBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ25ELENBQUM7WUFDRixPQUFPLElBQUksTUFBTSxDQUFpQixJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7K0dBMUNVLHNCQUFzQjttSEFBdEIsc0JBQXNCLGNBRFQsTUFBTTs7NEZBQ25CLHNCQUFzQjtrQkFEbEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGZXRjaENsaWVudCwgSVJlc3VsdCwgUGFnaW5nLCBTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnaW5nVG9waWNMaXN0IH0gZnJvbSAnLi4vbW9kZWwvdG9waWNMaXN0JztcbmltcG9ydCB7IE1lc3NhZ2luZ1RvcGljTGlzdEZpbHRlcnMgfSBmcm9tICcuLi9tb2RlbC90b3BpY0xpc3RGaWx0ZXJzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1RvcGljIH0gZnJvbSAnLi4vbW9kZWwvdG9waWMnO1xuaW1wb3J0IHsgTWVzc2FnaW5nVG9waWNEZXRhaWxGaWx0ZXJzIH0gZnJvbSAnLi4vbW9kZWwvdG9waWNEZXRhaWxGaWx0ZXJzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdpbmdUb3BpY3NTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxNZXNzYWdpbmdUb3BpYz4ge1xuICBwcm90ZWN0ZWQgYmFzZVVybCA9ICcvc2VydmljZS9tZXNzYWdpbmctbWFuYWdlbWVudCc7XG4gIHByb3RlY3RlZCBsaXN0VXJsID0gJ3RlbmFudHMnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogRmV0Y2hDbGllbnQpIHtcbiAgICBzdXBlcihjbGllbnQpO1xuICB9XG5cbiAgYXN5bmMgbGlzdChmaWx0ZXI6IE1lc3NhZ2luZ1RvcGljTGlzdEZpbHRlcnMpIHtcbiAgICBjb25zdCBoZWFkZXJzID0geyBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyB9O1xuICAgIGNvbnN0IHsgdGVuYW50LCBuYW1lc3BhY2UsIC4uLnBhcmFtcyB9ID0gZmlsdGVyO1xuICAgIGNvbnN0IHVybCA9IGAvJHt0aGlzLmxpc3RVcmx9LyR7dGVuYW50fS9uYW1lc3BhY2VzLyR7bmFtZXNwYWNlfS90b3BpY3NgO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZmV0Y2godXJsLCB0aGlzLmNoYW5nZUZldGNoT3B0aW9ucyh7IGhlYWRlcnMsIHBhcmFtcyB9LCB1cmwpKTtcbiAgICBjb25zdCB0b3BpY0xpc3QgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgTWVzc2FnaW5nVG9waWNMaXN0O1xuICAgIGNvbnN0IGRhdGEgPSB0b3BpY0xpc3QudG9waWNzO1xuICAgIGNvbnN0IHBhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nKHRvcGljTGlzdCwgZmlsdGVyKTtcbiAgICByZXR1cm4geyByZXMsIGRhdGEsIHBhZ2luZyB9O1xuICB9XG5cbiAgYXN5bmMgZGV0YWlsKGZpbHRlcjogTWVzc2FnaW5nVG9waWNEZXRhaWxGaWx0ZXJzKTogUHJvbWlzZTxJUmVzdWx0PE1lc3NhZ2luZ1RvcGljPj4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7IGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nIH07XG4gICAgY29uc3QgeyB0ZW5hbnQsIG5hbWVzcGFjZSwgdG9waWMsIHR5cGUgfSA9IGZpbHRlcjtcbiAgICBjb25zdCB1cmwgPSBgLyR7dGhpcy5saXN0VXJsfS8ke3RlbmFudH0vbmFtZXNwYWNlcy8ke25hbWVzcGFjZX0vdG9waWNzLyR7dG9waWN9L3R5cGVzLyR7dHlwZX1gO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZmV0Y2godXJsLCB0aGlzLmNoYW5nZUZldGNoT3B0aW9ucyh7IGhlYWRlcnMgfSwgdXJsKSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmV0dXJuIHsgcmVzLCBkYXRhIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGFnaW5nKFxuICAgIHRvcGljTGlzdDogTWVzc2FnaW5nVG9waWNMaXN0LFxuICAgIGZpbHRlcjogTWVzc2FnaW5nVG9waWNMaXN0RmlsdGVyc1xuICApOiBQYWdpbmc8TWVzc2FnaW5nVG9waWM+IHtcbiAgICBpZiAodG9waWNMaXN0LnBhZ2VTdGF0aXN0aWNzKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRQYWdlLCB0b3RhbFBhZ2VzIH0gPSB0b3BpY0xpc3QucGFnZVN0YXRpc3RpY3M7XG4gICAgICBjb25zdCBzdGF0aXN0aWNzID0ge1xuICAgICAgICAuLi50b3BpY0xpc3QucGFnZVN0YXRpc3RpY3MsXG4gICAgICAgIG5leHRQYWdlOiBjdXJyZW50UGFnZSA8IHRvdGFsUGFnZXMgPyBjdXJyZW50UGFnZSArIDEgOiBudWxsLFxuICAgICAgICBwcmV2UGFnZTogY3VycmVudFBhZ2UgPiAxID8gY3VycmVudFBhZ2UgLSAxIDogbnVsbFxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgUGFnaW5nPE1lc3NhZ2luZ1RvcGljPih0aGlzLCBzdGF0aXN0aWNzLCBmaWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYzh5LW5neC1jb21wb25lbnRzLW1lc3NhZ2luZy1tYW5hZ2VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvYzh5LW5neC1jb21wb25lbnRzLW1lc3NhZ2luZy1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,4 @@
1
+ export const basePath = 'monitoring/messaging-service';
2
+ export const MESSAGING_MANAGEMENT_FEATURE_KEY = 'messaging-management.api';
3
+ export const MESSAGING_MANAGEMENT_MICROSERVICE_NAME = 'messaging-management';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQztBQUN2RCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRywwQkFBMEIsQ0FBQztBQUMzRSxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBiYXNlUGF0aCA9ICdtb25pdG9yaW5nL21lc3NhZ2luZy1zZXJ2aWNlJztcbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfTUFOQUdFTUVOVF9GRUFUVVJFX0tFWSA9ICdtZXNzYWdpbmctbWFuYWdlbWVudC5hcGknO1xuZXhwb3J0IGNvbnN0IE1FU1NBR0lOR19NQU5BR0VNRU5UX01JQ1JPU0VSVklDRV9OQU1FID0gJ21lc3NhZ2luZy1tYW5hZ2VtZW50JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './messaging-management.module';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tZXNzYWdpbmctbWFuYWdlbWVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmctbWFuYWdlbWVudC5tb2R1bGUnO1xuIl19
@@ -0,0 +1,43 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { C8yTranslateModule, gettext, IconDirective } from '@c8y/ngx-components';
3
+ import { CommonModule } from '@angular/common';
4
+ import { BacklogQuotaLimitPipe } from '../../../../utils/backlog-quota-limit.pipe';
5
+ import { UsageComponent } from '../../../shared/usage/usage.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@c8y/ngx-components";
8
+ import * as i2 from "@angular/common";
9
+ const DataType = {
10
+ publishers: 'publishers',
11
+ subscribers: 'subscribers',
12
+ topics: 'topics'
13
+ };
14
+ export class NamespaceItemCardComponent {
15
+ constructor() {
16
+ this.DATA_TYPE = DataType;
17
+ this.ITEM_DETAILS = {
18
+ publishers: { icon: 'output', title: gettext('Publishers') },
19
+ subscribers: { icon: 'input', title: gettext('Subscribers') },
20
+ topics: { icon: 'day-view', title: gettext('Topics') }
21
+ };
22
+ this.topicsLimitLabel = gettext('Limit: {{ backlogQuotaLimit }}');
23
+ /**
24
+ * The label of the service (already translated).
25
+ */
26
+ this.serviceLabel = '';
27
+ }
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NamespaceItemCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NamespaceItemCardComponent, isStandalone: true, selector: "app-namespace-item-card", inputs: { serviceLabel: "serviceLabel", limit: "limit", dataType: "dataType", value: "value" }, host: { classAttribute: "card m-b-0 fit-w" }, ngImport: i0, template: "<div class=\"card-block text-default visible-xs text-center p-b-0\">\n <span class=\"text-12 text-uppercase text-muted\">\n {{ serviceLabel | translate }}\n </span>\n</div>\n<div\n class=\"card-block text-default p-t-sm-48\"\n [ngClass]=\"{\n 'p-b-sm-48': limit === 0\n }\"\n>\n <div class=\"d-flex fit-w a-i-center gap-8 j-c-center\">\n <i\n class=\"icon-32 c8y-icon-duocolor\"\n [c8yIcon]=\"ITEM_DETAILS[dataType].icon\"\n ></i>\n <span class=\"h1\">\n {{ value | number }}\n </span>\n <span\n class=\"a-s-baseline text-14 text-medium text-truncate\"\n title=\"{{ ITEM_DETAILS[dataType].title | translate }}\"\n >\n {{ ITEM_DETAILS[dataType].title | translate }}\n </span>\n </div>\n</div>\n<div\n class=\"card-footer d-flex gap-16 j-c-center a-i-center\"\n *ngIf=\"dataType === DATA_TYPE.topics && limit !== 0\"\n>\n <span\n class=\"tag tag--default no-pointer\"\n data-cy=\"card-limit\"\n >\n {{ topicsLimitLabel | translate: { backlogQuotaLimit: limit | backlogQuotaLimit } }}\n </span>\n <app-usage\n [count]=\"value\"\n [limit]=\"limit\"\n ></app-usage>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: C8yTranslateModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: BacklogQuotaLimitPipe, name: "backlogQuotaLimit" }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }] }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NamespaceItemCardComponent, decorators: [{
32
+ type: Component,
33
+ args: [{ selector: 'app-namespace-item-card', standalone: true, imports: [IconDirective, C8yTranslateModule, CommonModule, BacklogQuotaLimitPipe, UsageComponent], host: { class: 'card m-b-0 fit-w' }, template: "<div class=\"card-block text-default visible-xs text-center p-b-0\">\n <span class=\"text-12 text-uppercase text-muted\">\n {{ serviceLabel | translate }}\n </span>\n</div>\n<div\n class=\"card-block text-default p-t-sm-48\"\n [ngClass]=\"{\n 'p-b-sm-48': limit === 0\n }\"\n>\n <div class=\"d-flex fit-w a-i-center gap-8 j-c-center\">\n <i\n class=\"icon-32 c8y-icon-duocolor\"\n [c8yIcon]=\"ITEM_DETAILS[dataType].icon\"\n ></i>\n <span class=\"h1\">\n {{ value | number }}\n </span>\n <span\n class=\"a-s-baseline text-14 text-medium text-truncate\"\n title=\"{{ ITEM_DETAILS[dataType].title | translate }}\"\n >\n {{ ITEM_DETAILS[dataType].title | translate }}\n </span>\n </div>\n</div>\n<div\n class=\"card-footer d-flex gap-16 j-c-center a-i-center\"\n *ngIf=\"dataType === DATA_TYPE.topics && limit !== 0\"\n>\n <span\n class=\"tag tag--default no-pointer\"\n data-cy=\"card-limit\"\n >\n {{ topicsLimitLabel | translate: { backlogQuotaLimit: limit | backlogQuotaLimit } }}\n </span>\n <app-usage\n [count]=\"value\"\n [limit]=\"limit\"\n ></app-usage>\n</div>\n" }]
34
+ }], propDecorators: { serviceLabel: [{
35
+ type: Input
36
+ }], limit: [{
37
+ type: Input
38
+ }], dataType: [{
39
+ type: Input
40
+ }], value: [{
41
+ type: Input
42
+ }] } });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNwYWNlLWl0ZW0tY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tZXNzYWdpbmctbWFuYWdlbWVudC9tZXNzYWdpbmcvbmFtZXNwYWNlLWxpc3QvbmFtZXNwYWNlLWl0ZW0vbmFtZXNwYWNlLWl0ZW0tY2FyZC9uYW1lc3BhY2UtaXRlbS1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL21lc3NhZ2luZy1tYW5hZ2VtZW50L21lc3NhZ2luZy9uYW1lc3BhY2UtbGlzdC9uYW1lc3BhY2UtaXRlbS9uYW1lc3BhY2UtaXRlbS1jYXJkL25hbWVzcGFjZS1pdGVtLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7O0FBRXZFLE1BQU0sUUFBUSxHQUFHO0lBQ2YsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsTUFBTSxFQUFFLFFBQVE7Q0FDUixDQUFDO0FBU1gsTUFBTSxPQUFPLDBCQUEwQjtJQVB2QztRQVFXLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFDckIsaUJBQVksR0FBbUU7WUFDdEYsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzVELFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUM3RCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7U0FDOUMsQ0FBQztRQUNYLHFCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTdEOztXQUVHO1FBQ00saUJBQVksR0FBRyxFQUFFLENBQUM7S0FJNUI7K0dBaEJZLDBCQUEwQjttR0FBMUIsMEJBQTBCLGlPQ25CdkMsc29DQTBDQSw0Q0QzQlksYUFBYSwwRUFBRSxrQkFBa0IsOEZBQUUsWUFBWSxvUkFBRSxxQkFBcUIsMERBQUUsY0FBYzs7NEZBSXJGLDBCQUEwQjtrQkFQdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxjQUFjLENBQUMsUUFFM0YsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7OEJBYzFCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQzh5VHJhbnNsYXRlTW9kdWxlLCBnZXR0ZXh0LCBJY29uRGlyZWN0aXZlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmFja2xvZ1F1b3RhTGltaXRQaXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvYmFja2xvZy1xdW90YS1saW1pdC5waXBlJztcbmltcG9ydCB7IFVzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3VzYWdlL3VzYWdlLmNvbXBvbmVudCc7XG5cbmNvbnN0IERhdGFUeXBlID0ge1xuICBwdWJsaXNoZXJzOiAncHVibGlzaGVycycsXG4gIHN1YnNjcmliZXJzOiAnc3Vic2NyaWJlcnMnLFxuICB0b3BpY3M6ICd0b3BpY3MnXG59IGFzIGNvbnN0O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbmFtZXNwYWNlLWl0ZW0tY2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJY29uRGlyZWN0aXZlLCBDOHlUcmFuc2xhdGVNb2R1bGUsIENvbW1vbk1vZHVsZSwgQmFja2xvZ1F1b3RhTGltaXRQaXBlLCBVc2FnZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9uYW1lc3BhY2UtaXRlbS1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NhcmQgbS1iLTAgZml0LXcnIH1cbn0pXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlSXRlbUNhcmRDb21wb25lbnQge1xuICByZWFkb25seSBEQVRBX1RZUEUgPSBEYXRhVHlwZTtcbiAgcmVhZG9ubHkgSVRFTV9ERVRBSUxTOiBSZWNvcmQ8a2V5b2YgdHlwZW9mIERhdGFUeXBlLCB7IGljb246IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9PiA9IHtcbiAgICBwdWJsaXNoZXJzOiB7IGljb246ICdvdXRwdXQnLCB0aXRsZTogZ2V0dGV4dCgnUHVibGlzaGVycycpIH0sXG4gICAgc3Vic2NyaWJlcnM6IHsgaWNvbjogJ2lucHV0JywgdGl0bGU6IGdldHRleHQoJ1N1YnNjcmliZXJzJykgfSxcbiAgICB0b3BpY3M6IHsgaWNvbjogJ2RheS12aWV3JywgdGl0bGU6IGdldHRleHQoJ1RvcGljcycpIH1cbiAgfSBhcyBjb25zdDtcbiAgdG9waWNzTGltaXRMYWJlbCA9IGdldHRleHQoJ0xpbWl0OiB7eyBiYWNrbG9nUXVvdGFMaW1pdCB9fScpO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgb2YgdGhlIHNlcnZpY2UgKGFscmVhZHkgdHJhbnNsYXRlZCkuXG4gICAqL1xuICBASW5wdXQoKSBzZXJ2aWNlTGFiZWwgPSAnJztcbiAgQElucHV0KCkgbGltaXQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGRhdGFUeXBlOiBrZXlvZiB0eXBlb2YgRGF0YVR5cGU7XG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayB0ZXh0LWRlZmF1bHQgdmlzaWJsZS14cyB0ZXh0LWNlbnRlciBwLWItMFwiPlxuICA8c3BhbiBjbGFzcz1cInRleHQtMTIgdGV4dC11cHBlcmNhc2UgdGV4dC1tdXRlZFwiPlxuICAgIHt7IHNlcnZpY2VMYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICA8L3NwYW4+XG48L2Rpdj5cbjxkaXZcbiAgY2xhc3M9XCJjYXJkLWJsb2NrIHRleHQtZGVmYXVsdCBwLXQtc20tNDhcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3AtYi1zbS00OCc6IGxpbWl0ID09PSAwXG4gIH1cIlxuPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZpdC13IGEtaS1jZW50ZXIgZ2FwLTggai1jLWNlbnRlclwiPlxuICAgIDxpXG4gICAgICBjbGFzcz1cImljb24tMzIgYzh5LWljb24tZHVvY29sb3JcIlxuICAgICAgW2M4eUljb25dPVwiSVRFTV9ERVRBSUxTW2RhdGFUeXBlXS5pY29uXCJcbiAgICA+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwiaDFcIj5cbiAgICAgIHt7IHZhbHVlIHwgbnVtYmVyIH19XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cImEtcy1iYXNlbGluZSB0ZXh0LTE0IHRleHQtbWVkaXVtIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgdGl0bGU9XCJ7eyBJVEVNX0RFVEFJTFNbZGF0YVR5cGVdLnRpdGxlIHwgdHJhbnNsYXRlIH19XCJcbiAgICA+XG4gICAgICB7eyBJVEVNX0RFVEFJTFNbZGF0YVR5cGVdLnRpdGxlIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdlxuICBjbGFzcz1cImNhcmQtZm9vdGVyIGQtZmxleCBnYXAtMTYgai1jLWNlbnRlciBhLWktY2VudGVyXCJcbiAgKm5nSWY9XCJkYXRhVHlwZSA9PT0gREFUQV9UWVBFLnRvcGljcyAmJiBsaW1pdCAhPT0gMFwiXG4+XG4gIDxzcGFuXG4gICAgY2xhc3M9XCJ0YWcgdGFnLS1kZWZhdWx0IG5vLXBvaW50ZXJcIlxuICAgIGRhdGEtY3k9XCJjYXJkLWxpbWl0XCJcbiAgPlxuICAgIHt7IHRvcGljc0xpbWl0TGFiZWwgfCB0cmFuc2xhdGU6IHsgYmFja2xvZ1F1b3RhTGltaXQ6IGxpbWl0IHwgYmFja2xvZ1F1b3RhTGltaXQgfSB9fVxuICA8L3NwYW4+XG4gIDxhcHAtdXNhZ2VcbiAgICBbY291bnRdPVwidmFsdWVcIlxuICAgIFtsaW1pdF09XCJsaW1pdFwiXG4gID48L2FwcC11c2FnZT5cbjwvZGl2PlxuIl19
@@ -0,0 +1,36 @@
1
+ import { Component, inject, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';
4
+ import { NamespaceItemCardComponent } from './namespace-item-card/namespace-item-card.component';
5
+ import { NAMESPACE_PROPS } from '../../../utils/namespace-props';
6
+ import { TranslateService } from '@ngx-translate/core';
7
+ import * as i0 from "@angular/core";
8
+ export class NamespaceItemComponent {
9
+ constructor() {
10
+ this.translateService = inject(TranslateService);
11
+ this.namespaceName = '';
12
+ this.namespaceLabel = '';
13
+ this.icon = '';
14
+ this.namespace = {};
15
+ this.policies = {};
16
+ }
17
+ set _namespaceName(name) {
18
+ this.namespaceName = name;
19
+ this.icon = NAMESPACE_PROPS[name]?.icon;
20
+ this.namespaceLabel = this.translateService.instant(NAMESPACE_PROPS[name]?.label) || name;
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NamespaceItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NamespaceItemComponent, isStandalone: true, selector: "app-namespace-item", inputs: { _namespaceName: ["namespaceName", "_namespaceName"], namespace: "namespace", policies: "policies" }, ngImport: i0, template: "<div class=\"d-flex-sm d-col-xs p-t-24 p-l-16 p-r-16 m-0 bg-level-1\">\n <div\n class=\"col-sm-3 m-b-24 col-xs-12 d-flex gap-16 text-default a-i-center j-c-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4\">{{ namespaceLabel }}</span>\n </div>\n <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n <app-namespace-item-card\n [serviceLabel]=\"namespaceLabel\"\n [dataType]=\"'topics'\"\n [limit]=\"namespace?.topics?.limit\"\n [value]=\"namespace?.topics?.count\"\n ></app-namespace-item-card>\n </div>\n <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n <app-namespace-item-card\n [serviceLabel]=\"namespaceLabel\"\n [dataType]=\"'publishers'\"\n [value]=\"namespace?.publishers?.count\"\n ></app-namespace-item-card>\n </div>\n <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n <app-namespace-item-card\n [serviceLabel]=\"namespaceLabel\"\n [dataType]=\"'subscribers'\"\n [value]=\"namespace?.subscribers?.count\"\n ></app-namespace-item-card>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: NamespaceItemCardComponent, selector: "app-namespace-item-card", inputs: ["serviceLabel", "limit", "dataType", "value"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NamespaceItemComponent, decorators: [{
26
+ type: Component,
27
+ args: [{ selector: 'app-namespace-item', standalone: true, imports: [CommonModule, IconDirective, NamespaceItemCardComponent, C8yTranslatePipe], template: "<div class=\"d-flex-sm d-col-xs p-t-24 p-l-16 p-r-16 m-0 bg-level-1\">\n <div\n class=\"col-sm-3 m-b-24 col-xs-12 d-flex gap-16 text-default a-i-center j-c-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4\">{{ namespaceLabel }}</span>\n </div>\n <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n <app-namespace-item-card\n [serviceLabel]=\"namespaceLabel\"\n [dataType]=\"'topics'\"\n [limit]=\"namespace?.topics?.limit\"\n [value]=\"namespace?.topics?.count\"\n ></app-namespace-item-card>\n </div>\n <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n <app-namespace-item-card\n [serviceLabel]=\"namespaceLabel\"\n [dataType]=\"'publishers'\"\n [value]=\"namespace?.publishers?.count\"\n ></app-namespace-item-card>\n </div>\n <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n <app-namespace-item-card\n [serviceLabel]=\"namespaceLabel\"\n [dataType]=\"'subscribers'\"\n [value]=\"namespace?.subscribers?.count\"\n ></app-namespace-item-card>\n </div>\n</div>\n" }]
28
+ }], propDecorators: { _namespaceName: [{
29
+ type: Input,
30
+ args: ['namespaceName']
31
+ }], namespace: [{
32
+ type: Input
33
+ }], policies: [{
34
+ type: Input
35
+ }] } });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNwYWNlLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvbWVzc2FnaW5nL25hbWVzcGFjZS1saXN0L25hbWVzcGFjZS1pdGVtL25hbWVzcGFjZS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL21lc3NhZ2luZy1tYW5hZ2VtZW50L21lc3NhZ2luZy9uYW1lc3BhY2UtbGlzdC9uYW1lc3BhY2UtaXRlbS9uYW1lc3BhY2UtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBUXZELE1BQU0sT0FBTyxzQkFBc0I7SUFObkM7UUFPVSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQVFwRCxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRUQsY0FBUyxHQUF1QixFQUFFLENBQUM7UUFDbkMsYUFBUSxHQUErQixFQUFFLENBQUM7S0FDcEQ7SUFaQyxJQUNJLGNBQWMsQ0FBQyxJQUFZO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1RixDQUFDOytHQVJVLHNCQUFzQjttR0FBdEIsc0JBQXNCLDZMQ2ZuQyx5eENBb0NBLDJDRHhCWSxZQUFZLCtCQUFFLGFBQWEsMkVBQUUsMEJBQTBCLHVIQUFFLGdCQUFnQjs7NEZBR3hFLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSwwQkFBMEIsRUFBRSxnQkFBZ0IsQ0FBQzs4QkFPaEYsY0FBYztzQkFEakIsS0FBSzt1QkFBQyxlQUFlO2dCQVViLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEM4eVRyYW5zbGF0ZVBpcGUsIEljb25EaXJlY3RpdmUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE5hbWVzcGFjZUl0ZW1DYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9uYW1lc3BhY2UtaXRlbS1jYXJkL25hbWVzcGFjZS1pdGVtLWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IE5BTUVTUEFDRV9QUk9QUyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL25hbWVzcGFjZS1wcm9wcyc7XG5pbXBvcnQgeyBNZXNzYWdpbmdOYW1lc3BhY2UgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvbmFtZXNwYWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ05hbWVzcGFjZVBvbGljaWVzIH0gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVsL25hbWVzcGFjZVBvbGljaWVzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW5hbWVzcGFjZS1pdGVtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkRpcmVjdGl2ZSwgTmFtZXNwYWNlSXRlbUNhcmRDb21wb25lbnQsIEM4eVRyYW5zbGF0ZVBpcGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbmFtZXNwYWNlLWl0ZW0uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZUl0ZW1Db21wb25lbnQge1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgQElucHV0KCduYW1lc3BhY2VOYW1lJylcbiAgc2V0IF9uYW1lc3BhY2VOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pY29uID0gTkFNRVNQQUNFX1BST1BTW25hbWVdPy5pY29uO1xuICAgIHRoaXMubmFtZXNwYWNlTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChOQU1FU1BBQ0VfUFJPUFNbbmFtZV0/LmxhYmVsKSB8fCBuYW1lO1xuICB9XG4gIG5hbWVzcGFjZU5hbWUgPSAnJztcbiAgbmFtZXNwYWNlTGFiZWwgPSAnJztcbiAgaWNvbiA9ICcnO1xuXG4gIEBJbnB1dCgpIG5hbWVzcGFjZTogTWVzc2FnaW5nTmFtZXNwYWNlID0ge307XG4gIEBJbnB1dCgpIHBvbGljaWVzOiBNZXNzYWdpbmdOYW1lc3BhY2VQb2xpY2llcyA9IHt9O1xufVxuIiwiPGRpdiBjbGFzcz1cImQtZmxleC1zbSBkLWNvbC14cyBwLXQtMjQgcC1sLTE2IHAtci0xNiBtLTAgYmctbGV2ZWwtMVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb2wtc20tMyBtLWItMjQgY29sLXhzLTEyIGQtZmxleCBnYXAtMTYgdGV4dC1kZWZhdWx0IGEtaS1jZW50ZXIgai1jLWNlbnRlciBhLXMtc3RyZXRjaFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgZC1jb2xcIj5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwibS1iLTggaWNvbi00MCBjOHktaWNvbi1kdW9jb2xvclwiXG4gICAgICAgIFtjOHlJY29uXT1cImljb25cIlxuICAgICAgPjwvaT5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGFnIHRhZy0taW5mb1wiPnt7ICdTZXJ2aWNlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cImg0XCI+e3sgbmFtZXNwYWNlTGFiZWwgfX08L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgbS1iLTI0IGNvbC14cy0xMiBhLWktc3RyZXRjaCBkLWZsZXhcIj5cbiAgICA8YXBwLW5hbWVzcGFjZS1pdGVtLWNhcmRcbiAgICAgIFtzZXJ2aWNlTGFiZWxdPVwibmFtZXNwYWNlTGFiZWxcIlxuICAgICAgW2RhdGFUeXBlXT1cIid0b3BpY3MnXCJcbiAgICAgIFtsaW1pdF09XCJuYW1lc3BhY2U/LnRvcGljcz8ubGltaXRcIlxuICAgICAgW3ZhbHVlXT1cIm5hbWVzcGFjZT8udG9waWNzPy5jb3VudFwiXG4gICAgPjwvYXBwLW5hbWVzcGFjZS1pdGVtLWNhcmQ+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgbS1iLTI0IGNvbC14cy0xMiBhLWktc3RyZXRjaCBkLWZsZXhcIj5cbiAgICA8YXBwLW5hbWVzcGFjZS1pdGVtLWNhcmRcbiAgICAgIFtzZXJ2aWNlTGFiZWxdPVwibmFtZXNwYWNlTGFiZWxcIlxuICAgICAgW2RhdGFUeXBlXT1cIidwdWJsaXNoZXJzJ1wiXG4gICAgICBbdmFsdWVdPVwibmFtZXNwYWNlPy5wdWJsaXNoZXJzPy5jb3VudFwiXG4gICAgPjwvYXBwLW5hbWVzcGFjZS1pdGVtLWNhcmQ+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgbS1iLTI0IGNvbC14cy0xMiBhLWktc3RyZXRjaCBkLWZsZXhcIj5cbiAgICA8YXBwLW5hbWVzcGFjZS1pdGVtLWNhcmRcbiAgICAgIFtzZXJ2aWNlTGFiZWxdPVwibmFtZXNwYWNlTGFiZWxcIlxuICAgICAgW2RhdGFUeXBlXT1cIidzdWJzY3JpYmVycydcIlxuICAgICAgW3ZhbHVlXT1cIm5hbWVzcGFjZT8uc3Vic2NyaWJlcnM/LmNvdW50XCJcbiAgICA+PC9hcHAtbmFtZXNwYWNlLWl0ZW0tY2FyZD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,51 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { ActionBarItemComponent, AlertService, AppStateService, BreadcrumbModule, C8yTranslateModule, HeaderModule, HelpModule, IconDirective, LoadingComponent } from '@c8y/ngx-components';
3
+ import { CommonModule } from '@angular/common';
4
+ import { RouterLink } from '@angular/router';
5
+ import { NamespaceItemComponent } from './namespace-item/namespace-item.component';
6
+ import { MessagingNamespacesService } from '../../api/services/messaging-namespaces.service';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ import * as i2 from "@c8y/ngx-components";
10
+ export class NamespaceListComponent {
11
+ constructor() {
12
+ this.alertService = inject(AlertService);
13
+ this.appState = inject(AppStateService);
14
+ this.namespacesService = inject(MessagingNamespacesService);
15
+ this.loading = true;
16
+ }
17
+ async ngOnInit() {
18
+ await this.reload();
19
+ }
20
+ async reload() {
21
+ this.loading = true;
22
+ try {
23
+ const currentTenantId = this.appState.currentTenant.value.name;
24
+ this.namespacesDetails = await this.namespacesService.getNamespacesDetails(currentTenantId);
25
+ }
26
+ catch (e) {
27
+ this.alertService.addServerFailure(e);
28
+ }
29
+ finally {
30
+ this.loading = false;
31
+ }
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NamespaceListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NamespaceListComponent, isStandalone: true, selector: "app-namespace-list", ngImport: i0, template: "<c8y-title>{{ 'Messaging service' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Messaging service' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <li>\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n </li>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/monitoring/#messaging-service\"></c8y-help>\n\n<div\n class=\"interact-grid\"\n *ngIf=\"!loading; else loadingTemplate\"\n>\n <a\n class=\"card\"\n *ngFor=\"let namespace of namespacesDetails\"\n [routerLink]=\"['namespace', namespace.id]\"\n >\n <app-namespace-item\n [namespaceName]=\"namespace.id\"\n [namespace]=\"namespace.namespace\"\n ></app-namespace-item>\n </a>\n</div>\n\n<ng-template #loadingTemplate>\n <c8y-loading></c8y-loading>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "ngmodule", type: HelpModule }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "ngmodule", type: C8yTranslateModule }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "component", type: NamespaceItemComponent, selector: "app-namespace-item", inputs: ["namespaceName", "namespace", "policies"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }] }); }
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NamespaceListComponent, decorators: [{
37
+ type: Component,
38
+ args: [{ selector: 'app-namespace-list', imports: [
39
+ CommonModule,
40
+ HeaderModule,
41
+ HelpModule,
42
+ C8yTranslateModule,
43
+ NamespaceItemComponent,
44
+ RouterLink,
45
+ BreadcrumbModule,
46
+ ActionBarItemComponent,
47
+ IconDirective,
48
+ LoadingComponent
49
+ ], standalone: true, template: "<c8y-title>{{ 'Messaging service' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Messaging service' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <li>\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n </li>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/monitoring/#messaging-service\"></c8y-help>\n\n<div\n class=\"interact-grid\"\n *ngIf=\"!loading; else loadingTemplate\"\n>\n <a\n class=\"card\"\n *ngFor=\"let namespace of namespacesDetails\"\n [routerLink]=\"['namespace', namespace.id]\"\n >\n <app-namespace-item\n [namespaceName]=\"namespace.id\"\n [namespace]=\"namespace.namespace\"\n ></app-namespace-item>\n </a>\n</div>\n\n<ng-template #loadingTemplate>\n <c8y-loading></c8y-loading>\n</ng-template>\n" }]
50
+ }] });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNwYWNlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvbWVzc2FnaW5nL25hbWVzcGFjZS1saXN0L25hbWVzcGFjZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL21lc3NhZ2luZy1tYW5hZ2VtZW50L21lc3NhZ2luZy9uYW1lc3BhY2UtbGlzdC9uYW1lc3BhY2UtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLFlBQVksRUFDWixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osVUFBVSxFQUNWLGFBQWEsRUFDYixnQkFBZ0IsRUFDakIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOzs7O0FBb0I3RixNQUFNLE9BQU8sc0JBQXNCO0lBakJuQztRQWtCRSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLHNCQUFpQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBR3ZELFlBQU8sR0FBRyxJQUFJLENBQUM7S0FpQmhCO0lBZkMsS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU07UUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQy9ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7K0dBdEJVLHNCQUFzQjttR0FBdEIsc0JBQXNCLDhFQ25DbkMsK3FDQStDQSwyQ0R6QkksWUFBWSw2VkFDWixZQUFZLGtJQUNaLFVBQVUsdUpBQ1Ysa0JBQWtCLCtGQUNsQixzQkFBc0IsbUhBQ3RCLFVBQVUsbU9BQ1YsZ0JBQWdCLHNRQUNoQixzQkFBc0IsMEpBQ3RCLGFBQWEsMkVBQ2IsZ0JBQWdCOzs0RkFJUCxzQkFBc0I7a0JBakJsQyxTQUFTOytCQUNFLG9CQUFvQixXQUVyQjt3QkFDUCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixrQkFBa0I7d0JBQ2xCLHNCQUFzQjt3QkFDdEIsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLHNCQUFzQjt3QkFDdEIsYUFBYTt3QkFDYixnQkFBZ0I7cUJBQ2pCLGNBQ1csSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGlvbkJhckl0ZW1Db21wb25lbnQsXG4gIEFsZXJ0U2VydmljZSxcbiAgQXBwU3RhdGVTZXJ2aWNlLFxuICBCcmVhZGNydW1iTW9kdWxlLFxuICBDOHlUcmFuc2xhdGVNb2R1bGUsXG4gIEhlYWRlck1vZHVsZSxcbiAgSGVscE1vZHVsZSxcbiAgSWNvbkRpcmVjdGl2ZSxcbiAgTG9hZGluZ0NvbXBvbmVudFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5hbWVzcGFjZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL25hbWVzcGFjZS1pdGVtL25hbWVzcGFjZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNzYWdpbmdOYW1lc3BhY2VzU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9zZXJ2aWNlcy9tZXNzYWdpbmctbmFtZXNwYWNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ05hbWVzcGFjZURldGFpbHMgfSBmcm9tICcuLi8uLi9hcGkvbW9kZWwvbmFtZXNwYWNlRGV0YWlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1uYW1lc3BhY2UtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uYW1lc3BhY2UtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSGVhZGVyTW9kdWxlLFxuICAgIEhlbHBNb2R1bGUsXG4gICAgQzh5VHJhbnNsYXRlTW9kdWxlLFxuICAgIE5hbWVzcGFjZUl0ZW1Db21wb25lbnQsXG4gICAgUm91dGVyTGluayxcbiAgICBCcmVhZGNydW1iTW9kdWxlLFxuICAgIEFjdGlvbkJhckl0ZW1Db21wb25lbnQsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBMb2FkaW5nQ29tcG9uZW50XG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGFsZXJ0U2VydmljZSA9IGluamVjdChBbGVydFNlcnZpY2UpO1xuICBhcHBTdGF0ZSA9IGluamVjdChBcHBTdGF0ZVNlcnZpY2UpO1xuICBuYW1lc3BhY2VzU2VydmljZSA9IGluamVjdChNZXNzYWdpbmdOYW1lc3BhY2VzU2VydmljZSk7XG5cbiAgbmFtZXNwYWNlc0RldGFpbHM6IE1lc3NhZ2luZ05hbWVzcGFjZURldGFpbHNbXTtcbiAgbG9hZGluZyA9IHRydWU7XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIHJlbG9hZCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VGVuYW50SWQgPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQudmFsdWUubmFtZTtcbiAgICAgIHRoaXMubmFtZXNwYWNlc0RldGFpbHMgPSBhd2FpdCB0aGlzLm5hbWVzcGFjZXNTZXJ2aWNlLmdldE5hbWVzcGFjZXNEZXRhaWxzKGN1cnJlbnRUZW5hbnRJZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7ICdNZXNzYWdpbmcgc2VydmljZScgfCB0cmFuc2xhdGUgfX08L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cIidtb25pdG9yaW5nJ1wiXG4gICAgW2xhYmVsXT1cIidNb25pdG9yaW5nJyB8IHRyYW5zbGF0ZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtsYWJlbF09XCInTWVzc2FnaW5nIHNlcnZpY2UnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxsaT5cbiAgICA8YVxuICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAoY2xpY2spPVwicmVsb2FkKClcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogbG9hZGluZyB9XCJcbiAgICAgID48L2k+XG4gICAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYT5cbiAgPC9saT5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1oZWxwIHNyYz1cIi9kb2NzL3N0YW5kYXJkLXRlbmFudC9tb25pdG9yaW5nLyNtZXNzYWdpbmctc2VydmljZVwiPjwvYzh5LWhlbHA+XG5cbjxkaXZcbiAgY2xhc3M9XCJpbnRlcmFjdC1ncmlkXCJcbiAgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBsb2FkaW5nVGVtcGxhdGVcIlxuPlxuICA8YVxuICAgIGNsYXNzPVwiY2FyZFwiXG4gICAgKm5nRm9yPVwibGV0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzRGV0YWlsc1wiXG4gICAgW3JvdXRlckxpbmtdPVwiWyduYW1lc3BhY2UnLCBuYW1lc3BhY2UuaWRdXCJcbiAgPlxuICAgIDxhcHAtbmFtZXNwYWNlLWl0ZW1cbiAgICAgIFtuYW1lc3BhY2VOYW1lXT1cIm5hbWVzcGFjZS5pZFwiXG4gICAgICBbbmFtZXNwYWNlXT1cIm5hbWVzcGFjZS5uYW1lc3BhY2VcIlxuICAgID48L2FwcC1uYW1lc3BhY2UtaXRlbT5cbiAgPC9hPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RlbXBsYXRlPlxuICA8Yzh5LWxvYWRpbmc+PC9jOHktbG9hZGluZz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,68 @@
1
+ import { Component, computed, input } from '@angular/core';
2
+ import { C8yTranslatePipe, gettext, IconDirective } from '@c8y/ngx-components';
3
+ import { NgClass, NgIf, PercentPipe } from '@angular/common';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Usage component displays usage information in a form of e.g. "51% used".
7
+ * It can be used in two ways:
8
+ * 1. By providing `count` and `limit` inputs, it will calculate the usage percentage.
9
+ * 2. By providing `percentage` input, it will use the provided percentage value.
10
+ * Note: `percentage` input takes precedence over `count` and `limit` inputs.
11
+ */
12
+ export class UsageComponent {
13
+ constructor() {
14
+ this.count = input(null);
15
+ this.limit = input(null);
16
+ /**
17
+ * Percentage of usage. Value range is from 0 to 100 (or more).
18
+ * For example, if 10% is used, this value should be provided as 10 (not 0.1).
19
+ */
20
+ this.percentage = input(null);
21
+ /**
22
+ * Usage as a fraction (e.g. if 50% is used, usage value will be 0.5)
23
+ */
24
+ this.usage = computed(() => this.percentage() != null ? this.percentage() / 100 : this.getUsage(this.count(), this.limit()));
25
+ this.status = computed(() => this.getStatus(this.usage()));
26
+ this.usageToDisplay = gettext('{{ percentageOfQuota }} used');
27
+ this.statusMap = {
28
+ danger: ['tag--danger'],
29
+ warning: ['tag--warning'],
30
+ success: ['tag--success']
31
+ };
32
+ }
33
+ /**
34
+ * Get usage as fraction of count and limit.
35
+ * E.g. if count is 5 and limit is 10, returned usage will be 0.5
36
+ * @param count Usage count
37
+ * @param limit Usage limit
38
+ * @returns Count divided by limit or null if count or limit is null or limit is -1 (indicates no limit)
39
+ */
40
+ getUsage(count, limit) {
41
+ if (count == null || limit == null || limit === -1) {
42
+ return null;
43
+ }
44
+ return count / limit;
45
+ }
46
+ getStatus(usage) {
47
+ if (usage == null) {
48
+ return null;
49
+ }
50
+ const percentage = usage * 100;
51
+ if (percentage >= 80) {
52
+ return 'danger';
53
+ }
54
+ else if (percentage >= 50) {
55
+ return 'warning';
56
+ }
57
+ else {
58
+ return 'success';
59
+ }
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UsageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
62
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: UsageComponent, isStandalone: true, selector: "app-usage", inputs: { count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, percentage: { classPropertyName: "percentage", publicName: "percentage", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "d-contents" }, ngImport: i0, template: "<div\n class=\"tag no-pointer\"\n [ngClass]=\"statusMap[status()]\"\n *ngIf=\"usage() !== null\"\n>\n <i\n class=\"text-danger m-r-4 text-12\"\n c8yIcon=\"exclamation-circle\"\n *ngIf=\"status() === 'danger'\"\n ></i>\n <span>\n {{ usageToDisplay | translate: { percentageOfQuota: (usage() | percent: '1.0-2') } }}\n </span>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: PercentPipe, name: "percent" }] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UsageComponent, decorators: [{
65
+ type: Component,
66
+ args: [{ selector: 'app-usage', standalone: true, imports: [IconDirective, NgIf, NgClass, IconDirective, C8yTranslatePipe, PercentPipe], host: { class: 'd-contents' }, template: "<div\n class=\"tag no-pointer\"\n [ngClass]=\"statusMap[status()]\"\n *ngIf=\"usage() !== null\"\n>\n <i\n class=\"text-danger m-r-4 text-12\"\n c8yIcon=\"exclamation-circle\"\n *ngIf=\"status() === 'danger'\"\n ></i>\n <span>\n {{ usageToDisplay | translate: { percentageOfQuota: (usage() | percent: '1.0-2') } }}\n </span>\n</div>\n" }]
67
+ }] });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvbWVzc2FnaW5nL3NoYXJlZC91c2FnZS91c2FnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9tZXNzYWdpbmctbWFuYWdlbWVudC9tZXNzYWdpbmcvc2hhcmVkL3VzYWdlL3VzYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUU3RDs7Ozs7O0dBTUc7QUFRSCxNQUFNLE9BQU8sY0FBYztJQVAzQjtRQVFFLFVBQUssR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ25DLFVBQUssR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ25DOzs7V0FHRztRQUNILGVBQVUsR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBRXhDOztXQUVHO1FBQ0gsVUFBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQ2hHLENBQUM7UUFDRixXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RCxtQkFBYyxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRXpELGNBQVMsR0FBRztZQUNWLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUN2QixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDekIsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQzFCLENBQUM7S0E4Qkg7SUE1QkM7Ozs7OztPQU1HO0lBQ0ssUUFBUSxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQzNDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQW9CO1FBQ3BDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7UUFFL0IsSUFBSSxVQUFVLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckIsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQzthQUFNLElBQUksVUFBVSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7K0dBbkRVLGNBQWM7bUdBQWQsY0FBYyxnZkNsQjNCLG1XQWNBLDRDREFZLGFBQWEsMkVBQUUsSUFBSSw2RkFBRSxPQUFPLCtFQUFpQixnQkFBZ0IsNkNBQUUsV0FBVzs7NEZBSXpFLGNBQWM7a0JBUDFCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FDUCxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsUUFFL0UsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEM4eVRyYW5zbGF0ZVBpcGUsIGdldHRleHQsIEljb25EaXJlY3RpdmUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nSWYsIFBlcmNlbnRQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBVc2FnZSBjb21wb25lbnQgZGlzcGxheXMgdXNhZ2UgaW5mb3JtYXRpb24gaW4gYSBmb3JtIG9mIGUuZy4gXCI1MSUgdXNlZFwiLlxuICogSXQgY2FuIGJlIHVzZWQgaW4gdHdvIHdheXM6XG4gKiAxLiBCeSBwcm92aWRpbmcgYGNvdW50YCBhbmQgYGxpbWl0YCBpbnB1dHMsIGl0IHdpbGwgY2FsY3VsYXRlIHRoZSB1c2FnZSBwZXJjZW50YWdlLlxuICogMi4gQnkgcHJvdmlkaW5nIGBwZXJjZW50YWdlYCBpbnB1dCwgaXQgd2lsbCB1c2UgdGhlIHByb3ZpZGVkIHBlcmNlbnRhZ2UgdmFsdWUuXG4gKiBOb3RlOiBgcGVyY2VudGFnZWAgaW5wdXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBjb3VudGAgYW5kIGBsaW1pdGAgaW5wdXRzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNhZ2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbSWNvbkRpcmVjdGl2ZSwgTmdJZiwgTmdDbGFzcywgSWNvbkRpcmVjdGl2ZSwgQzh5VHJhbnNsYXRlUGlwZSwgUGVyY2VudFBpcGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNhZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb250ZW50cycgfVxufSlcbmV4cG9ydCBjbGFzcyBVc2FnZUNvbXBvbmVudCB7XG4gIGNvdW50ID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIGxpbWl0ID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIC8qKlxuICAgKiBQZXJjZW50YWdlIG9mIHVzYWdlLiBWYWx1ZSByYW5nZSBpcyBmcm9tIDAgdG8gMTAwIChvciBtb3JlKS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIDEwJSBpcyB1c2VkLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBwcm92aWRlZCBhcyAxMCAobm90IDAuMSkuXG4gICAqL1xuICBwZXJjZW50YWdlID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFVzYWdlIGFzIGEgZnJhY3Rpb24gKGUuZy4gaWYgNTAlIGlzIHVzZWQsIHVzYWdlIHZhbHVlIHdpbGwgYmUgMC41KVxuICAgKi9cbiAgdXNhZ2UgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMucGVyY2VudGFnZSgpICE9IG51bGwgPyB0aGlzLnBlcmNlbnRhZ2UoKSAvIDEwMCA6IHRoaXMuZ2V0VXNhZ2UodGhpcy5jb3VudCgpLCB0aGlzLmxpbWl0KCkpXG4gICk7XG4gIHN0YXR1cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZ2V0U3RhdHVzKHRoaXMudXNhZ2UoKSkpO1xuICB1c2FnZVRvRGlzcGxheSA9IGdldHRleHQoJ3t7IHBlcmNlbnRhZ2VPZlF1b3RhIH19IHVzZWQnKTtcblxuICBzdGF0dXNNYXAgPSB7XG4gICAgZGFuZ2VyOiBbJ3RhZy0tZGFuZ2VyJ10sXG4gICAgd2FybmluZzogWyd0YWctLXdhcm5pbmcnXSxcbiAgICBzdWNjZXNzOiBbJ3RhZy0tc3VjY2VzcyddXG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB1c2FnZSBhcyBmcmFjdGlvbiBvZiBjb3VudCBhbmQgbGltaXQuXG4gICAqIEUuZy4gaWYgY291bnQgaXMgNSBhbmQgbGltaXQgaXMgMTAsIHJldHVybmVkIHVzYWdlIHdpbGwgYmUgMC41XG4gICAqIEBwYXJhbSBjb3VudCBVc2FnZSBjb3VudFxuICAgKiBAcGFyYW0gbGltaXQgVXNhZ2UgbGltaXRcbiAgICogQHJldHVybnMgQ291bnQgZGl2aWRlZCBieSBsaW1pdCBvciBudWxsIGlmIGNvdW50IG9yIGxpbWl0IGlzIG51bGwgb3IgbGltaXQgaXMgLTEgKGluZGljYXRlcyBubyBsaW1pdClcbiAgICovXG4gIHByaXZhdGUgZ2V0VXNhZ2UoY291bnQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChjb3VudCA9PSBudWxsIHx8IGxpbWl0ID09IG51bGwgfHwgbGltaXQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50IC8gbGltaXQ7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXR1cyh1c2FnZTogbnVtYmVyIHwgbnVsbCkge1xuICAgIGlmICh1c2FnZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcGVyY2VudGFnZSA9IHVzYWdlICogMTAwO1xuXG4gICAgaWYgKHBlcmNlbnRhZ2UgPj0gODApIHtcbiAgICAgIHJldHVybiAnZGFuZ2VyJztcbiAgICB9IGVsc2UgaWYgKHBlcmNlbnRhZ2UgPj0gNTApIHtcbiAgICAgIHJldHVybiAnd2FybmluZyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwidGFnIG5vLXBvaW50ZXJcIlxuICBbbmdDbGFzc109XCJzdGF0dXNNYXBbc3RhdHVzKCldXCJcbiAgKm5nSWY9XCJ1c2FnZSgpICE9PSBudWxsXCJcbj5cbiAgPGlcbiAgICBjbGFzcz1cInRleHQtZGFuZ2VyIG0tci00IHRleHQtMTJcIlxuICAgIGM4eUljb249XCJleGNsYW1hdGlvbi1jaXJjbGVcIlxuICAgICpuZ0lmPVwic3RhdHVzKCkgPT09ICdkYW5nZXInXCJcbiAgPjwvaT5cbiAgPHNwYW4+XG4gICAge3sgdXNhZ2VUb0Rpc3BsYXkgfCB0cmFuc2xhdGU6IHsgcGVyY2VudGFnZU9mUXVvdGE6ICh1c2FnZSgpIHwgcGVyY2VudDogJzEuMC0yJykgfSB9fVxuICA8L3NwYW4+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import { Component, DestroyRef, EventEmitter, inject } from '@angular/core';
2
+ import { ActivatedRoute, RouterLink } from '@angular/router';
3
+ import { ActionBarItemComponent, AppStateService, BreadcrumbModule, BytesPipe, C8yTranslatePipe, DataGridModule, EmptyStateComponent, EmptyStateContextDirective, gettext, HeaderModule, IconDirective, LoadingComponent } from '@c8y/ngx-components';
4
+ import { AsyncPipe, DecimalPipe, NgClass, NgIf, PercentPipe } from '@angular/common';
5
+ import { MessagingNamespacesService } from '../../api/services/messaging-namespaces.service';
6
+ import { BacklogQuotaLimitPipe } from '../../utils/backlog-quota-limit.pipe';
7
+ import { UsageComponent } from '../shared/usage/usage.component';
8
+ import { TimeToLivePipe } from '../../utils/time-to-live.pipe';
9
+ import { NAMESPACE_PROPS } from '../../utils/namespace-props';
10
+ import { TranslateService } from '@ngx-translate/core';
11
+ import { TopicsDataGridService } from './topics-data-grid.service';
12
+ import { map, shareReplay, switchMap, tap } from 'rxjs/operators';
13
+ import { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';
14
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@c8y/ngx-components";
17
+ export class TopicListViewComponent {
18
+ constructor() {
19
+ this.route = inject(ActivatedRoute);
20
+ this.appState = inject(AppStateService);
21
+ this.namespacesService = inject(MessagingNamespacesService);
22
+ this.topicsDataGridService = inject(TopicsDataGridService);
23
+ this.translateService = inject(TranslateService);
24
+ this.destroyRef = inject(DestroyRef);
25
+ this.loading$ = new BehaviorSubject(false);
26
+ this.refresh = new EventEmitter();
27
+ this.tenantId$ = this.appState.currentTenant.pipe(map(tenant => tenant.name));
28
+ this.namespaceId$ = this.route.params.pipe(map(params => params['namespace']));
29
+ this.namespaceLabel$ = this.namespaceId$.pipe(map(namespaceId => this.translateService.instant(NAMESPACE_PROPS[namespaceId].label)));
30
+ this.icon$ = this.namespaceId$.pipe(map(namespaceId => NAMESPACE_PROPS[namespaceId].icon));
31
+ this.namespaceDetails$ = combineLatest([this.tenantId$, this.namespaceId$, this.refresh]).pipe(tap(() => this.loading$.next(true)), switchMap(([tenantId, namespaceId]) => this.namespacesService.getNamespaceDetails(tenantId, namespaceId)), tap(() => this.loading$.next(false)), shareReplay(1));
32
+ this.tableTitle = gettext('Topics');
33
+ this.loadingItemsLabel = gettext('Loading topics...');
34
+ this.loadMoreItemsLabel = gettext('Load more topics');
35
+ this.noResultsMessage = gettext('No matching topics found.');
36
+ this.noResultsSubtitle = gettext('Refine your search terms or check your spelling.');
37
+ this.noDataMessage = gettext('No topics to display.');
38
+ this.noDataSubtitle = gettext('Create new topics to monitor them here.');
39
+ this.columns = this.topicsDataGridService.getColumns();
40
+ this.pagination = {
41
+ pageSize: 20,
42
+ currentPage: 1
43
+ };
44
+ this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
45
+ }
46
+ async onDataSourceModifier(dataSourceModifier) {
47
+ return firstValueFrom(combineLatest([this.tenantId$, this.namespaceId$]).pipe(switchMap(([tenantId, namespaceId]) => this.topicsDataGridService.getServerSideData(tenantId, namespaceId, dataSourceModifier))));
48
+ }
49
+ ngAfterViewInit() {
50
+ this.route.params
51
+ .pipe(takeUntilDestroyed(this.destroyRef))
52
+ .subscribe(() => this.refresh.emit());
53
+ }
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
55
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicListViewComponent, isStandalone: true, selector: "app-topic-list-view", ngImport: i0, template: "<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div\n class=\"card-block\"\n style=\"min-height: 172px\"\n >\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon$ | async\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>\n {{ 'Service usage/limits' | translate }}\n </legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"namespace?.topics?.limit !== 0\">\n <app-usage\n [count]=\"namespace?.topics?.count\"\n [limit]=\"namespace?.topics?.limit\"\n ></app-usage>\n <span class=\"m-l-16\">\n {{ namespace?.topics?.count | number }} /\n {{ namespace?.topics?.limit | backlogQuotaLimit }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.subscribers?.count | number }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.publishers?.count | number }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog quota (per topic)' | translate }}\n </label>\n <span\n title=\"{{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0 : true)\n : '-'\n }}\"\n >\n {{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0)\n : '-'\n }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog time to live (TTL)' | translate }}\n </label>\n <span>{{ policies?.messageTTL | timeToLive }}</span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n\n <c8y-data-grid\n class=\"d-contents\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value }}\"\n [routerLink]=\"['topic', context.item.id]\"\n >\n {{ context.value }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateIn\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateOut\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"subscribers\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value | number }}\"\n [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n >\n {{ context.value | number }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogSize\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | bytes: 2 : true }}\">\n {{ context.value | bytes: 2 }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BacklogQuotaLimitPipe, name: "backlogQuotaLimit" }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: TimeToLivePipe, name: "timeToLive" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, decorators: [{
58
+ type: Component,
59
+ args: [{ imports: [
60
+ RouterLink,
61
+ HeaderModule,
62
+ DataGridModule,
63
+ DecimalPipe,
64
+ C8yTranslatePipe,
65
+ BacklogQuotaLimitPipe,
66
+ UsageComponent,
67
+ BytesPipe,
68
+ TimeToLivePipe,
69
+ BreadcrumbModule,
70
+ LoadingComponent,
71
+ NgIf,
72
+ ActionBarItemComponent,
73
+ NgClass,
74
+ IconDirective,
75
+ PercentPipe,
76
+ EmptyStateComponent,
77
+ EmptyStateContextDirective,
78
+ AsyncPipe
79
+ ], selector: 'app-topic-list-view', standalone: true, template: "<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div\n class=\"card-block\"\n style=\"min-height: 172px\"\n >\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon$ | async\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>\n {{ 'Service usage/limits' | translate }}\n </legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"namespace?.topics?.limit !== 0\">\n <app-usage\n [count]=\"namespace?.topics?.count\"\n [limit]=\"namespace?.topics?.limit\"\n ></app-usage>\n <span class=\"m-l-16\">\n {{ namespace?.topics?.count | number }} /\n {{ namespace?.topics?.limit | backlogQuotaLimit }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.subscribers?.count | number }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.publishers?.count | number }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog quota (per topic)' | translate }}\n </label>\n <span\n title=\"{{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0 : true)\n : '-'\n }}\"\n >\n {{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0)\n : '-'\n }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog time to live (TTL)' | translate }}\n </label>\n <span>{{ policies?.messageTTL | timeToLive }}</span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n\n <c8y-data-grid\n class=\"d-contents\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value }}\"\n [routerLink]=\"['topic', context.item.id]\"\n >\n {{ context.value }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateIn\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateOut\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"subscribers\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value | number }}\"\n [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n >\n {{ context.value | number }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogSize\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | bytes: 2 : true }}\">\n {{ context.value | bytes: 2 }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
80
+ }] });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtbGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21lc3NhZ2luZy1tYW5hZ2VtZW50L21lc3NhZ2luZy90b3BpYy90b3BpYy1saXN0LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvbWVzc2FnaW5nL3RvcGljL3RvcGljLWxpc3Qtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZ0JBQWdCLEVBRWhCLGNBQWMsRUFFZCxtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLE9BQU8sRUFDUCxZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUlqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBNEJoRSxNQUFNLE9BQU8sc0JBQXNCO0lBMUJuQztRQTJCRSxVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLGFBQVEsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkMsc0JBQWlCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdkQsMEJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdEQscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVoQyxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDL0MsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFbkMsY0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RSxpQkFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLG9CQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3RDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3RGLENBQUM7UUFDRixVQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFdEYsc0JBQWlCLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkYsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ25DLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FDbEUsRUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7UUFFRixlQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLHNCQUFpQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pELHVCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pELHFCQUFnQixHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3hELHNCQUFpQixHQUFHLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2hGLGtCQUFhLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDakQsbUJBQWMsR0FBRyxPQUFPLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUVwRSxZQUFPLEdBQWEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVELGVBQVUsR0FBZTtZQUN2QixRQUFRLEVBQUUsRUFBRTtZQUNaLFdBQVcsRUFBRSxDQUFDO1NBQ2YsQ0FBQztRQUVGLDJCQUFzQixHQUEyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBa0J2RjtJQWpCQyxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLGtCQUFzQztRQUV0QyxPQUFPLGNBQWMsQ0FDbkIsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JELFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FDeEYsQ0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTthQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDOytHQTFEVSxzQkFBc0I7bUdBQXRCLHNCQUFzQiwrRUMzRG5DLDh0UEFvTkEsNENEakxJLFVBQVUsbU9BQ1YsWUFBWSxrSUFDWixjQUFjLHUrQkFDZCxXQUFXLDBDQUNYLGdCQUFnQiw2Q0FDaEIscUJBQXFCLDBEQUNyQixjQUFjLDJGQUNkLFNBQVMseUNBQ1QsY0FBYyxrREFDZCxnQkFBZ0Isc1FBQ2hCLGdCQUFnQixtR0FDaEIsSUFBSSw2RkFDSixzQkFBc0IsMEpBQ3RCLE9BQU8sb0ZBQ1AsYUFBYSxzRUFDYixXQUFXLGdEQUNYLG1CQUFtQixvSEFDbkIsMEJBQTBCLDJEQUMxQixTQUFTOzs0RkFNQSxzQkFBc0I7a0JBMUJsQyxTQUFTOzhCQUNDO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixJQUFJO3dCQUNKLHNCQUFzQjt3QkFDdEIsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQiwwQkFBMEI7d0JBQzFCLFNBQVM7cUJBQ1YsWUFDUyxxQkFBcUIsY0FDbkIsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFjdGlvbkJhckl0ZW1Db21wb25lbnQsXG4gIEFwcFN0YXRlU2VydmljZSxcbiAgQnJlYWRjcnVtYk1vZHVsZSxcbiAgQnl0ZXNQaXBlLFxuICBDOHlUcmFuc2xhdGVQaXBlLFxuICBDb2x1bW4sXG4gIERhdGFHcmlkTW9kdWxlLFxuICBEYXRhU291cmNlTW9kaWZpZXIsXG4gIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICBnZXR0ZXh0LFxuICBIZWFkZXJNb2R1bGUsXG4gIEljb25EaXJlY3RpdmUsXG4gIExvYWRpbmdDb21wb25lbnQsXG4gIFBhZ2luYXRpb24sXG4gIFNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gIFNlcnZlclNpZGVEYXRhUmVzdWx0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBEZWNpbWFsUGlwZSwgTmdDbGFzcywgTmdJZiwgUGVyY2VudFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWVzc2FnaW5nTmFtZXNwYWNlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hcGkvc2VydmljZXMvbWVzc2FnaW5nLW5hbWVzcGFjZXMuc2VydmljZSc7XG5pbXBvcnQgeyBCYWNrbG9nUXVvdGFMaW1pdFBpcGUgfSBmcm9tICcuLi8uLi91dGlscy9iYWNrbG9nLXF1b3RhLWxpbWl0LnBpcGUnO1xuaW1wb3J0IHsgVXNhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvdXNhZ2UvdXNhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVUb0xpdmVQaXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGltZS10by1saXZlLnBpcGUnO1xuaW1wb3J0IHsgTkFNRVNQQUNFX1BST1BTIH0gZnJvbSAnLi4vLi4vdXRpbHMvbmFtZXNwYWNlLXByb3BzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvcGljc0RhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vdG9waWNzLWRhdGEtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIFJvdXRlckxpbmssXG4gICAgSGVhZGVyTW9kdWxlLFxuICAgIERhdGFHcmlkTW9kdWxlLFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEM4eVRyYW5zbGF0ZVBpcGUsXG4gICAgQmFja2xvZ1F1b3RhTGltaXRQaXBlLFxuICAgIFVzYWdlQ29tcG9uZW50LFxuICAgIEJ5dGVzUGlwZSxcbiAgICBUaW1lVG9MaXZlUGlwZSxcbiAgICBCcmVhZGNydW1iTW9kdWxlLFxuICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgTmdJZixcbiAgICBBY3Rpb25CYXJJdGVtQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBQZXJjZW50UGlwZSxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICAgIEFzeW5jUGlwZVxuICBdLFxuICBzZWxlY3RvcjogJ2FwcC10b3BpYy1saXN0LXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9waWMtbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUb3BpY0xpc3RWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVTZXJ2aWNlKTtcbiAgbmFtZXNwYWNlc1NlcnZpY2UgPSBpbmplY3QoTWVzc2FnaW5nTmFtZXNwYWNlc1NlcnZpY2UpO1xuICB0b3BpY3NEYXRhR3JpZFNlcnZpY2UgPSBpbmplY3QoVG9waWNzRGF0YUdyaWRTZXJ2aWNlKTtcbiAgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHRlbmFudElkJCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC5waXBlKG1hcCh0ZW5hbnQgPT4gdGVuYW50Lm5hbWUpKTtcbiAgbmFtZXNwYWNlSWQkID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShtYXAocGFyYW1zID0+IHBhcmFtc1snbmFtZXNwYWNlJ10gYXMgc3RyaW5nKSk7XG4gIG5hbWVzcGFjZUxhYmVsJCA9IHRoaXMubmFtZXNwYWNlSWQkLnBpcGUoXG4gICAgbWFwKG5hbWVzcGFjZUlkID0+IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KE5BTUVTUEFDRV9QUk9QU1tuYW1lc3BhY2VJZF0ubGFiZWwpKVxuICApO1xuICBpY29uJCA9IHRoaXMubmFtZXNwYWNlSWQkLnBpcGUobWFwKG5hbWVzcGFjZUlkID0+IE5BTUVTUEFDRV9QUk9QU1tuYW1lc3BhY2VJZF0uaWNvbikpO1xuXG4gIG5hbWVzcGFjZURldGFpbHMkID0gY29tYmluZUxhdGVzdChbdGhpcy50ZW5hbnRJZCQsIHRoaXMubmFtZXNwYWNlSWQkLCB0aGlzLnJlZnJlc2hdKS5waXBlKFxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoW3RlbmFudElkLCBuYW1lc3BhY2VJZF0pID0+XG4gICAgICB0aGlzLm5hbWVzcGFjZXNTZXJ2aWNlLmdldE5hbWVzcGFjZURldGFpbHModGVuYW50SWQsIG5hbWVzcGFjZUlkKVxuICAgICksXG4gICAgdGFwKCgpID0+IHRoaXMubG9hZGluZyQubmV4dChmYWxzZSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgdGFibGVUaXRsZSA9IGdldHRleHQoJ1RvcGljcycpO1xuICBsb2FkaW5nSXRlbXNMYWJlbCA9IGdldHRleHQoJ0xvYWRpbmcgdG9waWNzLi4uJyk7XG4gIGxvYWRNb3JlSXRlbXNMYWJlbCA9IGdldHRleHQoJ0xvYWQgbW9yZSB0b3BpY3MnKTtcbiAgbm9SZXN1bHRzTWVzc2FnZSA9IGdldHRleHQoJ05vIG1hdGNoaW5nIHRvcGljcyBmb3VuZC4nKTtcbiAgbm9SZXN1bHRzU3VidGl0bGUgPSBnZXR0ZXh0KCdSZWZpbmUgeW91ciBzZWFyY2ggdGVybXMgb3IgY2hlY2sgeW91ciBzcGVsbGluZy4nKTtcbiAgbm9EYXRhTWVzc2FnZSA9IGdldHRleHQoJ05vIHRvcGljcyB0byBkaXNwbGF5LicpO1xuICBub0RhdGFTdWJ0aXRsZSA9IGdldHRleHQoJ0NyZWF0ZSBuZXcgdG9waWNzIHRvIG1vbml0b3IgdGhlbSBoZXJlLicpO1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gdGhpcy50b3BpY3NEYXRhR3JpZFNlcnZpY2UuZ2V0Q29sdW1ucygpO1xuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uID0ge1xuICAgIHBhZ2VTaXplOiAyMCxcbiAgICBjdXJyZW50UGFnZTogMVxuICB9O1xuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgPSB0aGlzLm9uRGF0YVNvdXJjZU1vZGlmaWVyLmJpbmQodGhpcyk7XG4gIGFzeW5jIG9uRGF0YVNvdXJjZU1vZGlmaWVyKFxuICAgIGRhdGFTb3VyY2VNb2RpZmllcjogRGF0YVNvdXJjZU1vZGlmaWVyXG4gICk6IFByb21pc2U8U2VydmVyU2lkZURhdGFSZXN1bHQ+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnRlbmFudElkJCwgdGhpcy5uYW1lc3BhY2VJZCRdKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKFt0ZW5hbnRJZCwgbmFtZXNwYWNlSWRdKSA9PlxuICAgICAgICAgIHRoaXMudG9waWNzRGF0YUdyaWRTZXJ2aWNlLmdldFNlcnZlclNpZGVEYXRhKHRlbmFudElkLCBuYW1lc3BhY2VJZCwgZGF0YVNvdXJjZU1vZGlmaWVyKVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVmcmVzaC5lbWl0KCkpO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7IG5hbWVzcGFjZUxhYmVsJCB8IGFzeW5jIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInbW9uaXRvcmluZydcIlxuICAgIFtsYWJlbF09XCInTW9uaXRvcmluZycgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtsYWJlbF09XCInTWVzc2FnaW5nIHNlcnZpY2UnIHwgdHJhbnNsYXRlXCJcbiAgICBbcGF0aF09XCInL21vbml0b3JpbmcvbWVzc2FnaW5nLXNlcnZpY2UnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cIm5hbWVzcGFjZUxhYmVsJCB8IGFzeW5jXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxhXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIChjbGljayk9XCJyZWZyZXNoLmVtaXQoKVwiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogbG9hZGluZyQgfCBhc3luYyB9XCJcbiAgICA+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY29udGVudC1mdWxscGFnZSBkLWZsZXggZC1jb2xcIj5cbiAgPGRpdiBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBmbGV4LW5vLXNocmlua1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2FyZC1ibG9ja1wiXG4gICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDE3MnB4XCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29sLW1kLTQgbS1iLTI0IGNvbC14cy0xMiBkLWZsZXggcC10LTI0IGdhcC0xNiB0ZXh0LWRlZmF1bHQgYS1pLWNlbnRlciBhLXMtc3RyZXRjaFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBkLWNvbFwiPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi04IGljb24tNDAgYzh5LWljb24tZHVvY29sb3JcIlxuICAgICAgICAgICAgW2M4eUljb25dPVwiaWNvbiQgfCBhc3luY1wiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyB0YWctLWluZm9cIj57eyAnU2VydmljZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cImg0IHRleHQtYnJlYWstYWxsXCI+e3sgbmFtZXNwYWNlTGFiZWwkIHwgYXN5bmMgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXQgYzh5LWZpZWxkc2V0LS1sZ1wiPlxuICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICB7eyAnU2VydmljZSB1c2FnZS9saW1pdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9sZWdlbmQ+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyQgfCBhc3luYzsgZWxzZSBzZXJ2aWNlVXNhZ2VMaW1pdHNcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZXJ2aWNlVXNhZ2VMaW1pdHM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG5hbWVzcGFjZURldGFpbHMkIHwgYXN5bmMpPy5uYW1lc3BhY2UgYXMgbmFtZXNwYWNlXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgc21hbGwgYW5pbWF0ZWQgZmFkZUluXCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci1hdXRvXCI+e3sgJ1RvcGljcycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdCAhPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLXVzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cIm5hbWVzcGFjZT8udG9waWNzPy5jb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbWl0XT1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdFwiXG4gICAgICAgICAgICAgICAgICAgID48L2FwcC11c2FnZT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBuYW1lc3BhY2U/LnRvcGljcz8uY291bnQgfCBudW1iZXIgfX0gL1xuICAgICAgICAgICAgICAgICAgICAgIHt7IG5hbWVzcGFjZT8udG9waWNzPy5saW1pdCB8IGJhY2tsb2dRdW90YUxpbWl0IH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC0xNlwiPnt7IG5hbWVzcGFjZT8udG9waWNzPy5jb3VudCB8IG51bWJlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj57eyAnU3Vic2NyaWJlcnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG5hbWVzcGFjZT8uc3Vic2NyaWJlcnM/LmNvdW50IHwgbnVtYmVyIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj57eyAnUHVibGlzaGVycycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbmFtZXNwYWNlPy5wdWJsaXNoZXJzPy5jb3VudCB8IG51bWJlciB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IGM4eS1maWVsZHNldC0tbGdcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdTZXJ2aWNlIG1lc3NhZ2UgYmFja2xvZyBsaW1pdHMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyQgfCBhc3luYzsgZWxzZSBzZXJ2aWNlTWVzc2FnZUJhY2tsb2dMaW1pdHNcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZXJ2aWNlTWVzc2FnZUJhY2tsb2dMaW1pdHM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG5hbWVzcGFjZURldGFpbHMkIHwgYXN5bmMpPy5wb2xpY2llcyBhcyBwb2xpY2llc1wiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIHNtYWxsIGFuaW1hdGVkIGZhZGVJblwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIHRleHQtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQmFja2xvZyBxdW90YSAocGVyIHRvcGljKScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXM/LmJhY2tsb2dRdW90YT8ubGltaXQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChwb2xpY2llcy5iYWNrbG9nUXVvdGEubGltaXQgfCBieXRlczogMCA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICctJ1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXM/LmJhY2tsb2dRdW90YT8ubGltaXQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChwb2xpY2llcy5iYWNrbG9nUXVvdGEubGltaXQgfCBieXRlczogMClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJy0nXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0JhY2tsb2cgdGltZSB0byBsaXZlIChUVEwpJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBvbGljaWVzPy5tZXNzYWdlVFRMIHwgdGltZVRvTGl2ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Yzh5LWRhdGEtZ3JpZFxuICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgW3RpdGxlXT1cInRhYmxlVGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgIFtsb2FkaW5nSXRlbXNMYWJlbF09XCJsb2FkaW5nSXRlbXNMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgW2xvYWRNb3JlSXRlbXNMYWJlbF09XCJsb2FkTW9yZUl0ZW1zTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtwYWdpbmF0aW9uXT1cInBhZ2luYXRpb25cIlxuICAgIFtzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrXT1cInNlcnZlclNpZGVEYXRhQ2FsbGJhY2tcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICAgIFtoaWRlUmVsb2FkXT1cInRydWVcIlxuICA+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwic3RhdHM/LnNpemUgPiAwID8gJ3NlYXJjaCcgOiAnZGF5LXZpZXcnXCJcbiAgICAgIFt0aXRsZV09XCJzdGF0cz8uc2l6ZSA+IDAgPyAobm9SZXN1bHRzTWVzc2FnZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhTWVzc2FnZSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgW3N1YnRpdGxlXT1cInN0YXRzPy5zaXplID4gMCA/IChub1Jlc3VsdHNTdWJ0aXRsZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhU3VidGl0bGUgfCB0cmFuc2xhdGUpXCJcbiAgICAgICplbXB0eVN0YXRlQ29udGV4dD1cImxldCBzdGF0c1wiXG4gICAgICBbaG9yaXpvbnRhbF09XCJzdGF0cz8uc2l6ZSA+IDBcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJuYW1lXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8YVxuICAgICAgICAgIHRpdGxlPVwie3sgY29udGV4dC52YWx1ZSB9fVwiXG4gICAgICAgICAgW3JvdXRlckxpbmtdPVwiWyd0b3BpYycsIGNvbnRleHQuaXRlbS5pZF1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgY29udGV4dC52YWx1ZSB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2M4eS1jb2x1bW4+XG5cbiAgICA8Yzh5LWNvbHVtbiBuYW1lPVwibXNnUmF0ZUluXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWNvbHVtbj5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJtc2dSYXRlT3V0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWNvbHVtbj5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJzdWJzY3JpYmVyc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqYzh5Q2VsbFJlbmRlcmVyRGVmPVwibGV0IGNvbnRleHRcIj5cbiAgICAgICAgPGFcbiAgICAgICAgICB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsndG9waWMnLCBjb250ZXh0Lml0ZW0uaWQsICdzdWJzY3JpYmVycyddXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktY29sdW1uPlxuXG4gICAgPGM4eS1jb2x1bW4gbmFtZT1cImJhY2tsb2dTaXplXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBieXRlczogMiA6IHRydWUgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgYnl0ZXM6IDIgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktY29sdW1uPlxuXG4gICAgPGM4eS1jb2x1bW4gbmFtZT1cImJhY2tsb2dVc2FnZVBlcmNlbnRhZ2VcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKmM4eUNlbGxSZW5kZXJlckRlZj1cImxldCBjb250ZXh0XCI+XG4gICAgICAgIDxzcGFuIHRpdGxlPVwie3sgY29udGV4dC52YWx1ZSAvIDEwMCB8IHBlcmNlbnQ6ICcxLjAtMicgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIC8gMTAwIHwgcGVyY2VudDogJzEuMC0yJyB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2M4eS1jb2x1bW4+XG4gIDwvYzh5LWRhdGEtZ3JpZD5cbjwvZGl2PlxuIl19