@c8y/ngx-components 1021.13.3 → 1021.22.0

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 (432) hide show
  1. package/alarms/alarm-details.component.d.ts +1 -3
  2. package/alarms/alarm-details.component.d.ts.map +1 -1
  3. package/alarms/alarm-info.component.d.ts +9 -14
  4. package/alarms/alarm-info.component.d.ts.map +1 -1
  5. package/alarms/alarms-list.component.d.ts +2 -17
  6. package/alarms/alarms-list.component.d.ts.map +1 -1
  7. package/alarms/alarms-view.service.d.ts +1 -0
  8. package/alarms/alarms-view.service.d.ts.map +1 -1
  9. package/alarms/alarms.component.d.ts.map +1 -1
  10. package/alarms/alarms.helper.d.ts +5 -0
  11. package/alarms/alarms.helper.d.ts.map +1 -0
  12. package/alarms/alarms.model.d.ts +30 -0
  13. package/alarms/alarms.model.d.ts.map +1 -1
  14. package/alarms/alarms.module.d.ts.map +1 -1
  15. package/alarms/cockpit/index.d.ts.map +1 -1
  16. package/alarms/devicemanagement/index.d.ts.map +1 -1
  17. package/alarms/index.d.ts +5 -4
  18. package/alarms/index.d.ts.map +1 -1
  19. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  20. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  21. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  22. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  23. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  24. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  25. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  26. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  27. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  28. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  29. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  30. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  31. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  32. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  33. package/core/action-bar/action-bar.module.d.ts +6 -6
  34. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  35. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  36. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  37. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  38. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  39. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  40. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  41. package/core/common/index.d.ts +4 -0
  42. package/core/common/index.d.ts.map +1 -1
  43. package/core/common/inter-app.service.d.ts +48 -0
  44. package/core/common/inter-app.service.d.ts.map +1 -0
  45. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  46. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  47. package/core/dashboard/dashboard.module.d.ts +24 -18
  48. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  49. package/core/dashboard/index.d.ts +3 -0
  50. package/core/dashboard/index.d.ts.map +1 -1
  51. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  52. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  53. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  54. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  55. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  56. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  57. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  58. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  59. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  60. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  61. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  62. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  63. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  64. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  65. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  66. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  67. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  68. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  69. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  70. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  71. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  72. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  73. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  74. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +11 -8
  75. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  76. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +6 -12
  77. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  78. package/core/header/header.module.d.ts +18 -18
  79. package/core/header/header.module.d.ts.map +1 -1
  80. package/core/header/title/title.component.d.ts +1 -1
  81. package/core/header/title/title.component.d.ts.map +1 -1
  82. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  83. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  84. package/core/i18n/i18n.module.d.ts +0 -4
  85. package/core/i18n/i18n.module.d.ts.map +1 -1
  86. package/core/i18n/index.d.ts +2 -1
  87. package/core/i18n/index.d.ts.map +1 -1
  88. package/core/i18n/translation-loader.service.d.ts +50 -0
  89. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  90. package/core/i18n/translation-utils.d.ts +14 -0
  91. package/core/i18n/translation-utils.d.ts.map +1 -0
  92. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  93. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  94. package/core/router/context-route.component.d.ts +8 -3
  95. package/core/router/context-route.component.d.ts.map +1 -1
  96. package/core/router/context-route.service.d.ts +29 -3
  97. package/core/router/context-route.service.d.ts.map +1 -1
  98. package/core/router/router-tabs.resolver.d.ts +4 -1
  99. package/core/router/router-tabs.resolver.d.ts.map +1 -1
  100. package/core/router/router.model.d.ts +40 -3
  101. package/core/router/router.model.d.ts.map +1 -1
  102. package/core/router/router.module.d.ts +2 -1
  103. package/core/router/router.module.d.ts.map +1 -1
  104. package/core/router/router.service.d.ts +5 -4
  105. package/core/router/router.service.d.ts.map +1 -1
  106. package/core/router/scoped-context-route.service.d.ts +57 -0
  107. package/core/router/scoped-context-route.service.d.ts.map +1 -0
  108. package/core/router/view-context.service.d.ts +8 -18
  109. package/core/router/view-context.service.d.ts.map +1 -1
  110. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  111. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  112. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  113. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  114. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  115. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  116. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  117. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  118. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  119. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  120. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  121. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  122. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  123. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  124. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  125. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
  126. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
  127. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
  128. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
  129. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
  130. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
  131. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
  132. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
  133. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  134. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  135. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  136. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  137. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  138. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  139. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  140. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  141. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  142. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  143. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  144. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  145. package/datapoints-export-selector/index.d.ts +15 -0
  146. package/datapoints-export-selector/index.d.ts.map +1 -0
  147. package/device-list/device-list.module.d.ts +4 -2
  148. package/device-list/device-list.module.d.ts.map +1 -1
  149. package/esm2022/alarms/alarm-details.component.mjs +7 -9
  150. package/esm2022/alarms/alarm-info.component.mjs +23 -33
  151. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  152. package/esm2022/alarms/alarms-view.service.mjs +3 -2
  153. package/esm2022/alarms/alarms.component.mjs +10 -3
  154. package/esm2022/alarms/alarms.helper.mjs +32 -0
  155. package/esm2022/alarms/alarms.model.mjs +1 -1
  156. package/esm2022/alarms/alarms.module.mjs +5 -5
  157. package/esm2022/alarms/cockpit/index.mjs +13 -17
  158. package/esm2022/alarms/devicemanagement/index.mjs +15 -18
  159. package/esm2022/alarms/index.mjs +6 -5
  160. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  161. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  162. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  163. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  164. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  165. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  166. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  167. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  168. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  169. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  170. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  171. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  172. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  173. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  174. package/esm2022/core/common/index.mjs +5 -1
  175. package/esm2022/core/common/inter-app.service.mjs +76 -0
  176. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  177. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  178. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  179. package/esm2022/core/dashboard/dashboard.module.mjs +18 -1
  180. package/esm2022/core/dashboard/index.mjs +4 -1
  181. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  182. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  183. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  184. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  185. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  186. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  187. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  188. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  189. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  190. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  191. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  192. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  193. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  194. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -37
  195. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -28
  196. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +3 -3
  197. package/esm2022/core/header/header.module.mjs +7 -5
  198. package/esm2022/core/header/title/title.component.mjs +3 -3
  199. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  200. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  201. package/esm2022/core/i18n/index.mjs +3 -2
  202. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  203. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  204. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  205. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  206. package/esm2022/core/router/context-route.component.mjs +23 -13
  207. package/esm2022/core/router/context-route.service.mjs +37 -5
  208. package/esm2022/core/router/router-tabs.resolver.mjs +46 -15
  209. package/esm2022/core/router/router.model.mjs +6 -1
  210. package/esm2022/core/router/router.module.mjs +20 -13
  211. package/esm2022/core/router/router.service.mjs +24 -10
  212. package/esm2022/core/router/scoped-context-route.service.mjs +152 -0
  213. package/esm2022/core/router/view-context.service.mjs +59 -16
  214. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  215. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  216. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  217. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  218. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  219. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  220. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  221. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  222. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  223. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  224. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
  225. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
  226. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
  227. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
  228. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  229. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  230. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  231. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  232. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  233. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  234. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  235. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  236. package/esm2022/device-list/device-list.module.mjs +22 -4
  237. package/esm2022/map/cluster-map.component.mjs +41 -13
  238. package/esm2022/map/map-status.component.mjs +6 -5
  239. package/esm2022/map/map.component.mjs +9 -5
  240. package/esm2022/map/map.model.mjs +1 -1
  241. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  242. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  243. package/esm2022/translation-editor/data/index.mjs +2 -0
  244. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  245. package/esm2022/translation-editor/index.mjs +10 -0
  246. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  247. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  248. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  249. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  250. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  251. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  252. package/esm2022/widgets/cockpit/index.mjs +4 -2
  253. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  254. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  255. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  256. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  257. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  258. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  259. package/esm2022/widgets/definitions/index.mjs +2 -1
  260. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  261. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  262. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  263. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  264. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  265. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  266. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  267. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  268. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  269. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  270. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  271. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  272. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  273. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  274. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  275. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  276. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  277. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  278. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  279. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  280. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  281. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  282. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  283. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  284. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +12 -16
  285. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
  286. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +14 -17
  287. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
  288. package/fesm2022/c8y-ngx-components-alarms.mjs +203 -185
  289. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  290. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  291. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  292. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  293. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  294. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  295. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  296. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  297. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  298. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  299. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  300. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  301. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  302. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  303. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  304. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  305. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  306. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  307. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  308. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  309. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  310. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  311. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  312. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  313. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  314. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  315. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  316. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  317. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  318. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  319. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  320. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  321. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  322. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  323. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  324. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  325. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  326. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  327. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  328. package/fesm2022/c8y-ngx-components.mjs +5476 -4396
  329. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  330. package/locales/de.po +289 -18
  331. package/locales/en.po +12 -0
  332. package/locales/en_US.po +3 -0
  333. package/locales/es.po +253 -18
  334. package/locales/fr.po +253 -18
  335. package/locales/ja_JP.po +282 -18
  336. package/locales/locales.pot +257 -18
  337. package/locales/nl.po +253 -18
  338. package/locales/pl.po +253 -18
  339. package/locales/pt_BR.po +253 -18
  340. package/map/cluster-map.component.d.ts +8 -3
  341. package/map/cluster-map.component.d.ts.map +1 -1
  342. package/map/map-status.component.d.ts +0 -3
  343. package/map/map-status.component.d.ts.map +1 -1
  344. package/map/map.component.d.ts +4 -2
  345. package/map/map.component.d.ts.map +1 -1
  346. package/map/map.model.d.ts +2 -1
  347. package/map/map.model.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  350. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  351. package/translation-editor/data/index.d.ts +2 -0
  352. package/translation-editor/data/index.d.ts.map +1 -0
  353. package/translation-editor/data/translation-store.service.d.ts +61 -0
  354. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  355. package/translation-editor/index.d.ts +2 -0
  356. package/translation-editor/index.d.ts.map +1 -0
  357. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  358. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  359. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  360. package/translation-editor/lazy/index.d.ts +2 -0
  361. package/translation-editor/lazy/index.d.ts.map +1 -0
  362. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  363. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  364. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  365. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  366. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  367. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  368. package/widgets/cockpit/index.d.ts +13 -0
  369. package/widgets/cockpit/index.d.ts.map +1 -1
  370. package/widgets/cockpit-exports/index.d.ts +6 -0
  371. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  372. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  373. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  374. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  375. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  376. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  377. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  378. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  379. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  380. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  381. package/widgets/definitions/index.d.ts +1 -0
  382. package/widgets/definitions/index.d.ts.map +1 -1
  383. package/widgets/definitions/map/index.d.ts +2 -1
  384. package/widgets/definitions/map/index.d.ts.map +1 -1
  385. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  386. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  387. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  388. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  389. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  390. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  391. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  392. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  393. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  394. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  395. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  396. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  397. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  398. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  399. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  400. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  401. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  402. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  403. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  404. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  405. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  406. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  407. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  408. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  409. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  410. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  411. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  412. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  413. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  414. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  415. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  416. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  417. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  418. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  419. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  420. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  421. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  422. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  423. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  424. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  425. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  426. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  427. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  428. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  429. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  430. package/core/i18n/translate.loader.d.ts +0 -31
  431. package/core/i18n/translate.loader.d.ts.map +0 -1
  432. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -0,0 +1,120 @@
