@grnsft/if 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/.env +5 -0
  2. package/build/common/config/index.d.ts +1 -0
  3. package/build/common/config/index.js +6 -0
  4. package/build/common/config/strings.d.ts +11 -0
  5. package/build/common/config/strings.js +19 -0
  6. package/build/common/lib/load.d.ts +6 -0
  7. package/build/common/lib/load.js +18 -0
  8. package/build/common/types/manifest.d.ts +13 -0
  9. package/build/common/types/manifest.js +3 -0
  10. package/build/common/util/debug-logger.d.ts +4 -0
  11. package/build/common/util/debug-logger.js +124 -0
  12. package/build/common/util/fs.d.ts +20 -0
  13. package/build/common/util/fs.js +94 -0
  14. package/build/common/util/helpers.d.ts +15 -0
  15. package/build/common/util/helpers.js +80 -0
  16. package/build/common/util/logger.d.ts +5 -0
  17. package/build/common/util/logger.js +39 -0
  18. package/build/common/util/validations.d.ts +465 -0
  19. package/build/common/util/validations.js +148 -0
  20. package/build/common/util/yaml.d.ts +12 -0
  21. package/build/common/util/yaml.js +59 -0
  22. package/build/if-check/config/config.d.ts +6 -0
  23. package/build/if-check/config/config.js +31 -0
  24. package/build/if-check/config/index.d.ts +2 -0
  25. package/build/if-check/config/index.js +8 -0
  26. package/build/if-check/config/strings.d.ts +11 -0
  27. package/build/if-check/config/strings.js +15 -0
  28. package/build/if-check/index.d.ts +2 -0
  29. package/build/if-check/index.js +98 -0
  30. package/build/if-check/types/process-args.d.ts +4 -0
  31. package/build/if-check/types/process-args.js +3 -0
  32. package/build/if-check/util/args.d.ts +10 -0
  33. package/build/if-check/util/args.js +56 -0
  34. package/build/if-check/util/helpers.d.ts +4 -0
  35. package/build/if-check/util/helpers.js +18 -0
  36. package/build/if-check/util/npm.d.ts +4 -0
  37. package/build/if-check/util/npm.js +59 -0
  38. package/build/if-csv/config/config.d.ts +6 -0
  39. package/build/if-csv/config/config.js +36 -0
  40. package/build/if-csv/config/index.d.ts +2 -0
  41. package/build/if-csv/config/index.js +8 -0
  42. package/build/if-csv/config/strings.d.ts +3 -0
  43. package/build/if-csv/config/strings.js +7 -0
  44. package/build/if-csv/index.d.ts +2 -0
  45. package/build/if-csv/index.js +63 -0
  46. package/build/if-csv/types/csv.d.ts +7 -0
  47. package/build/if-csv/types/csv.js +3 -0
  48. package/build/if-csv/types/process-args.d.ts +5 -0
  49. package/build/if-csv/types/process-args.js +3 -0
  50. package/build/if-csv/util/args.d.ts +12 -0
  51. package/build/if-csv/util/args.js +47 -0
  52. package/build/if-csv/util/helpers.d.ts +9 -0
  53. package/build/if-csv/util/helpers.js +95 -0
  54. package/build/if-diff/config/config.d.ts +6 -0
  55. package/build/if-diff/config/config.js +31 -0
  56. package/build/if-diff/config/index.d.ts +2 -0
  57. package/build/if-diff/config/index.js +8 -0
  58. package/build/if-diff/config/strings.d.ts +6 -0
  59. package/build/if-diff/config/strings.js +10 -0
  60. package/build/if-diff/index.d.ts +2 -0
  61. package/build/if-diff/index.js +46 -0
  62. package/build/if-diff/lib/compare.d.ts +10 -0
  63. package/build/if-diff/lib/compare.js +56 -0
  64. package/build/if-diff/lib/load.d.ts +63 -0
  65. package/build/if-diff/lib/load.js +51 -0
  66. package/build/if-diff/types/args.d.ts +5 -0
  67. package/build/if-diff/types/args.js +3 -0
  68. package/build/if-diff/types/compare.d.ts +7 -0
  69. package/build/if-diff/types/compare.js +3 -0
  70. package/build/if-diff/types/process-args.d.ts +4 -0
  71. package/build/if-diff/types/process-args.js +3 -0
  72. package/build/if-diff/util/args.d.ts +5 -0
  73. package/build/if-diff/util/args.js +51 -0
  74. package/build/if-diff/util/helpers.d.ts +13 -0
  75. package/build/if-diff/util/helpers.js +75 -0
  76. package/build/if-env/config/config.d.ts +6 -0
  77. package/build/if-env/config/config.js +37 -0
  78. package/build/if-env/config/index.d.ts +2 -0
  79. package/build/if-env/config/index.js +8 -0
  80. package/build/if-env/config/strings.d.ts +7 -0
  81. package/build/if-env/config/strings.js +11 -0
  82. package/build/if-env/index.d.ts +2 -0
  83. package/build/if-env/index.js +40 -0
  84. package/build/if-env/types/if-env.d.ts +8 -0
  85. package/build/if-env/types/if-env.js +3 -0
  86. package/build/if-env/types/npm.d.ts +9 -0
  87. package/build/if-env/types/npm.js +3 -0
  88. package/build/if-env/types/process-args.d.ts +5 -0
  89. package/build/if-env/types/process-args.js +3 -0
  90. package/build/if-env/util/args.d.ts +12 -0
  91. package/build/if-env/util/args.js +47 -0
  92. package/build/if-env/util/helpers.d.ts +20 -0
  93. package/build/if-env/util/helpers.js +94 -0
  94. package/build/if-env/util/npm.d.ts +24 -0
  95. package/build/if-env/util/npm.js +126 -0
  96. package/build/if-merge/config/config.d.ts +6 -0
  97. package/build/if-merge/config/config.js +43 -0
  98. package/build/if-merge/config/index.d.ts +2 -0
  99. package/build/if-merge/config/index.js +8 -0
  100. package/build/if-merge/config/strings.d.ts +5 -0
  101. package/build/if-merge/config/strings.js +9 -0
  102. package/build/if-merge/index.d.ts +2 -0
  103. package/build/if-merge/index.js +26 -0
  104. package/build/if-merge/types/process-args.d.ts +6 -0
  105. package/build/if-merge/types/process-args.js +3 -0
  106. package/build/if-merge/util/args.d.ts +9 -0
  107. package/build/if-merge/util/args.js +59 -0
  108. package/build/if-merge/util/helpers.d.ts +5 -0
  109. package/build/if-merge/util/helpers.js +83 -0
  110. package/build/if-run/builtins/coefficient/index.d.ts +16 -0
  111. package/build/if-run/builtins/coefficient/index.js +45 -0
  112. package/build/if-run/builtins/copy-param/index.d.ts +21 -0
  113. package/build/if-run/builtins/copy-param/index.js +58 -0
  114. package/build/if-run/builtins/csv-lookup/index.d.ts +16 -0
  115. package/build/if-run/builtins/csv-lookup/index.js +175 -0
  116. package/build/if-run/builtins/divide/index.d.ts +16 -0
  117. package/build/if-run/builtins/divide/index.js +68 -0
  118. package/build/if-run/builtins/exponent/index.d.ts +16 -0
  119. package/build/if-run/builtins/exponent/index.js +52 -0
  120. package/build/if-run/builtins/export-log.d.ts +4 -0
  121. package/build/if-run/builtins/export-log.js +44 -0
  122. package/build/if-run/builtins/export-yaml.d.ts +4 -0
  123. package/build/if-run/builtins/export-yaml.js +30 -0
  124. package/build/if-run/builtins/index.d.ts +16 -0
  125. package/build/if-run/builtins/index.js +36 -0
  126. package/build/if-run/builtins/interpolation/index.d.ts +16 -0
  127. package/build/if-run/builtins/interpolation/index.js +138 -0
  128. package/build/if-run/builtins/mock-observations/helpers/common-generator.d.ts +3 -0
  129. package/build/if-run/builtins/mock-observations/helpers/common-generator.js +29 -0
  130. package/build/if-run/builtins/mock-observations/helpers/rand-int-generator.d.ts +3 -0
  131. package/build/if-run/builtins/mock-observations/helpers/rand-int-generator.js +48 -0
  132. package/build/if-run/builtins/mock-observations/index.d.ts +16 -0
  133. package/build/if-run/builtins/mock-observations/index.js +108 -0
  134. package/build/if-run/builtins/mock-observations/interfaces/index.d.ts +6 -0
  135. package/build/if-run/builtins/mock-observations/interfaces/index.js +3 -0
  136. package/build/if-run/builtins/multiply/index.d.ts +16 -0
  137. package/build/if-run/builtins/multiply/index.js +47 -0
  138. package/build/if-run/builtins/regex/index.d.ts +16 -0
  139. package/build/if-run/builtins/regex/index.js +55 -0
  140. package/build/if-run/builtins/sci/index.d.ts +16 -0
  141. package/build/if-run/builtins/sci/index.js +92 -0
  142. package/build/if-run/builtins/sci-embodied/index.d.ts +16 -0
  143. package/build/if-run/builtins/sci-embodied/index.js +142 -0
  144. package/build/if-run/builtins/shell/index.d.ts +16 -0
  145. package/build/if-run/builtins/shell/index.js +50 -0
  146. package/build/if-run/builtins/subtract/index.d.ts +16 -0
  147. package/build/if-run/builtins/subtract/index.js +51 -0
  148. package/build/if-run/builtins/sum/index.d.ts +16 -0
  149. package/build/if-run/builtins/sum/index.js +37 -0
  150. package/build/if-run/builtins/time-converter/config.d.ts +1 -0
  151. package/build/if-run/builtins/time-converter/config.js +44 -0
  152. package/build/if-run/builtins/time-converter/index.d.ts +16 -0
  153. package/build/if-run/builtins/time-converter/index.js +63 -0
  154. package/build/if-run/builtins/time-sync/index.d.ts +31 -0
  155. package/build/if-run/builtins/time-sync/index.js +371 -0
  156. package/build/if-run/config/config.d.ts +9 -0
  157. package/build/if-run/config/config.js +79 -0
  158. package/build/if-run/config/index.d.ts +2 -0
  159. package/build/if-run/config/index.js +8 -0
  160. package/build/if-run/config/strings.d.ts +62 -0
  161. package/build/if-run/config/strings.js +81 -0
  162. package/build/if-run/index.d.ts +2 -0
  163. package/build/if-run/index.js +58 -0
  164. package/build/if-run/lib/aggregate.d.ts +14 -0
  165. package/build/if-run/lib/aggregate.js +130 -0
  166. package/build/if-run/lib/compute.d.ts +5 -0
  167. package/build/if-run/lib/compute.js +164 -0
  168. package/build/if-run/lib/environment.d.ts +5 -0
  169. package/build/if-run/lib/environment.js +75 -0
  170. package/build/if-run/lib/exhaust.d.ts +7 -0
  171. package/build/if-run/lib/exhaust.js +27 -0
  172. package/build/if-run/lib/explain.d.ts +9 -0
  173. package/build/if-run/lib/explain.js +72 -0
  174. package/build/if-run/lib/initialize.d.ts +10 -0
  175. package/build/if-run/lib/initialize.js +113 -0
  176. package/build/if-run/lib/regroup.d.ts +5 -0
  177. package/build/if-run/lib/regroup.js +67 -0
  178. package/build/if-run/types/aggregation.d.ts +2 -0
  179. package/build/if-run/types/aggregation.js +11 -0
  180. package/build/if-run/types/compute.d.ts +33 -0
  181. package/build/if-run/types/compute.js +3 -0
  182. package/build/if-run/types/environment.d.ts +18 -0
  183. package/build/if-run/types/environment.js +3 -0
  184. package/build/if-run/types/explain.d.ts +16 -0
  185. package/build/if-run/types/explain.js +3 -0
  186. package/build/if-run/types/plugin-storage.d.ts +6 -0
  187. package/build/if-run/types/plugin-storage.js +3 -0
  188. package/build/if-run/types/process-args.d.ts +27 -0
  189. package/build/if-run/types/process-args.js +3 -0
  190. package/build/if-run/util/aggregation-helper.d.ts +6 -0
  191. package/build/if-run/util/aggregation-helper.js +52 -0
  192. package/build/if-run/util/args.d.ts +9 -0
  193. package/build/if-run/util/args.js +61 -0
  194. package/build/if-run/util/helpers.d.ts +8 -0
  195. package/build/if-run/util/helpers.js +37 -0
  196. package/build/if-run/util/log-memoize.d.ts +3 -0
  197. package/build/if-run/util/log-memoize.js +19 -0
  198. package/build/if-run/util/os-checker.d.ts +7 -0
  199. package/build/if-run/util/os-checker.js +97 -0
  200. package/build/if-run/util/plugin-storage.d.ts +14 -0
  201. package/build/if-run/util/plugin-storage.js +34 -0
  202. package/coverage/clover.xml +2045 -0
  203. package/coverage/coverage-final.json +55 -0
  204. package/coverage/lcov-report/base.css +224 -0
  205. package/coverage/lcov-report/block-navigation.js +87 -0
  206. package/coverage/lcov-report/builtins/coefficient/index.html +116 -0
  207. package/coverage/lcov-report/builtins/coefficient/index.ts.html +298 -0
  208. package/coverage/lcov-report/builtins/csv-lookup/index.html +116 -0
  209. package/coverage/lcov-report/builtins/csv-lookup/index.ts.html +826 -0
  210. package/coverage/lcov-report/builtins/divide/index.html +116 -0
  211. package/coverage/lcov-report/builtins/divide/index.ts.html +358 -0
  212. package/coverage/lcov-report/builtins/exponent/index.html +116 -0
  213. package/coverage/lcov-report/builtins/exponent/index.ts.html +361 -0
  214. package/coverage/lcov-report/builtins/export-csv-raw.ts.html +553 -0
  215. package/coverage/lcov-report/builtins/export-csv.ts.html +436 -0
  216. package/coverage/lcov-report/builtins/export-log.ts.html +148 -0
  217. package/coverage/lcov-report/builtins/export-yaml.ts.html +193 -0
  218. package/coverage/lcov-report/builtins/group-by.ts.html +370 -0
  219. package/coverage/lcov-report/builtins/index.html +206 -0
  220. package/coverage/lcov-report/builtins/index.ts.html +130 -0
  221. package/coverage/lcov-report/builtins/interpolation/index.html +116 -0
  222. package/coverage/lcov-report/builtins/interpolation/index.ts.html +676 -0
  223. package/coverage/lcov-report/builtins/interpolation/types.ts.html +100 -0
  224. package/coverage/lcov-report/builtins/mock-observations/helpers/common-generator.ts.html +184 -0
  225. package/coverage/lcov-report/builtins/mock-observations/helpers/index.html +131 -0
  226. package/coverage/lcov-report/builtins/mock-observations/helpers/rand-int-generator.ts.html +289 -0
  227. package/coverage/lcov-report/builtins/mock-observations/index.html +116 -0
  228. package/coverage/lcov-report/builtins/mock-observations/index.ts.html +619 -0
  229. package/coverage/lcov-report/builtins/multiply/index.html +116 -0
  230. package/coverage/lcov-report/builtins/multiply/index.ts.html +343 -0
  231. package/coverage/lcov-report/builtins/regex/index.html +116 -0
  232. package/coverage/lcov-report/builtins/regex/index.ts.html +373 -0
  233. package/coverage/lcov-report/builtins/sci/config.ts.html +205 -0
  234. package/coverage/lcov-report/builtins/sci/index.html +116 -0
  235. package/coverage/lcov-report/builtins/sci/index.ts.html +325 -0
  236. package/coverage/lcov-report/builtins/sci-embodied/index.html +116 -0
  237. package/coverage/lcov-report/builtins/sci-embodied/index.ts.html +478 -0
  238. package/coverage/lcov-report/builtins/shell/index.html +116 -0
  239. package/coverage/lcov-report/builtins/shell/index.ts.html +280 -0
  240. package/coverage/lcov-report/builtins/subtract/index.html +116 -0
  241. package/coverage/lcov-report/builtins/subtract/index.ts.html +379 -0
  242. package/coverage/lcov-report/builtins/sum/index.html +116 -0
  243. package/coverage/lcov-report/builtins/sum/index.ts.html +334 -0
  244. package/coverage/lcov-report/builtins/time-sync.ts.html +1462 -0
  245. package/coverage/lcov-report/common/config/index.html +131 -0
  246. package/coverage/lcov-report/common/config/index.ts.html +88 -0
  247. package/coverage/lcov-report/common/config/strings.ts.html +121 -0
  248. package/coverage/lcov-report/common/lib/index.html +116 -0
  249. package/coverage/lcov-report/common/lib/load.ts.html +139 -0
  250. package/coverage/lcov-report/common/util/debug-logger.ts.html +511 -0
  251. package/coverage/lcov-report/common/util/fs.ts.html +289 -0
  252. package/coverage/lcov-report/common/util/helpers.ts.html +280 -0
  253. package/coverage/lcov-report/common/util/index.html +191 -0
  254. package/coverage/lcov-report/common/util/logger.ts.html +151 -0
  255. package/coverage/lcov-report/common/util/validations.ts.html +613 -0
  256. package/coverage/lcov-report/common/util/yaml.ts.html +193 -0
  257. package/coverage/lcov-report/config/config.ts.html +463 -0
  258. package/coverage/lcov-report/config/index.html +161 -0
  259. package/coverage/lcov-report/config/index.ts.html +94 -0
  260. package/coverage/lcov-report/config/params.ts.html +697 -0
  261. package/coverage/lcov-report/config/strings.ts.html +490 -0
  262. package/coverage/lcov-report/favicon.png +0 -0
  263. package/coverage/lcov-report/if-check/config/config.ts.html +184 -0
  264. package/coverage/lcov-report/if-check/config/index.html +146 -0
  265. package/coverage/lcov-report/if-check/config/index.ts.html +91 -0
  266. package/coverage/lcov-report/if-check/config/strings.ts.html +142 -0
  267. package/coverage/lcov-report/if-check/util/args.ts.html +304 -0
  268. package/coverage/lcov-report/if-check/util/helpers.ts.html +136 -0
  269. package/coverage/lcov-report/if-check/util/index.html +146 -0
  270. package/coverage/lcov-report/if-check/util/npm.ts.html +232 -0
  271. package/coverage/lcov-report/if-csv/util/helpers.ts.html +346 -0
  272. package/coverage/lcov-report/if-csv/util/index.html +116 -0
  273. package/coverage/lcov-report/if-diff/config/config.ts.html +184 -0
  274. package/coverage/lcov-report/if-diff/config/index.html +146 -0
  275. package/coverage/lcov-report/if-diff/config/index.ts.html +91 -0
  276. package/coverage/lcov-report/if-diff/config/strings.ts.html +100 -0
  277. package/coverage/lcov-report/if-diff/lib/compare.ts.html +286 -0
  278. package/coverage/lcov-report/if-diff/lib/index.html +131 -0
  279. package/coverage/lcov-report/if-diff/lib/load.ts.html +199 -0
  280. package/coverage/lcov-report/if-diff/util/args.ts.html +268 -0
  281. package/coverage/lcov-report/if-diff/util/helpers.ts.html +337 -0
  282. package/coverage/lcov-report/if-diff/util/index.html +131 -0
  283. package/coverage/lcov-report/if-env/config/config.ts.html +211 -0
  284. package/coverage/lcov-report/if-env/config/index.html +146 -0
  285. package/coverage/lcov-report/if-env/config/index.ts.html +91 -0
  286. package/coverage/lcov-report/if-env/config/strings.ts.html +109 -0
  287. package/coverage/lcov-report/if-env/util/args.ts.html +250 -0
  288. package/coverage/lcov-report/if-env/util/index.html +131 -0
  289. package/coverage/lcov-report/if-env/util/npm.ts.html +526 -0
  290. package/coverage/lcov-report/if-merge/util/args.ts.html +295 -0
  291. package/coverage/lcov-report/if-merge/util/helpers.ts.html +301 -0
  292. package/coverage/lcov-report/if-merge/util/index.html +131 -0
  293. package/coverage/lcov-report/if-run/builtins/coefficient/index.html +116 -0
  294. package/coverage/lcov-report/if-run/builtins/coefficient/index.ts.html +382 -0
  295. package/coverage/lcov-report/if-run/builtins/copy-param/index.html +116 -0
  296. package/coverage/lcov-report/if-run/builtins/copy-param/index.ts.html +415 -0
  297. package/coverage/lcov-report/if-run/builtins/csv-lookup/index.html +116 -0
  298. package/coverage/lcov-report/if-run/builtins/csv-lookup/index.ts.html +868 -0
  299. package/coverage/lcov-report/if-run/builtins/divide/index.html +116 -0
  300. package/coverage/lcov-report/if-run/builtins/divide/index.ts.html +469 -0
  301. package/coverage/lcov-report/if-run/builtins/exponent/index.html +116 -0
  302. package/coverage/lcov-report/if-run/builtins/exponent/index.ts.html +394 -0
  303. package/coverage/lcov-report/if-run/builtins/export-csv-raw.ts.html +553 -0
  304. package/coverage/lcov-report/if-run/builtins/export-csv.ts.html +436 -0
  305. package/coverage/lcov-report/if-run/builtins/export-log.ts.html +148 -0
  306. package/coverage/lcov-report/if-run/builtins/export-yaml.ts.html +193 -0
  307. package/coverage/lcov-report/if-run/builtins/group-by.ts.html +370 -0
  308. package/coverage/lcov-report/if-run/builtins/index.html +146 -0
  309. package/coverage/lcov-report/if-run/builtins/index.ts.html +133 -0
  310. package/coverage/lcov-report/if-run/builtins/interpolation/index.html +116 -0
  311. package/coverage/lcov-report/if-run/builtins/interpolation/index.ts.html +709 -0
  312. package/coverage/lcov-report/if-run/builtins/mock-observations/helpers/common-generator.ts.html +184 -0
  313. package/coverage/lcov-report/if-run/builtins/mock-observations/helpers/index.html +131 -0
  314. package/coverage/lcov-report/if-run/builtins/mock-observations/helpers/rand-int-generator.ts.html +289 -0
  315. package/coverage/lcov-report/if-run/builtins/mock-observations/index.html +116 -0
  316. package/coverage/lcov-report/if-run/builtins/mock-observations/index.ts.html +709 -0
  317. package/coverage/lcov-report/if-run/builtins/multiply/index.html +116 -0
  318. package/coverage/lcov-report/if-run/builtins/multiply/index.ts.html +406 -0
  319. package/coverage/lcov-report/if-run/builtins/regex/index.html +116 -0
  320. package/coverage/lcov-report/if-run/builtins/regex/index.ts.html +433 -0
  321. package/coverage/lcov-report/if-run/builtins/sci/index.html +116 -0
  322. package/coverage/lcov-report/if-run/builtins/sci/index.ts.html +502 -0
  323. package/coverage/lcov-report/if-run/builtins/sci-embodied/index.html +116 -0
  324. package/coverage/lcov-report/if-run/builtins/sci-embodied/index.ts.html +577 -0
  325. package/coverage/lcov-report/if-run/builtins/shell/index.html +116 -0
  326. package/coverage/lcov-report/if-run/builtins/shell/index.ts.html +343 -0
  327. package/coverage/lcov-report/if-run/builtins/subtract/index.html +116 -0
  328. package/coverage/lcov-report/if-run/builtins/subtract/index.ts.html +418 -0
  329. package/coverage/lcov-report/if-run/builtins/sum/index.html +116 -0
  330. package/coverage/lcov-report/if-run/builtins/sum/index.ts.html +400 -0
  331. package/coverage/lcov-report/if-run/builtins/time-converter/config.ts.html +205 -0
  332. package/coverage/lcov-report/if-run/builtins/time-converter/index.html +131 -0
  333. package/coverage/lcov-report/if-run/builtins/time-converter/index.ts.html +412 -0
  334. package/coverage/lcov-report/if-run/builtins/time-sync/index.html +116 -0
  335. package/coverage/lcov-report/if-run/builtins/time-sync/index.ts.html +1651 -0
  336. package/coverage/lcov-report/if-run/builtins/time-sync.ts.html +1462 -0
  337. package/coverage/lcov-report/if-run/config/config.ts.html +271 -0
  338. package/coverage/lcov-report/if-run/config/index.html +161 -0
  339. package/coverage/lcov-report/if-run/config/index.ts.html +94 -0
  340. package/coverage/lcov-report/if-run/config/params.ts.html +679 -0
  341. package/coverage/lcov-report/if-run/config/strings.ts.html +460 -0
  342. package/coverage/lcov-report/if-run/lib/aggregate.ts.html +580 -0
  343. package/coverage/lcov-report/if-run/lib/compute.ts.html +709 -0
  344. package/coverage/lcov-report/if-run/lib/environment.ts.html +373 -0
  345. package/coverage/lcov-report/if-run/lib/exhaust.ts.html +193 -0
  346. package/coverage/lcov-report/if-run/lib/explain.ts.html +217 -0
  347. package/coverage/lcov-report/if-run/lib/index.html +206 -0
  348. package/coverage/lcov-report/if-run/lib/initialize.ts.html +475 -0
  349. package/coverage/lcov-report/if-run/lib/parameterize.ts.html +322 -0
  350. package/coverage/lcov-report/if-run/lib/regroup.ts.html +325 -0
  351. package/coverage/lcov-report/if-run/lib/time-sync.ts.html +1510 -0
  352. package/coverage/lcov-report/if-run/types/aggregation.ts.html +94 -0
  353. package/coverage/lcov-report/if-run/types/index.html +146 -0
  354. package/coverage/lcov-report/if-run/types/interface.ts.html +112 -0
  355. package/coverage/lcov-report/if-run/types/parameters.ts.html +106 -0
  356. package/coverage/lcov-report/if-run/util/aggregation-helper.ts.html +280 -0
  357. package/coverage/lcov-report/if-run/util/args.ts.html +313 -0
  358. package/coverage/lcov-report/if-run/util/helpers.ts.html +304 -0
  359. package/coverage/lcov-report/if-run/util/index.html +191 -0
  360. package/coverage/lcov-report/if-run/util/json.ts.html +115 -0
  361. package/coverage/lcov-report/if-run/util/log-memoize.ts.html +145 -0
  362. package/coverage/lcov-report/if-run/util/os-checker.ts.html +421 -0
  363. package/coverage/lcov-report/if-run/util/plugin-storage.ts.html +202 -0
  364. package/coverage/lcov-report/index.html +521 -0
  365. package/coverage/lcov-report/lib/aggregate.ts.html +358 -0
  366. package/coverage/lcov-report/lib/compare.ts.html +286 -0
  367. package/coverage/lcov-report/lib/compute.ts.html +436 -0
  368. package/coverage/lcov-report/lib/environment.ts.html +376 -0
  369. package/coverage/lcov-report/lib/exhaust.ts.html +289 -0
  370. package/coverage/lcov-report/lib/index.html +221 -0
  371. package/coverage/lcov-report/lib/initialize.ts.html +430 -0
  372. package/coverage/lcov-report/lib/load.ts.html +268 -0
  373. package/coverage/lcov-report/lib/parameterize.ts.html +316 -0
  374. package/coverage/lcov-report/prettify.css +1 -0
  375. package/coverage/lcov-report/prettify.js +2 -0
  376. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  377. package/coverage/lcov-report/sorter.js +196 -0
  378. package/coverage/lcov-report/types/aggregation.ts.html +94 -0
  379. package/coverage/lcov-report/types/index.html +146 -0
  380. package/coverage/lcov-report/types/interface.ts.html +112 -0
  381. package/coverage/lcov-report/types/parameters.ts.html +106 -0
  382. package/coverage/lcov-report/util/aggregation-helper.ts.html +289 -0
  383. package/coverage/lcov-report/util/args.ts.html +649 -0
  384. package/coverage/lcov-report/util/debug-logger.ts.html +481 -0
  385. package/coverage/lcov-report/util/errors.ts.html +232 -0
  386. package/coverage/lcov-report/util/fs.ts.html +124 -0
  387. package/coverage/lcov-report/util/helpers.ts.html +895 -0
  388. package/coverage/lcov-report/util/index.html +296 -0
  389. package/coverage/lcov-report/util/json.ts.html +115 -0
  390. package/coverage/lcov-report/util/log-memoize.ts.html +145 -0
  391. package/coverage/lcov-report/util/logger.ts.html +151 -0
  392. package/coverage/lcov-report/util/npm.ts.html +499 -0
  393. package/coverage/lcov-report/util/os-checker.ts.html +421 -0
  394. package/coverage/lcov-report/util/plugin-storage.ts.html +202 -0
  395. package/coverage/lcov-report/util/validations.ts.html +544 -0
  396. package/coverage/lcov-report/util/yaml.ts.html +193 -0
  397. package/coverage/lcov.info +3392 -0
  398. package/manifests/outputs/features/regroup/test.yml +92 -0
  399. package/package.json +9 -8
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimeConverter = void 0;
4
+ const zod_1 = require("zod");
5
+ const interfaces_1 = require("@grnsft/if-core/interfaces");
6
+ const utils_1 = require("@grnsft/if-core/utils");
7
+ const validations_1 = require("../../../common/util/validations");
8
+ const config_1 = require("./config");
9
+ const config_2 = require("../../config");
10
+ const { ConfigError } = utils_1.ERRORS;
11
+ const { MISSING_CONFIG } = config_2.STRINGS;
12
+ exports.TimeConverter = (0, interfaces_1.PluginFactory)({
13
+ configValidation: (config) => {
14
+ if (!config || !Object.keys(config)?.length) {
15
+ throw new ConfigError(MISSING_CONFIG);
16
+ }
17
+ const timeUnitsValues = Object.keys(config_1.TIME_UNITS_IN_SECONDS);
18
+ const originalTimeUnitValuesWithDuration = [
19
+ 'duration',
20
+ ...timeUnitsValues,
21
+ ];
22
+ const originalTimeUnitValues = timeUnitsValues;
23
+ const configSchema = zod_1.z.object({
24
+ 'input-parameter': zod_1.z.string(),
25
+ 'original-time-unit': zod_1.z.enum(originalTimeUnitValues),
26
+ 'new-time-unit': zod_1.z.enum(originalTimeUnitValuesWithDuration),
27
+ 'output-parameter': zod_1.z.string().min(1),
28
+ });
29
+ return (0, validations_1.validate)(configSchema, config);
30
+ },
31
+ inputValidation: (input, config) => {
32
+ const inputParameter = config['input-parameter'];
33
+ const schema = zod_1.z.object({
34
+ duration: zod_1.z.number().gte(1),
35
+ [inputParameter]: zod_1.z.number(),
36
+ });
37
+ return (0, validations_1.validate)(schema, input);
38
+ },
39
+ implementation: async (inputs, config) => {
40
+ const outputParameter = config['output-parameter'];
41
+ return inputs.map(input => ({
42
+ ...input,
43
+ [outputParameter]: calculateEnergy(input, config),
44
+ }));
45
+ },
46
+ allowArithmeticExpressions: ['input-parameter'],
47
+ });
48
+ /**
49
+ * Calculates the energy for given period.
50
+ */
51
+ const calculateEnergy = (input, config) => {
52
+ const { 'original-time-unit': originalTimeUnit, 'input-parameter': inputParameter, 'new-time-unit': newTimeUnit, } = config;
53
+ const originalTimeUnitInSeoncds = config_1.TIME_UNITS_IN_SECONDS[originalTimeUnit];
54
+ const energyPerPeriod = isNaN(Number(inputParameter))
55
+ ? input[inputParameter]
56
+ : inputParameter;
57
+ const timeUnit = newTimeUnit === 'duration'
58
+ ? input.duration
59
+ : config_1.TIME_UNITS_IN_SECONDS[newTimeUnit];
60
+ const result = (energyPerPeriod / originalTimeUnitInSeoncds) * timeUnit;
61
+ return Number(result.toFixed(6));
62
+ };
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3RpbWUtY29udmVydGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUFzQjtBQUd0QiwyREFBeUQ7QUFDekQsaURBQTZDO0FBRTdDLGtFQUEwRDtBQUUxRCxxQ0FBK0M7QUFFL0MseUNBQXFDO0FBRXJDLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFDN0IsTUFBTSxFQUFDLGNBQWMsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFFcEIsUUFBQSxhQUFhLEdBQUcsSUFBQSwwQkFBYSxFQUFDO0lBQ3pDLGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBRSxFQUFFO1FBQ3pDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUMzQyxNQUFNLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBcUIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sa0NBQWtDLEdBQUc7WUFDekMsVUFBVTtZQUNWLEdBQUcsZUFBZTtTQUNWLENBQUM7UUFDWCxNQUFNLHNCQUFzQixHQUFHLGVBQXdDLENBQUM7UUFFeEUsTUFBTSxZQUFZLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUM1QixpQkFBaUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1lBQzdCLG9CQUFvQixFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDcEQsZUFBZSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUM7WUFDM0Qsa0JBQWtCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFBLHNCQUFRLEVBQStCLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsZUFBZSxFQUFFLENBQUMsS0FBbUIsRUFBRSxNQUFvQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFakQsTUFBTSxNQUFNLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN0QixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO1NBQzdCLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBQSxzQkFBUSxFQUF5QixNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBc0IsRUFBRSxNQUFvQixFQUFFLEVBQUU7UUFDckUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFbkQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixHQUFHLEtBQUs7WUFDUixDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1NBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELDBCQUEwQixFQUFFLENBQUMsaUJBQWlCLENBQUM7Q0FDaEQsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQW1CLEVBQUUsTUFBb0IsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sRUFDSixvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDdEMsaUJBQWlCLEVBQUUsY0FBYyxFQUNqQyxlQUFlLEVBQUUsV0FBVyxHQUM3QixHQUFHLE1BQU0sQ0FBQztJQUVYLE1BQU0seUJBQXlCLEdBQUcsOEJBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxRSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDbkIsTUFBTSxRQUFRLEdBQ1osV0FBVyxLQUFLLFVBQVU7UUFDeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRO1FBQ2hCLENBQUMsQ0FBQyw4QkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV6QyxNQUFNLE1BQU0sR0FBRyxDQUFDLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUV4RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuXG5pbXBvcnQge1BsdWdpblBhcmFtcywgQ29uZmlnUGFyYW1zfSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdHlwZXMnO1xuaW1wb3J0IHtQbHVnaW5GYWN0b3J5fSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQge0VSUk9SU30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcblxuaW1wb3J0IHt2YWxpZGF0ZX0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3V0aWwvdmFsaWRhdGlvbnMnO1xuXG5pbXBvcnQge1RJTUVfVU5JVFNfSU5fU0VDT05EU30gZnJvbSAnLi9jb25maWcnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmNvbnN0IHtDb25maWdFcnJvcn0gPSBFUlJPUlM7XG5jb25zdCB7TUlTU0lOR19DT05GSUd9ID0gU1RSSU5HUztcblxuZXhwb3J0IGNvbnN0IFRpbWVDb252ZXJ0ZXIgPSBQbHVnaW5GYWN0b3J5KHtcbiAgY29uZmlnVmFsaWRhdGlvbjogKGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gICAgaWYgKCFjb25maWcgfHwgIU9iamVjdC5rZXlzKGNvbmZpZyk/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKE1JU1NJTkdfQ09ORklHKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lVW5pdHNWYWx1ZXMgPSBPYmplY3Qua2V5cyhUSU1FX1VOSVRTX0lOX1NFQ09ORFMpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGltZVVuaXRWYWx1ZXNXaXRoRHVyYXRpb24gPSBbXG4gICAgICAnZHVyYXRpb24nLFxuICAgICAgLi4udGltZVVuaXRzVmFsdWVzLFxuICAgIF0gYXMgY29uc3Q7XG4gICAgY29uc3Qgb3JpZ2luYWxUaW1lVW5pdFZhbHVlcyA9IHRpbWVVbml0c1ZhbHVlcyBhcyBbc3RyaW5nLCAuLi5zdHJpbmdbXV07XG5cbiAgICBjb25zdCBjb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICAnaW5wdXQtcGFyYW1ldGVyJzogei5zdHJpbmcoKSxcbiAgICAgICdvcmlnaW5hbC10aW1lLXVuaXQnOiB6LmVudW0ob3JpZ2luYWxUaW1lVW5pdFZhbHVlcyksXG4gICAgICAnbmV3LXRpbWUtdW5pdCc6IHouZW51bShvcmlnaW5hbFRpbWVVbml0VmFsdWVzV2l0aER1cmF0aW9uKSxcbiAgICAgICdvdXRwdXQtcGFyYW1ldGVyJzogei5zdHJpbmcoKS5taW4oMSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2YgY29uZmlnU2NoZW1hPj4oY29uZmlnU2NoZW1hLCBjb25maWcpO1xuICB9LFxuICBpbnB1dFZhbGlkYXRpb246IChpbnB1dDogUGx1Z2luUGFyYW1zLCBjb25maWc6IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIGNvbnN0IGlucHV0UGFyYW1ldGVyID0gY29uZmlnWydpbnB1dC1wYXJhbWV0ZXInXTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICAgIGR1cmF0aW9uOiB6Lm51bWJlcigpLmd0ZSgxKSxcbiAgICAgIFtpbnB1dFBhcmFtZXRlcl06IHoubnVtYmVyKCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2Ygc2NoZW1hPj4oc2NoZW1hLCBpbnB1dCk7XG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSwgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgICBjb25zdCBvdXRwdXRQYXJhbWV0ZXIgPSBjb25maWdbJ291dHB1dC1wYXJhbWV0ZXInXTtcblxuICAgIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+ICh7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIFtvdXRwdXRQYXJhbWV0ZXJdOiBjYWxjdWxhdGVFbmVyZ3koaW5wdXQsIGNvbmZpZyksXG4gICAgfSkpO1xuICB9LFxuICBhbGxvd0FyaXRobWV0aWNFeHByZXNzaW9uczogWydpbnB1dC1wYXJhbWV0ZXInXSxcbn0pO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGVuZXJneSBmb3IgZ2l2ZW4gcGVyaW9kLlxuICovXG5jb25zdCBjYWxjdWxhdGVFbmVyZ3kgPSAoaW5wdXQ6IFBsdWdpblBhcmFtcywgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgY29uc3Qge1xuICAgICdvcmlnaW5hbC10aW1lLXVuaXQnOiBvcmlnaW5hbFRpbWVVbml0LFxuICAgICdpbnB1dC1wYXJhbWV0ZXInOiBpbnB1dFBhcmFtZXRlcixcbiAgICAnbmV3LXRpbWUtdW5pdCc6IG5ld1RpbWVVbml0LFxuICB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IG9yaWdpbmFsVGltZVVuaXRJblNlb25jZHMgPSBUSU1FX1VOSVRTX0lOX1NFQ09ORFNbb3JpZ2luYWxUaW1lVW5pdF07XG4gIGNvbnN0IGVuZXJneVBlclBlcmlvZCA9IGlzTmFOKE51bWJlcihpbnB1dFBhcmFtZXRlcikpXG4gICAgPyBpbnB1dFtpbnB1dFBhcmFtZXRlcl1cbiAgICA6IGlucHV0UGFyYW1ldGVyO1xuICBjb25zdCB0aW1lVW5pdCA9XG4gICAgbmV3VGltZVVuaXQgPT09ICdkdXJhdGlvbidcbiAgICAgID8gaW5wdXQuZHVyYXRpb25cbiAgICAgIDogVElNRV9VTklUU19JTl9TRUNPTkRTW25ld1RpbWVVbml0XTtcblxuICBjb25zdCByZXN1bHQgPSAoZW5lcmd5UGVyUGVyaW9kIC8gb3JpZ2luYWxUaW1lVW5pdEluU2VvbmNkcykgKiB0aW1lVW5pdDtcblxuICByZXR1cm4gTnVtYmVyKHJlc3VsdC50b0ZpeGVkKDYpKTtcbn07XG4iXX0=
@@ -0,0 +1,31 @@
1
+ import { PluginParams, MappingParams, TimeNormalizerConfig } from '@grnsft/if-core/types';
2
+ /**
3
+ * Time synchronization plugin converted into framework integrated tool.
4
+ * It can't be requested in `initialize.plugins` section anymore. Instead describe configuration in context.
5
+ * @example
6
+ * ```yaml
7
+ * name: time-sync
8
+ * description: sample in time sync lib
9
+ * tags: sample, time, sync
10
+ * time-sync:
11
+ * start-time: '2023-12-12T00:00:00.000Z'
12
+ * end-time: '2023-12-12T00:01:00.000Z'
13
+ * interval: 5
14
+ * allow-padding: true
15
+ * ```
16
+ */
17
+ export declare const TimeSync: (config: TimeNormalizerConfig | undefined, parametersMetadata: import("@grnsft/if-core/types").PluginParametersMetadata, mapping: MappingParams) => {
18
+ metadata: {
19
+ inputs: {
20
+ [x: string]: {
21
+ description: string;
22
+ unit: string;
23
+ 'aggregation-method': import("@grnsft/if-core/types").AggregationOptions;
24
+ };
25
+ };
26
+ outputs: import("@grnsft/if-core/types").ParameterMetadata;
27
+ };
28
+ execute: (inputs: PluginParams[]) => Promise<{
29
+ [x: string]: any;
30
+ }[]>;
31
+ };
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimeSync = void 0;
4
+ const types_1 = require("node:util/types");
5
+ const luxon_1 = require("luxon");
6
+ const zod_1 = require("zod");
7
+ const utils_1 = require("@grnsft/if-core/utils");
8
+ const validations_1 = require("../../../common/util/validations");
9
+ const config_1 = require("../../config");
10
+ const aggregate_1 = require("../../lib/aggregate");
11
+ const interfaces_1 = require("@grnsft/if-core/interfaces");
12
+ luxon_1.Settings.defaultZone = 'utc';
13
+ const { ConfigError, InvalidDateInInputError, InvalidPaddingError, InvalidInputError, } = utils_1.ERRORS;
14
+ const { INCOMPATIBLE_RESOLUTION_WITH_INTERVAL, INCOMPATIBLE_RESOLUTION_WITH_GAPS, INCOMPATIBLE_RESOLUTION_WITH_INPUTS, INVALID_OBSERVATION_OVERLAP, AVOIDING_PADDING_BY_EDGES, INVALID_DATE_TYPE, START_LOWER_END, MISSING_CONFIG, } = config_1.STRINGS;
15
+ /**
16
+ * Time synchronization plugin converted into framework integrated tool.
17
+ * It can't be requested in `initialize.plugins` section anymore. Instead describe configuration in context.
18
+ * @example
19
+ * ```yaml
20
+ * name: time-sync
21
+ * description: sample in time sync lib
22
+ * tags: sample, time, sync
23
+ * time-sync:
24
+ * start-time: '2023-12-12T00:00:00.000Z'
25
+ * end-time: '2023-12-12T00:01:00.000Z'
26
+ * interval: 5
27
+ * allow-padding: true
28
+ * ```
29
+ */
30
+ exports.TimeSync = (0, interfaces_1.PluginFactory)({
31
+ metadata: {
32
+ inputs: {
33
+ timestamp: {
34
+ description: 'refers to the time of occurrence of the input',
35
+ unit: 'RFC3339',
36
+ 'aggregation-method': {
37
+ time: 'none',
38
+ component: 'none',
39
+ },
40
+ },
41
+ duration: {
42
+ description: 'refers to the duration of the input',
43
+ unit: 'seconds',
44
+ 'aggregation-method': {
45
+ time: 'sum',
46
+ component: 'none',
47
+ },
48
+ },
49
+ },
50
+ },
51
+ configValidation: (config) => {
52
+ if (!config || !Object.keys(config)?.length) {
53
+ throw new ConfigError(MISSING_CONFIG);
54
+ }
55
+ const schema = zod_1.z
56
+ .object({
57
+ 'start-time': zod_1.z.string().datetime(),
58
+ 'end-time': zod_1.z.string().datetime(),
59
+ interval: zod_1.z.number(),
60
+ 'allow-padding': zod_1.z.boolean(),
61
+ 'upsampling-resolution': zod_1.z.number().min(1).optional(),
62
+ })
63
+ .refine(data => data['start-time'] < data['end-time'], {
64
+ message: START_LOWER_END,
65
+ });
66
+ return (0, validations_1.validate)(schema, config);
67
+ },
68
+ inputValidation: (input, _config, index) => {
69
+ const schema = zod_1.z.object({
70
+ timestamp: zod_1.z.string().datetime({}).or(zod_1.z.date()),
71
+ duration: zod_1.z.number(),
72
+ });
73
+ return (0, validations_1.validate)(schema, input, index);
74
+ },
75
+ implementation: async (inputs, config, mapping) => {
76
+ /**
77
+ * Checks if a given duration is compatible with a given timeStep. If not, throws an error
78
+ */
79
+ const validateIntervalForResample = (duration, timeStep, errorMessage) => {
80
+ if (duration % timeStep !== 0) {
81
+ throw new ConfigError(errorMessage);
82
+ }
83
+ };
84
+ /**
85
+ * Dates are passed to `time-sync` both in ISO 8601 format
86
+ * and as a Date object (from the deserialization of a YAML file).
87
+ * If the YAML parser fails to identify as a date, it passes as a string.
88
+ */
89
+ const parseDate = (date) => {
90
+ if (!date) {
91
+ return luxon_1.DateTime.invalid('Invalid date');
92
+ }
93
+ if ((0, types_1.isDate)(date)) {
94
+ return luxon_1.DateTime.fromJSDate(date);
95
+ }
96
+ if (typeof date === 'string') {
97
+ return luxon_1.DateTime.fromISO(date);
98
+ }
99
+ throw new InvalidDateInInputError(INVALID_DATE_TYPE(date));
100
+ };
101
+ /**
102
+ * Calculates minimal factor.
103
+ */
104
+ const convertPerInterval = (value, duration, timeStep) => {
105
+ const samplesNumber = duration / timeStep;
106
+ return value / samplesNumber;
107
+ };
108
+ /**
109
+ * Normalize time per given second.
110
+ */
111
+ const normalizeTimePerSecond = (currentRoundMoment, i) => {
112
+ const thisMoment = parseDate(currentRoundMoment).startOf('second');
113
+ return thisMoment.plus({ seconds: i });
114
+ };
115
+ /**
116
+ * Breaks down input per minimal time unit.
117
+ */
118
+ const breakDownInput = (input, i, params) => {
119
+ const metrics = Object.keys(input);
120
+ const timeStep = params.upsamplingResolution;
121
+ return metrics.reduce((acc, metric) => {
122
+ const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
123
+ if (metric === 'timestamp') {
124
+ const perSecond = normalizeTimePerSecond(input.timestamp, i);
125
+ acc[metric] = perSecond.toUTC().toISO() ?? '';
126
+ return acc;
127
+ }
128
+ if (metric === 'duration') {
129
+ acc[metric] = timeStep;
130
+ return acc;
131
+ }
132
+ if (aggregationParams.time === 'none') {
133
+ acc[metric] = null;
134
+ return acc;
135
+ }
136
+ acc[metric] =
137
+ aggregationParams.time === 'sum'
138
+ ? convertPerInterval(input[metric], input['duration'], timeStep)
139
+ : input[metric];
140
+ return acc;
141
+ }, {});
142
+ };
143
+ /**
144
+ * Populates object to fill the gaps in observational timeline using zeroish values.
145
+ */
146
+ const fillWithZeroishInput = (input, missingTimestamp, timeStep) => {
147
+ const metrics = Object.keys(input);
148
+ return metrics.reduce((acc, metric) => {
149
+ if (metric === 'timestamp') {
150
+ acc[metric] =
151
+ missingTimestamp.startOf('second').toUTC().toISO() ?? '';
152
+ return acc;
153
+ }
154
+ if (metric === 'duration') {
155
+ acc[metric] = timeStep;
156
+ return acc;
157
+ }
158
+ if (metric === 'time-reserved' ||
159
+ (mapping &&
160
+ mapping['time-reserved'] &&
161
+ metric === mapping['time-reserved'])) {
162
+ acc[metric] = acc['duration'];
163
+ return acc;
164
+ }
165
+ const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
166
+ if (aggregationParams.time === 'none') {
167
+ acc[metric] = null;
168
+ return acc;
169
+ }
170
+ if (aggregationParams.time === 'avg' ||
171
+ aggregationParams.time === 'sum') {
172
+ acc[metric] = 0;
173
+ return acc;
174
+ }
175
+ if (aggregationParams.time === 'copy') {
176
+ acc[metric] = input[metric];
177
+ return acc;
178
+ }
179
+ return acc;
180
+ }, {});
181
+ };
182
+ /**
183
+ * Checks if `error on padding` is enabled and padding is needed. If so, then throws error.
184
+ */
185
+ const validatePadding = (pad, params) => {
186
+ const { start, end } = pad;
187
+ const isPaddingNeeded = start || end;
188
+ if (!params.allowPadding && isPaddingNeeded) {
189
+ throw new InvalidPaddingError(AVOIDING_PADDING_BY_EDGES(start, end));
190
+ }
191
+ };
192
+ /**
193
+ * Checks if padding is needed either at start of the timeline or the end and returns status.
194
+ */
195
+ const checkForPadding = (inputs, params) => {
196
+ const startDiffInSeconds = parseDate(inputs[0].timestamp)
197
+ .diff(params.startTime)
198
+ .as('seconds');
199
+ const lastInput = inputs[inputs.length - 1];
200
+ const endDiffInSeconds = parseDate(lastInput.timestamp)
201
+ .plus({ second: eval(lastInput.duration) })
202
+ .diff(params.endTime)
203
+ .as('seconds');
204
+ return {
205
+ start: startDiffInSeconds > 0,
206
+ end: endDiffInSeconds < 0,
207
+ };
208
+ };
209
+ /**
210
+ * Iterates over given inputs frame, meanwhile checking if aggregation method is `sum`, then calculates it.
211
+ * For methods is `avg` and `none` calculating average of the frame.
212
+ */
213
+ const resampleInputFrame = (inputsInTimeslot) => inputsInTimeslot.reduce((acc, input, index, inputs) => {
214
+ const metrics = Object.keys(input);
215
+ metrics.forEach(metric => {
216
+ const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
217
+ if (metric === 'timestamp') {
218
+ acc[metric] = inputs[0][metric];
219
+ return;
220
+ }
221
+ if (metric === 'duration') {
222
+ aggregationParams.time = 'sum';
223
+ }
224
+ if (aggregationParams.time === 'none') {
225
+ acc[metric] = null;
226
+ return;
227
+ }
228
+ acc[metric] = acc[metric] ?? 0;
229
+ if (aggregationParams.time === 'sum') {
230
+ acc[metric] += input[metric];
231
+ return;
232
+ }
233
+ if (aggregationParams.time === 'copy') {
234
+ acc[metric] = input[metric];
235
+ return;
236
+ }
237
+ /**
238
+ * If timeslot contains records more than one, then divide each metric by the timeslot length,
239
+ * so that their sum yields the timeslot average.
240
+ */
241
+ if (inputsInTimeslot.length > 1 &&
242
+ index === inputsInTimeslot.length - 1) {
243
+ acc[metric] /= inputsInTimeslot.length;
244
+ return;
245
+ }
246
+ acc[metric] += input[metric];
247
+ });
248
+ return acc;
249
+ }, {});
250
+ /**
251
+ * Takes each array frame with interval length, then aggregating them together as from units.yaml file.
252
+ */
253
+ const resampleInputs = (inputs, params) => inputs.reduce((acc, _input, index, inputs) => {
254
+ const frameStart = (index * params.interval) / params.upsamplingResolution;
255
+ const frameEnd = ((index + 1) * params.interval) / params.upsamplingResolution;
256
+ const inputsFrame = inputs.slice(frameStart, frameEnd);
257
+ const resampledInput = resampleInputFrame(inputsFrame);
258
+ /** Checks if resampled input is not empty, then includes in result. */
259
+ if (Object.keys(resampledInput).length > 0) {
260
+ acc.push(resampledInput);
261
+ }
262
+ return acc;
263
+ }, []);
264
+ /**
265
+ * Pads zeroish inputs from the beginning or at the end of the inputs if needed.
266
+ */
267
+ const padInputs = (inputs, pad, params) => {
268
+ const { start, end } = pad;
269
+ const paddedFromBeginning = [];
270
+ if (start) {
271
+ paddedFromBeginning.push(...getZeroishInputPerSecondBetweenRange({
272
+ startDate: params.startTime,
273
+ endDate: parseDate(inputs[0].timestamp),
274
+ timeStep: params.upsamplingResolution,
275
+ }, inputs[0]));
276
+ }
277
+ const paddedArray = paddedFromBeginning.concat(inputs);
278
+ if (end) {
279
+ const lastInput = inputs[inputs.length - 1];
280
+ const lastInputEnd = parseDate(lastInput.timestamp).plus({
281
+ seconds: eval(lastInput.duration),
282
+ });
283
+ paddedArray.push(...getZeroishInputPerSecondBetweenRange({
284
+ startDate: lastInputEnd,
285
+ endDate: params.endTime,
286
+ timeStep: params.upsamplingResolution,
287
+ }, lastInput));
288
+ }
289
+ return paddedArray;
290
+ };
291
+ /**
292
+ * Brakes down the given range by 1 second, and generates zeroish values.
293
+ */
294
+ const getZeroishInputPerSecondBetweenRange = (params, input) => {
295
+ const array = [];
296
+ validateIntervalForResample(params.endDate.diff(params.startDate).as('seconds'), params.timeStep, INCOMPATIBLE_RESOLUTION_WITH_GAPS);
297
+ const dateRange = luxon_1.Interval.fromDateTimes(params.startDate, params.endDate);
298
+ for (const interval of dateRange.splitBy({ second: params.timeStep })) {
299
+ array.push(fillWithZeroishInput(input,
300
+ // as far as I can tell, start will never be null
301
+ // because if we pass an invalid start/endDate to
302
+ // Interval, we get a zero length array as the range
303
+ interval.start || luxon_1.DateTime.invalid('not expected - start is null'), params.timeStep));
304
+ }
305
+ return array;
306
+ };
307
+ /*
308
+ * Checks if input's timestamp is included in global specified period then leaves it, otherwise.
309
+ */
310
+ const trimInputsByGlobalTimeline = (inputs, params) => inputs.reduce((acc, item) => {
311
+ const { timestamp } = item;
312
+ if (parseDate(timestamp) >= params.startTime &&
313
+ parseDate(timestamp) <= params.endTime) {
314
+ acc.push(item);
315
+ }
316
+ return acc;
317
+ }, []);
318
+ /** Implementation */
319
+ const timeParams = {
320
+ startTime: luxon_1.DateTime.fromISO(config['start-time']),
321
+ endTime: luxon_1.DateTime.fromISO(config['end-time']),
322
+ interval: config.interval,
323
+ allowPadding: config['allow-padding'],
324
+ upsamplingResolution: config['upsampling-resolution']
325
+ ? config['upsampling-resolution']
326
+ : 1,
327
+ };
328
+ validateIntervalForResample(timeParams.interval, timeParams.upsamplingResolution, INCOMPATIBLE_RESOLUTION_WITH_INTERVAL);
329
+ const pad = checkForPadding(inputs, timeParams);
330
+ validatePadding(pad, timeParams);
331
+ const paddedInputs = padInputs(inputs, pad, timeParams);
332
+ const flattenInputs = paddedInputs.reduce((acc, input, index) => {
333
+ const currentMoment = parseDate(input.timestamp);
334
+ /** Checks if not the first input, then check consistency with previous ones. */
335
+ if (index > 0) {
336
+ const previousInput = paddedInputs[index - 1];
337
+ const previousInputTimestamp = parseDate(previousInput.timestamp);
338
+ /** Checks for timestamps overlap. */
339
+ if (parseDate(previousInput.timestamp).plus({
340
+ seconds: eval(previousInput.duration),
341
+ }) > currentMoment) {
342
+ throw new InvalidInputError(INVALID_OBSERVATION_OVERLAP);
343
+ }
344
+ const compareableTime = previousInputTimestamp.plus({
345
+ seconds: eval(previousInput.duration),
346
+ });
347
+ const timelineGapSize = currentMoment
348
+ .diff(compareableTime)
349
+ .as('seconds');
350
+ validateIntervalForResample(input.duration, timeParams.upsamplingResolution, INCOMPATIBLE_RESOLUTION_WITH_INPUTS);
351
+ if (timelineGapSize > 1) {
352
+ /** Checks if there is gap in timeline. */
353
+ acc.push(...getZeroishInputPerSecondBetweenRange({
354
+ startDate: compareableTime,
355
+ endDate: currentMoment,
356
+ timeStep: timeParams.upsamplingResolution,
357
+ }, input));
358
+ }
359
+ }
360
+ /** Break down current observation. */
361
+ for (let i = 0; i <= input.duration - timeParams.upsamplingResolution; i += timeParams.upsamplingResolution) {
362
+ const normalizedInput = breakDownInput(input, i, timeParams);
363
+ acc.push(normalizedInput);
364
+ }
365
+ return trimInputsByGlobalTimeline(acc, timeParams);
366
+ }, []);
367
+ const sortedInputs = flattenInputs.sort((a, b) => parseDate(a.timestamp).diff(parseDate(b.timestamp)).as('seconds'));
368
+ return resampleInputs(sortedInputs, timeParams);
369
+ },
370
+ });
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3RpbWUtc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsaUNBQXVFO0FBQ3ZFLDZCQUFzQjtBQUN0QixpREFBNkM7QUFVN0Msa0VBQTBEO0FBRTFELHlDQUFxQztBQUNyQyxtREFBMEQ7QUFDMUQsMkRBQXlEO0FBRXpELGdCQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUU3QixNQUFNLEVBQ0osV0FBVyxFQUNYLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLEdBQUcsY0FBTSxDQUFDO0FBRVgsTUFBTSxFQUNKLHFDQUFxQyxFQUNyQyxpQ0FBaUMsRUFDakMsbUNBQW1DLEVBQ25DLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEdBQ2YsR0FBRyxnQkFBTyxDQUFDO0FBRVo7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDVSxRQUFBLFFBQVEsR0FBRyxJQUFBLDBCQUFhLEVBQXVCO0lBQzFELFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRTtZQUNOLFNBQVMsRUFBRTtnQkFDVCxXQUFXLEVBQUUsK0NBQStDO2dCQUM1RCxJQUFJLEVBQUUsU0FBUztnQkFDZixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLHFDQUFxQztnQkFDbEQsSUFBSSxFQUFFLFNBQVM7Z0JBQ2Ysb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxLQUFLO29CQUNYLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjthQUNGO1NBQ0Y7S0FDRjtJQUNELGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBd0IsRUFBRTtRQUMvRCxJ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Q0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNEYXRlfSBmcm9tICdub2RlOnV0aWwvdHlwZXMnO1xuXG5pbXBvcnQge1NldHRpbmdzLCBEYXRlVGltZSwgRGF0ZVRpbWVNYXliZVZhbGlkLCBJbnRlcnZhbH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5pbXBvcnQge1xuICBQbHVnaW5QYXJhbXMsXG4gIFBhZGRpbmdSZWNlaXB0LFxuICBNYXBwaW5nUGFyYW1zLFxuICBDb25maWdQYXJhbXMsXG4gIFRpbWVQYXJhbXMsXG4gIFRpbWVOb3JtYWxpemVyQ29uZmlnLFxufSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdHlwZXMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7Z2V0QWdncmVnYXRpb25JbmZvRm9yfSBmcm9tICcuLi8uLi9saWIvYWdncmVnYXRlJztcbmltcG9ydCB7UGx1Z2luRmFjdG9yeX0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL2ludGVyZmFjZXMnO1xuXG5TZXR0aW5ncy5kZWZhdWx0Wm9uZSA9ICd1dGMnO1xuXG5jb25zdCB7XG4gIENvbmZpZ0Vycm9yLFxuICBJbnZhbGlkRGF0ZUluSW5wdXRFcnJvcixcbiAgSW52YWxpZFBhZGRpbmdFcnJvcixcbiAgSW52YWxpZElucHV0RXJyb3IsXG59ID0gRVJST1JTO1xuXG5jb25zdCB7XG4gIElOQ09NUEFUSUJMRV9SRVNPTFVUSU9OX1dJVEhfSU5URVJWQUwsXG4gIElOQ09NUEFUSUJMRV9SRVNPTFVUSU9OX1dJVEhfR0FQUyxcbiAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9JTlBVVFMsXG4gIElOVkFMSURfT0JTRVJWQVRJT05fT1ZFUkxBUCxcbiAgQVZPSURJTkdfUEFERElOR19CWV9FREdFUyxcbiAgSU5WQUxJRF9EQVRFX1RZUEUsXG4gIFNUQVJUX0xPV0VSX0VORCxcbiAgTUlTU0lOR19DT05GSUcsXG59ID0gU1RSSU5HUztcblxuLyoqXG4gKiBUaW1lIHN5bmNocm9uaXphdGlvbiBwbHVnaW4gY29udmVydGVkIGludG8gZnJhbWV3b3JrIGludGVncmF0ZWQgdG9vbC5cbiAqIEl0IGNhbid0IGJlIHJlcXVlc3RlZCBpbiBgaW5pdGlhbGl6ZS5wbHVnaW5zYCBzZWN0aW9uIGFueW1vcmUuIEluc3RlYWQgZGVzY3JpYmUgY29uZmlndXJhdGlvbiBpbiBjb250ZXh0LlxuICogQGV4YW1wbGVcbiAqIGBgYHlhbWxcbiAqIG5hbWU6IHRpbWUtc3luY1xuICogZGVzY3JpcHRpb246IHNhbXBsZSBpbiB0aW1lIHN5bmMgbGliXG4gKiB0YWdzOiBzYW1wbGUsIHRpbWUsIHN5bmNcbiAqIHRpbWUtc3luYzpcbiAqICAgc3RhcnQtdGltZTogJzIwMjMtMTItMTJUMDA6MDA6MDAuMDAwWidcbiAqICAgZW5kLXRpbWU6ICcyMDIzLTEyLTEyVDAwOjAxOjAwLjAwMFonXG4gKiAgIGludGVydmFsOiA1XG4gKiAgIGFsbG93LXBhZGRpbmc6IHRydWVcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgVGltZVN5bmMgPSBQbHVnaW5GYWN0b3J5PFRpbWVOb3JtYWxpemVyQ29uZmlnPih7XG4gIG1ldGFkYXRhOiB7XG4gICAgaW5wdXRzOiB7XG4gICAgICB0aW1lc3RhbXA6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIHRpbWUgb2Ygb2NjdXJyZW5jZSBvZiB0aGUgaW5wdXQnLFxuICAgICAgICB1bml0OiAnUkZDMzMzOScsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ25vbmUnLFxuICAgICAgICAgIGNvbXBvbmVudDogJ25vbmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW5wdXQnLFxuICAgICAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ3N1bScsXG4gICAgICAgICAgY29tcG9uZW50OiAnbm9uZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNvbmZpZ1ZhbGlkYXRpb246IChjb25maWc6IENvbmZpZ1BhcmFtcyk6IFRpbWVOb3JtYWxpemVyQ29uZmlnID0+IHtcbiAgICBpZiAoIWNvbmZpZyB8fCAhT2JqZWN0LmtleXMoY29uZmlnKT8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoTUlTU0lOR19DT05GSUcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAnc3RhcnQtdGltZSc6IHouc3RyaW5nKCkuZGF0ZXRpbWUoKSxcbiAgICAgICAgJ2VuZC10aW1lJzogei5zdHJpbmcoKS5kYXRldGltZSgpLFxuICAgICAgICBpbnRlcnZhbDogei5udW1iZXIoKSxcbiAgICAgICAgJ2FsbG93LXBhZGRpbmcnOiB6LmJvb2xlYW4oKSxcbiAgICAgICAgJ3Vwc2FtcGxpbmctcmVzb2x1dGlvbic6IHoubnVtYmVyKCkubWluKDEpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ3N0YXJ0LXRpbWUnXSA8IGRhdGFbJ2VuZC10aW1lJ10sIHtcbiAgICAgICAgbWVzc2FnZTogU1RBUlRfTE9XRVJfRU5ELFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2Ygc2NoZW1hPj4oc2NoZW1hLCBjb25maWcpO1xuICB9LFxuICBpbnB1dFZhbGlkYXRpb246IChpbnB1dDogUGx1Z2luUGFyYW1zLCBfY29uZmlnOiBhbnksIGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xuICAgICAgdGltZXN0YW1wOiB6LnN0cmluZygpLmRhdGV0aW1lKHt9KS5vcih6LmRhdGUoKSksXG4gICAgICBkdXJhdGlvbjogei5udW1iZXIoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0LCBpbmRleCk7XG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoXG4gICAgaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSxcbiAgICBjb25maWcsXG4gICAgbWFwcGluZz86IE1hcHBpbmdQYXJhbXNcbiAgKSA9PiB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gZHVyYXRpb24gaXMgY29tcGF0aWJsZSB3aXRoIGEgZ2l2ZW4gdGltZVN0ZXAuIElmIG5vdCwgdGhyb3dzIGFuIGVycm9yXG4gICAgICovXG4gICAgY29uc3QgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlID0gKFxuICAgICAgZHVyYXRpb246IG51bWJlcixcbiAgICAgIHRpbWVTdGVwOiBudW1iZXIsXG4gICAgICBlcnJvck1lc3NhZ2U6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGR1cmF0aW9uICUgdGltZVN0ZXAgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERhdGVzIGFyZSBwYXNzZWQgdG8gYHRpbWUtc3luY2AgYm90aCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAgKiBhbmQgYXMgYSBEYXRlIG9iamVjdCAoZnJvbSB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgWUFNTCBmaWxlKS5cbiAgICAgKiBJZiB0aGUgWUFNTCBwYXJzZXIgZmFpbHMgdG8gaWRlbnRpZnkgYXMgYSBkYXRlLCBpdCBwYXNzZXMgYXMgYSBzdHJpbmcuXG4gICAgICovXG4gICAgY29uc3QgcGFyc2VEYXRlID0gKGRhdGU6IERhdGUgfCBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnSW52YWxpZCBkYXRlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21JU08oZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZUluSW5wdXRFcnJvcihJTlZBTElEX0RBVEVfVFlQRShkYXRlKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgbWluaW1hbCBmYWN0b3IuXG4gICAgICovXG4gICAgY29uc3QgY29udmVydFBlckludGVydmFsID0gKFxuICAgICAgdmFsdWU6IG51bWJlcixcbiAgICAgIGR1cmF0aW9uOiBudW1iZXIsXG4gICAgICB0aW1lU3RlcDogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBzYW1wbGVzTnVtYmVyID0gZHVyYXRpb24gLyB0aW1lU3RlcDtcblxuICAgICAgcmV0dXJuIHZhbHVlIC8gc2FtcGxlc051bWJlcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRpbWUgcGVyIGdpdmVuIHNlY29uZC5cbiAgICAgKi9cbiAgICBjb25zdCBub3JtYWxpemVUaW1lUGVyU2Vjb25kID0gKFxuICAgICAgY3VycmVudFJvdW5kTW9tZW50OiBEYXRlIHwgc3RyaW5nLFxuICAgICAgaTogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0aGlzTW9tZW50ID0gcGFyc2VEYXRlKGN1cnJlbnRSb3VuZE1vbWVudCkuc3RhcnRPZignc2Vjb25kJyk7XG5cbiAgICAgIHJldHVybiB0aGlzTW9tZW50LnBsdXMoe3NlY29uZHM6IGl9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJlYWtzIGRvd24gaW5wdXQgcGVyIG1pbmltYWwgdGltZSB1bml0LlxuICAgICAqL1xuICAgIGNvbnN0IGJyZWFrRG93bklucHV0ID0gKFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICAgIGk6IG51bWJlcixcbiAgICAgIHBhcmFtczogVGltZVBhcmFtc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcbiAgICAgIGNvbnN0IHRpbWVTdGVwID0gcGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uO1xuXG4gICAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICBjb25zdCBwZXJTZWNvbmQgPSBub3JtYWxpemVUaW1lUGVyU2Vjb25kKGlucHV0LnRpbWVzdGFtcCwgaSk7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBwZXJTZWNvbmQudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRyaWMgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IHRpbWVTdGVwO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnbm9uZScpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IG51bGw7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjW21ldHJpY10gPVxuICAgICAgICAgIGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdzdW0nXG4gICAgICAgICAgICA/IGNvbnZlcnRQZXJJbnRlcnZhbChpbnB1dFttZXRyaWNdLCBpbnB1dFsnZHVyYXRpb24nXSwgdGltZVN0ZXApXG4gICAgICAgICAgICA6IGlucHV0W21ldHJpY107XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlcyBvYmplY3QgdG8gZmlsbCB0aGUgZ2FwcyBpbiBvYnNlcnZhdGlvbmFsIHRpbWVsaW5lIHVzaW5nIHplcm9pc2ggdmFsdWVzLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbGxXaXRoWmVyb2lzaElucHV0ID0gKFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICAgIG1pc3NpbmdUaW1lc3RhbXA6IERhdGVUaW1lTWF5YmVWYWxpZCxcbiAgICAgIHRpbWVTdGVwOiBudW1iZXJcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG4gICAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICAgIGlmIChtZXRyaWMgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPVxuICAgICAgICAgICAgbWlzc2luZ1RpbWVzdGFtcC5zdGFydE9mKCdzZWNvbmQnKS50b1VUQygpLnRvSVNPKCkgPz8gJyc7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gdGltZVN0ZXA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldHJpYyA9PT0gJ3RpbWUtcmVzZXJ2ZWQnIHx8XG4gICAgICAgICAgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgIG1hcHBpbmdbJ3RpbWUtcmVzZXJ2ZWQnXSAmJlxuICAgICAgICAgICAgbWV0cmljID09PSBtYXBwaW5nWyd0aW1lLXJlc2VydmVkJ10pXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjWydkdXJhdGlvbiddO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gbnVsbDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWdncmVnYXRpb25QYXJhbXMudGltZSA9PT0gJ2F2ZycgfHxcbiAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJ1xuICAgICAgICApIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IDA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdjb3B5Jykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZXJyb3Igb24gcGFkZGluZ2AgaXMgZW5hYmxlZCBhbmQgcGFkZGluZyBpcyBuZWVkZWQuIElmIHNvLCB0aGVuIHRocm93cyBlcnJvci5cbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVBhZGRpbmcgPSAocGFkOiBQYWRkaW5nUmVjZWlwdCwgcGFyYW1zOiBUaW1lUGFyYW1zKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBpc1BhZGRpbmdOZWVkZWQgPSBzdGFydCB8fCBlbmQ7XG5cbiAgICAgIGlmICghcGFyYW1zLmFsbG93UGFkZGluZyAmJiBpc1BhZGRpbmdOZWVkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYWRkaW5nRXJyb3IoQVZPSURJTkdfUEFERElOR19CWV9FREdFUyhzdGFydCwgZW5kKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBwYWRkaW5nIGlzIG5lZWRlZCBlaXRoZXIgYXQgc3RhcnQgb2YgdGhlIHRpbWVsaW5lIG9yIHRoZSBlbmQgYW5kIHJldHVybnMgc3RhdHVzLlxuICAgICAqL1xuICAgIGNvbnN0IGNoZWNrRm9yUGFkZGluZyA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQYWRkaW5nUmVjZWlwdCA9PiB7XG4gICAgICBjb25zdCBzdGFydERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUoaW5wdXRzWzBdLnRpbWVzdGFtcClcbiAgICAgICAgLmRpZmYocGFyYW1zLnN0YXJ0VGltZSlcbiAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgIGNvbnN0IGxhc3RJbnB1dCA9IGlucHV0c1tpbnB1dHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGNvbnN0IGVuZERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcClcbiAgICAgICAgLnBsdXMoe3NlY29uZDogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pfSlcbiAgICAgICAgLmRpZmYocGFyYW1zLmVuZFRpbWUpXG4gICAgICAgIC5hcygnc2Vjb25kcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0RGlmZkluU2Vjb25kcyA+IDAsXG4gICAgICAgIGVuZDogZW5kRGlmZkluU2Vjb25kcyA8IDAsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGdpdmVuIGlucHV0cyBmcmFtZSwgbWVhbndoaWxlIGNoZWNraW5nIGlmIGFnZ3JlZ2F0aW9uIG1ldGhvZCBpcyBgc3VtYCwgdGhlbiBjYWxjdWxhdGVzIGl0LlxuICAgICAqIEZvciBtZXRob2RzIGlzIGBhdmdgIGFuZCBgbm9uZWAgY2FsY3VsYXRpbmcgYXZlcmFnZSBvZiB0aGUgZnJhbWUuXG4gICAgICovXG4gICAgY29uc3QgcmVzYW1wbGVJbnB1dEZyYW1lID0gKGlucHV0c0luVGltZXNsb3Q6IFBsdWdpblBhcmFtc1tdKSA9PlxuICAgICAgaW5wdXRzSW5UaW1lc2xvdC5yZWR1Y2UoKGFjYywgaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcblxuICAgICAgICBtZXRyaWNzLmZvckVhY2gobWV0cmljID0+IHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblBhcmFtcyA9IGdldEFnZ3JlZ2F0aW9uSW5mb0ZvcihtZXRyaWMpO1xuXG4gICAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRzWzBdW21ldHJpY107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID0gJ3N1bSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjW21ldHJpY10gPz8gMDtcblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnY29weScpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIElmIHRpbWVzbG90IGNvbnRhaW5zIHJlY29yZHMgbW9yZSB0aGFuIG9uZSwgdGhlbiBkaXZpZGUgZWFjaCBtZXRyaWMgYnkgdGhlIHRpbWVzbG90IGxlbmd0aCxcbiAgICAgICAgICAgKiAgc28gdGhhdCB0aGVpciBzdW0geWllbGRzIHRoZSB0aW1lc2xvdCBhdmVyYWdlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlucHV0c0luVGltZXNsb3QubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgaW5kZXggPT09IGlucHV0c0luVGltZXNsb3QubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gLz0gaW5wdXRzSW5UaW1lc2xvdC5sZW5ndGg7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY2NbbWV0cmljXSArPSBpbnB1dFttZXRyaWNdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUGx1Z2luUGFyYW1zKTtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIGVhY2ggYXJyYXkgZnJhbWUgd2l0aCBpbnRlcnZhbCBsZW5ndGgsIHRoZW4gYWdncmVnYXRpbmcgdGhlbSB0b2dldGhlciBhcyBmcm9tIHVuaXRzLnlhbWwgZmlsZS5cbiAgICAgKi9cbiAgICBjb25zdCByZXNhbXBsZUlucHV0cyA9IChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBwYXJhbXM6IFRpbWVQYXJhbXMpID0+XG4gICAgICBpbnB1dHMucmVkdWNlKChhY2M6IFBsdWdpblBhcmFtc1tdLCBfaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgZnJhbWVTdGFydCA9XG4gICAgICAgICAgKGluZGV4ICogcGFyYW1zLmludGVydmFsKSAvIHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbjtcbiAgICAgICAgY29uc3QgZnJhbWVFbmQgPVxuICAgICAgICAgICgoaW5kZXggKyAxKSAqIHBhcmFtcy5pbnRlcnZhbCkgLyBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb247XG5cbiAgICAgICAgY29uc3QgaW5wdXRzRnJhbWUgPSBpbnB1dHMuc2xpY2UoZnJhbWVTdGFydCwgZnJhbWVFbmQpO1xuICAgICAgICBjb25zdCByZXNhbXBsZWRJbnB1dCA9IHJlc2FtcGxlSW5wdXRGcmFtZShpbnB1dHNGcmFtZSk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBpZiByZXNhbXBsZWQgaW5wdXQgaXMgbm90IGVtcHR5LCB0aGVuIGluY2x1ZGVzIGluIHJlc3VsdC4gKi9cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc2FtcGxlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYWNjLnB1c2gocmVzYW1wbGVkSW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdIGFzIFBsdWdpblBhcmFtc1tdKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgemVyb2lzaCBpbnB1dHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0cyBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkSW5wdXRzID0gKFxuICAgICAgaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSxcbiAgICAgIHBhZDogUGFkZGluZ1JlY2VpcHQsXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBwYWRkZWRGcm9tQmVnaW5uaW5nID0gW107XG5cbiAgICAgIGlmIChzdGFydCkge1xuICAgICAgICBwYWRkZWRGcm9tQmVnaW5uaW5nLnB1c2goXG4gICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGFydERhdGU6IHBhcmFtcy5zdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZERhdGU6IHBhcnNlRGF0ZShpbnB1dHNbMF0udGltZXN0YW1wKSxcbiAgICAgICAgICAgICAgdGltZVN0ZXA6IHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dHNbMF1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhZGRlZEFycmF5ID0gcGFkZGVkRnJvbUJlZ2lubmluZy5jb25jYXQoaW5wdXRzKTtcblxuICAgICAgaWYgKGVuZCkge1xuICAgICAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBsYXN0SW5wdXRFbmQgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcCkucGx1cyh7XG4gICAgICAgICAgc2Vjb25kczogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICAgICAgcGFkZGVkQXJyYXkucHVzaChcbiAgICAgICAgICAuLi5nZXRaZXJvaXNoSW5wdXRQZXJTZWNvbmRCZXR3ZWVuUmFuZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZTogbGFzdElucHV0RW5kLFxuICAgICAgICAgICAgICBlbmREYXRlOiBwYXJhbXMuZW5kVGltZSxcbiAgICAgICAgICAgICAgdGltZVN0ZXA6IHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0SW5wdXRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWRkZWRBcnJheTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJha2VzIGRvd24gdGhlIGdpdmVuIHJhbmdlIGJ5IDEgc2Vjb25kLCBhbmQgZ2VuZXJhdGVzIHplcm9pc2ggdmFsdWVzLlxuICAgICAqL1xuICAgIGNvbnN0IGdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZSA9IChcbiAgICAgIHBhcmFtczogUGx1Z2luUGFyYW1zLFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgYXJyYXk6IFBsdWdpblBhcmFtc1tdID0gW107XG4gICAgICB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUoXG4gICAgICAgIHBhcmFtcy5lbmREYXRlLmRpZmYocGFyYW1zLnN0YXJ0RGF0ZSkuYXMoJ3NlY29uZHMnKSxcbiAgICAgICAgcGFyYW1zLnRpbWVTdGVwLFxuICAgICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0dBUFNcbiAgICAgICk7XG4gICAgICBjb25zdCBkYXRlUmFuZ2UgPSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKFxuICAgICAgICBwYXJhbXMuc3RhcnREYXRlLFxuICAgICAgICBwYXJhbXMuZW5kRGF0ZVxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBpbnRlcnZhbCBvZiBkYXRlUmFuZ2Uuc3BsaXRCeSh7c2Vjb25kOiBwYXJhbXMudGltZVN0ZXB9KSkge1xuICAgICAgICBhcnJheS5wdXNoKFxuICAgICAgICAgIGZpbGxXaXRoWmVyb2lzaElucHV0KFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAvLyBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgc3RhcnQgd2lsbCBuZXZlciBiZSBudWxsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIGlmIHdlIHBhc3MgYW4gaW52YWxpZCBzdGFydC9lbmREYXRlIHRvXG4gICAgICAgICAgICAvLyBJbnRlcnZhbCwgd2UgZ2V0IGEgemVybyBsZW5ndGggYXJyYXkgYXMgdGhlIHJhbmdlXG4gICAgICAgICAgICBpbnRlcnZhbC5zdGFydCB8fCBEYXRlVGltZS5pbnZhbGlkKCdub3QgZXhwZWN0ZWQgLSBzdGFydCBpcyBudWxsJyksXG4gICAgICAgICAgICBwYXJhbXMudGltZVN0ZXBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBDaGVja3MgaWYgaW5wdXQncyB0aW1lc3RhbXAgaXMgaW5jbHVkZWQgaW4gZ2xvYmFsIHNwZWNpZmllZCBwZXJpb2QgdGhlbiBsZWF2ZXMgaXQsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25zdCB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZSA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQbHVnaW5QYXJhbXNbXSA9PlxuICAgICAgaW5wdXRzLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7dGltZXN0YW1wfSA9IGl0ZW07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcnNlRGF0ZSh0aW1lc3RhbXApID49IHBhcmFtcy5zdGFydFRpbWUgJiZcbiAgICAgICAgICBwYXJzZURhdGUodGltZXN0YW1wKSA8PSBwYXJhbXMuZW5kVGltZVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2MucHVzaChpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSBhcyBQbHVnaW5QYXJhbXNbXSk7XG5cbiAgICAvKiogSW1wbGVtZW50YXRpb24gKi9cbiAgICBjb25zdCB0aW1lUGFyYW1zID0ge1xuICAgICAgc3RhcnRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKGNvbmZpZ1snc3RhcnQtdGltZSddIGFzIHN0cmluZyksXG4gICAgICBlbmRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKGNvbmZpZ1snZW5kLXRpbWUnXSBhcyBzdHJpbmcpLFxuICAgICAgaW50ZXJ2YWw6IGNvbmZpZy5pbnRlcnZhbCxcbiAgICAgIGFsbG93UGFkZGluZzogY29uZmlnWydhbGxvdy1wYWRkaW5nJ10sXG4gICAgICB1cHNhbXBsaW5nUmVzb2x1dGlvbjogY29uZmlnWyd1cHNhbXBsaW5nLXJlc29sdXRpb24nXVxuICAgICAgICA/IGNvbmZpZ1sndXBzYW1wbGluZy1yZXNvbHV0aW9uJ11cbiAgICAgICAgOiAxLFxuICAgIH07XG4gICAgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlKFxuICAgICAgdGltZVBhcmFtcy5pbnRlcnZhbCxcbiAgICAgIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOVEVSVkFMXG4gICAgKTtcbiAgICBjb25zdCBwYWQgPSBjaGVja0ZvclBhZGRpbmcoaW5wdXRzLCB0aW1lUGFyYW1zKTtcbiAgICB2YWxpZGF0ZVBhZGRpbmcocGFkLCB0aW1lUGFyYW1zKTtcbiAgICBjb25zdCBwYWRkZWRJbnB1dHMgPSBwYWRJbnB1dHMoaW5wdXRzLCBwYWQsIHRpbWVQYXJhbXMpO1xuXG4gICAgY29uc3QgZmxhdHRlbklucHV0cyA9IHBhZGRlZElucHV0cy5yZWR1Y2UoXG4gICAgICAoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb21lbnQgPSBwYXJzZURhdGUoaW5wdXQudGltZXN0YW1wKTtcblxuICAgICAgICAvKiogQ2hlY2tzIGlmIG5vdCB0aGUgZmlyc3QgaW5wdXQsIHRoZW4gY2hlY2sgY29uc2lzdGVuY3kgd2l0aCBwcmV2aW91cyBvbmVzLiAqL1xuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNJbnB1dCA9IHBhZGRlZElucHV0c1tpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5wdXRUaW1lc3RhbXAgPSBwYXJzZURhdGUocHJldmlvdXNJbnB1dC50aW1lc3RhbXApO1xuXG4gICAgICAgICAgLyoqIENoZWNrcyBmb3IgdGltZXN0YW1wcyBvdmVybGFwLiAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcnNlRGF0ZShwcmV2aW91c0lucHV0LnRpbWVzdGFtcCkucGx1cyh7XG4gICAgICAgICAgICAgIHNlY29uZHM6IGV2YWwocHJldmlvdXNJbnB1dC5kdXJhdGlvbiksXG4gICAgICAgICAgICB9KSA+IGN1cnJlbnRNb21lbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5wdXRFcnJvcihJTlZBTElEX09CU0VSVkFUSU9OX09WRVJMQVApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbXBhcmVhYmxlVGltZSA9IHByZXZpb3VzSW5wdXRUaW1lc3RhbXAucGx1cyh7XG4gICAgICAgICAgICBzZWNvbmRzOiBldmFsKHByZXZpb3VzSW5wdXQuZHVyYXRpb24pLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdGltZWxpbmVHYXBTaXplID0gY3VycmVudE1vbWVudFxuICAgICAgICAgICAgLmRpZmYoY29tcGFyZWFibGVUaW1lKVxuICAgICAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgICAgICB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUoXG4gICAgICAgICAgICBpbnB1dC5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICAgICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOUFVUU1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGltZWxpbmVHYXBTaXplID4gMSkge1xuICAgICAgICAgICAgLyoqIENoZWNrcyBpZiB0aGVyZSBpcyBnYXAgaW4gdGltZWxpbmUuICovXG4gICAgICAgICAgICBhY2MucHVzaChcbiAgICAgICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogY29tcGFyZWFibGVUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogY3VycmVudE1vbWVudCxcbiAgICAgICAgICAgICAgICAgIHRpbWVTdGVwOiB0aW1lUGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiogQnJlYWsgZG93biBjdXJyZW50IG9ic2VydmF0aW9uLiAqL1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICBpIDw9IGlucHV0LmR1cmF0aW9uIC0gdGltZVBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbjtcbiAgICAgICAgICBpICs9IHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZElucHV0ID0gYnJlYWtEb3duSW5wdXQoaW5wdXQsIGksIHRpbWVQYXJhbXMpO1xuXG4gICAgICAgICAgYWNjLnB1c2gobm9ybWFsaXplZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZShhY2MsIHRpbWVQYXJhbXMpO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIFBsdWdpblBhcmFtc1tdXG4gICAgKTtcblxuICAgIGNvbnN0IHNvcnRlZElucHV0cyA9IGZsYXR0ZW5JbnB1dHMuc29ydCgoYSwgYikgPT5cbiAgICAgIHBhcnNlRGF0ZShhLnRpbWVzdGFtcCkuZGlmZihwYXJzZURhdGUoYi50aW1lc3RhbXApKS5hcygnc2Vjb25kcycpXG4gICAgKTtcblxuICAgIHJldHVybiByZXNhbXBsZUlucHV0cyhzb3J0ZWRJbnB1dHMsIHRpbWVQYXJhbXMpIGFzIFBsdWdpblBhcmFtc1tdO1xuICB9LFxufSk7XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import { ArgumentConfig, ParseOptions } from 'ts-command-line-args';
2
+ import { IfRunArgs } from '../types/process-args';
3
+ export declare const CONFIG: {
4
+ ARGS: ArgumentConfig<IfRunArgs>;
5
+ HELP: ParseOptions<any>;
6
+ GITHUB_PATH: string;
7
+ NATIVE_PLUGIN: string;
8
+ AGGREGATION_TIME_METRICS: string[];
9
+ };
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG = void 0;
4
+ const config_1 = require("../../common/config");
5
+ const { DISCLAIMER_MESSAGE } = config_1.STRINGS;
6
+ exports.CONFIG = {
7
+ ARGS: {
8
+ manifest: {
9
+ type: String,
10
+ optional: true,
11
+ alias: 'm',
12
+ description: '[path to the input file]',
13
+ },
14
+ output: {
15
+ type: String,
16
+ optional: true,
17
+ alias: 'o',
18
+ description: '[path to the output file]',
19
+ },
20
+ 'override-params': {
21
+ type: String,
22
+ optional: true,
23
+ alias: 'p',
24
+ description: '[path to a parameter file that overrides our defaults]',
25
+ },
26
+ 'no-output': {
27
+ type: Boolean,
28
+ optional: true,
29
+ alias: 'n',
30
+ description: '[prevent output to the console]',
31
+ },
32
+ help: {
33
+ type: Boolean,
34
+ optional: true,
35
+ alias: 'h',
36
+ description: '[prints out the above help instruction]',
37
+ },
38
+ append: {
39
+ type: Boolean,
40
+ optional: true,
41
+ alias: 'a',
42
+ description: '[append to outputs, instead of overwriting]',
43
+ },
44
+ debug: {
45
+ type: Boolean,
46
+ optional: true,
47
+ alias: 'd',
48
+ description: '[prints out debug logs to the console]',
49
+ },
50
+ observe: {
51
+ type: Boolean,
52
+ optional: true,
53
+ description: '[executes only observe pipeline of the manifest]',
54
+ },
55
+ regroup: {
56
+ type: Boolean,
57
+ optional: true,
58
+ description: '[executes only regroup pipeline of the manifest]',
59
+ },
60
+ compute: {
61
+ type: Boolean,
62
+ optional: true,
63
+ description: '[executes only compute pipeline of the manifest]',
64
+ },
65
+ },
66
+ HELP: {
67
+ helpArg: 'help',
68
+ headerContentSections: [
69
+ { header: 'Impact Framework', content: 'Helpful keywords:' },
70
+ ],
71
+ footerContentSections: [
72
+ { header: 'Green Software Foundation', content: DISCLAIMER_MESSAGE },
73
+ ],
74
+ },
75
+ GITHUB_PATH: 'https://github.com',
76
+ NATIVE_PLUGIN: 'if-plugins',
77
+ AGGREGATION_TIME_METRICS: ['timestamp', 'duration'],
78
+ };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLXJ1bi9jb25maWcvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGdEQUE0QztBQUk1QyxNQUFNLEVBQUMsa0JBQWtCLEVBQUMsR0FBRyxnQkFBTyxDQUFDO0FBRXhCLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRTtRQUNKLFFBQVEsRUFBRTtZQUNSLElBQUksRUFBRSxNQUFNO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSwwQkFBMEI7U0FDeEM7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsTUFBTTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUc7WUFDVixXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDO1FBQ0QsaUJBQWlCLEVBQUU7WUFDakIsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLHdEQUF3RDtTQUN0RTtRQUNELFdBQVcsRUFBRTtZQUNYLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSxpQ0FBaUM7U0FDL0M7UUFDRCxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUc7WUFDVixXQUFXLEVBQUUseUNBQXlDO1NBQ3ZEO1FBQ0QsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLDZDQUE2QztTQUMzRDtRQUNELEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSx3Q0FBd0M7U0FDdEQ7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLGtEQUFrRDtTQUNoRTtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsa0RBQWtEO1NBQ2hFO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxrREFBa0Q7U0FDaEU7S0FDMkI7SUFDOUIsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLE1BQU07UUFDZixxQkFBcUIsRUFBRTtZQUNyQixFQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUM7U0FDM0Q7UUFDRCxxQkFBcUIsRUFBRTtZQUNyQixFQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUM7U0FDbkU7S0FDbUI7SUFDdEIsV0FBVyxFQUFFLG9CQUFvQjtJQUNqQyxhQUFhLEVBQUUsWUFBWTtJQUMzQix3QkFBd0IsRUFBRSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUM7Q0FDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXJndW1lbnRDb25maWcsIFBhcnNlT3B0aW9uc30gZnJvbSAndHMtY29tbWFuZC1saW5lLWFyZ3MnO1xuXG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4uLy4uL2NvbW1vbi9jb25maWcnO1xuXG5pbXBvcnQge0lmUnVuQXJnc30gZnJvbSAnLi4vdHlwZXMvcHJvY2Vzcy1hcmdzJztcblxuY29uc3Qge0RJU0NMQUlNRVJfTUVTU0FHRX0gPSBTVFJJTkdTO1xuXG5leHBvcnQgY29uc3QgQ09ORklHID0ge1xuICBBUkdTOiB7XG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgYWxpYXM6ICdtJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnW3BhdGggdG8gdGhlIGlucHV0IGZpbGVdJyxcbiAgICB9LFxuICAgIG91dHB1dDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ28nLFxuICAgICAgZGVzY3JpcHRpb246ICdbcGF0aCB0byB0aGUgb3V0cHV0IGZpbGVdJyxcbiAgICB9LFxuICAgICdvdmVycmlkZS1wYXJhbXMnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIGFsaWFzOiAncCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1twYXRoIHRvIGEgcGFyYW1ldGVyIGZpbGUgdGhhdCBvdmVycmlkZXMgb3VyIGRlZmF1bHRzXScsXG4gICAgfSxcbiAgICAnbm8tb3V0cHV0Jzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgYWxpYXM6ICduJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnW3ByZXZlbnQgb3V0cHV0IHRvIHRoZSBjb25zb2xlXScsXG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdbcHJpbnRzIG91dCB0aGUgYWJvdmUgaGVscCBpbnN0cnVjdGlvbl0nLFxuICAgIH0sXG4gICAgYXBwZW5kOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ2EnLFxuICAgICAgZGVzY3JpcHRpb246ICdbYXBwZW5kIHRvIG91dHB1dHMsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmddJyxcbiAgICB9LFxuICAgIGRlYnVnOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBhbGlhczogJ2QnLFxuICAgICAgZGVzY3JpcHRpb246ICdbcHJpbnRzIG91dCBkZWJ1ZyBsb2dzIHRvIHRoZSBjb25zb2xlXScsXG4gICAgfSxcbiAgICBvYnNlcnZlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1tleGVjdXRlcyBvbmx5IG9ic2VydmUgcGlwZWxpbmUgb2YgdGhlIG1hbmlmZXN0XScsXG4gICAgfSxcbiAgICByZWdyb3VwOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1tleGVjdXRlcyBvbmx5IHJlZ3JvdXAgcGlwZWxpbmUgb2YgdGhlIG1hbmlmZXN0XScsXG4gICAgfSxcbiAgICBjb21wdXRlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1tleGVjdXRlcyBvbmx5IGNvbXB1dGUgcGlwZWxpbmUgb2YgdGhlIG1hbmlmZXN0XScsXG4gICAgfSxcbiAgfSBhcyBBcmd1bWVudENvbmZpZzxJZlJ1bkFyZ3M+LFxuICBIRUxQOiB7XG4gICAgaGVscEFyZzogJ2hlbHAnLFxuICAgIGhlYWRlckNvbnRlbnRTZWN0aW9uczogW1xuICAgICAge2hlYWRlcjogJ0ltcGFjdCBGcmFtZXdvcmsnLCBjb250ZW50OiAnSGVscGZ1bCBrZXl3b3JkczonfSxcbiAgICBdLFxuICAgIGZvb3RlckNvbnRlbnRTZWN0aW9uczogW1xuICAgICAge2hlYWRlcjogJ0dyZWVuIFNvZnR3YXJlIEZvdW5kYXRpb24nLCBjb250ZW50OiBESVNDTEFJTUVSX01FU1NBR0V9LFxuICAgIF0sXG4gIH0gYXMgUGFyc2VPcHRpb25zPGFueT4sXG4gIEdJVEhVQl9QQVRIOiAnaHR0cHM6Ly9naXRodWIuY29tJyxcbiAgTkFUSVZFX1BMVUdJTjogJ2lmLXBsdWdpbnMnLFxuICBBR0dSRUdBVElPTl9USU1FX01FVFJJQ1M6IFsndGltZXN0YW1wJywgJ2R1cmF0aW9uJ10sXG59O1xuIl19