@c8y/ngx-components 1021.52.0 → 1021.54.4

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 (259) hide show
  1. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts +10 -2
  2. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts.map +1 -1
  3. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts +11 -0
  4. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts.map +1 -0
  5. package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts +10 -4
  6. package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts.map +1 -1
  7. package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts +3 -1
  8. package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts.map +1 -1
  9. package/alarm-event-selector/alarm-event-selector.model.d.ts +7 -0
  10. package/alarm-event-selector/alarm-event-selector.model.d.ts.map +1 -1
  11. package/core/application/app-icon.component.d.ts.map +1 -1
  12. package/core/dashboard/dashboard-child-action.component.d.ts +1 -1
  13. package/core/dashboard/dashboard-child-action.component.d.ts.map +1 -1
  14. package/core/dashboard/dashboard.module.d.ts +29 -29
  15. package/core/dashboard/index.d.ts +3 -0
  16. package/core/dashboard/index.d.ts.map +1 -1
  17. package/core/dashboard/widgets-dashboard.component.d.ts +1 -1
  18. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  19. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +1 -1
  20. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  21. package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts +1 -1
  22. package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts.map +1 -1
  23. package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts +10 -0
  24. package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts.map +1 -0
  25. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +7 -4
  26. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  27. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +0 -1
  28. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  29. package/core/date-picker/date-picker.component.d.ts +1 -1
  30. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  31. package/core/date-picker/date-picker.module.d.ts +9 -9
  32. package/core/date-time-picker/close-date-picker.directive.d.ts +1 -1
  33. package/core/date-time-picker/close-date-picker.directive.d.ts.map +1 -1
  34. package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
  35. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  36. package/core/date-time-picker/date-time-picker.module.d.ts +11 -11
  37. package/core/date-time-picker/date-time-picker.module.d.ts.map +1 -1
  38. package/core/forms/forms.module.d.ts +18 -18
  39. package/core/forms/required-input-placeholder.directive.d.ts +1 -1
  40. package/core/forms/required-input-placeholder.directive.d.ts.map +1 -1
  41. package/core/router/router.service.d.ts.map +1 -1
  42. package/core/user/user-menu.service.d.ts +36 -11
  43. package/core/user/user-menu.service.d.ts.map +1 -1
  44. package/datapoint-explorer/c8y-ngx-components-datapoint-explorer.d.ts.map +1 -0
  45. package/datapoint-explorer/datapoint-explorer.module.d.ts +7 -0
  46. package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -0
  47. package/datapoint-explorer/index.d.ts +2 -0
  48. package/datapoint-explorer/index.d.ts.map +1 -0
  49. package/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -0
  50. package/datapoint-explorer/view/configuration/naming-dictionary.d.ts +3 -0
  51. package/datapoint-explorer/view/configuration/naming-dictionary.d.ts.map +1 -0
  52. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts +38 -0
  53. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -0
  54. package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts +7 -0
  55. package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts.map +1 -0
  56. package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts +15 -0
  57. package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts.map +1 -0
  58. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts +25 -0
  59. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts.map +1 -0
  60. package/datapoint-explorer/view/datapoint-explorer.component.d.ts +67 -0
  61. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -0
  62. package/datapoint-explorer/view/datapoint-explorer.service.d.ts +9 -0
  63. package/datapoint-explorer/view/datapoint-explorer.service.d.ts.map +1 -0
  64. package/datapoint-explorer/view/index.d.ts +2 -0
  65. package/datapoint-explorer/view/index.d.ts.map +1 -0
  66. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts +23 -0
  67. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts.map +1 -0
  68. package/echart/c8y-ngx-components-echart.d.ts.map +1 -0
  69. package/echart/chart-alerts/chart-alerts.component.d.ts +8 -0
  70. package/echart/chart-alerts/chart-alerts.component.d.ts.map +1 -0
  71. package/echart/charts.component.d.ts +63 -0
  72. package/echart/charts.component.d.ts.map +1 -0
  73. package/echart/index.d.ts +5 -0
  74. package/echart/index.d.ts.map +1 -0
  75. package/echart/models/c8y-ngx-components-echart-models.d.ts.map +1 -0
  76. package/echart/models/chart.model.d.ts +37 -0
  77. package/echart/models/chart.model.d.ts.map +1 -0
  78. package/echart/models/datapoints-graph-widget.model.d.ts +126 -0
  79. package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -0
  80. package/echart/models/index.d.ts +4 -0
  81. package/echart/models/index.d.ts.map +1 -0
  82. package/echart/models/svg-icons.model.d.ts +22 -0
  83. package/echart/models/svg-icons.model.d.ts.map +1 -0
  84. package/echart/services/chart-alarms.service.d.ts +17 -0
  85. package/echart/services/chart-alarms.service.d.ts.map +1 -0
  86. package/echart/services/chart-events.service.d.ts +17 -0
  87. package/echart/services/chart-events.service.d.ts.map +1 -0
  88. package/echart/services/chart-realtime.service.d.ts +35 -0
  89. package/echart/services/chart-realtime.service.d.ts.map +1 -0
  90. package/echart/services/chart-types.service.d.ts +15 -0
  91. package/echart/services/chart-types.service.d.ts.map +1 -0
  92. package/echart/services/custom-measurements.service.d.ts +12 -0
  93. package/echart/services/custom-measurements.service.d.ts.map +1 -0
  94. package/echart/services/echarts-options.service.d.ts +143 -0
  95. package/echart/services/echarts-options.service.d.ts.map +1 -0
  96. package/echart/services/y-axis.service.d.ts +17 -0
  97. package/echart/services/y-axis.service.d.ts.map +1 -0
  98. package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.mjs +37 -12
  99. package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.mjs +2 -0
  100. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +39 -12
  101. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +6 -4
  102. package/esm2022/alarm-event-selector/alarm-event-selector.component.mjs +1 -1
  103. package/esm2022/alarm-event-selector/alarm-event-selector.model.mjs +1 -1
  104. package/esm2022/alarm-event-selector/custom-alarm-event-form/custom-alarm-event-form.component.mjs +1 -1
  105. package/esm2022/alarms/alarms-filter.component.mjs +3 -3
  106. package/esm2022/core/application/app-icon.component.mjs +4 -4
  107. package/esm2022/core/dashboard/dashboard-child-action.component.mjs +3 -3
  108. package/esm2022/core/dashboard/dashboard.module.mjs +17 -14
  109. package/esm2022/core/dashboard/index.mjs +4 -1
  110. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -9
  111. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +11 -9
  112. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +8 -7
  113. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-date-range.service.mjs +23 -0
  114. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +70 -26
  115. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -1
  116. package/esm2022/core/date-picker/date-picker.component.mjs +29 -14
  117. package/esm2022/core/date-picker/date-picker.module.mjs +9 -7
  118. package/esm2022/core/date-time-picker/close-date-picker.directive.mjs +4 -3
  119. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +57 -29
  120. package/esm2022/core/date-time-picker/date-time-picker.module.mjs +11 -7
  121. package/esm2022/core/forms/forms.module.mjs +3 -3
  122. package/esm2022/core/forms/ip-range-input-list.component.mjs +5 -5
  123. package/esm2022/core/forms/required-input-placeholder.directive.mjs +4 -3
  124. package/esm2022/core/router/router.service.mjs +1 -1
  125. package/esm2022/core/time-interval/time-interval.component.mjs +3 -3
  126. package/esm2022/core/user/user-menu.service.mjs +57 -17
  127. package/esm2022/datapoint-explorer/c8y-ngx-components-datapoint-explorer.mjs +5 -0
  128. package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +65 -0
  129. package/esm2022/datapoint-explorer/index.mjs +2 -0
  130. package/esm2022/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.mjs +5 -0
  131. package/esm2022/datapoint-explorer/view/configuration/naming-dictionary.mjs +65 -0
  132. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.component.mjs +169 -0
  133. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.model.mjs +2 -0
  134. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.service.mjs +40 -0
  135. package/esm2022/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.mjs +64 -0
  136. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +279 -0
  137. package/esm2022/datapoint-explorer/view/datapoint-explorer.service.mjs +23 -0
  138. package/esm2022/datapoint-explorer/view/index.mjs +2 -0
  139. package/esm2022/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.mjs +48 -0
  140. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
  141. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  142. 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 +3 -3
  143. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +3 -3
  144. package/esm2022/device-list/add-smart-group.component.mjs +3 -3
  145. package/esm2022/echart/c8y-ngx-components-echart.mjs +5 -0
  146. package/esm2022/echart/chart-alerts/chart-alerts.component.mjs +16 -0
  147. package/esm2022/echart/charts.component.mjs +560 -0
  148. package/esm2022/echart/index.mjs +5 -0
  149. package/esm2022/echart/models/c8y-ngx-components-echart-models.mjs +5 -0
  150. package/esm2022/echart/models/chart.model.mjs +2 -0
  151. package/esm2022/echart/models/datapoints-graph-widget.model.mjs +17 -0
  152. package/esm2022/echart/models/index.mjs +4 -0
  153. package/esm2022/echart/models/svg-icons.model.mjs +22 -0
  154. package/esm2022/echart/services/chart-alarms.service.mjs +58 -0
  155. package/esm2022/echart/services/chart-events.service.mjs +44 -0
  156. package/esm2022/echart/services/chart-realtime.service.mjs +193 -0
  157. package/esm2022/echart/services/chart-types.service.mjs +102 -0
  158. package/esm2022/echart/services/custom-measurements.service.mjs +52 -0
  159. package/esm2022/echart/services/echarts-options.service.mjs +857 -0
  160. package/esm2022/echart/services/y-axis.service.mjs +150 -0
  161. package/esm2022/interval-picker/interval-picker.component.mjs +3 -3
  162. package/esm2022/interval-picker/interval-picker.model.mjs +1 -1
  163. package/esm2022/map/map.component.mjs +4 -1
  164. package/esm2022/report-dashboard/index.mjs +2 -1
  165. package/esm2022/time-context/c8y-ngx-components-time-context.mjs +5 -0
  166. package/esm2022/time-context/index.mjs +2 -0
  167. package/esm2022/time-context/time-context.component.mjs +217 -0
  168. package/esm2022/time-context/time-context.service.mjs +83 -0
  169. package/esm2022/tracking/tracking.component.mjs +5 -6
  170. package/esm2022/tracking/tracking.service.mjs +7 -3
  171. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +6 -5
  172. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  173. package/esm2022/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +5 -0
  174. package/esm2022/widgets/definitions/datapoints-graph/index.mjs +31 -0
  175. package/esm2022/widgets/definitions/index.mjs +3 -2
  176. package/esm2022/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +5 -0
  177. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +239 -0
  178. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +241 -0
  179. package/esm2022/widgets/implementations/datapoints-graph/index.mjs +3 -0
  180. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +80 -28
  181. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  182. package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
  183. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  184. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +658 -0
  185. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -0
  186. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +72 -0
  187. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -0
  188. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +4 -4
  189. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  190. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +4 -4
  191. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  192. package/fesm2022/c8y-ngx-components-device-list.mjs +2 -2
  193. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  194. package/fesm2022/c8y-ngx-components-echart-models.mjs +46 -0
  195. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -0
  196. package/fesm2022/c8y-ngx-components-echart.mjs +2023 -0
  197. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -0
  198. package/fesm2022/c8y-ngx-components-interval-picker.mjs +2 -2
  199. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  200. package/fesm2022/c8y-ngx-components-map.mjs +3 -0
  201. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  202. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
  203. package/fesm2022/c8y-ngx-components-time-context.mjs +300 -0
  204. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -0
  205. package/fesm2022/c8y-ngx-components-tracking.mjs +10 -7
  206. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
  207. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +5 -4
  208. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  209. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  210. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  211. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +38 -0
  212. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -0
  213. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  214. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  215. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +467 -0
  216. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -0
  217. package/fesm2022/c8y-ngx-components.mjs +433 -281
  218. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  219. package/interval-picker/interval-picker.component.d.ts.map +1 -1
  220. package/interval-picker/interval-picker.model.d.ts.map +1 -1
  221. package/locales/de.po +206 -279
  222. package/locales/es.po +206 -279
  223. package/locales/fr.po +206 -279
  224. package/locales/ja_JP.po +196 -279
  225. package/locales/ko.po +455 -444
  226. package/locales/locales.pot +200 -0
  227. package/locales/nl.po +206 -279
  228. package/locales/pl.po +206 -279
  229. package/locales/pt_BR.po +206 -279
  230. package/locales/zh_CN.po +450 -443
  231. package/locales/zh_TW.po +452 -445
  232. package/map/map.component.d.ts.map +1 -1
  233. package/package.json +1 -1
  234. package/report-dashboard/index.d.ts +1 -0
  235. package/report-dashboard/index.d.ts.map +1 -1
  236. package/time-context/c8y-ngx-components-time-context.d.ts.map +1 -0
  237. package/time-context/index.d.ts +2 -0
  238. package/time-context/index.d.ts.map +1 -0
  239. package/time-context/time-context.component.d.ts +61 -0
  240. package/time-context/time-context.component.d.ts.map +1 -0
  241. package/time-context/time-context.service.d.ts +25 -0
  242. package/time-context/time-context.service.d.ts.map +1 -0
  243. package/tracking/tracking.component.d.ts.map +1 -1
  244. package/tracking/tracking.service.d.ts.map +1 -1
  245. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -1
  246. package/widgets/cockpit-exports/index.d.ts +6 -0
  247. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  248. package/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.d.ts.map +1 -0
  249. package/widgets/definitions/datapoints-graph/index.d.ts +16 -0
  250. package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -0
  251. package/widgets/definitions/index.d.ts +1 -0
  252. package/widgets/definitions/index.d.ts.map +1 -1
  253. package/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -0
  254. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts +43 -0
  255. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -0
  256. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +54 -0
  257. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -0
  258. package/widgets/implementations/datapoints-graph/index.d.ts +3 -0
  259. package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -0