1
+ import { gettext } from '@c8y/ngx-components';
2
+ class CSVDataTransformer {
3
+ transformToMergedFormat(exportData) {
4
+ const timeSeries = new Map();
5
+ const uniqueColumnIdentifiers = new Set();
6
+ exportData.forEach(({ time, device_name, fragment_series, unit, value_min, value_max, source }) => {
7
+ const measurementIdentifier = this.createMeasurementIdentifier(device_name, fragment_series, unit, source);
8
+ if (!timeSeries.has(time)) {
9
+ timeSeries.set(time, {});
10
+ }
11
+ const timeEntry = timeSeries.get(time);
12
+ if (timeEntry) {
13
+ const minKey = this.formatMinKey(measurementIdentifier);
14
+ const maxKey = this.formatMaxKey(measurementIdentifier);
15
+ timeEntry[minKey] = value_min;
16
+ timeEntry[maxKey] = value_max;
17
+ uniqueColumnIdentifiers.add(minKey);
18
+ uniqueColumnIdentifiers.add(maxKey);
19
+ }
20
+ });
21
+ return {
22
+ timeSeries,
23
+ uniqueColumnIdentifiers: Array.from(uniqueColumnIdentifiers)
24
+ };
25
+ }
26
+ createMeasurementIdentifier(deviceName, fragmentSeries, unit, source) {
27
+ return unit
28
+ ? `(${source}) ${deviceName} -> ${fragmentSeries} [${unit}]`
29
+ : `(${source}) ${deviceName} -> ${fragmentSeries}`;
30
+ }
31
+ formatMinKey(baseKey) {
32
+ return `${baseKey} (min)`;
33
+ }
34
+ formatMaxKey(baseKey) {
35
+ return `${baseKey} (max)`;
36
+ }
37
+ }
38
+ class CSVFileCreator {
39
+ async createFile(content, mimeType) {
40
+ return new Blob([content], { type: mimeType });
41
+ }
42
+ }
43
+ class CSVGenerator {
44
+ static getLabel() {
45
+ return gettext('Comma-separated value');
46
+ }
47
+ static getTitle() {
48
+ return 'CSV';
49
+ }
50
+ static getType() {
51
+ return 'csv';
52
+ }
53
+ static getIcon() {
54
+ return 'table';
55
+ }
56
+ static getFileExtension() {
57
+ return 'csv';
58
+ }
59
+ static getAcceptType() {
60
+ return 'text/csv';
61
+ }
62
+ static getMimeType() {
63
+ return 'text/csv';
64
+ }
65
+ static getZipName() {
66
+ return 'export_csv.zip';
67
+ }
68
+ static async convertToMergedCSV(exportData, mergedExportDetails) {
69
+ const instance = CSVGenerator.getInstance();
70
+ const { timeSeries, uniqueColumnIdentifiers } = instance.dataTransformer.transformToMergedFormat(exportData);
71
+ const rows = [
72
+ instance.createMergedFileHeaderRow(uniqueColumnIdentifiers, mergedExportDetails),
73
+ ...instance.createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers)
74
+ ];
75
+ const csvContent = rows.map(row => row.join(',')).join('\n');
76
+ return instance.fileCreator.createFile(csvContent, CSVGenerator.getMimeType());
77
+ }
78
+ static getInstance() {
79
+ if (!CSVGenerator.instance) {
80
+ CSVGenerator.instance = new CSVGenerator();
81
+ }
82
+ return CSVGenerator.instance;
83
+ }
84
+ constructor() {
85
+ this.dataTransformer = new CSVDataTransformer();
86
+ this.fileCreator = new CSVFileCreator();
87
+ }
88
+ createMergedFileHeaderRow(uniqueColumnIdentifiers, details) {
89
+ const time = details ? `time => from ${details.dateFrom} to ${details.dateTo}` : 'time';
90
+ return [time, ...uniqueColumnIdentifiers];
91
+ }
92
+ createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers) {
93
+ return Array.from(timeSeries.entries())
94
+ .filter(([time, values]) => this.isValidEntry(time, values))
95
+ .map(([time, values]) => this.createDataRow(time, values, uniqueColumnIdentifiers));
96
+ }
97
+ isValidEntry(time, values) {
98
+ return time !== null && Object.values(values).some(value => value != null);
99
+ }
100
+ createDataRow(time, values, uniqueColumnIdentifiers) {
101
+ const row = [time];
102
+ uniqueColumnIdentifiers.forEach(key => {
103
+ const value = values[key];
104
+ row.push(value?.toString() || '');
105
+ });
106
+ return row;
107
+ }
108
+ }
109
+ export const CSVGeneratorAdapter = {
110
+ getLabel: CSVGenerator.getLabel.bind(CSVGenerator),
111
+ getIcon: CSVGenerator.getIcon.bind(CSVGenerator),
112
+ getFileExtension: CSVGenerator.getFileExtension.bind(CSVGenerator),
113
+ getMimeType: CSVGenerator.getMimeType.bind(CSVGenerator),
114
+ generateMerged: CSVGenerator.convertToMergedCSV.bind(CSVGenerator),
115
+ getType: CSVGenerator.getType.bind(CSVGenerator),
116
+ getTitle: CSVGenerator.getTitle.bind(CSVGenerator),
117
+ getZipName: CSVGenerator.getZipName.bind(CSVGenerator),
118
+ getAcceptType: CSVGenerator.getAcceptType.bind(CSVGenerator)
119
+ };
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLW1vZGFsL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIvZ2VuZXJhdG9ycy9jc3YtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWE5QyxNQUFNLGtCQUFrQjtJQUN0Qix1QkFBdUIsQ0FBQyxVQUF3QjtRQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztRQUM3RCxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFbEQsVUFBVSxDQUFDLE9BQU8sQ0FDaEIsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDN0UsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQzVELFdBQVcsRUFDWCxlQUFlLEVBQ2YsSUFBSSxFQUNKLE1BQU0sQ0FDUCxDQUFDO1lBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUks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LENBQUMsWUFBWSxDQUFDO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBFeHBvcnREYXRhLFxuICBGaWxlR2VuZXJhdG9yLFxuICBJRGF0YVRyYW5zZm9ybWVyLFxuICBNZXJnZWRFeHBvcnREZXRhaWxzLFxuICBUaW1lU2VyaWVzQ29sdW1uRGF0YVxufSBmcm9tICcuLi8uLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci5tb2RlbCc7XG5cbmludGVyZmFjZSBJQ3N2RmlsZUNyZWF0b3Ige1xuICBjcmVhdGVGaWxlKGNvbnRlbnQ6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZyk6IFByb21pc2U8QmxvYj47XG59XG5cbmNsYXNzIENTVkRhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElEYXRhVHJhbnNmb3JtZXIge1xuICB0cmFuc2Zvcm1Ub01lcmdlZEZvcm1hdChleHBvcnREYXRhOiBFeHBvcnREYXRhW10pOiBUaW1lU2VyaWVzQ29sdW1uRGF0YSB7XG4gICAgY29uc3QgdGltZVNlcmllcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIGNvbnN0IHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBleHBvcnREYXRhLmZvckVhY2goXG4gICAgICAoeyB0aW1lLCBkZXZpY2VfbmFtZSwgZnJhZ21lbnRfc2VyaWVzLCB1bml0LCB2YWx1ZV9taW4sIHZhbHVlX21heCwgc291cmNlIH0pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRJZGVudGlmaWVyID0gdGhpcy5jcmVhdGVNZWFzdXJlbWVudElkZW50aWZpZXIoXG4gICAgICAgICAgZGV2aWNlX25hbWUsXG4gICAgICAgICAgZnJhZ21lbnRfc2VyaWVzLFxuICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgc291cmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aW1lU2VyaWVzLmhhcyh0aW1lKSkge1xuICAgICAgICAgIHRpbWVTZXJpZXMuc2V0KHRpbWUsIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVFbnRyeSA9IHRpbWVTZXJpZXMuZ2V0KHRpbWUpO1xuICAgICAgICBpZiAodGltZUVudHJ5KSB7XG4gICAgICAgICAgY29uc3QgbWluS2V5ID0gdGhpcy5mb3JtYXRNaW5LZXkobWVhc3VyZW1lbnRJZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCBtYXhLZXkgPSB0aGlzLmZvcm1hdE1heEtleShtZWFzdXJlbWVudElkZW50aWZpZXIpO1xuXG4gICAgICAgICAgdGltZUVudHJ5W21pbktleV0gPSB2YWx1ZV9taW47XG4gICAgICAgICAgdGltZUVudHJ5W21heEtleV0gPSB2YWx1ZV9tYXg7XG5cbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWluS2V5KTtcbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWF4S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVNlcmllcyxcbiAgICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBBcnJheS5mcm9tKHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVtZW50SWRlbnRpZmllcihcbiAgICBkZXZpY2VOYW1lOiBzdHJpbmcsXG4gICAgZnJhZ21lbnRTZXJpZXM6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdW5pdFxuICAgICAgPyBgKCR7c291cmNlfSkgJHtkZXZpY2VOYW1lfSAtPiAke2ZyYWdtZW50U2VyaWVzfSBbJHt1bml0fV1gXG4gICAgICA6IGAoJHtzb3VyY2V9KSAke2RldmljZU5hbWV9IC0+ICR7ZnJhZ21lbnRTZXJpZXN9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWluS2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtaW4pYDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWF4S2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtYXgpYDtcbiAgfVxufVxuXG5jbGFzcyBDU1ZGaWxlQ3JlYXRvciBpbXBsZW1lbnRzIElDc3ZGaWxlQ3JlYXRvciB7XG4gIGFzeW5jIGNyZWF0ZUZpbGUoY29udGVudDogc3RyaW5nLCBtaW1lVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtjb250ZW50XSwgeyB0eXBlOiBtaW1lVHlwZSB9KTtcbiAgfVxufVxuXG5jbGFzcyBDU1ZHZW5lcmF0b3Ige1xuICBzdGF0aWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0dGV4dCgnQ29tbWEtc2VwYXJhdGVkIHZhbHVlJyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0NTVic7XG4gIH1cblxuICBzdGF0aWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3N2JztcbiAgfVxuXG4gIHN0YXRpYyBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICd0YWJsZSc7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3N2JztcbiAgfVxuXG4gIHN0YXRpYyBnZXRBY2NlcHRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICd0ZXh0L2Nzdic7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWltZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3RleHQvY3N2JztcbiAgfVxuXG4gIHN0YXRpYyBnZXRaaXBOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdleHBvcnRfY3N2LnppcCc7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29udmVydFRvTWVyZ2VkQ1NWKFxuICAgIGV4cG9ydERhdGE6IEV4cG9ydERhdGFbXSxcbiAgICBtZXJnZWRFeHBvcnREZXRhaWxzOiBNZXJnZWRFeHBvcnREZXRhaWxzXG4gICk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gQ1NWR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgeyB0aW1lU2VyaWVzLCB1bmlxdWVDb2x1bW5JZGVudGlmaWVycyB9ID1cbiAgICAgIGluc3RhbmNlLmRhdGFUcmFuc2Zvcm1lci50cmFuc2Zvcm1Ub01lcmdlZEZvcm1hdChleHBvcnREYXRhKTtcblxuICAgIGNvbnN0IHJvd3MgPSBbXG4gICAgICBpbnN0YW5jZS5jcmVhdGVNZXJnZWRGaWxlSGVhZGVyUm93KHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzLCBtZXJnZWRFeHBvcnREZXRhaWxzKSxcbiAgICAgIC4uLmluc3RhbmNlLmNyZWF0ZU1lcmdlZEZpbGVEYXRhUm93cyh0aW1lU2VyaWVzLCB1bmlxdWVDb2x1bW5JZGVudGlmaWVycylcbiAgICBdO1xuXG4gICAgY29uc3QgY3N2Q29udGVudCA9IHJvd3MubWFwKHJvdyA9PiByb3cuam9pbignLCcpKS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gaW5zdGFuY2UuZmlsZUNyZWF0b3IuY3JlYXRlRmlsZShjc3ZDb250ZW50LCBDU1ZHZW5lcmF0b3IuZ2V0TWltZVR5cGUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENTVkdlbmVyYXRvcjtcblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDU1ZHZW5lcmF0b3Ige1xuICAgIGlmICghQ1NWR2VuZXJhdG9yLmluc3RhbmNlKSB7XG4gICAgICBDU1ZHZW5lcmF0b3IuaW5zdGFuY2UgPSBuZXcgQ1NWR2VuZXJhdG9yKCk7XG4gICAgfVxuICAgIHJldHVybiBDU1ZHZW5lcmF0b3IuaW5zdGFuY2U7XG4gIH1cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmb3JtZXI6IElEYXRhVHJhbnNmb3JtZXI7XG4gIHByaXZhdGUgZmlsZUNyZWF0b3I6IElDc3ZGaWxlQ3JlYXRvcjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGF0YVRyYW5zZm9ybWVyID0gbmV3IENTVkRhdGFUcmFuc2Zvcm1lcigpO1xuICAgIHRoaXMuZmlsZUNyZWF0b3IgPSBuZXcgQ1NWRmlsZUNyZWF0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZUhlYWRlclJvdyhcbiAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVyczogc3RyaW5nW10sXG4gICAgZGV0YWlscz86IE1lcmdlZEV4cG9ydERldGFpbHNcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRpbWUgPSBkZXRhaWxzID8gYHRpbWUgPT4gZnJvbSAke2RldGFpbHMuZGF0ZUZyb219IHRvICR7ZGV0YWlscy5kYXRlVG99YCA6ICd0aW1lJztcbiAgICByZXR1cm4gW3RpbWUsIC4uLnVuaXF1ZUNvbHVtbklkZW50aWZpZXJzXTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZURhdGFSb3dzKFxuICAgIHRpbWVTZXJpZXM6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+LFxuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBzdHJpbmdbXVxuICApOiBzdHJpbmdbXVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aW1lU2VyaWVzLmVudHJpZXMoKSlcbiAgICAgIC5maWx0ZXIoKFt0aW1lLCB2YWx1ZXNdKSA9PiB0aGlzLmlzVmFsaWRFbnRyeSh0aW1lLCB2YWx1ZXMpKVxuICAgICAgLm1hcCgoW3RpbWUsIHZhbHVlc10pID0+IHRoaXMuY3JlYXRlRGF0YVJvdyh0aW1lLCB2YWx1ZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKSk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRFbnRyeSh0aW1lOiBzdHJpbmcsIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aW1lICE9PSBudWxsICYmIE9iamVjdC52YWx1ZXModmFsdWVzKS5zb21lKHZhbHVlID0+IHZhbHVlICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhUm93KFxuICAgIHRpbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICAgdW5pcXVlQ29sdW1uSWRlbnRpZmllcnM6IHN0cmluZ1tdXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByb3cgPSBbdGltZV07XG4gICAgdW5pcXVlQ29sdW1uSWRlbnRpZmllcnMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgIHJvdy5wdXNoKHZhbHVlPy50b1N0cmluZygpIHx8ICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDU1ZHZW5lcmF0b3JBZGFwdGVyOiBGaWxlR2VuZXJhdG9yID0ge1xuICBnZXRMYWJlbDogQ1NWR2VuZXJhdG9yLmdldExhYmVsLmJpbmQoQ1NWR2VuZXJhdG9yKSxcbiAgZ2V0SWNvbjogQ1NWR2VuZXJhdG9yLmdldEljb24uYmluZChDU1ZHZW5lcmF0b3IpLFxuICBnZXRGaWxlRXh0ZW5zaW9uOiBDU1ZHZW5lcmF0b3IuZ2V0RmlsZUV4dGVuc2lvbi5iaW5kKENTVkdlbmVyYXRvciksXG4gIGdldE1pbWVUeXBlOiBDU1ZHZW5lcmF0b3IuZ2V0TWltZVR5cGUuYmluZChDU1ZHZW5lcmF0b3IpLFxuICBnZW5lcmF0ZU1lcmdlZDogQ1NWR2VuZXJhdG9yLmNvbnZlcnRUb01lcmdlZENTVi5iaW5kKENTVkdlbmVyYXRvciksXG4gIGdldFR5cGU6IENTVkdlbmVyYXRvci5nZXRUeXBlLmJpbmQoQ1NWR2VuZXJhdG9yKSxcbiAgZ2V0VGl0bGU6IENTVkdlbmVyYXRvci5nZXRUaXRsZS5iaW5kKENTVkdlbmVyYXRvciksXG4gIGdldFppcE5hbWU6IENTVkdlbmVyYXRvci5nZXRaaXBOYW1lLmJpbmQoQ1NWR2VuZXJhdG9yKSxcbiAgZ2V0QWNjZXB0VHlwZTogQ1NWR2VuZXJhdG9yLmdldEFjY2VwdFR5cGUuYmluZChDU1ZHZW5lcmF0b3IpXG59O1xuIl19
@@ -0,0 +1,282 @@
1
+ import { gettext } from '@c8y/ngx-components';
2
+ import JSZip from 'jszip';
3
+ import { isEmpty, isNil, isNumber } from 'lodash-es';
4
+ import { FILE_COMPRESSION_TYPES_VALUES } from '../../../datapoints-export-selector.model';
5
+ // Utility functions
6
+ class XmlUtils {
7
+ static escapeXml(unsafe) {
8
+ return unsafe.replace(/[<>&'"]/g, c => {
9
+ switch (c) {
10
+ case '<':
11
+ return '&lt;';
12
+ case '>':
13
+ return '&gt;';
14
+ case '&':
15
+ return '&amp;';
16
+ case "'":
17
+ return '&apos;';
18
+ case '"':
19
+ return '&quot;';
20
+ }
21
+ });
22
+ }
23
+ }
24
+ export class ExcelDataTransformer {
25
+ transformToMergedFormat(exportData) {
26
+ const timeSeries = new Map();
27
+ const uniqueColumnIdentifiers = new Set();
28
+ exportData.forEach(({ time, device_name, fragment_series, unit, value_min, value_max, source }) => {
29
+ const measurementIdentifier = this.createMeasurementIdentifier(device_name, fragment_series, unit, source);
30
+ if (!timeSeries.has(time)) {
31
+ timeSeries.set(time, {});
32
+ }
33
+ const timeEntry = timeSeries.get(time);
34
+ if (timeEntry) {
35
+ const minKey = this.formatMinKey(measurementIdentifier);
36
+ const maxKey = this.formatMaxKey(measurementIdentifier);
37
+ timeEntry[minKey] = value_min;
38
+ timeEntry[maxKey] = value_max;
39
+ uniqueColumnIdentifiers.add(minKey);
40
+ uniqueColumnIdentifiers.add(maxKey);
41
+ }
42
+ });
43
+ return {
44
+ timeSeries,
45
+ uniqueColumnIdentifiers: Array.from(uniqueColumnIdentifiers)
46
+ };
47
+ }
48
+ createMeasurementIdentifier(deviceName, fragmentSeries, unit, source) {
49
+ return unit
50
+ ? `(${source}) ${deviceName} -> ${fragmentSeries} [${unit}]`
51
+ : `(${source}) ${deviceName} -> ${fragmentSeries}`;
52
+ }
53
+ formatMinKey(baseKey) {
54
+ return `${baseKey} (min)`;
55
+ }
56
+ formatMaxKey(baseKey) {
57
+ return `${baseKey} (max)`;
58
+ }
59
+ }
60
+ class ExcelXmlGenerator {
61
+ constructor() {
62
+ this.columnWidths = {
63
+ time: 25,
64
+ source: 10,
65
+ device_name: 20,
66
+ 'fragment.series': 20,
67
+ value_min: 15,
68
+ value_max: 15,
69
+ unit: 5
70
+ };
71
+ this.defaultWidth = 30;
72
+ this.RELS_XML = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
73
+ '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n' +
74
+ ' <Relationship Id="rId1" Target="xl/workbook.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>\n' +
75
+ ' <Relationship Id="rId2" Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"/>\n' +
76
+ ' <Relationship Id="rId3" Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"/>\n' +
77
+ '</Relationships>';
78
+ this.CONTENT_TYPES_XML = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' +
79
+ '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">\n' +
80
+ ' <Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>\n' +
81
+ ' <Default ContentType="application/xml" Extension="xml"/>\n' +
82
+ ' <Override ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" PartName="/docProps/app.xml"/>\n' +
83
+ ' <Override ContentType="application/vnd.openxmlformats-package.core-properties+xml" PartName="/docProps/core.xml"/>\n' +
84
+ ' <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" PartName="/xl/sharedStrings.xml"/>\n' +
85
+ ' <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" PartName="/xl/workbook.xml"/>\n' +
86
+ ' <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" PartName="/xl/worksheets/sheet1.xml"/>\n' +
87
+ '</Types>';
88
+ this.WORKBOOK_RELS_XML = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
89
+ '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n' +
90
+ ' <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>\n' +
91
+ ' <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>\n' +
92
+ '</Relationships>';
93
+ this.SHARED_STRINGS_XML = '<?xml version="1.0" encoding="UTF-8"?>\n' +
94
+ '<sst count="0" uniqueCount="0" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"/>';
95
+ }
96
+ generateWorkbookXml(sheetName = 'Measurements') {
97
+ return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
98
+ `<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><sheets><sheet name='${sheetName}' r:id="rId3" sheetId="1"/></sheets></workbook>`);
99
+ }
100
+ generateSheetXml(data) {
101
+ const headers = data[0];
102
+ const colsXml = this.generateColsXml(headers);
103
+ const rowsXml = this.generateRowsXml(data);
104
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
105
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
106
+ <cols>${colsXml}</cols>
107
+ <sheetData>${rowsXml}</sheetData>
108
+ </worksheet>`;
109
+ }
110
+ generateAppXml(name) {
111
+ return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
112
+ '<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">\n' +
113
+ ` <Application>${name}</Application>\n` +
114
+ ' <DocSecurity>0</DocSecurity>\n' +
115
+ ' <ScaleCrop>false</ScaleCrop>\n' +
116
+ ' <HeadingPairs>\n' +
117
+ ' <vt:vector size="2" baseType="variant">\n' +
118
+ ' <vt:variant>\n' +
119
+ ' <vt:lpstr>Worksheets</vt:lpstr>\n' +
120
+ ' </vt:variant>\n' +
121
+ ' <vt:variant>\n' +
122
+ ' <vt:i4>1</vt:i4>\n' +
123
+ ' </vt:variant>\n' +
124
+ ' </vt:vector>\n' +
125
+ ' </HeadingPairs>\n' +
126
+ ' <TitlesOfParts>\n' +
127
+ ' <vt:vector size="1" baseType="lpstr">\n' +
128
+ ' <vt:lpstr>Sheet1</vt:lpstr>\n' +
129
+ ' </vt:vector>\n' +
130
+ ' </TitlesOfParts>\n' +
131
+ ' <Company></Company>\n' +
132
+ ' <LinksUpToDate>false</LinksUpToDate>\n' +
133
+ ' <SharedDoc>false</SharedDoc>\n' +
134
+ ' <HyperlinksChanged>false</HyperlinksChanged>\n' +
135
+ ' <AppVersion>16.0300</AppVersion>\n' +
136
+ '</Properties>');
137
+ }
138
+ generateCoreXml(name) {
139
+ const now = new Date().toISOString();
140
+ return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
141
+ '<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n' +
142
+ ` <dc:creator>${name}</dc:creator>\n` +
143
+ ` <cp:lastModifiedBy>${name}</cp:lastModifiedBy>\n` +
144
+ ` <dcterms:created xsi:type="dcterms:W3CDTF">${now}</dcterms:created>\n` +
145
+ ` <dcterms:modified xsi:type="dcterms:W3CDTF">${now}</dcterms:modified>\n` +
146
+ '</cp:coreProperties>');
147
+ }
148
+ generateColsXml(headers) {
149
+ return headers
150
+ .map((header, index) => {
151
+ const width = this.columnWidths[header] || this.defaultWidth;
152
+ return `<col min="${index + 1}" max="${index + 1}" width="${width}" customWidth="1"/>`;
153
+ })
154
+ .join('');
155
+ }
156
+ generateRowsXml(data) {
157
+ return data
158
+ .map(row => `<row>${row
159
+ .map(cell => {
160
+ if (isNil(cell) || isEmpty(cell)) {
161
+ return `<c t="inlineStr"><is><t></t></is></c>`; // String cell
162
+ }
163
+ else if (isNumber(Number(cell)) && !isNaN(Number(cell))) {
164
+ return `<c t="n"><v>${Number(cell)}</v></c>`; // Number cell
165
+ }
166
+ else {
167
+ return `<c t="inlineStr"><is><t>${XmlUtils.escapeXml(cell)}</t></is></c>`; // String cell
168
+ }
169
+ })
170
+ .join('')}</row>`)
171
+ .join('');
172
+ }
173
+ }
174
+ class ZipFileCreator {
175
+ async createZipFile(contents, compressionType, compressionLevel) {
176
+ const zip = new JSZip();
177
+ const blob = 'blob';
178
+ contents.forEach((content, filename) => {
179
+ zip.file(filename, content);
180
+ });
181
+ const options = { type: blob };
182
+ if (compressionType !== FILE_COMPRESSION_TYPES_VALUES.store) {
183
+ options.compression = compressionType;
184
+ options.compressionOptions = { level: compressionLevel };
185
+ }
186
+ return (await zip.generateAsync(options));
187
+ }
188
+ }
189
+ class ExcelGenerator {
190
+ static getLabel() {
191
+ return gettext('Microsoft Excel');
192
+ }
193
+ static getTitle() {
194
+ return 'Excel';
195
+ }
196
+ static getType() {
197
+ return 'excel';
198
+ }
199
+ static getIcon() {
200
+ return 'excel';
201
+ }
202
+ static getFileExtension() {
203
+ return 'xlsx';
204
+ }
205
+ static getAcceptType() {
206
+ return 'application/vnd.ms-excel';
207
+ }
208
+ static getMimeType() {
209
+ return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
210
+ }
211
+ static getZipName() {
212
+ return 'export_excel.zip';
213
+ }
214
+ static async convertToMergedExcel(exportData, mergedExportDetails) {
215
+ const instance = ExcelGenerator.getInstance();
216
+ const { timeSeries, uniqueColumnIdentifiers } = instance.dataTransformer.transformToMergedFormat(exportData);
217
+ const rows = [
218
+ instance.createMergedFileHeaderRow(uniqueColumnIdentifiers, mergedExportDetails),
219
+ ...instance.createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers)
220
+ ];
221
+ return instance.createExcelFile(rows, mergedExportDetails);
222
+ }
223
+ static getInstance() {
224
+ if (!ExcelGenerator.instance) {
225
+ ExcelGenerator.instance = new ExcelGenerator();
226
+ }
227
+ return ExcelGenerator.instance;
228
+ }
229
+ constructor() {
230
+ this.dataTransformer = new ExcelDataTransformer();
231
+ this.xmlGenerator = new ExcelXmlGenerator();
232
+ this.fileCreator = new ZipFileCreator();
233
+ }
234
+ async createExcelFile(data, details) {
235
+ const contents = new Map([
236
+ ['[Content_Types].xml', this.xmlGenerator.CONTENT_TYPES_XML],
237
+ ['_rels/.rels', this.xmlGenerator.RELS_XML],
238
+ [
239
+ 'xl/workbook.xml',
240
+ this.xmlGenerator.generateWorkbookXml(details?.aggregation ? details?.aggregation : 'NO AGGREGATION')
241
+ ],
242
+ ['xl/worksheets/sheet1.xml', this.xmlGenerator.generateSheetXml(data)],
243
+ ['xl/sharedStrings.xml', this.xmlGenerator.SHARED_STRINGS_XML],
244
+ ['docProps/app.xml', this.xmlGenerator.generateAppXml('Custom Script')],
245
+ ['docProps/core.xml', this.xmlGenerator.generateCoreXml('Custom Script')],
246
+ ['xl/_rels/workbook.xml.rels', this.xmlGenerator.WORKBOOK_RELS_XML]
247
+ ]);
248
+ return this.fileCreator.createZipFile(contents, FILE_COMPRESSION_TYPES_VALUES.deflate, 9);
249
+ }
250
+ createMergedFileHeaderRow(uniqueColumnIdentifiers, details) {
251
+ const time = details ? `time => from ${details.dateFrom} to ${details.dateTo}` : 'time';
252
+ return [time, ...uniqueColumnIdentifiers];
253
+ }
254
+ createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers) {
255
+ return Array.from(timeSeries.entries())
256
+ .filter(([time, values]) => this.isValidEntry(time, values))
257
+ .map(([time, values]) => this.createDataRow(time, values, uniqueColumnIdentifiers));
258
+ }
259
+ isValidEntry(time, values) {
260
+ return (time !== null && Object.values(values).some(value => value !== null && value !== undefined));
261
+ }
262
+ createDataRow(time, values, uniqueColumnIdentifiers) {
263
+ const row = [time];
264
+ uniqueColumnIdentifiers.forEach(key => {
265
+ const value = values[key];
266
+ row.push(value !== undefined && value !== null ? value.toString() : '');
267
+ });
268
+ return row;
269
+ }
270
+ }
271
+ export const ExcelGeneratorAdapter = {
272
+ getLabel: ExcelGenerator.getLabel.bind(ExcelGenerator),
273
+ getIcon: ExcelGenerator.getIcon.bind(ExcelGenerator),
274
+ getFileExtension: ExcelGenerator.getFileExtension.bind(ExcelGenerator),
275
+ getMimeType: ExcelGenerator.getMimeType.bind(ExcelGenerator),
276
+ generateMerged: ExcelGenerator.convertToMergedExcel.bind(ExcelGenerator),
277
+ getType: ExcelGenerator.getType.bind(ExcelGenerator),
278
+ getTitle: ExcelGenerator.getTitle.bind(ExcelGenerator),
279
+ getZipName: ExcelGenerator.getZipName.bind(ExcelGenerator),
280
+ getAcceptType: ExcelGenerator.getAcceptType.bind(ExcelGenerator)
281
+ };
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9nZW5lcmF0b3JzL2V4Y2VsLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBRUwsNkJBQTZCLEVBTTlCLE1BQU0sMkNBQTJDLENBQUM7QUFxQm5ELG9CQUFvQjtBQUNwQixNQUFNLFFBQVE7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQWM7UUFDN0IsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNWLEtBQUssR0FBRztvQkFDTixPQUFPLE1BQU0sQ0FBQztnQkFDaEIsS0FBSyxHQUFHO29CQUNOLE9BQU8sTUFBTSxDQUFDO2dCQUNoQixLQUFLLEdBQUc7b0JBQ04sT0FBTyxPQUFPLENBQUM7Z0JBQ2pCLEtBQUssR0FBRztvQkFDTixPQUFPLFFBQVEsQ0FBQztnQkFDbEIsS0FBSyxHQUFHO29CQUNOLE9BQU8sUUFBUSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsdUJBQXVCLENBQUMsVUFBd0I7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7UUFDN0QsTUFBTSx1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LE1BQU0scUJBQXFCLEdBQWtCO0lBQ2xELFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdEQsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUNwRCxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUN0RSxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzVELGNBQWMsRUFBRSxjQUFjLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUN4RSxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3BELFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdEQsVUFBVSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMxRCxhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0NBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNOaWwsIGlzTnVtYmVyIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEV4cG9ydERhdGEsXG4gIEZJTEVfQ09NUFJFU1NJT05fVFlQRVNfVkFMVUVTLFxuICBGaWxlQ29tcHJlc3Npb25UeXBlcyxcbiAgRmlsZUdlbmVyYXRvcixcbiAgSURhdGFUcmFuc2Zvcm1lcixcbiAgTWVyZ2VkRXhwb3J0RGV0YWlscyxcbiAgVGltZVNlcmllc0NvbHVtbkRhdGFcbn0gZnJvbSAnLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IubW9kZWwnO1xuXG5pbnRlcmZhY2UgSVhtbEdlbmVyYXRvciB7XG4gIFJFTFNfWE1MOiBzdHJpbmc7XG4gIENPTlRFTlRfVFlQRVNfWE1MOiBzdHJpbmc7XG4gIFdPUktCT09LX1JFTFNfWE1MOiBzdHJpbmc7XG4gIFNIQVJFRF9TVFJJTkdTX1hNTDogc3RyaW5nO1xuICBnZW5lcmF0ZVdvcmtib29rWG1sKHNoZWV0TmFtZT86IHN0cmluZyk6IHN0cmluZztcbiAgZ2VuZXJhdGVTaGVldFhtbChkYXRhOiBzdHJpbmdbXVtdKTogc3RyaW5nO1xuICBnZW5lcmF0ZUFwcFhtbChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdlbmVyYXRlQ29yZVhtbChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJWG1sRmlsZUNyZWF0b3Ige1xuICBjcmVhdGVaaXBGaWxlKFxuICAgIGNvbnRlbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGNvbXByZXNzaW9uVHlwZTogRmlsZUNvbXByZXNzaW9uVHlwZXMsXG4gICAgY29tcHJlc3Npb25MZXZlbDogbnVtYmVyXG4gICk6IFByb21pc2U8QmxvYj47XG59XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG5jbGFzcyBYbWxVdGlscyB7XG4gIHN0YXRpYyBlc2NhcGVYbWwodW5zYWZlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1bnNhZmUucmVwbGFjZSgvWzw+JidcIl0vZywgYyA9PiB7XG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgcmV0dXJuICcmbHQ7JztcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgcmV0dXJuICcmZ3Q7JztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgcmV0dXJuICcmYW1wOyc7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgcmV0dXJuICcmYXBvczsnO1xuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgcmV0dXJuICcmcXVvdDsnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGNlbERhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElEYXRhVHJhbnNmb3JtZXIge1xuICB0cmFuc2Zvcm1Ub01lcmdlZEZvcm1hdChleHBvcnREYXRhOiBFeHBvcnREYXRhW10pOiBUaW1lU2VyaWVzQ29sdW1uRGF0YSB7XG4gICAgY29uc3QgdGltZVNlcmllcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIGNvbnN0IHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBleHBvcnREYXRhLmZvckVhY2goXG4gICAgICAoeyB0aW1lLCBkZXZpY2VfbmFtZSwgZnJhZ21lbnRfc2VyaWVzLCB1bml0LCB2YWx1ZV9taW4sIHZhbHVlX21heCwgc291cmNlIH0pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRJZGVudGlmaWVyID0gdGhpcy5jcmVhdGVNZWFzdXJlbWVudElkZW50aWZpZXIoXG4gICAgICAgICAgZGV2aWNlX25hbWUsXG4gICAgICAgICAgZnJhZ21lbnRfc2VyaWVzLFxuICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgc291cmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aW1lU2VyaWVzLmhhcyh0aW1lKSkge1xuICAgICAgICAgIHRpbWVTZXJpZXMuc2V0KHRpbWUsIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVFbnRyeSA9IHRpbWVTZXJpZXMuZ2V0KHRpbWUpO1xuICAgICAgICBpZiAodGltZUVudHJ5KSB7XG4gICAgICAgICAgY29uc3QgbWluS2V5ID0gdGhpcy5mb3JtYXRNaW5LZXkobWVhc3VyZW1lbnRJZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCBtYXhLZXkgPSB0aGlzLmZvcm1hdE1heEtleShtZWFzdXJlbWVudElkZW50aWZpZXIpO1xuXG4gICAgICAgICAgdGltZUVudHJ5W21pbktleV0gPSB2YWx1ZV9taW47XG4gICAgICAgICAgdGltZUVudHJ5W21heEtleV0gPSB2YWx1ZV9tYXg7XG5cbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWluS2V5KTtcbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWF4S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVNlcmllcyxcbiAgICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBBcnJheS5mcm9tKHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVtZW50SWRlbnRpZmllcihcbiAgICBkZXZpY2VOYW1lOiBzdHJpbmcsXG4gICAgZnJhZ21lbnRTZXJpZXM6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdW5pdFxuICAgICAgPyBgKCR7c291cmNlfSkgJHtkZXZpY2VOYW1lfSAtPiAke2ZyYWdtZW50U2VyaWVzfSBbJHt1bml0fV1gXG4gICAgICA6IGAoJHtzb3VyY2V9KSAke2RldmljZU5hbWV9IC0+ICR7ZnJhZ21lbnRTZXJpZXN9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWluS2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtaW4pYDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWF4S2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtYXgpYDtcbiAgfVxufVxuXG5jbGFzcyBFeGNlbFhtbEdlbmVyYXRvciBpbXBsZW1lbnRzIElYbWxHZW5lcmF0b3Ige1xuICBwcml2YXRlIGNvbHVtbldpZHRocyA9IHtcbiAgICB0aW1lOiAyNSxcbiAgICBzb3VyY2U6IDEwLFxuICAgIGRldmljZV9uYW1lOiAyMCxcbiAgICAnZnJhZ21lbnQuc2VyaWVzJzogMjAsXG4gICAgdmFsdWVfbWluOiAxNSxcbiAgICB2YWx1ZV9tYXg6IDE1LFxuICAgIHVuaXQ6IDVcbiAgfTtcbiAgcHJpdmF0ZSBkZWZhdWx0V2lkdGggPSAzMDtcblxuICByZWFkb25seSBSRUxTX1hNTCA9XG4gICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAnPFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj5cXG4nICtcbiAgICAnICA8UmVsYXRpb25zaGlwIElkPVwicklkMVwiIFRhcmdldD1cInhsL3dvcmtib29rLnhtbFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL29mZmljZURvY3VtZW50XCIvPlxcbicgK1xuICAgICcgIDxSZWxhdGlvbnNoaXAgSWQ9XCJySWQyXCIgVGFyZ2V0PVwiZG9jUHJvcHMvYXBwLnhtbFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVuZGVkLXByb3BlcnRpZXNcIi8+XFxuJyArXG4gICAgJyAgPFJlbGF0aW9uc2hpcCBJZD1cInJJZDNcIiBUYXJnZXQ9XCJkb2NQcm9wcy9jb3JlLnhtbFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzXCIvPlxcbicgK1xuICAgICc8L1JlbGF0aW9uc2hpcHM+JztcblxuICByZWFkb25seSBDT05URU5UX1RZUEVTX1hNTCA9XG4gICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cIm5vXCI/PlxcbicgK1xuICAgICc8VHlwZXMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L2NvbnRlbnQtdHlwZXNcIj5cXG4nICtcbiAgICAnICA8RGVmYXVsdCBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sXCIgRXh0ZW5zaW9uPVwicmVsc1wiLz5cXG4nICtcbiAgICAnICA8RGVmYXVsdCBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3htbFwiIEV4dGVuc2lvbj1cInhtbFwiLz5cXG4nICtcbiAgICAnICA8T3ZlcnJpZGUgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWxcIiBQYXJ0TmFtZT1cIi9kb2NQcm9wcy9hcHAueG1sXCIvPlxcbicgK1xuICAgICcgIDxPdmVycmlkZSBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLmNvcmUtcHJvcGVydGllcyt4bWxcIiBQYXJ0TmFtZT1cIi9kb2NQcm9wcy9jb3JlLnhtbFwiLz5cXG4nICtcbiAgICAnICA8T3ZlcnJpZGUgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbFwiIFBhcnROYW1lPVwiL3hsL3NoYXJlZFN0cmluZ3MueG1sXCIvPlxcbicgK1xuICAgICcgIDxPdmVycmlkZSBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sXCIgUGFydE5hbWU9XCIveGwvd29ya2Jvb2sueG1sXCIvPlxcbicgK1xuICAgICcgIDxPdmVycmlkZSBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWxcIiBQYXJ0TmFtZT1cIi94bC93b3Jrc2hlZXRzL3NoZWV0MS54bWxcIi8+XFxuJyArXG4gICAgJzwvVHlwZXM+JztcblxuICByZWFkb25seSBXT1JLQk9PS19SRUxTX1hNTCA9XG4gICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAnPFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj5cXG4nICtcbiAgICAnICA8UmVsYXRpb25zaGlwIElkPVwicklkMVwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3NoYXJlZFN0cmluZ3NcIiBUYXJnZXQ9XCJzaGFyZWRTdHJpbmdzLnhtbFwiLz5cXG4nICtcbiAgICAnICA8UmVsYXRpb25zaGlwIElkPVwicklkM1wiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldFwiIFRhcmdldD1cIndvcmtzaGVldHMvc2hlZXQxLnhtbFwiLz5cXG4nICtcbiAgICAnPC9SZWxhdGlvbnNoaXBzPic7XG5cbiAgcmVhZG9ubHkgU0hBUkVEX1NUUklOR1NfWE1MID1cbiAgICAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XFxuJyArXG4gICAgJzxzc3QgY291bnQ9XCIwXCIgdW5pcXVlQ291bnQ9XCIwXCIgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIi8+JztcblxuICBnZW5lcmF0ZVdvcmtib29rWG1sKHNoZWV0TmFtZSA9ICdNZWFzdXJlbWVudHMnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAgIGA8d29ya2Jvb2sgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiPjxzaGVldHM+PHNoZWV0IG5hbWU9JyR7c2hlZXROYW1lfScgcjppZD1cInJJZDNcIiBzaGVldElkPVwiMVwiLz48L3NoZWV0cz48L3dvcmtib29rPmBcbiAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVTaGVldFhtbChkYXRhOiBzdHJpbmdbXVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBoZWFkZXJzID0gZGF0YVswXTtcbiAgICBjb25zdCBjb2xzWG1sID0gdGhpcy5nZW5lcmF0ZUNvbHNYbWwoaGVhZGVycyk7XG4gICAgY29uc3Qgcm93c1htbCA9IHRoaXMuZ2VuZXJhdGVSb3dzWG1sKGRhdGEpO1xuXG4gICAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+XG4gICAgICA8d29ya3NoZWV0IHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIj5cbiAgICAgICAgPGNvbHM+JHtjb2xzWG1sfTwvY29scz5cbiAgICAgICAgPHNoZWV0RGF0YT4ke3Jvd3NYbWx9PC9zaGVldERhdGE+XG4gICAgICA8L3dvcmtzaGVldD5gO1xuICB9XG5cbiAgZ2VuZXJhdGVBcHBYbWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAgICc8UHJvcGVydGllcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2V4dGVuZGVkLXByb3BlcnRpZXNcIiB4bWxuczp2dD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2RvY1Byb3BzVlR5cGVzXCI+XFxuJyArXG4gICAgICBgICA8QXBwbGljYXRpb24+JHtuYW1lfTwvQXBwbGljYXRpb24+XFxuYCArXG4gICAgICAnICA8RG9jU2VjdXJpdHk+MDwvRG9jU2VjdXJpdHk+XFxuJyArXG4gICAgICAnICA8U2NhbGVDcm9wPmZhbHNlPC9TY2FsZUNyb3A+XFxuJyArXG4gICAgICAnICA8SGVhZGluZ1BhaXJzPlxcbicgK1xuICAgICAgJyAgICA8dnQ6dmVjdG9yIHNpemU9XCIyXCIgYmFzZVR5cGU9XCJ2YXJpYW50XCI+XFxuJyArXG4gICAgICAnICAgICAgPHZ0OnZhcmlhbnQ+XFxuJyArXG4gICAgICAnICAgICAgICA8dnQ6bHBzdHI+V29ya3NoZWV0czwvdnQ6bHBzdHI+XFxuJyArXG4gICAgICAnICAgICAgPC92dDp2YXJpYW50PlxcbicgK1xuICAgICAgJyAgICAgIDx2dDp2YXJpYW50PlxcbicgK1xuICAgICAgJyAgICAgICAgPHZ0Omk0PjE8L3Z0Omk0PlxcbicgK1xuICAgICAgJyAgICAgIDwvdnQ6dmFyaWFudD5cXG4nICtcbiAgICAgICcgICAgPC92dDp2ZWN0b3I+XFxuJyArXG4gICAgICAnICA8L0hlYWRpbmdQYWlycz5cXG4nICtcbiAgICAgICcgIDxUaXRsZXNPZlBhcnRzPlxcbicgK1xuICAgICAgJyAgICA8dnQ6dmVjdG9yIHNpemU9XCIxXCIgYmFzZVR5cGU9XCJscHN0clwiPlxcbicgK1xuICAgICAgJyAgICAgIDx2dDpscHN0cj5TaGVldDE8L3Z0Omxwc3RyPlxcbicgK1xuICAgICAgJyAgICA8L3Z0OnZlY3Rvcj5cXG4nICtcbiAgICAgICcgIDwvVGl0bGVzT2ZQYXJ0cz5cXG4nICtcbiAgICAgICcgIDxDb21wYW55PjwvQ29tcGFueT5cXG4nICtcbiAgICAgICcgIDxMaW5rc1VwVG9EYXRlPmZhbHNlPC9MaW5rc1VwVG9EYXRlPlxcbicgK1xuICAgICAgJyAgPFNoYXJlZERvYz5mYWxzZTwvU2hhcmVkRG9jPlxcbicgK1xuICAgICAgJyAgPEh5cGVybGlua3NDaGFuZ2VkPmZhbHNlPC9IeXBlcmxpbmtzQ2hhbmdlZD5cXG4nICtcbiAgICAgICcgIDxBcHBWZXJzaW9uPjE2LjAzMDA8L0FwcFZlcnNpb24+XFxuJyArXG4gICAgICAnPC9Qcm9wZXJ0aWVzPidcbiAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVDb3JlWG1sKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIHJldHVybiAoXG4gICAgICAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PlxcbicgK1xuICAgICAgJzxjcDpjb3JlUHJvcGVydGllcyB4bWxuczpjcD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzXCIgeG1sbnM6ZGM9XCJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL1wiIHhtbG5zOmRjdGVybXM9XCJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvXCIgeG1sbnM6ZGNtaXR5cGU9XCJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj5cXG4nICtcbiAgICAgIGAgIDxkYzpjcmVhdG9yPiR7bmFtZX08L2RjOmNyZWF0b3I+XFxuYCArXG4gICAgICBgICA8Y3A6bGFzdE1vZGlmaWVkQnk+JHtuYW1lfTwvY3A6bGFzdE1vZGlmaWVkQnk+XFxuYCArXG4gICAgICBgICA8ZGN0ZXJtczpjcmVhdGVkIHhzaTp0eXBlPVwiZGN0ZXJtczpXM0NEVEZcIj4ke25vd308L2RjdGVybXM6Y3JlYXRlZD5cXG5gICtcbiAgICAgIGAgIDxkY3Rlcm1zOm1vZGlmaWVkIHhzaTp0eXBlPVwiZGN0ZXJtczpXM0NEVEZcIj4ke25vd308L2RjdGVybXM6bW9kaWZpZWQ+XFxuYCArXG4gICAgICAnPC9jcDpjb3JlUHJvcGVydGllcz4nXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDb2xzWG1sKGhlYWRlcnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhZGVyc1xuICAgICAgLm1hcCgoaGVhZGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuY29sdW1uV2lkdGhzW2hlYWRlcl0gfHwgdGhpcy5kZWZhdWx0V2lkdGg7XG4gICAgICAgIHJldHVybiBgPGNvbCBtaW49XCIke2luZGV4ICsgMX1cIiBtYXg9XCIke2luZGV4ICsgMX1cIiB3aWR0aD1cIiR7d2lkdGh9XCIgY3VzdG9tV2lkdGg9XCIxXCIvPmA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJvd3NYbWwoZGF0YTogc3RyaW5nW11bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGFcbiAgICAgIC5tYXAoXG4gICAgICAgIHJvdyA9PlxuICAgICAgICAgIGA8cm93PiR7cm93XG4gICAgICAgICAgICAubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNOaWwoY2VsbCkgfHwgaXNFbXB0eShjZWxsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPGMgdD1cImlubGluZVN0clwiPjxpcz48dD48L3Q+PC9pcz48L2M+YDsgLy8gU3RyaW5nIGNlbGxcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihOdW1iZXIoY2VsbCkpICYmICFpc05hTihOdW1iZXIoY2VsbCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGA8YyB0PVwiblwiPjx2PiR7TnVtYmVyKGNlbGwpfTwvdj48L2M+YDsgLy8gTnVtYmVyIGNlbGxcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYDxjIHQ9XCJpbmxpbmVTdHJcIj48aXM+PHQ+JHtYbWxVdGlscy5lc2NhcGVYbWwoY2VsbCl9PC90PjwvaXM+PC9jPmA7IC8vIFN0cmluZyBjZWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyl9PC9yb3c+YFxuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG59XG5cbmNsYXNzIFppcEZpbGVDcmVhdG9yIGltcGxlbWVudHMgSVhtbEZpbGVDcmVhdG9yIHtcbiAgYXN5bmMgY3JlYXRlWmlwRmlsZShcbiAgICBjb250ZW50czogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBjb21wcmVzc2lvblR5cGU6IEZpbGVDb21wcmVzc2lvblR5cGVzLFxuICAgIGNvbXByZXNzaW9uTGV2ZWw6IG51bWJlclxuICApOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCB6aXAgPSBuZXcgSlNaaXAoKTtcbiAgICBjb25zdCBibG9iID0gJ2Jsb2InO1xuXG4gICAgY29udGVudHMuZm9yRWFjaCgoY29udGVudCwgZmlsZW5hbWUpID0+IHtcbiAgICAgIHppcC5maWxlKGZpbGVuYW1lLCBjb250ZW50KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEpTWmlwLkpTWmlwR2VuZXJhdG9yT3B0aW9ucyA9IHsgdHlwZTogYmxvYiB9O1xuICAgIGlmIChjb21wcmVzc2lvblR5cGUgIT09IEZJTEVfQ09NUFJFU1NJT05fVFlQRVNfVkFMVUVTLnN0b3JlKSB7XG4gICAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb25UeXBlO1xuICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbk9wdGlvbnMgPSB7IGxldmVsOiBjb21wcmVzc2lvbkxldmVsIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB6aXAuZ2VuZXJhdGVBc3luYyhvcHRpb25zKSkgYXMgQmxvYjtcbiAgfVxufVxuXG5jbGFzcyBFeGNlbEdlbmVyYXRvciB7XG4gIHN0YXRpYyBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXR0ZXh0KCdNaWNyb3NvZnQgRXhjZWwnKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnRXhjZWwnO1xuICB9XG5cbiAgc3RhdGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2V4Y2VsJztcbiAgfVxuXG4gIHN0YXRpYyBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdleGNlbCc7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAneGxzeCc7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWNjZXB0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJztcbiAgfVxuXG4gIHN0YXRpYyBnZXRNaW1lVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnO1xuICB9XG5cbiAgc3RhdGljIGdldFppcE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2V4cG9ydF9leGNlbC56aXAnO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNvbnZlcnRUb01lcmdlZEV4Y2VsKFxuICAgIGV4cG9ydERhdGE6IEV4cG9ydERhdGFbXSxcbiAgICBtZXJnZWRFeHBvcnREZXRhaWxzOiBNZXJnZWRFeHBvcnREZXRhaWxzXG4gICk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRXhjZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCB7IHRpbWVTZXJpZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzIH0gPVxuICAgICAgaW5zdGFuY2UuZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybVRvTWVyZ2VkRm9ybWF0KGV4cG9ydERhdGEpO1xuXG4gICAgY29uc3Qgcm93cyA9IFtcbiAgICAgIGluc3RhbmNlLmNyZWF0ZU1lcmdlZEZpbGVIZWFkZXJSb3codW5pcXVlQ29sdW1uSWRlbnRpZmllcnMsIG1lcmdlZEV4cG9ydERldGFpbHMpLFxuICAgICAgLi4uaW5zdGFuY2UuY3JlYXRlTWVyZ2VkRmlsZURhdGFSb3dzKHRpbWVTZXJpZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKVxuICAgIF07XG5cbiAgICByZXR1cm4gaW5zdGFuY2UuY3JlYXRlRXhjZWxGaWxlKHJvd3MsIG1lcmdlZEV4cG9ydERldGFpbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRXhjZWxHZW5lcmF0b3Ige1xuICAgIGlmICghRXhjZWxHZW5lcmF0b3IuaW5zdGFuY2UpIHtcbiAgICAgIEV4Y2VsR2VuZXJhdG9yLmluc3RhbmNlID0gbmV3IEV4Y2VsR2VuZXJhdG9yKCk7XG4gICAgfVxuICAgIHJldHVybiBFeGNlbEdlbmVyYXRvci5pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBFeGNlbEdlbmVyYXRvcjtcbiAgcHJpdmF0ZSBkYXRhVHJhbnNmb3JtZXI6IElEYXRhVHJhbnNmb3JtZXI7XG4gIHByaXZhdGUgeG1sR2VuZXJhdG9yOiBJWG1sR2VuZXJhdG9yO1xuICBwcml2YXRlIGZpbGVDcmVhdG9yOiBJWG1sRmlsZUNyZWF0b3I7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zvcm1lciA9IG5ldyBFeGNlbERhdGFUcmFuc2Zvcm1lcigpO1xuICAgIHRoaXMueG1sR2VuZXJhdG9yID0gbmV3IEV4Y2VsWG1sR2VuZXJhdG9yKCk7XG4gICAgdGhpcy5maWxlQ3JlYXRvciA9IG5ldyBaaXBGaWxlQ3JlYXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVFeGNlbEZpbGUoZGF0YTogc3RyaW5nW11bXSwgZGV0YWlscz86IE1lcmdlZEV4cG9ydERldGFpbHMpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCBjb250ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgICAgIFsnW0NvbnRlbnRfVHlwZXNdLnhtbCcsIHRoaXMueG1sR2VuZXJhdG9yLkNPTlRFTlRfVFlQRVNfWE1MXSxcbiAgICAgIFsnX3JlbHMvLnJlbHMnLCB0aGlzLnhtbEdlbmVyYXRvci5SRUxTX1hNTF0sXG4gICAgICBbXG4gICAgICAgICd4bC93b3JrYm9vay54bWwnLFxuICAgICAgICB0aGlzLnhtbEdlbmVyYXRvci5nZW5lcmF0ZVdvcmtib29rWG1sKFxuICAgICAgICAgIGRldGFpbHM/LmFnZ3JlZ2F0aW9uID8gZGV0YWlscz8uYWdncmVnYXRpb24gOiAnTk8gQUdHUkVHQVRJT04nXG4gICAgICAgIClcbiAgICAgIF0sXG4gICAgICBbJ3hsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCcsIHRoaXMueG1sR2VuZXJhdG9yLmdlbmVyYXRlU2hlZXRYbWwoZGF0YSldLFxuICAgICAgWyd4bC9zaGFyZWRTdHJpbmdzLnhtbCcsIHRoaXMueG1sR2VuZXJhdG9yLlNIQVJFRF9TVFJJTkdTX1hNTF0sXG4gICAgICBbJ2RvY1Byb3BzL2FwcC54bWwnLCB0aGlzLnhtbEdlbmVyYXRvci5nZW5lcmF0ZUFwcFhtbCgnQ3VzdG9tIFNjcmlwdCcpXSxcbiAgICAgIFsnZG9jUHJvcHMvY29yZS54bWwnLCB0aGlzLnhtbEdlbmVyYXRvci5nZW5lcmF0ZUNvcmVYbWwoJ0N1c3RvbSBTY3JpcHQnKV0sXG4gICAgICBbJ3hsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzJywgdGhpcy54bWxHZW5lcmF0b3IuV09SS0JPT0tfUkVMU19YTUxdXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcy5maWxlQ3JlYXRvci5jcmVhdGVaaXBGaWxlKGNvbnRlbnRzLCBGSUxFX0NPTVBSRVNTSU9OX1RZUEVTX1ZBTFVFUy5kZWZsYXRlLCA5KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZUhlYWRlclJvdyhcbiAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVyczogc3RyaW5nW10sXG4gICAgZGV0YWlscz86IE1lcmdlZEV4cG9ydERldGFpbHNcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRpbWUgPSBkZXRhaWxzID8gYHRpbWUgPT4gZnJvbSAke2RldGFpbHMuZGF0ZUZyb219IHRvICR7ZGV0YWlscy5kYXRlVG99YCA6ICd0aW1lJztcbiAgICByZXR1cm4gW3RpbWUsIC4uLnVuaXF1ZUNvbHVtbklkZW50aWZpZXJzXTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZURhdGFSb3dzKFxuICAgIHRpbWVTZXJpZXM6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+LFxuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBzdHJpbmdbXVxuICApOiBzdHJpbmdbXVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aW1lU2VyaWVzLmVudHJpZXMoKSlcbiAgICAgIC5maWx0ZXIoKFt0aW1lLCB2YWx1ZXNdKSA9PiB0aGlzLmlzVmFsaWRFbnRyeSh0aW1lLCB2YWx1ZXMpKVxuICAgICAgLm1hcCgoW3RpbWUsIHZhbHVlc10pID0+IHRoaXMuY3JlYXRlRGF0YVJvdyh0aW1lLCB2YWx1ZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKSk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRFbnRyeSh0aW1lOiBzdHJpbmcsIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aW1lICE9PSBudWxsICYmIE9iamVjdC52YWx1ZXModmFsdWVzKS5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVJvdyhcbiAgICB0aW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LFxuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBzdHJpbmdbXVxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgcm93ID0gW3RpbWVdO1xuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgICByb3cucHVzaCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6ICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBFeGNlbEdlbmVyYXRvckFkYXB0ZXI6IEZpbGVHZW5lcmF0b3IgPSB7XG4gIGdldExhYmVsOiBFeGNlbEdlbmVyYXRvci5nZXRMYWJlbC5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0SWNvbjogRXhjZWxHZW5lcmF0b3IuZ2V0SWNvbi5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0RmlsZUV4dGVuc2lvbjogRXhjZWxHZW5lcmF0b3IuZ2V0RmlsZUV4dGVuc2lvbi5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0TWltZVR5cGU6IEV4Y2VsR2VuZXJhdG9yLmdldE1pbWVUeXBlLmJpbmQoRXhjZWxHZW5lcmF0b3IpLFxuICBnZW5lcmF0ZU1lcmdlZDogRXhjZWxHZW5lcmF0b3IuY29udmVydFRvTWVyZ2VkRXhjZWwuYmluZChFeGNlbEdlbmVyYXRvciksXG4gIGdldFR5cGU6IEV4Y2VsR2VuZXJhdG9yLmdldFR5cGUuYmluZChFeGNlbEdlbmVyYXRvciksXG4gIGdldFRpdGxlOiBFeGNlbEdlbmVyYXRvci5nZXRUaXRsZS5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0WmlwTmFtZTogRXhjZWxHZW5lcmF0b3IuZ2V0WmlwTmFtZS5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0QWNjZXB0VHlwZTogRXhjZWxHZW5lcmF0b3IuZ2V0QWNjZXB0VHlwZS5iaW5kKEV4Y2VsR2VuZXJhdG9yKVxufTtcbiJdfQ==
@@ -0,0 +1,76 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class UtilsService {
4
+ transformDataStructure(data) {
5
+ const result = {};
6
+ data.forEach(sourceItem => {
7
+ const { source: sourceId, data: sourceData } = sourceItem;
8
+ result[sourceId] = {};
9
+ sourceData.series.forEach((seriesInfo, index) => {
10
+ const { type, name, unit } = seriesInfo;
11
+ /**
12
+ * Unique key to distinguish between different series from same source,
13
+ * e.g.: c8y_Acceleration.accelerationX, c8y_Acceleration.accelerationY, c8y_Acceleration.accelerationZ
14
+ */
15
+ const seriesKey = `${type}.${name}`;
16
+ result[sourceId][seriesKey] = {
17
+ values: {},
18
+ seriesDetails: { name, unit, type }
19
+ };
20
+ let hasValues = false;
21
+ Object.entries(sourceData.values).forEach(([timestamp, measurements]) => {
22
+ if (!measurements) {
23
+ return;
24
+ }
25
+ const measurement = measurements[index];
26
+ if (measurement !== null && measurement !== undefined) {
27
+ result[sourceId][seriesKey].values[timestamp] = measurement;
28
+ hasValues = true;
29
+ }
30
+ });
31
+ if (!hasValues) {
32
+ result[sourceId][seriesKey].values = null;
33
+ }
34
+ });
35
+ });
36
+ return result;
37
+ }
38
+ /**
39
+ * Formats a date range into a specific string format, handling UTC dates correctly.
40
+ *
41
+ * @param fromDate - The start date in ISO format (e.g., "2023-12-04T12:40:00.000Z")
42
+ * @param toDate - The end date in ISO format (e.g., "2023-12-06T23:50:00.000Z")
43
+ * @returns A string representing the date range in the format "ddmmmyyhhmm-ddmmmyyhhmm"
44
+ * where d=day, m=month, y=year, h=hour, m=minute
45
+ *
46
+ * Example
47
+ * ```typescript
48
+ * const fromDate = "2023-12-04T12:40:00.000Z";
49
+ * const toDate = "2023-12-06T23:50:00.000Z";
50
+ * const formattedRange = getFormattedDateRange(fromDate, toDate);
51
+ * console.log(formattedRange); // Output: "04dec231240-06dec232350"
52
+ * ```
53
+ */
54
+ getFormattedDateRange(fromDate, toDate) {
55
+ const formatDate = (dateString) => {
56
+ const date = new Date(dateString);
57
+ if (isNaN(date.getTime())) {
58
+ throw new Error(`Invalid date string: ${dateString}`);
59
+ }
60
+ const day = date.getUTCDate().toString().padStart(2, '0');
61
+ const month = date.toLocaleString('en', { month: 'short', timeZone: 'UTC' }).toLowerCase();
62
+ const hours = date.getUTCHours().toString().padStart(2, '0');
63
+ const minutes = date.getUTCMinutes().toString().padStart(2, '0');
64
+ const seconds = date.getUTCSeconds().toString().padStart(2, '0');
65
+ return `${day}${month}${hours}${minutes}${seconds}`;
66
+ };
67
+ return `${formatDate(fromDate)}-${formatDate(toDate)}`;
68
+ }
69
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
70
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UtilsService, providedIn: 'root' }); }
71
+ }
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UtilsService, decorators: [{
73
+ type: Injectable,
74
+ args: [{ providedIn: 'root' }]
75
+ }] });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLW1vZGFsL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIvdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQXFDM0MsTUFBTSxPQUFPLFlBQVk7SUFDdkIsc0JBQXNCLENBQUMsSUFBa0I7UUFDdkMsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxVQUFVLENBQUM7WUFDMUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUV0QixVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDOUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDO2dCQUN4Qzs7O21CQUdHO2dCQUNILE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUVwQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUc7b0JBQzVCLE1BQU0sRUFBRSxFQUFFO29CQUNWLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO2lCQUNwQyxDQUFDO2dCQUVGLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTtvQkFDdEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNsQixPQUFPO29CQUNULENBQUM7b0JBQ0QsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUV4QyxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQzt3QkFDNUQsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDbkIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILHFCQUFxQixDQUFDLFFBQWdCLEVBQUUsTUFBYztRQUNwRCxNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQWtCLEVBQVUsRUFBRTtZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakUsT0FBTyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN0RCxDQUFDLENBQUM7UUFFRixPQUFPLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3pELENBQUM7OEdBMUVVLFlBQVk7a0hBQVosWUFBWSxjQURDLE1BQU07OzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTWVhc3VyZW1lbnQgPSBudW1iZXIgfCB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmllc0luZm8ge1xuICB1bml0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlRGF0YSB7XG4gIHNlcmllczogU2VyaWVzSW5mb1tdO1xuICB2YWx1ZXM6IHtcbiAgICBbdGltZXN0YW1wOiBzdHJpbmddOiAoTWVhc3VyZW1lbnQgfCBudWxsKVtdIHwgdW5kZWZpbmVkO1xuICB9O1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlSXRlbSB7XG4gIHNvdXJjZTogc3RyaW5nIHwgbnVtYmVyO1xuICBkYXRhOiBTb3VyY2VEYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkU2VyaWVzIHtcbiAgdmFsdWVzOiB7IFt0aW1lc3RhbXA6IHN0cmluZ106IE1lYXN1cmVtZW50IH0gfCBudWxsO1xuICBzZXJpZXNEZXRhaWxzOiBTZXJpZXNJbmZvO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkU291cmNlIHtcbiAgW3Nlcmllc1R5cGU6IHN0cmluZ106IFRyYW5zZm9ybWVkU2VyaWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkRGF0YSB7XG4gIFtzb3VyY2VJZDogc3RyaW5nXTogVHJhbnNmb3JtZWRTb3VyY2U7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVXRpbHNTZXJ2aWNlIHtcbiAgdHJhbnNmb3JtRGF0YVN0cnVjdHVyZShkYXRhOiBTb3VyY2VJdGVtW10pOiBUcmFuc2Zvcm1lZERhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNmb3JtZWREYXRhID0ge307XG5cbiAgICBkYXRhLmZvckVhY2goc291cmNlSXRlbSA9PiB7XG4gICAgICBjb25zdCB7IHNvdXJjZTogc291cmNlSWQsIGRhdGE6IHNvdXJjZURhdGEgfSA9IHNvdXJjZUl0ZW07XG4gICAgICByZXN1bHRbc291cmNlSWRdID0ge307XG5cbiAgICAgIHNvdXJjZURhdGEuc2VyaWVzLmZvckVhY2goKHNlcmllc0luZm8sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgbmFtZSwgdW5pdCB9ID0gc2VyaWVzSW5mbztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXF1ZSBrZXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgc2VyaWVzIGZyb20gc2FtZSBzb3VyY2UsXG4gICAgICAgICAqIGUuZy46IGM4eV9BY2NlbGVyYXRpb24uYWNjZWxlcmF0aW9uWCwgYzh5X0FjY2VsZXJhdGlvbi5hY2NlbGVyYXRpb25ZLCBjOHlfQWNjZWxlcmF0aW9uLmFjY2VsZXJhdGlvblpcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHNlcmllc0tleSA9IGAke3R5cGV9LiR7bmFtZX1gO1xuXG4gICAgICAgIHJlc3VsdFtzb3VyY2VJZF1bc2VyaWVzS2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXM6IHt9LFxuICAgICAgICAgIHNlcmllc0RldGFpbHM6IHsgbmFtZSwgdW5pdCwgdHlwZSB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGhhc1ZhbHVlcyA9IGZhbHNlO1xuICAgICAgICBPYmplY3QuZW50cmllcyhzb3VyY2VEYXRhLnZhbHVlcykuZm9yRWFjaCgoW3RpbWVzdGFtcCwgbWVhc3VyZW1lbnRzXSkgPT4ge1xuICAgICAgICAgIGlmICghbWVhc3VyZW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1lYXN1cmVtZW50ID0gbWVhc3VyZW1lbnRzW2luZGV4XTtcblxuICAgICAgICAgIGlmIChtZWFzdXJlbWVudCAhPT0gbnVsbCAmJiBtZWFzdXJlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRbc291cmNlSWRdW3Nlcmllc0tleV0udmFsdWVzW3RpbWVzdGFtcF0gPSBtZWFzdXJlbWVudDtcbiAgICAgICAgICAgIGhhc1ZhbHVlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWhhc1ZhbHVlcykge1xuICAgICAgICAgIHJlc3VsdFtzb3VyY2VJZF1bc2VyaWVzS2V5XS52YWx1ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIGRhdGUgcmFuZ2UgaW50byBhIHNwZWNpZmljIHN0cmluZyBmb3JtYXQsIGhhbmRsaW5nIFVUQyBkYXRlcyBjb3JyZWN0bHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tRGF0ZSAtIFRoZSBzdGFydCBkYXRlIGluIElTTyBmb3JtYXQgKGUuZy4sIFwiMjAyMy0xMi0wNFQxMjo0MDowMC4wMDBaXCIpXG4gICAqIEBwYXJhbSB0b0RhdGUgLSBUaGUgZW5kIGRhdGUgaW4gSVNPIGZvcm1hdCAoZS5nLiwgXCIyMDIzLTEyLTA2VDIzOjUwOjAwLjAwMFpcIilcbiAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlIHJhbmdlIGluIHRoZSBmb3JtYXQgXCJkZG1tbXl5aGhtbS1kZG1tbXl5aGhtbVwiXG4gICAqICAgICAgICAgIHdoZXJlIGQ9ZGF5LCBtPW1vbnRoLCB5PXllYXIsIGg9aG91ciwgbT1taW51dGVcbiAgICpcbiAgICogRXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGZyb21EYXRlID0gXCIyMDIzLTEyLTA0VDEyOjQwOjAwLjAwMFpcIjtcbiAgICogY29uc3QgdG9EYXRlID0gXCIyMDIzLTEyLTA2VDIzOjUwOjAwLjAwMFpcIjtcbiAgICogY29uc3QgZm9ybWF0dGVkUmFuZ2UgPSBnZXRGb3JtYXR0ZWREYXRlUmFuZ2UoZnJvbURhdGUsIHRvRGF0ZSk7XG4gICAqIGNvbnNvbGUubG9nKGZvcm1hdHRlZFJhbmdlKTsgLy8gT3V0cHV0OiBcIjA0ZGVjMjMxMjQwLTA2ZGVjMjMyMzUwXCJcbiAgICogYGBgXG4gICAqL1xuICBnZXRGb3JtYXR0ZWREYXRlUmFuZ2UoZnJvbURhdGU6IHN0cmluZywgdG9EYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZVN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nOiAke2RhdGVTdHJpbmd9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBtb250aCA9IGRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuJywgeyBtb250aDogJ3Nob3J0JywgdGltZVpvbmU6ICdVVEMnIH0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIHJldHVybiBgJHtkYXl9JHttb250aH0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGAke2Zvcm1hdERhdGUoZnJvbURhdGUpfS0ke2Zvcm1hdERhdGUodG9EYXRlKX1gO1xuICB9XG59XG4iXX0=