@@ -0,0 +1,217 @@
1
+ import { Component, DestroyRef, inject, Input, model, ViewChild } from '@angular/core';
2
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
3
+ import { FormBuilder } from '@angular/forms';
4
+ import { CoreModule, DateTimePickerModule, RealtimeControlComponent, WidgetTimeContextDateRangeService } from '@c8y/ngx-components';
5
+ import { INTERVAL_TITLES } from '@c8y/ngx-components/interval-picker';
6
+ import { AggregationPickerComponent } from '@c8y/ngx-components';
7
+ import { IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';
8
+ import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
9
+ import { BsDropdownDirective, BsDropdownModule } from 'ngx-bootstrap/dropdown';
10
+ import { TooltipModule } from 'ngx-bootstrap/tooltip';
11
+ import { interval } from 'rxjs';
12
+ import { DatapointExplorerService } from './time-context.service';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@c8y/ngx-components";
15
+ import * as i2 from "@angular/common";
16
+ import * as i3 from "@angular/forms";
17
+ import * as i4 from "ngx-bootstrap/dropdown";
18
+ import * as i5 from "ngx-bootstrap/tooltip";
19
+ export class TimeContextComponent {
20
+ #destroyRef;
21
+ constructor(widgetTimeContextDateRangeService) {
22
+ this.widgetTimeContextDateRangeService = widgetTimeContextDateRangeService;
23
+ this.datapointExplorerService = inject(DatapointExplorerService);
24
+ this.formBuilder = inject(FormBuilder);
25
+ this.#destroyRef = inject(DestroyRef);
26
+ this.DATE_FORMAT = 'short';
27
+ this.INTERVAL_TITLES = INTERVAL_TITLES;
28
+ this.REALTIME_INTERVAL = 1000;
29
+ this.form = this.createForm(this.datapointExplorerService.getDefaultContext());
30
+ this.valuesSignal = toSignal(this.form.controls.currentDateContextFromDate.valueChanges, {
31
+ initialValue: this.form.controls.currentDateContextFromDate.value
32
+ });
33
+ this.context = model(this.form.value);
34
+ const context = this.datapointExplorerService.getDefaultContext();
35
+ const { disabledAggregations } = this.datapointExplorerService.calculateAggregation(context.date, context.aggregation);
36
+ this.disabledAggregations = disabledAggregations;
37
+ this.subscribeToIntervalChange();
38
+ this.subscribeToRealtimeChange();
39
+ this.subscribeToAggregationChange();
40
+ }
41
+ ngOnChanges(changes) {
42
+ if (changes.changedDateContext && changes.changedDateContext.currentValue) {
43
+ this.update({
44
+ date: [this.changedDateContext.dateFrom, this.changedDateContext.dateTo],
45
+ interval: this.changedDateContext.interval,
46
+ realtime: this.changedDateContext.realtime || false,
47
+ aggregation: this.changedDateContext.aggregation
48
+ });
49
+ if (this.changedDateContext.realtime) {
50
+ this.form.controls.aggregation.disable();
51
+ }
52
+ }
53
+ }
54
+ applyDatetimeContext() {
55
+ this.update({
56
+ date: [
57
+ new Date(this.form.controls.temporaryUserSelectedFromDate.value),
58
+ new Date(this.form.controls.temporaryUserSelectedToDate.value)
59
+ ],
60
+ interval: 'custom',
61
+ realtime: this.form.value.realtime,
62
+ aggregation: this.form.value.aggregation
63
+ });
64
+ }
65
+ subscribeToIntervalChange() {
66
+ this.form.controls.currentDateContextInterval.valueChanges
67
+ .pipe(takeUntilDestroyed(this.#destroyRef))
68
+ .subscribe(interval => {
69
+ let date;
70
+ this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);
71
+ if (interval === 'custom') {
72
+ date = [
73
+ new Date(this.form.controls.currentDateContextFromDate.value),
74
+ new Date(this.form.controls.currentDateContextToDate.value)
75
+ ];
76
+ }
77
+ else {
78
+ date = this.datapointExplorerService.getDateTimeContextByInterval(interval);
79
+ this.dropdown.isOpen = false;
80
+ }
81
+ this.update({
82
+ date,
83
+ interval,
84
+ realtime: this.form.value.realtime,
85
+ aggregation: this.form.value.aggregation
86
+ });
87
+ });
88
+ }
89
+ subscribeToRealtimeChange() {
90
+ this.form.controls.realtime.valueChanges
91
+ .pipe(takeUntilDestroyed(this.#destroyRef))
92
+ .subscribe(realtime => {
93
+ this.onRealtimeValueChange(realtime);
94
+ if (realtime) {
95
+ this.startRealtime();
96
+ }
97
+ else {
98
+ this.stopRealtime();
99
+ }
100
+ });
101
+ }
102
+ subscribeToAggregationChange() {
103
+ this.form.controls.aggregation.valueChanges
104
+ .pipe(takeUntilDestroyed(this.#destroyRef))
105
+ .subscribe(aggregation => {
106
+ this.update({
107
+ date: [
108
+ new Date(this.form.value.currentDateContextFromDate),
109
+ new Date(this.form.value.currentDateContextToDate)
110
+ ],
111
+ interval: this.form.value.currentDateContextInterval,
112
+ realtime: this.form.value.realtime,
113
+ aggregation
114
+ });
115
+ });
116
+ }
117
+ onRealtimeValueChange(realtime) {
118
+ let dateTimeContext;
119
+ if (this.form.value.currentDateContextInterval !== 'custom') {
120
+ dateTimeContext = this.datapointExplorerService.getDateTimeContextByInterval(this.form.value.currentDateContextInterval);
121
+ }
122
+ else {
123
+ const currentTimeSpanInMs = new Date(this.form.value.currentDateContextToDate).valueOf() -
124
+ new Date(this.form.value.currentDateContextFromDate).valueOf();
125
+ const dateTo = new Date();
126
+ const dateFrom = new Date(dateTo.valueOf() - currentTimeSpanInMs);
127
+ dateTimeContext = [dateFrom, dateTo];
128
+ }
129
+ this.update({
130
+ date: dateTimeContext,
131
+ interval: this.form.value.currentDateContextInterval,
132
+ realtime,
133
+ aggregation: null
134
+ });
135
+ }
136
+ startRealtime() {
137
+ this.form.controls.temporaryUserSelectedFromDate.disable();
138
+ this.form.controls.temporaryUserSelectedToDate.disable();
139
+ this.form.controls.aggregation.disable();
140
+ this.realtimeSubscription = interval(this.REALTIME_INTERVAL)
141
+ .pipe(takeUntilDestroyed(this.#destroyRef))
142
+ .subscribe(() => {
143
+ if (!this.form.value.realtime) {
144
+ this.realtimeSubscription.unsubscribe();
145
+ return;
146
+ }
147
+ const newDateFrom = new Date(new Date(this.form.value.currentDateContextFromDate).valueOf() + this.REALTIME_INTERVAL);
148
+ const newDateTo = new Date(new Date(this.form.value.currentDateContextToDate).valueOf() + this.REALTIME_INTERVAL);
149
+ this.updateFormValues({
150
+ date: [newDateFrom, newDateTo],
151
+ interval: this.form.value.currentDateContextInterval,
152
+ realtime: true,
153
+ aggregation: null
154
+ });
155
+ });
156
+ }
157
+ stopRealtime() {
158
+ this.realtimeSubscription?.unsubscribe();
159
+ this.form?.controls.temporaryUserSelectedFromDate.enable();
160
+ this.form?.controls.temporaryUserSelectedToDate.enable();
161
+ this.form?.controls.aggregation.enable();
162
+ }
163
+ update({ date, interval, realtime, aggregation }) {
164
+ const { selectedAggregation, disabledAggregations } = this.datapointExplorerService.calculateAggregation(date, aggregation);
165
+ this.disabledAggregations = disabledAggregations;
166
+ this.updateFormValues({ date, interval, realtime, aggregation: selectedAggregation });
167
+ }
168
+ createForm(context) {
169
+ return this.formBuilder.group({
170
+ temporaryUserSelectedFromDate: context.date[0].toISOString(),
171
+ temporaryUserSelectedToDate: context.date[1].toISOString(),
172
+ currentDateContextFromDate: context.date[0].toISOString(),
173
+ currentDateContextToDate: context.date[1].toISOString(),
174
+ currentDateContextInterval: context.interval || 'custom',
175
+ realtime: context.realtime,
176
+ aggregation: context.aggregation
177
+ });
178
+ }
179
+ updateFormValues({ date, interval, realtime, aggregation }) {
180
+ const newFormValues = {
181
+ temporaryUserSelectedFromDate: date[0].toISOString(),
182
+ temporaryUserSelectedToDate: date[1].toISOString(),
183
+ currentDateContextFromDate: date[0].toISOString(),
184
+ currentDateContextToDate: date[1].toISOString(),
185
+ realtime,
186
+ currentDateContextInterval: interval || 'custom',
187
+ aggregation: aggregation || null
188
+ };
189
+ this.context.set(newFormValues);
190
+ this.form.patchValue(newFormValues, {
191
+ emitEvent: false
192
+ });
193
+ }
194
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TimeContextComponent, deps: [{ token: i1.WidgetTimeContextDateRangeService }], target: i0.ɵɵFactoryTarget.Component }); }
195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.9", type: TimeContextComponent, isStandalone: true, selector: "c8y-time-context", inputs: { changedDateContext: { classPropertyName: "changedDateContext", publicName: "changedDateContext", isSignal: false, isRequired: false, transformFunction: null }, controlsAvailable: { classPropertyName: "controlsAvailable", publicName: "controlsAvailable", isSignal: false, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { context: "contextChange" }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"controlsAvailable; else actionBarTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</ng-container>\n\n<ng-template #actionBarTemplate>\n <c8y-action-bar-item\n [groupId]=\"'timeContext'\"\n [inGroupPriority]=\"1\"\n [placement]=\"'left'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n </c8y-action-bar-item>\n</ng-template>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-8 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"controlsAvailable ? controlsAvailable.aggregation : true\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "ngmodule", type: BsDatepickerModule }, { kind: "ngmodule", type: DateTimePickerModule }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i4.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i4.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i4.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "component", type: AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: IntervalPickerComponent, selector: "c8y-interval-picker", inputs: ["INTERVALS"] }, { kind: "component", type: RealtimeControlComponent, selector: "c8y-realtime-control" }] }); }
196
+ }
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TimeContextComponent, decorators: [{
198
+ type: Component,
199
+ args: [{ selector: 'c8y-time-context', standalone: true, imports: [
200
+ CoreModule,
201
+ BsDatepickerModule,
202
+ DateTimePickerModule,
203
+ BsDropdownModule,
204
+ AggregationPickerComponent,
205
+ TooltipModule,
206
+ IntervalPickerComponent,
207
+ RealtimeControlComponent
208
+ ], template: "<ng-container *ngIf=\"controlsAvailable; else actionBarTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</ng-container>\n\n<ng-template #actionBarTemplate>\n <c8y-action-bar-item\n [groupId]=\"'timeContext'\"\n [inGroupPriority]=\"1\"\n [placement]=\"'left'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n </c8y-action-bar-item>\n</ng-template>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-8 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"controlsAvailable ? controlsAvailable.aggregation : true\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n" }]
209
+ }], ctorParameters: () => [{ type: i1.WidgetTimeContextDateRangeService }], propDecorators: { changedDateContext: [{
210
+ type: Input
211
+ }], controlsAvailable: [{
212
+ type: Input
213
+ }], dropdown: [{
214
+ type: ViewChild,
215
+ args: [BsDropdownDirective]
216
+ }] } });
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1jb250ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RpbWUtY29udGV4dC90aW1lLWNvbnRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdGltZS1jb250ZXh0L3RpbWUtY29udGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsVUFBVSxFQUVWLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsaUNBQWlDLEVBQ2xDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBWSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQWlCbEUsTUFBTSxPQUFPLG9CQUFvQjtJQVkvQixXQUFXLENBQXNCO0lBZ0JqQyxZQUFvQixpQ0FB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QUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFZO1lBQ3pELFFBQVE7WUFDUiwwQkFBMEIsRUFBRSxRQUFRLElBQUksUUFBUTtZQUNoRCxXQUFXLEVBQUUsV0FBVyxJQUFJLElBQUk7U0FDakMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUNsQyxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDOzhHQXROVSxvQkFBb0I7a0dBQXBCLG9CQUFvQixvbUJBU3BCLG1CQUFtQixxRUNuRGhDLDg3TkE0TEEsMkNENUpJLFVBQVUsbXlFQUNWLGtCQUFrQiw4QkFDbEIsb0JBQW9CLDhCQUNwQixnQkFBZ0IsdWxCQUNoQiwwQkFBMEIsb0dBQzFCLGFBQWEsa2tCQUNiLHVCQUF1Qix1RkFDdkIsd0JBQXdCOzsyRkFHZixvQkFBb0I7a0JBZmhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBRWhCLElBQUksV0FDUDt3QkFDUCxVQUFVO3dCQUNWLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLDBCQUEwQjt3QkFDMUIsYUFBYTt3QkFDYix1QkFBdUI7d0JBQ3ZCLHdCQUF3QjtxQkFDekI7c0dBR1Esa0JBQWtCO3NCQUExQixLQUFLO2dCQU9HLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDMEIsUUFBUTtzQkFBdkMsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIG1vZGVsLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDb3JlTW9kdWxlLFxuICBEYXRlVGltZUNvbnRleHQsXG4gIERhdGVUaW1lUGlja2VyTW9kdWxlLFxuICBSZWFsdGltZUNvbnRyb2xDb21wb25lbnQsXG4gIFdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IElOVEVSVkFMX1RJVExFUywgSW50ZXJ2YWwgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvblBpY2tlckNvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgSW50ZXJ2YWxQaWNrZXJDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgQnNEcm9wZG93bkRpcmVjdGl2ZSwgQnNEcm9wZG93bk1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvZHJvcGRvd24nO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRhcG9pbnRFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuL3RpbWUtY29udGV4dC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXRpbWUtY29udGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90aW1lLWNvbnRleHQuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29yZU1vZHVsZSxcbiAgICBCc0RhdGVwaWNrZXJNb2R1bGUsXG4gICAgRGF0ZVRpbWVQaWNrZXJNb2R1bGUsXG4gICAgQnNEcm9wZG93bk1vZHVsZSxcbiAgICBBZ2dyZWdhdGlvblBpY2tlckNvbXBvbmVudCxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEludGVydmFsUGlja2VyQ29tcG9uZW50LFxuICAgIFJlYWx0aW1lQ29udHJvbENvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVDb250ZXh0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY2hhbmdlZERhdGVDb250ZXh0OiB7XG4gICAgZGF0ZUZyb20/OiBEYXRlO1xuICAgIGRhdGVUbz86IERhdGU7XG4gICAgaW50ZXJ2YWw/OiBJbnRlcnZhbFsnaWQnXTtcbiAgICByZWFsdGltZT86IGJvb2xlYW47XG4gICAgYWdncmVnYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIEBJbnB1dCgpIGNvbnRyb2xzQXZhaWxhYmxlOiBhbnk7XG4gIEBWaWV3Q2hpbGQoQnNEcm9wZG93bkRpcmVjdGl2ZSkgZHJvcGRvd246IEJzRHJvcGRvd25EaXJlY3RpdmU7XG4gIGRhdGFwb2ludEV4cGxvcmVyU2VydmljZSA9IGluamVjdChEYXRhcG9pbnRFeHBsb3JlclNlcnZpY2UpO1xuICBmb3JtQnVpbGRlciA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHJlYWRvbmx5IERBVEVfRk9STUFUID0gJ3Nob3J0JztcbiAgcmVhZG9ubHkgSU5URVJWQUxfVElUTEVTID0gSU5URVJWQUxfVElUTEVTO1xuICByZWFkb25seSBSRUFMVElNRV9JTlRFUlZBTCA9IDEwMDA7XG4gIGZvcm0gPSB0aGlzLmNyZWF0ZUZvcm0odGhpcy5kYXRhcG9pbnRFeHBsb3JlclNlcnZpY2UuZ2V0RGVmYXVsdENvbnRleHQoKSk7XG4gIGRpc2FibGVkQWdncmVnYXRpb25zO1xuXG4gIHJlYWRvbmx5IHZhbHVlc1NpZ25hbCA9IHRvU2lnbmFsKHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZS52YWx1ZUNoYW5nZXMsIHtcbiAgICBpbml0aWFsVmFsdWU6IHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZS52YWx1ZVxuICB9KTtcblxuICBjb250ZXh0ID0gbW9kZWwodGhpcy5mb3JtLnZhbHVlKTtcblxuICBwcml2YXRlIHJlYWx0aW1lU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB3aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2U6IFdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmRhdGFwb2ludEV4cGxvcmVyU2VydmljZS5nZXREZWZhdWx0Q29udGV4dCgpO1xuICAgIGNvbnN0IHsgZGlzYWJsZWRBZ2dyZWdhdGlvbnMgfSA9IHRoaXMuZGF0YXBvaW50RXhwbG9yZXJTZXJ2aWNlLmNhbGN1bGF0ZUFnZ3JlZ2F0aW9uKFxuICAgICAgY29udGV4dC5kYXRlLFxuICAgICAgY29udGV4dC5hZ2dyZWdhdGlvblxuICAgICk7XG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9ucyA9IGRpc2FibGVkQWdncmVnYXRpb25zO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVUb0ludGVydmFsQ2hhbmdlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0FnZ3JlZ2F0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY2hhbmdlZERhdGVDb250ZXh0ICYmIGNoYW5nZXMuY2hhbmdlZERhdGVDb250ZXh0LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICBkYXRlOiBbdGhpcy5jaGFuZ2VkRGF0ZUNvbnRleHQuZGF0ZUZyb20sIHRoaXMuY2hhbmdlZERhdGVDb250ZXh0LmRhdGVUb10sXG4gICAgICAgIGludGVydmFsOiB0aGlzLmNoYW5nZWREYXRlQ29udGV4dC5pbnRlcnZhbCxcbiAgICAgICAgcmVhbHRpbWU6IHRoaXMuY2hhbmdlZERhdGVDb250ZXh0LnJlYWx0aW1lIHx8IGZhbHNlLFxuICAgICAgICBhZ2dyZWdhdGlvbjogdGhpcy5jaGFuZ2VkRGF0ZUNvbnRleHQuYWdncmVnYXRpb25cbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuY2hhbmdlZERhdGVDb250ZXh0LnJlYWx0aW1lKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZ2dyZWdhdGlvbi5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXBwbHlEYXRldGltZUNvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoe1xuICAgICAgZGF0ZTogW1xuICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUudmFsdWUpLFxuICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLnZhbHVlKVxuICAgICAgXSxcbiAgICAgIGludGVydmFsOiAnY3VzdG9tJyxcbiAgICAgIHJlYWx0aW1lOiB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogdGhpcy5mb3JtLnZhbHVlLmFnZ3JlZ2F0aW9uXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvSW50ZXJ2YWxDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShpbnRlcnZhbCA9PiB7XG4gICAgICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgICAgIHRoaXMud2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlLnVwZGF0ZUluaXRpYWxUaW1lUmFuZ2UobnVsbCk7XG4gICAgICAgIGlmIChpbnRlcnZhbCA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICBkYXRlID0gW1xuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLmNvbnRyb2xzLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlLnZhbHVlKSxcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRUb0RhdGUudmFsdWUpXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRlID0gdGhpcy5kYXRhcG9pbnRFeHBsb3JlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChcbiAgICAgICAgICAgIGludGVydmFsIGFzIEludGVydmFsWydpZCddXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWUsXG4gICAgICAgICAgYWdncmVnYXRpb246IHRoaXMuZm9ybS52YWx1ZS5hZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5yZWFsdGltZS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUocmVhbHRpbWUgPT4ge1xuICAgICAgICB0aGlzLm9uUmVhbHRpbWVWYWx1ZUNoYW5nZShyZWFsdGltZSBhcyBib29sZWFuKTtcblxuICAgICAgICBpZiAocmVhbHRpbWUpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UmVhbHRpbWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0b3BSZWFsdGltZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9BZ2dyZWdhdGlvbkNoYW5nZSgpIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMuYWdncmVnYXRpb24udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKGFnZ3JlZ2F0aW9uID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICAgIGRhdGU6IFtcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSksXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgICAgICByZWFsdGltZTogdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVhbHRpbWVWYWx1ZUNoYW5nZShyZWFsdGltZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGxldCBkYXRlVGltZUNvbnRleHQ6IERhdGVUaW1lQ29udGV4dDtcbiAgICBpZiAodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsICE9PSAnY3VzdG9tJykge1xuICAgICAgZGF0ZVRpbWVDb250ZXh0ID0gdGhpcy5kYXRhcG9pbnRFeHBsb3JlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsIGFzIEludGVydmFsWydpZCddXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50VGltZVNwYW5Jbk1zID1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpIC1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBkYXRlVG8gPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZGF0ZUZyb20gPSBuZXcgRGF0ZShkYXRlVG8udmFsdWVPZigpIC0gY3VycmVudFRpbWVTcGFuSW5Ncyk7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSBbZGF0ZUZyb20sIGRhdGVUb107XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoe1xuICAgICAgZGF0ZTogZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgIHJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRSZWFsdGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5hZ2dyZWdhdGlvbi5kaXNhYmxlKCk7XG5cbiAgICB0aGlzLnJlYWx0aW1lU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwodGhpcy5SRUFMVElNRV9JTlRFUlZBTClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybS52YWx1ZS5yZWFsdGltZSkge1xuICAgICAgICAgIHRoaXMucmVhbHRpbWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZUZyb20gPSBuZXcgRGF0ZShcbiAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLnZhbHVlT2YoKSArIHRoaXMuUkVBTFRJTUVfSU5URVJWQUxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZVRvID0gbmV3IERhdGUoXG4gICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpICsgdGhpcy5SRUFMVElNRV9JTlRFUlZBTFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoe1xuICAgICAgICAgIGRhdGU6IFtuZXdEYXRlRnJvbSwgbmV3RGF0ZVRvXSxcbiAgICAgICAgICBpbnRlcnZhbDogdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0cnVlLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZWFsdGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWx0aW1lU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybT8uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy5hZ2dyZWdhdGlvbi5lbmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9KTogdm9pZCB7XG4gICAgY29uc3QgeyBzZWxlY3RlZEFnZ3JlZ2F0aW9uLCBkaXNhYmxlZEFnZ3JlZ2F0aW9ucyB9ID1cbiAgICAgIHRoaXMuZGF0YXBvaW50RXhwbG9yZXJTZXJ2aWNlLmNhbGN1bGF0ZUFnZ3JlZ2F0aW9uKGRhdGUsIGFnZ3JlZ2F0aW9uKTtcbiAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25zID0gZGlzYWJsZWRBZ2dyZWdhdGlvbnM7XG4gICAgdGhpcy51cGRhdGVGb3JtVmFsdWVzKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbjogc2VsZWN0ZWRBZ2dyZWdhdGlvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGU6IGNvbnRleHQuZGF0ZVswXS50b0lTT1N0cmluZygpIGFzIHN0cmluZyxcbiAgICAgIHRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZTogY29udGV4dC5kYXRlWzFdLnRvSVNPU3RyaW5nKCkgYXMgc3RyaW5nLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0RnJvbURhdGU6IGNvbnRleHQuZGF0ZVswXS50b0lTT1N0cmluZygpIGFzIHN0cmluZyxcbiAgICAgIGN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZTogY29udGV4dC5kYXRlWzFdLnRvSVNPU3RyaW5nKCkgYXMgc3RyaW5nLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWw6IGNvbnRleHQuaW50ZXJ2YWwgfHwgJ2N1c3RvbScsXG4gICAgICByZWFsdGltZTogY29udGV4dC5yZWFsdGltZSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiBjb250ZXh0LmFnZ3JlZ2F0aW9uXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdGb3JtVmFsdWVzID0ge1xuICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGU6IGRhdGVbMF0udG9JU09TdHJpbmcoKSBhcyBzdHJpbmcsXG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGU6IGRhdGVbMV0udG9JU09TdHJpbmcoKSBhcyBzdHJpbmcsXG4gICAgICBjdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZTogZGF0ZVswXS50b0lTT1N0cmluZygpIGFzIHN0cmluZyxcbiAgICAgIGN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZTogZGF0ZVsxXS50b0lTT1N0cmluZygpIGFzIHN0cmluZyxcbiAgICAgIHJlYWx0aW1lLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWw6IGludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uIHx8IG51bGxcbiAgICB9O1xuXG4gICAgdGhpcy5jb250ZXh0LnNldChuZXdGb3JtVmFsdWVzKTtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShuZXdGb3JtVmFsdWVzLCB7XG4gICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sc0F2YWlsYWJsZTsgZWxzZSBhY3Rpb25CYXJUZW1wbGF0ZVwiPlxuICA8bmctY29udGFpbmVyXG4gICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVQaWNrZXJcIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICBkYXRlOiBbZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZSwgZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRUb0RhdGVdXG4gICAgfVwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2FjdGlvbkJhclRlbXBsYXRlPlxuICA8Yzh5LWFjdGlvbi1iYXItaXRlbVxuICAgIFtncm91cElkXT1cIid0aW1lQ29udGV4dCdcIlxuICAgIFtpbkdyb3VwUHJpb3JpdHldPVwiMVwiXG4gICAgW3BsYWNlbWVudF09XCInbGVmdCdcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVQaWNrZXJcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgZGF0ZTogW2Zvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUsIGZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlXVxuICAgICAgfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2RhdGVUaW1lUGlja2VyXG4gIGxldC1kYXRlPVwiZGF0ZVwiXG4+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWZsZXggZ2FwLTggcC1sLXhzLTE2IHAtci14cy0xNiBtLXQteHMtOCBtLWIteHMtOFwiXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24gZmxleC1ncm93XCJcbiAgICAgICAgI2Ryb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICBkcm9wZG93blxuICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICpuZ0lmPVwiZGF0ZVwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBmb3JtLWNvbnRyb2wgbC1oLXRpZ2h0IGQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJ7eyBkYXRlWzBdIHwgYzh5RGF0ZTogREFURV9GT1JNQVQgfX0g4oCUIHt7XG4gICAgICAgICAgICBkYXRlWzFdIHwgYzh5RGF0ZTogREFURV9GT1JNQVRcbiAgICAgICAgICB9fVwiXG4gICAgICAgICAgdG9vbHRpcD1cInt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3sgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19XCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1kYXRlLXBpY2tlci1kcm9wZG93bi1idXR0b25cIlxuICAgICAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgYzh5SWNvbj1cInNjaGVkdWxlMVwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1jb2wgdGV4dC1sZWZ0IGZpdC13XCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMTJcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwid2lkZ2V0LXRpbWUtY29udGV4dC0tc2VsZWN0ZWQtaW50ZXJ2YWxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBJTlRFUlZBTF9USVRMRVNbZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xMCB0ZXh0LW11dGVkIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwid2lkZ2V0LXRpbWUtY29udGV4dC0tc2VsZWN0ZWQtdGltZS1yYW5nZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3sgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJldCBtLXItMTYgbS1sLTRcIj48L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDx1bFxuICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1kYXRlLXJhbmdlXCJcbiAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgID5cbiAgICAgICAgICA8Yzh5LWludGVydmFsLXBpY2tlclxuICAgICAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImN1cnJlbnREYXRlQ29udGV4dEludGVydmFsXCJcbiAgICAgICAgICA+PC9jOHktaW50ZXJ2YWwtcGlja2VyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0uY29udHJvbHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwudmFsdWUgPT09ICdjdXN0b20nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1sLTE2IHAtci0xNlwiPlxuICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlLmVycm9ycyA/ICdoYXMtZXJyb3InIDogJydcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0Zyb21gZGF0ZWAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIGZvcj1cInRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEZyb21gZGF0ZWBcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxjOHktZGF0ZS10aW1lLXBpY2tlclxuICAgICAgICAgICAgICAgICAgaWQ9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0Zyb21gZGF0ZWAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgPjwvYzh5LWRhdGUtdGltZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlcyBbc2hvd109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlLmVycm9yc1wiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkYXRlQWZ0ZXJSYW5nZU1heFwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgYWZ0ZXIgdGhlIGxhdGVzdCBhbGxvd2VkIGRhdGUuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW52YWxpZERhdGVUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBpbnZhbGlkLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInVG9gZGF0ZWAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIGZvcj1cInRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBUb2BkYXRlYFxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGM4eS1kYXRlLXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgICBpZD1cInRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVG9gZGF0ZWAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICA+PC9jOHktZGF0ZS10aW1lLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIFtzaG93XT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLmVycm9yc1wiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkYXRlQmVmb3JlUmFuZ2VNaW5cIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVGhpcyBkYXRlIGlzIGJlZm9yZSB0aGUgZWFybGllc3QgYWxsb3dlZCBkYXRlLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImludmFsaWREYXRlVGltZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTE2IGQtZmxleCBnYXAtOCBzZXBhcmF0b3ItdG9wXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gZmxleC1ncm93XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZXNldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkcm9wZG93bi5pc09wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0udmFsdWUucmVhbHRpbWVcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgUmVzZXRcbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5RGF0ZXRpbWVDb250ZXh0KCk7IGRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAoZm9ybS5wcmlzdGluZSAmJiBmb3JtLnVudG91Y2hlZCkgfHwgZm9ybS5pbnZhbGlkIHx8IGZvcm0udmFsdWUucmVhbHRpbWVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctYXV0b1wiPlxuICAgICAgPGM4eS1yZWFsdGltZS1jb250cm9sXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHAtMCBmbGV4LW5vLWdyb3cgdy1hdXRvXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVhbHRpbWVcIlxuICAgICAgPjwvYzh5LXJlYWx0aW1lLWNvbnRyb2w+XG5cbiAgICAgIDxjOHktYWdncmVnYXRpb24tcGlja2VyXG4gICAgICAgICpuZ0lmPVwiY29udHJvbHNBdmFpbGFibGUgPyBjb250cm9sc0F2YWlsYWJsZS5hZ2dyZWdhdGlvbiA6IHRydWVcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZEFnZ3JlZ2F0aW9uc109XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uc1wiXG4gICAgICA+PC9jOHktYWdncmVnYXRpb24tcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,83 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { aggregationType } from '@c8y/client';
3
+ import { AGGREGATION_LIMITS } from '@c8y/ngx-components';
4
+ import { INTERVALS, TimeSpanInMs } from '@c8y/ngx-components/interval-picker';
5
+ import * as i0 from "@angular/core";
6
+ export class DatapointExplorerService {
7
+ constructor() {
8
+ this.DEFAULT_INTERVAL = 'days';
9
+ }
10
+ // Create generic? Based on packages/ngx-components/core/dashboard/wiget-time-context/widget-time-context.component.html
11
+ getDefaultContext() {
12
+ return {
13
+ date: this.getDateTimeContextByInterval(this.DEFAULT_INTERVAL),
14
+ interval: this.DEFAULT_INTERVAL,
15
+ realtime: false,
16
+ aggregation: aggregationType.MINUTELY
17
+ };
18
+ }
19
+ calculateAggregation([dateFrom, dateTo], requestedAggregation) {
20
+ const timeRangeValidations = this.validateTimeRanges([dateFrom, dateTo]);
21
+ const disabledAggregations = this.getDisabledAggregations(timeRangeValidations);
22
+ const timeRangeInMs = this.getTimeRangeInMs(dateFrom, dateTo);
23
+ const isRequestedAggregationValid = requestedAggregation === null || !disabledAggregations[requestedAggregation];
24
+ const selectedAggregation = isRequestedAggregationValid
25
+ ? requestedAggregation
26
+ : this.determineAggregation(timeRangeInMs);
27
+ return {
28
+ selectedAggregation,
29
+ disabledAggregations
30
+ };
31
+ }
32
+ getDateTimeContextByInterval(intervalId) {
33
+ const interval = INTERVALS.find(({ id }) => id === intervalId);
34
+ const dateTo = new Date();
35
+ const dateFrom = new Date(dateTo.valueOf() - interval.timespanInMs);
36
+ return [dateFrom, dateTo];
37
+ }
38
+ getTimeRangeInMs(dateFrom, dateTo) {
39
+ return dateTo.valueOf() - dateFrom.valueOf();
40
+ }
41
+ validateTimeRanges([dateFrom, dateTo]) {
42
+ const timeRangeInMs = this.getTimeRangeInMs(dateFrom, dateTo);
43
+ return [
44
+ {
45
+ aggregationType: aggregationType.DAILY,
46
+ isDisabled: timeRangeInMs <= TimeSpanInMs.DAY
47
+ },
48
+ {
49
+ aggregationType: aggregationType.HOURLY,
50
+ isDisabled: timeRangeInMs <= TimeSpanInMs.HOUR
51
+ },
52
+ {
53
+ aggregationType: aggregationType.MINUTELY,
54
+ isDisabled: timeRangeInMs <= TimeSpanInMs.MINUTE
55
+ }
56
+ ];
57
+ }
58
+ getDisabledAggregations(timeRangeValidations) {
59
+ return timeRangeValidations.reduce((acc, { aggregationType, isDisabled }) => ({
60
+ ...acc,
61
+ [aggregationType]: isDisabled
62
+ }), {});
63
+ }
64
+ determineAggregation(timeRangeInMs) {
65
+ if (timeRangeInMs >= AGGREGATION_LIMITS.DAILY_LIMIT) {
66
+ return aggregationType.DAILY;
67
+ }
68
+ else if (timeRangeInMs >= AGGREGATION_LIMITS.HOURLY_LIMIT) {
69
+ return aggregationType.HOURLY;
70
+ }
71
+ else if (timeRangeInMs >= AGGREGATION_LIMITS.MINUTELY_LIMIT) {
72
+ return aggregationType.MINUTELY;
73
+ }
74
+ return null;
75
+ }
76
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointExplorerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
77
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointExplorerService, providedIn: 'root' }); }
78
+ }
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointExplorerService, decorators: [{
80
+ type: Injectable,
81
+ args: [{ providedIn: 'root' }]
82
+ }] });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90aW1lLWNvbnRleHQvdGltZS1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQVksU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQVF4RixNQUFNLE9BQU8sd0JBQXdCO0lBRHJDO1FBRVcscUJBQWdCLEdBQW1CLE1BQU0sQ0FBQztLQXlGcEQ7SUF2RkMsd0hBQXdIO0lBQ3hILGlCQUFpQjtRQUNmLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM5RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUMvQixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsUUFBUTtTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVELG9CQUFvQixDQUNsQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQWtCLEVBQ25DLG9CQUE0QztRQUs1QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFaEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU5RCxNQUFNLDJCQUEyQixHQUMvQixvQkFBb0IsS0FBSyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sbUJBQW1CLEdBQUcsMkJBQTJCO1lBQ3JELENBQUMsQ0FBQyxvQkFBb0I7WUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU3QyxPQUFPO1lBQ0wsbUJBQW1CO1lBQ25CLG9CQUFvQjtTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVELDRCQUE0QixDQUFDLFVBQTBCO1FBQ3JELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQWMsRUFBRSxNQUFZO1FBQ25ELE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFrQjtRQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTlELE9BQU87WUFDTDtnQkFDRSxlQUFlLEVBQUUsZUFBZSxDQUFDLEtBQUs7Z0JBQ3RDLFVBQVUsRUFBRSxhQUFhLElBQUksWUFBWSxDQUFDLEdBQUc7YUFDOUM7WUFDRDtnQkFDRSxlQUFlLEVBQUUsZUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLFVBQVUsRUFBRSxhQUFhLElBQUksWUFBWSxDQUFDLElBQUk7YUFDL0M7WUFDRDtnQkFDRSxlQUFlLEVBQUUsZUFBZSxDQUFDLFFBQVE7Z0JBQ3pDLFVBQVUsRUFBRSxhQUFhLElBQUksWUFBWSxDQUFDLE1BQU07YUFDakQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUM3QixvQkFBMkM7UUFFM0MsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLENBQ2hDLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLEdBQUcsR0FBRztZQUNOLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVTtTQUM5QixDQUFDLEVBQ0YsRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sb0JBQW9CLENBQUMsYUFBcUI7UUFDaEQsSUFBSSxhQUFhLElBQUksa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM1RCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksYUFBYSxJQUFJLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlELE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzhHQXpGVSx3QkFBd0I7a0hBQXhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQUdHUkVHQVRJT05fTElNSVRTLCBEYXRlVGltZUNvbnRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEludGVydmFsLCBJTlRFUlZBTFMsIFRpbWVTcGFuSW5NcyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaW50ZXJ2YWwtcGlja2VyJztcblxuaW50ZXJmYWNlIFRpbWVSYW5nZVZhbGlkYXRpb24ge1xuICBhZ2dyZWdhdGlvblR5cGU6IGFnZ3JlZ2F0aW9uVHlwZTtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRFeHBsb3JlclNlcnZpY2Uge1xuICByZWFkb25seSBERUZBVUxUX0lOVEVSVkFMOiBJbnRlcnZhbFsnaWQnXSA9ICdkYXlzJztcblxuICAvLyBDcmVhdGUgZ2VuZXJpYz8gQmFzZWQgb24gcGFja2FnZXMvbmd4LWNvbXBvbmVudHMvY29yZS9kYXNoYm9hcmQvd2lnZXQtdGltZS1jb250ZXh0L3dpZGdldC10aW1lLWNvbnRleHQuY29tcG9uZW50Lmh0bWxcbiAgZ2V0RGVmYXVsdENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGU6IHRoaXMuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbCh0aGlzLkRFRkFVTFRfSU5URVJWQUwpLFxuICAgICAgaW50ZXJ2YWw6IHRoaXMuREVGQVVMVF9JTlRFUlZBTCxcbiAgICAgIHJlYWx0aW1lOiBmYWxzZSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvblR5cGUuTUlOVVRFTFlcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlQWdncmVnYXRpb24oXG4gICAgW2RhdGVGcm9tLCBkYXRlVG9dOiBEYXRlVGltZUNvbnRleHQsXG4gICAgcmVxdWVzdGVkQWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZSB8IG51bGxcbiAgKToge1xuICAgIHNlbGVjdGVkQWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZSB8IG51bGw7XG4gICAgZGlzYWJsZWRBZ2dyZWdhdGlvbnM6IFBhcnRpYWw8UmVjb3JkPGFnZ3JlZ2F0aW9uVHlwZSwgYm9vbGVhbj4+O1xuICB9IHtcbiAgICBjb25zdCB0aW1lUmFuZ2VWYWxpZGF0aW9ucyA9IHRoaXMudmFsaWRhdGVUaW1lUmFuZ2VzKFtkYXRlRnJvbSwgZGF0ZVRvXSk7XG4gICAgY29uc3QgZGlzYWJsZWRBZ2dyZWdhdGlvbnMgPSB0aGlzLmdldERpc2FibGVkQWdncmVnYXRpb25zKHRpbWVSYW5nZVZhbGlkYXRpb25zKTtcblxuICAgIGNvbnN0IHRpbWVSYW5nZUluTXMgPSB0aGlzLmdldFRpbWVSYW5nZUluTXMoZGF0ZUZyb20sIGRhdGVUbyk7XG5cbiAgICBjb25zdCBpc1JlcXVlc3RlZEFnZ3JlZ2F0aW9uVmFsaWQgPVxuICAgICAgcmVxdWVzdGVkQWdncmVnYXRpb24gPT09IG51bGwgfHwgIWRpc2FibGVkQWdncmVnYXRpb25zW3JlcXVlc3RlZEFnZ3JlZ2F0aW9uXTtcblxuICAgIGNvbnN0IHNlbGVjdGVkQWdncmVnYXRpb24gPSBpc1JlcXVlc3RlZEFnZ3JlZ2F0aW9uVmFsaWRcbiAgICAgID8gcmVxdWVzdGVkQWdncmVnYXRpb25cbiAgICAgIDogdGhpcy5kZXRlcm1pbmVBZ2dyZWdhdGlvbih0aW1lUmFuZ2VJbk1zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RlZEFnZ3JlZ2F0aW9uLFxuICAgICAgZGlzYWJsZWRBZ2dyZWdhdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChpbnRlcnZhbElkOiBJbnRlcnZhbFsnaWQnXSk6IERhdGVUaW1lQ29udGV4dCB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBJTlRFUlZBTFMuZmluZCgoeyBpZCB9KSA9PiBpZCA9PT0gaW50ZXJ2YWxJZCk7XG4gICAgY29uc3QgZGF0ZVRvID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkYXRlRnJvbSA9IG5ldyBEYXRlKGRhdGVUby52YWx1ZU9mKCkgLSBpbnRlcnZhbC50aW1lc3BhbkluTXMpO1xuICAgIHJldHVybiBbZGF0ZUZyb20sIGRhdGVUb107XG4gIH1cblxuICBwcml2YXRlIGdldFRpbWVSYW5nZUluTXMoZGF0ZUZyb206IERhdGUsIGRhdGVUbzogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGVUby52YWx1ZU9mKCkgLSBkYXRlRnJvbS52YWx1ZU9mKCk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZVJhbmdlcyhbZGF0ZUZyb20sIGRhdGVUb106IERhdGVUaW1lQ29udGV4dCk6IFRpbWVSYW5nZVZhbGlkYXRpb25bXSB7XG4gICAgY29uc3QgdGltZVJhbmdlSW5NcyA9IHRoaXMuZ2V0VGltZVJhbmdlSW5NcyhkYXRlRnJvbSwgZGF0ZVRvKTtcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogYWdncmVnYXRpb25UeXBlLkRBSUxZLFxuICAgICAgICBpc0Rpc2FibGVkOiB0aW1lUmFuZ2VJbk1zIDw9IFRpbWVTcGFuSW5Ncy5EQVlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFnZ3JlZ2F0aW9uVHlwZTogYWdncmVnYXRpb25UeXBlLkhPVVJMWSxcbiAgICAgICAgaXNEaXNhYmxlZDogdGltZVJhbmdlSW5NcyA8PSBUaW1lU3BhbkluTXMuSE9VUlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWdncmVnYXRpb25UeXBlOiBhZ2dyZWdhdGlvblR5cGUuTUlOVVRFTFksXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRpbWVSYW5nZUluTXMgPD0gVGltZVNwYW5Jbk1zLk1JTlVURVxuICAgICAgfVxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGdldERpc2FibGVkQWdncmVnYXRpb25zKFxuICAgIHRpbWVSYW5nZVZhbGlkYXRpb25zOiBUaW1lUmFuZ2VWYWxpZGF0aW9uW11cbiAgKTogUGFydGlhbDxSZWNvcmQ8YWdncmVnYXRpb25UeXBlLCBib29sZWFuPj4ge1xuICAgIHJldHVybiB0aW1lUmFuZ2VWYWxpZGF0aW9ucy5yZWR1Y2UoXG4gICAgICAoYWNjLCB7IGFnZ3JlZ2F0aW9uVHlwZSwgaXNEaXNhYmxlZCB9KSA9PiAoe1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFthZ2dyZWdhdGlvblR5cGVdOiBpc0Rpc2FibGVkXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lQWdncmVnYXRpb24odGltZVJhbmdlSW5NczogbnVtYmVyKTogYWdncmVnYXRpb25UeXBlIHwgbnVsbCB7XG4gICAgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLkRBSUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkRBSUxZO1xuICAgIH0gZWxzZSBpZiAodGltZVJhbmdlSW5NcyA+PSBBR0dSRUdBVElPTl9MSU1JVFMuSE9VUkxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkhPVVJMWTtcbiAgICB9IGVsc2UgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLk1JTlVURUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLk1JTlVURUxZO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
@@ -1,4 +1,3 @@
1
- import { AsyncPipe } from '@angular/common';
2
1
  import { Component, ViewChild } from '@angular/core';
3
2
  import { FormsModule } from '@angular/forms';
4
3
  import { ActivatedRoute } from '@angular/router';
@@ -24,7 +23,7 @@ export class TrackingComponent {
24
23
  preventChangeToNextMonth: true
25
24
  };
26
25
  this.config = {
27
- realtime: false,
26
+ realtime: true,
28
27
  follow: false,
29
28
  zoomLevel: 12,
30
29
  fitBoundsOptions: {
@@ -40,6 +39,7 @@ export class TrackingComponent {
40
39
  this.device = contextData;
41
40
  }
42
41
  async ngAfterViewInit() {
42
+ this.service.setDeviceId(this.device.id);
43
43
  this.togglePositionRealtime(this.realtime.active);
44
44
  }
45
45
  toggleMarker(event) {
@@ -69,21 +69,20 @@ export class TrackingComponent {
69
69
  }
70
70
  }
71
71
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingComponent, deps: [{ token: i1.TrackingService }, { token: i2.EventRealtimeService }, { token: i2.ContextRouteService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
72
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TrackingComponent, isStandalone: true, selector: "c8y-tracking", providers: [EventRealtimeService], viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: ActionBarModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i2.TimeIntervalComponent, selector: "c8y-time-interval", inputs: ["minCustomDate", "maxCustomDate", "dateRangePickerConfig", "selectedInterval"], outputs: ["interval"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TrackingMarkerPopupComponent, selector: "c8y-tracking-marker-popup", inputs: ["context", "showTrackingLink"] }] }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TrackingComponent, isStandalone: true, selector: "c8y-tracking", providers: [EventRealtimeService], viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n data-cy=\"c8y-tracking--load-more\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: ActionBarModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i2.TimeIntervalComponent, selector: "c8y-time-interval", inputs: ["minCustomDate", "maxCustomDate", "dateRangePickerConfig", "selectedInterval"], outputs: ["interval"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TrackingMarkerPopupComponent, selector: "c8y-tracking-marker-popup", inputs: ["context", "showTrackingLink"] }] }); }
73
73
  }
74
74
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingComponent, decorators: [{
75
75
  type: Component,
76
76
  args: [{ standalone: true, imports: [
77
77
  MapModule,
78
- AsyncPipe,
79
78
  ActionBarModule,
80
79
  CoreModule,
81
80
  TimeIntervalComponent,
82
81
  FormsModule,
83
82
  TrackingMarkerPopupComponent
84
- ], providers: [EventRealtimeService], selector: 'c8y-tracking', template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n" }]
83
+ ], providers: [EventRealtimeService], selector: 'c8y-tracking', template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n data-cy=\"c8y-tracking--load-more\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n" }]
85
84
  }], ctorParameters: () => [{ type: i1.TrackingService }, { type: i2.EventRealtimeService }, { type: i2.ContextRouteService }, { type: i3.ActivatedRoute }], propDecorators: { map: [{
86
85
  type: ViewChild,
87
86
  args: [MapComponent]
88
87
  }] } });
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBaUIsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLFVBQVUsRUFFVixvQkFBb0IsRUFHcEIscUJBQXFCLEVBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBaUJyRCxNQUFNLE9BQU8saUJBQWlCO0lBeUI1QixZQUNTLE9BQXdCLEVBQ3hCLFFBQThCLEVBQzdCLG1CQUF3QyxFQUN4QyxjQUE4QjtRQUgvQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM3Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpCeEMsMEJBQXFCLEdBQTBCO1lBQzdDLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2Qix3QkFBd0IsRUFBRSxJQUFJO1NBQy9CLENBQUM7UUFFRixX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YXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQmFyTW9kdWxlLFxuICBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICBDb3JlTW9kdWxlLFxuICBEYXRlUmFuZ2VQaWNrZXJDb25maWcsXG4gIEV2ZW50UmVhbHRpbWVTZXJ2aWNlLFxuICBMb2FkTW9yZUNvbXBvbmVudCxcbiAgVGltZUludGVydmFsLFxuICBUaW1lSW50ZXJ2YWxDb21wb25lbnRcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBNYXBDb21wb25lbnQsIE1hcENvbmZpZywgTWFwTW9kdWxlLCBQb3NpdGlvbk1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFja2luZ01hcmtlclBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi90cmFja2luZy1tYXJrZXItcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYWNraW5nU2VydmljZSB9IGZyb20gJy4vdHJhY2tpbmcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJhY2tpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBpbXBvcnRzOiBbXG4gICAgTWFwTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBBY3Rpb25CYXJNb2R1bGUsXG4gICAgQ29yZU1vZHVsZSxcbiAgICBUaW1lSW50ZXJ2YWxDb21wb25lbnQsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHJhY2tpbmdNYXJrZXJQb3B1cENvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtFdmVudFJlYWx0aW1lU2VydmljZV0sXG4gIHNlbGVjdG9yOiAnYzh5LXRyYWNraW5nJ1xufSlcbmV4cG9ydCBjbGFzcyBUcmFja2luZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBtYXA6IE1hcENvbXBvbmVudDtcblxuICBkYXRlUmFuZ2VQaWNrZXJDb25maWc6IERhdGVSYW5nZVBpY2tlckNvbmZpZyA9IHtcbiAgICBhZGFwdGl2ZVBvc2l0aW9uOiB0cnVlLFxuICAgIHNob3dQcmV2aW91c01vbnRoOiB0cnVlLFxuICAgIHByZXZlbnRDaGFuZ2VUb05leHRNb250aDogdHJ1ZVxuICB9O1xuXG4gIGNvbmZpZzogTWFwQ29uZmlnID0ge1xuICAgIHJlYWx0aW1lOiBmYWxzZSxcbiAgICBmb2xsb3c6IGZhbHNlLFxuICAgIHpvb21MZXZlbDogMTIsXG4gICAgZml0Qm91bmRzT3B0aW9uczoge1xuICAgICAgcGFkZGluZzogWzUwLCA1MF1cbiAgICB9XG4gIH07XG5cbiAgbWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGFjdGl2ZU1hcmtlcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIHJlYWx0aW1lRGlzYWJsZWQgPSBmYWxzZTtcbiAgZGV2aWNlOiBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2VydmljZTogVHJhY2tpbmdTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFsdGltZTogRXZlbnRSZWFsdGltZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB7IGNvbnRleHREYXRhIH0gPSB0aGlzLmNvbnRleHRSb3V0ZVNlcnZpY2UuZ2V0Q29udGV4dERhdGEodGhpcy5hY3RpdmF0ZWRSb3V0ZSk7XG4gICAgdGhpcy5kZXZpY2UgPSBjb250ZXh0RGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gIH1cblxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50b2dnbGVQb3NpdGlvblJlYWx0aW1lKHRoaXMucmVhbHRpbWUuYWN0aXZlKTtcbiAgfVxuXG4gIHRvZ2dsZU1hcmtlcihldmVudDogSUV2ZW50KSB7XG4gICAgbGV0IG1hcmtlciA9IHRoaXMubWFwLmZpbmRNYXJrZXIoZXZlbnQpO1xuXG4gICAgaWYgKG1hcmtlcikge1xuICAgICAgdGhpcy5tYXAucmVtb3ZlTWFya2VyKG1hcmtlcik7XG4gICAgICBkZWxldGUgdGhpcy5hY3RpdmVNYXJrZXJzW2BwJHtldmVudC5pZH1gXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFya2VyID0gdGhpcy5tYXAuZ2V0VHJhY2tpbmdNYXJrZXIoZXZlbnQpO1xuICAgICAgdGhpcy5tYXAuYWRkTWFya2VyVG9NYXAobWFya2VyKTtcbiAgICAgIHRoaXMuYWN0aXZlTWFya2Vyc1tgcCR7ZXZlbnQuaWR9YF0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVBvc2l0aW9uUmVhbHRpbWUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCByZWFsdGltZTogYWN0aXZlIH07XG4gIH1cblxuICB0b2dnbGVSZWFsdGltZShpbnRlcnZhbDogVGltZUludGVydmFsKSB7XG4gICAgY29uc3QgY3VycmVudFRpbWVJblJhbmdlID0gRGF0ZS5ub3coKSA8PSBpbnRlcnZhbD8uZGF0ZVRvPy5nZXRUaW1lKCk7XG4gICAgdGhpcy50b2dnbGVQb3NpdGlvblJlYWx0aW1lKGN1cnJlbnRUaW1lSW5SYW5nZSk7XG4gICAgdGhpcy5yZWFsdGltZURpc2FibGVkID0gIWN1cnJlbnRUaW1lSW5SYW5nZTtcblxuICAgIGlmIChjdXJyZW50VGltZUluUmFuZ2UpIHtcbiAgICAgIHRoaXMucmVhbHRpbWUuc3RhcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWFsdGltZS5zdG9wKCk7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidyaWdodCdcIlxuICBbcHJpb3JpdHldPVwiMTAwXCJcbj5cbiAgPGM4eS1yZWFsdGltZS1idG5cbiAgICBbc2VydmljZV09XCJyZWFsdGltZVwiXG4gICAgW2Rpc2FibGVkXT1cInJlYWx0aW1lRGlzYWJsZWRcIlxuICAgIChvblRvZ2dsZSk9XCJ0b2dnbGVQb3NpdGlvblJlYWx0aW1lKCRldmVudClcIlxuICA+PC9jOHktcmVhbHRpbWUtYnRuPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCIncmlnaHQnXCJcbiAgW3ByaW9yaXR5XT1cIjYwXCJcbj5cbiAgPGM4eS10aW1lLWludGVydmFsXG4gICAgW21heEN1c3RvbURhdGVdPVwibWF4RGF0ZVwiXG4gICAgW2RhdGVSYW5nZVBpY2tlckNvbmZpZ109XCJkYXRlUmFuZ2VQaWNrZXJDb25maWdcIlxuICAgIChpbnRlcnZhbCk9XCJzZXJ2aWNlLnNldEludGVydmFsKCRldmVudCk7IHRvZ2dsZVJlYWx0aW1lKCRldmVudClcIlxuICA+PC9jOHktdGltZS1pbnRlcnZhbD5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY2FyZC0tZ3JpZCBjb250ZW50LWZ1bGxwYWdlIGQtZ3JpZCBncmlkX19jb2wtLTgtNC0tbWRcIj5cbiAgPGRpdiBjbGFzcz1cImJnLXdoaXRlIHAtcmVsYXRpdmVcIj5cbiAgICA8Yzh5LW1hcFxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgW2Fzc2V0c109XCJkZXZpY2VcIlxuICAgICAgW3BvbHlsaW5lJF09XCJzZXJ2aWNlLnBvbHlsaW5lJFwiXG4gICAgICBbcG9seWxpbmVPcHRpb25zXT1cInsgY29sb3I6ICdkYXJrYmx1ZScgfVwiXG4gICAgPlxuICAgICAgPGRpdiAqYzh5TWFwUG9wdXA9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8Yzh5LXRyYWNraW5nLW1hcmtlci1wb3B1cCBbY29udGV4dF09XCJjb250ZXh0XCI+PC9jOHktdHJhY2tpbmctbWFya2VyLXBvcHVwPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbWFwPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIGJnLWluaGVyaXQgY29udGVudC1mdWxscGFnZSBiZy1ncmF5LXdoaXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGxhcmdlLXBhZGRpbmcgc2VwYXJhdG9yIHN0aWNreS10b3BcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBUcmFja2luZyBldmVudHNcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc2Nyb2xsXCI+XG4gICAgICA8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJjOHktbGlzdF9fZ3JvdXAtLXN0cmlwXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGM4eUZvclxuICAgICAgICAgIGxldC1ldmVudFxuICAgICAgICAgIFtjOHlGb3JPZl09XCJzZXJ2aWNlLmV2ZW50cyRcIlxuICAgICAgICAgIFtjOHlGb3JQaXBlXT1cInNlcnZpY2UucGlwZVwiXG4gICAgICAgICAgW2M4eUZvclJlYWx0aW1lXT1cInJlYWx0aW1lXCJcbiAgICAgICAgICBbYzh5Rm9yUmVhbHRpbWVPcHRpb25zXT1cInsgZW50aXR5T3JJZDogZGV2aWNlIH1cIlxuICAgICAgICAgIFtjOHlGb3JMb2FkTW9yZV09XCInaGlkZGVuJ1wiXG4gICAgICAgICAgW2M4eUZvck5vdEZvdW5kXT1cImVtcHR5XCJcbiAgICAgICAgICAoYzh5Rm9yTG9hZE1vcmVDb21wb25lbnQpPVwiXG4gICAgICAgICAgICBsb2FkTW9yZUNvbXBvbmVudCA9ICRldmVudDsgbG9hZE1vcmVDb21wb25lbnQudXNlSW50ZXJzZWN0aW9uID0gZmFsc2VcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGM4eS1saVxuICAgICAgICAgICAgY2xhc3M9XCJwb2ludGVyXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3RleHQtcHJpbWFyeSB0ZXh0LWJvbGQnOiBhY3RpdmVNYXJrZXJzWydwJyArIGV2ZW50Py5pZF0gfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWFya2VyKGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGM4eS1saS1pY29uIFtuZ0NsYXNzXT1cInsgJ3RleHQtcHJpbWFyeSc6IGFjdGl2ZU1hcmtlcnNbJ3AnICsgZXZlbnQ/LmlkXSB9XCI+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJjOHktbG9jYXRpb25cIj48L2k+XG4gICAgICAgICAgICA8L2M4eS1saS1pY29uPlxuICAgICAgICAgICAgPGM4eS1saS1ib2R5PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICB7eyBldmVudC50aW1lIHwgZGF0ZTogJ21lZGl1bURhdGUnIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGV2ZW50LnRpbWUgfCBkYXRlOiAnbWVkaXVtVGltZScgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktbGktYm9keT5cbiAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvYzh5LWxpc3QtZ3JvdXA+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGVtcHR5IHN0YXRlIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHk+XG4gICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgIGljb249XCJjOHktbG9jYXRpb25cIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIHRyYWNraW5nIGV2ZW50cyBmb3VuZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIidTZWxlY3QgYW5vdGhlciB0aW1lIHJhbmdlLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAqbmdJZj1cIiFzZXJ2aWNlLmhhc0V2ZW50c1wiXG4gICAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibG9hZE1vcmVDb21wb25lbnQ/Lmhhc01vcmVcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgZml0LXcgc3RpY2t5LWJvdHRvbSBzZXBhcmF0b3ItdG9wXCJcbiAgICAgICAgW3RpdGxlXT1cIidMb2FkIG1vcmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXCJcbiAgICAgICAgKGNsaWNrKT1cImxvYWRNb3JlQ29tcG9uZW50LmxvYWRNb3JlKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnTG9hZCBtb3JlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgW3RpdGxlXT1cIidEZXNlbGVjdCBhbGwgbWFya2VycycgfCB0cmFuc2xhdGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIihhY3RpdmVNYXJrZXJzIHwganNvbikgPT09ICd7fSdcIlxuICAgICAgICAoY2xpY2spPVwibWFwLmNsZWFyTWFya2VycygnZXZlbnQnKTsgYWN0aXZlTWFya2VycyA9IHt9XCJcbiAgICAgID5cbiAgICAgICAge3sgJ0Rlc2VsZWN0IGFsbCBtYXJrZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxFQUNMLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUVWLG9CQUFvQixFQUdwQixxQkFBcUIsRUFDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFhLFNBQVMsRUFBeUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFnQnJELE1BQU0sT0FBTyxpQkFBaUI7SUF5QjVCLFlBQ1MsT0FBd0IsRUFDeEIsUUFBOEIsRUFDN0IsbUJBQXdDLEVBQ3hDLGNBQThCO1FBSC9CLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQzdCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBekJ4QywwQkFBcUIsR0FBMEI7WUFDN0MsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLHdCQUF3QixFQUFFLElBQUk7U0FDL0IsQ0FBQztRQUVGLFdBQU0sR0FBYztZQUNsQixRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFB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ZXdJbml0LCBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFjdGlvbkJhck1vZHVsZSxcbiAgQ29udGV4dFJvdXRlU2VydmljZSxcbiAgQ29yZU1vZHVsZSxcbiAgRGF0ZVJhbmdlUGlja2VyQ29uZmlnLFxuICBFdmVudFJlYWx0aW1lU2VydmljZSxcbiAgTG9hZE1vcmVDb21wb25lbnQsXG4gIFRpbWVJbnRlcnZhbCxcbiAgVGltZUludGVydmFsQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWFwQ29tcG9uZW50LCBNYXBDb25maWcsIE1hcE1vZHVsZSwgUG9zaXRpb25NYW5hZ2VkT2JqZWN0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9tYXAnO1xuaW1wb3J0IHsgVHJhY2tpbmdNYXJrZXJQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vdHJhY2tpbmctbWFya2VyLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFja2luZ1NlcnZpY2UgfSBmcm9tICcuL3RyYWNraW5nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyYWNraW5nLmNvbXBvbmVudC5odG1sJyxcbiAgaW1wb3J0czogW1xuICAgIE1hcE1vZHVsZSxcbiAgICBBY3Rpb25CYXJNb2R1bGUsXG4gICAgQ29yZU1vZHVsZSxcbiAgICBUaW1lSW50ZXJ2YWxDb21wb25lbnQsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHJhY2tpbmdNYXJrZXJQb3B1cENvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtFdmVudFJlYWx0aW1lU2VydmljZV0sXG4gIHNlbGVjdG9yOiAnYzh5LXRyYWNraW5nJ1xufSlcbmV4cG9ydCBjbGFzcyBUcmFja2luZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBtYXA6IE1hcENvbXBvbmVudDtcblxuICBkYXRlUmFuZ2VQaWNrZXJDb25maWc6IERhdGVSYW5nZVBpY2tlckNvbmZpZyA9IHtcbiAgICBhZGFwdGl2ZVBvc2l0aW9uOiB0cnVlLFxuICAgIHNob3dQcmV2aW91c01vbnRoOiB0cnVlLFxuICAgIHByZXZlbnRDaGFuZ2VUb05leHRNb250aDogdHJ1ZVxuICB9O1xuXG4gIGNvbmZpZzogTWFwQ29uZmlnID0ge1xuICAgIHJlYWx0aW1lOiB0cnVlLFxuICAgIGZvbGxvdzogZmFsc2UsXG4gICAgem9vbUxldmVsOiAxMixcbiAgICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgICBwYWRkaW5nOiBbNTAsIDUwXVxuICAgIH1cbiAgfTtcblxuICBtYXhEYXRlID0gbmV3IERhdGUoKTtcbiAgYWN0aXZlTWFya2VyczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgcmVhbHRpbWVEaXNhYmxlZCA9IGZhbHNlO1xuICBkZXZpY2U6IFBvc2l0aW9uTWFuYWdlZE9iamVjdDtcbiAgbG9hZE1vcmVDb21wb25lbnQ6IExvYWRNb3JlQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzZXJ2aWNlOiBUcmFja2luZ1NlcnZpY2UsXG4gICAgcHVibGljIHJlYWx0aW1lOiBFdmVudFJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRleHRSb3V0ZVNlcnZpY2U6IENvbnRleHRSb3V0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHsgY29udGV4dERhdGEgfSA9IHRoaXMuY29udGV4dFJvdXRlU2VydmljZS5nZXRDb250ZXh0RGF0YSh0aGlzLmFjdGl2YXRlZFJvdXRlKTtcbiAgICB0aGlzLmRldmljZSA9IGNvbnRleHREYXRhIGFzIFBvc2l0aW9uTWFuYWdlZE9iamVjdDtcbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0RGV2aWNlSWQodGhpcy5kZXZpY2UuaWQpO1xuICAgIHRoaXMudG9nZ2xlUG9zaXRpb25SZWFsdGltZSh0aGlzLnJlYWx0aW1lLmFjdGl2ZSk7XG4gIH1cblxuICB0b2dnbGVNYXJrZXIoZXZlbnQ6IElFdmVudCkge1xuICAgIGxldCBtYXJrZXIgPSB0aGlzLm1hcC5maW5kTWFya2VyKGV2ZW50KTtcblxuICAgIGlmIChtYXJrZXIpIHtcbiAgICAgIHRoaXMubWFwLnJlbW92ZU1hcmtlcihtYXJrZXIpO1xuICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlTWFya2Vyc1tgcCR7ZXZlbnQuaWR9YF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcmtlciA9IHRoaXMubWFwLmdldFRyYWNraW5nTWFya2VyKGV2ZW50KTtcbiAgICAgIHRoaXMubWFwLmFkZE1hcmtlclRvTWFwKG1hcmtlcik7XG4gICAgICB0aGlzLmFjdGl2ZU1hcmtlcnNbYHAke2V2ZW50LmlkfWBdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVQb3NpdGlvblJlYWx0aW1lKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgcmVhbHRpbWU6IGFjdGl2ZSB9O1xuICB9XG5cbiAgdG9nZ2xlUmVhbHRpbWUoaW50ZXJ2YWw6IFRpbWVJbnRlcnZhbCkge1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lSW5SYW5nZSA9IERhdGUubm93KCkgPD0gaW50ZXJ2YWw/LmRhdGVUbz8uZ2V0VGltZSgpO1xuICAgIHRoaXMudG9nZ2xlUG9zaXRpb25SZWFsdGltZShjdXJyZW50VGltZUluUmFuZ2UpO1xuICAgIHRoaXMucmVhbHRpbWVEaXNhYmxlZCA9ICFjdXJyZW50VGltZUluUmFuZ2U7XG5cbiAgICBpZiAoY3VycmVudFRpbWVJblJhbmdlKSB7XG4gICAgICB0aGlzLnJlYWx0aW1lLnN0YXJ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVhbHRpbWUuc3RvcCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCIncmlnaHQnXCJcbiAgW3ByaW9yaXR5XT1cIjEwMFwiXG4+XG4gIDxjOHktcmVhbHRpbWUtYnRuXG4gICAgW3NlcnZpY2VdPVwicmVhbHRpbWVcIlxuICAgIFtkaXNhYmxlZF09XCJyZWFsdGltZURpc2FibGVkXCJcbiAgICAob25Ub2dnbGUpPVwidG9nZ2xlUG9zaXRpb25SZWFsdGltZSgkZXZlbnQpXCJcbiAgPjwvYzh5LXJlYWx0aW1lLWJ0bj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gIFtwcmlvcml0eV09XCI2MFwiXG4+XG4gIDxjOHktdGltZS1pbnRlcnZhbFxuICAgIFttYXhDdXN0b21EYXRlXT1cIm1heERhdGVcIlxuICAgIFtkYXRlUmFuZ2VQaWNrZXJDb25maWddPVwiZGF0ZVJhbmdlUGlja2VyQ29uZmlnXCJcbiAgICAoaW50ZXJ2YWwpPVwic2VydmljZS5zZXRJbnRlcnZhbCgkZXZlbnQpOyB0b2dnbGVSZWFsdGltZSgkZXZlbnQpXCJcbiAgPjwvYzh5LXRpbWUtaW50ZXJ2YWw+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtLWdyaWQgY29udGVudC1mdWxscGFnZSBkLWdyaWQgZ3JpZF9fY29sLS04LTQtLW1kXCI+XG4gIDxkaXYgY2xhc3M9XCJiZy13aGl0ZSBwLXJlbGF0aXZlXCI+XG4gICAgPGM4eS1tYXBcbiAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgIFthc3NldHNdPVwiZGV2aWNlXCJcbiAgICAgIFtwb2x5bGluZSRdPVwic2VydmljZS5wb2x5bGluZSRcIlxuICAgICAgW3BvbHlsaW5lT3B0aW9uc109XCJ7IGNvbG9yOiAnZGFya2JsdWUnIH1cIlxuICAgID5cbiAgICAgIDxkaXYgKmM4eU1hcFBvcHVwPVwibGV0IGNvbnRleHRcIj5cbiAgICAgICAgPGM4eS10cmFja2luZy1tYXJrZXItcG9wdXAgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvYzh5LXRyYWNraW5nLW1hcmtlci1wb3B1cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvYzh5LW1hcD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBkLWNvbCBiZy1pbmhlcml0IGNvbnRlbnQtZnVsbHBhZ2UgYmctZ3JheS13aGl0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBsYXJnZS1wYWRkaW5nIHNlcGFyYXRvciBzdGlja3ktdG9wXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImNhcmQtdGl0bGVcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgVHJhY2tpbmcgZXZlbnRzXG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiPlxuICAgICAgPGM4eS1saXN0LWdyb3VwIGNsYXNzPVwiYzh5LWxpc3RfX2dyb3VwLS1zdHJpcFwiPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBjOHlGb3JcbiAgICAgICAgICBsZXQtZXZlbnRcbiAgICAgICAgICBbYzh5Rm9yT2ZdPVwic2VydmljZS5ldmVudHMkXCJcbiAgICAgICAgICBbYzh5Rm9yUGlwZV09XCJzZXJ2aWNlLnBpcGVcIlxuICAgICAgICAgIFtjOHlGb3JSZWFsdGltZV09XCJyZWFsdGltZVwiXG4gICAgICAgICAgW2M4eUZvclJlYWx0aW1lT3B0aW9uc109XCJ7IGVudGl0eU9ySWQ6IGRldmljZSB9XCJcbiAgICAgICAgICBbYzh5Rm9yTG9hZE1vcmVdPVwiJ2hpZGRlbidcIlxuICAgICAgICAgIFtjOHlGb3JOb3RGb3VuZF09XCJlbXB0eVwiXG4gICAgICAgICAgKGM4eUZvckxvYWRNb3JlQ29tcG9uZW50KT1cIlxuICAgICAgICAgICAgbG9hZE1vcmVDb21wb25lbnQgPSAkZXZlbnQ7IGxvYWRNb3JlQ29tcG9uZW50LnVzZUludGVyc2VjdGlvbiA9IGZhbHNlXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgIGNsYXNzPVwicG9pbnRlclwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd0ZXh0LXByaW1hcnkgdGV4dC1ib2xkJzogYWN0aXZlTWFya2Vyc1sncCcgKyBldmVudD8uaWRdIH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hcmtlcihldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInYzh5LXRyYWNraW5nLS10cmFja2luZy1ldmVudC1pdGVtLScgKyBldmVudD8uaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjOHktbGktaWNvbiBbbmdDbGFzc109XCJ7ICd0ZXh0LXByaW1hcnknOiBhY3RpdmVNYXJrZXJzWydwJyArIGV2ZW50Py5pZF0gfVwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiYzh5LWxvY2F0aW9uXCI+PC9pPlxuICAgICAgICAgICAgPC9jOHktbGktaWNvbj5cbiAgICAgICAgICAgIDxjOHktbGktYm9keT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAge3sgZXZlbnQudGltZSB8IGRhdGU6ICdtZWRpdW1EYXRlJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICB7eyBldmVudC50aW1lIHwgZGF0ZTogJ21lZGl1bVRpbWUnIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICAgICAgPC9jOHktbGk+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBlbXB0eSBzdGF0ZSAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2VtcHR5PlxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBpY29uPVwiYzh5LWxvY2F0aW9uXCJcbiAgICAgICAgW3RpdGxlXT1cIidObyB0cmFja2luZyBldmVudHMgZm91bmQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtzdWJ0aXRsZV09XCInU2VsZWN0IGFub3RoZXIgdGltZSByYW5nZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgKm5nSWY9XCIhc2VydmljZS5oYXNFdmVudHNcIlxuICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiAqbmdJZj1cImxvYWRNb3JlQ29tcG9uZW50Py5oYXNNb3JlXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGZpdC13IHN0aWNreS1ib3R0b20gc2VwYXJhdG9yLXRvcFwiXG4gICAgICAgIFt0aXRsZV09XCInTG9hZCBtb3JlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwibG9hZE1vcmVDb21wb25lbnQ/LmlzTG9hZGluZ1wiXG4gICAgICAgIChjbGljayk9XCJsb2FkTW9yZUNvbXBvbmVudC5sb2FkTW9yZSgpXCJcbiAgICAgICAgZGF0YS1jeT1cImM4eS10cmFja2luZy0tbG9hZC1tb3JlXCJcbiAgICAgID5cbiAgICAgICAge3sgJ0xvYWQgbW9yZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHNlcGFyYXRvclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgIFt0aXRsZV09XCInRGVzZWxlY3QgYWxsIG1hcmtlcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIoYWN0aXZlTWFya2VycyB8IGpzb24pID09PSAne30nXCJcbiAgICAgICAgKGNsaWNrKT1cIm1hcC5jbGVhck1hcmtlcnMoJ2V2ZW50Jyk7IGFjdGl2ZU1hcmtlcnMgPSB7fVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdEZXNlbGVjdCBhbGwgbWFya2VycycgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19