@acorex/core 16.0.2 → 17.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. package/common/README.md +3 -0
  2. package/common/countries/countries.data.d.ts +2 -0
  3. package/common/countries/country.d.ts +13 -0
  4. package/common/index.d.ts +2 -0
  5. package/config/README.md +3 -0
  6. package/config/index.d.ts +2 -0
  7. package/config/lib/configs.d.ts +6 -0
  8. package/config/lib/configs.service.d.ts +12 -0
  9. package/date-time/README.md +3 -0
  10. package/date-time/index.d.ts +10 -0
  11. package/date-time/lib/calendar.service.d.ts +27 -0
  12. package/date-time/lib/dateTime.config.d.ts +12 -0
  13. package/date-time/lib/datetime.class.d.ts +138 -0
  14. package/date-time/lib/datetime.module.d.ts +8 -0
  15. package/date-time/lib/datetime.pipe.d.ts +12 -0
  16. package/date-time/lib/formatters/datetime-formatter.d.ts +19 -0
  17. package/date-time/lib/formatters/timeleft-formatter.d.ts +16 -0
  18. package/date-time/lib/georgian.calendar.d.ts +21 -0
  19. package/date-time/lib/holidays.loader.d.ts +21 -0
  20. package/date-time/lib/jalali.calendar.d.ts +40 -0
  21. package/esm2022/common/acorex-core-common.mjs +5 -0
  22. package/esm2022/common/countries/countries.data.mjs +2625 -0
  23. package/esm2022/common/countries/country.mjs +2 -0
  24. package/esm2022/common/index.mjs +3 -0
  25. package/esm2022/config/acorex-core-config.mjs +5 -0
  26. package/esm2022/config/index.mjs +3 -0
  27. package/esm2022/config/lib/configs.mjs +7 -0
  28. package/esm2022/config/lib/configs.service.mjs +27 -0
  29. package/esm2022/date-time/acorex-core-date-time.mjs +5 -0
  30. package/esm2022/date-time/index.mjs +11 -0
  31. package/esm2022/date-time/lib/calendar.service.mjs +100 -0
  32. package/esm2022/date-time/lib/dateTime.config.mjs +50 -0
  33. package/esm2022/date-time/lib/datetime.class.mjs +337 -0
  34. package/esm2022/date-time/lib/datetime.module.mjs +27 -0
  35. package/esm2022/date-time/lib/datetime.pipe.mjs +29 -0
  36. package/esm2022/date-time/lib/formatters/datetime-formatter.mjs +32 -0
  37. package/esm2022/date-time/lib/formatters/timeleft-formatter.mjs +91 -0
  38. package/esm2022/date-time/lib/georgian.calendar.mjs +203 -0
  39. package/esm2022/date-time/lib/holidays.loader.mjs +13 -0
  40. package/esm2022/date-time/lib/jalali.calendar.mjs +440 -0
  41. package/esm2022/events/acorex-core-events.mjs +5 -0
  42. package/esm2022/events/index.mjs +3 -0
  43. package/esm2022/events/lib/event.service.mjs +43 -0
  44. package/esm2022/events/lib/event.type.mjs +6 -0
  45. package/esm2022/file/acorex-core-file.mjs +5 -0
  46. package/esm2022/file/index.mjs +7 -0
  47. package/esm2022/file/lib/file-download-ref.class.mjs +12 -0
  48. package/esm2022/file/lib/file-download-result.class.mjs +45 -0
  49. package/esm2022/file/lib/file-size-formatter.mjs +24 -0
  50. package/esm2022/file/lib/file-upload-ref.class.mjs +12 -0
  51. package/esm2022/file/lib/file.module.mjs +20 -0
  52. package/esm2022/file/lib/file.service.mjs +103 -0
  53. package/esm2022/format/acorex-core-format.mjs +5 -0
  54. package/esm2022/format/index.mjs +8 -0
  55. package/esm2022/format/lib/format.config.mjs +3 -0
  56. package/esm2022/format/lib/format.module.mjs +64 -0
  57. package/esm2022/format/lib/format.pipe.mjs +37 -0
  58. package/esm2022/format/lib/format.service.mjs +95 -0
  59. package/esm2022/format/lib/format.types.mjs +2 -0
  60. package/esm2022/format/lib/formatters/number-formatter.mjs +74 -0
  61. package/esm2022/format/lib/formatters/string-formatter.mjs +15 -0
  62. package/esm2022/image/acorex-core-image.mjs +5 -0
  63. package/esm2022/image/index.mjs +2 -0
  64. package/esm2022/image/lib/image.service.mjs +43 -0
  65. package/esm2022/index.mjs +2 -44
  66. package/esm2022/memorize/acorex-core-memorize.mjs +5 -0
  67. package/esm2022/memorize/index.mjs +2 -0
  68. package/esm2022/memorize/lib/memorize.decorator.mjs +19 -0
  69. package/esm2022/pipes/acorex-core-pipes.mjs +5 -0
  70. package/esm2022/pipes/index.mjs +2 -0
  71. package/esm2022/pipes/lib/safe/safe.pipe.mjs +38 -0
  72. package/esm2022/platform/acorex-core-platform.mjs +5 -0
  73. package/esm2022/platform/index.mjs +2 -0
  74. package/esm2022/platform/lib/platform.service.mjs +225 -0
  75. package/esm2022/storage/acorex-core-storage.mjs +5 -0
  76. package/esm2022/storage/cookie-storage.service.mjs +202 -0
  77. package/esm2022/storage/index.mjs +5 -0
  78. package/esm2022/storage/local-storage.service.mjs +58 -0
  79. package/esm2022/storage/session-storage.service.mjs +22 -0
  80. package/esm2022/storage/storage.interface.mjs +2 -0
  81. package/esm2022/translation/acorex-core-translation.mjs +5 -0
  82. package/esm2022/translation/index.mjs +9 -0
  83. package/esm2022/translation/lib/translation-scope.resolver.mjs +11 -0
  84. package/esm2022/translation/lib/translation.config.mjs +20 -0
  85. package/esm2022/translation/lib/translation.loader.mjs +14 -0
  86. package/esm2022/translation/lib/translation.module.mjs +40 -0
  87. package/esm2022/translation/lib/translation.service.mjs +173 -0
  88. package/esm2022/translation/lib/translation.types.mjs +2 -0
  89. package/esm2022/translation/lib/translator.directive.mjs +28 -0
  90. package/esm2022/translation/lib/translator.pipe.mjs +23 -0
  91. package/esm2022/types/acorex-core-types.mjs +5 -0
  92. package/esm2022/types/index.mjs +2 -0
  93. package/esm2022/utils/acorex-core-utils.mjs +5 -0
  94. package/esm2022/utils/index.mjs +6 -0
  95. package/esm2022/utils/lib/auto-unsubscribe.mjs +36 -0
  96. package/esm2022/utils/lib/color-util.mjs +111 -0
  97. package/esm2022/utils/lib/drawing-util.mjs +35 -0
  98. package/esm2022/utils/lib/html-util.mjs +39 -0
  99. package/esm2022/utils/lib/string-util.mjs +19 -0
  100. package/esm2022/validation/acorex-core-validation.mjs +5 -0
  101. package/esm2022/validation/index.mjs +18 -0
  102. package/esm2022/validation/lib/rules/between-rule.mjs +31 -0
  103. package/esm2022/validation/lib/rules/callback-rule.mjs +29 -0
  104. package/esm2022/validation/lib/rules/equal-rule.mjs +26 -0
  105. package/esm2022/validation/lib/rules/greater-than.mjs +29 -0
  106. package/esm2022/validation/lib/rules/length-rule.mjs +26 -0
  107. package/esm2022/validation/lib/rules/less-than-rule.mjs +29 -0
  108. package/esm2022/validation/lib/rules/maxlength-rule.mjs +27 -0
  109. package/esm2022/validation/lib/rules/minlength-rule.mjs +26 -0
  110. package/esm2022/validation/lib/rules/regex-rule.mjs +49 -0
  111. package/esm2022/validation/lib/rules/required-rule.mjs +36 -0
  112. package/esm2022/validation/lib/validation.config.mjs +33 -0
  113. package/esm2022/validation/lib/validation.module.mjs +84 -0
  114. package/esm2022/validation/lib/validation.service.mjs +98 -0
  115. package/esm2022/validation/lib/validation.types.mjs +3 -0
  116. package/events/README.md +3 -0
  117. package/events/index.d.ts +2 -0
  118. package/{lib/services → events/lib}/event.service.d.ts +8 -0
  119. package/events/lib/event.type.d.ts +5 -0
  120. package/fesm2022/acorex-core-common.mjs +2631 -0
  121. package/fesm2022/acorex-core-common.mjs.map +1 -0
  122. package/fesm2022/acorex-core-config.mjs +39 -0
  123. package/fesm2022/acorex-core-config.mjs.map +1 -0
  124. package/fesm2022/acorex-core-date-time.mjs +1305 -0
  125. package/fesm2022/acorex-core-date-time.mjs.map +1 -0
  126. package/fesm2022/acorex-core-events.mjs +56 -0
  127. package/fesm2022/acorex-core-events.mjs.map +1 -0
  128. package/fesm2022/acorex-core-file.mjs +214 -0
  129. package/fesm2022/acorex-core-file.mjs.map +1 -0
  130. package/fesm2022/acorex-core-format.mjs +282 -0
  131. package/fesm2022/acorex-core-format.mjs.map +1 -0
  132. package/fesm2022/acorex-core-image.mjs +50 -0
  133. package/fesm2022/acorex-core-image.mjs.map +1 -0
  134. package/fesm2022/acorex-core-memorize.mjs +26 -0
  135. package/fesm2022/acorex-core-memorize.mjs.map +1 -0
  136. package/fesm2022/acorex-core-pipes.mjs +44 -0
  137. package/fesm2022/acorex-core-pipes.mjs.map +1 -0
  138. package/fesm2022/acorex-core-platform.mjs +232 -0
  139. package/fesm2022/acorex-core-platform.mjs.map +1 -0
  140. package/fesm2022/acorex-core-storage.mjs +285 -0
  141. package/fesm2022/acorex-core-storage.mjs.map +1 -0
  142. package/fesm2022/acorex-core-translation.mjs +293 -0
  143. package/fesm2022/acorex-core-translation.mjs.map +1 -0
  144. package/fesm2022/acorex-core-types.mjs +6 -0
  145. package/fesm2022/acorex-core-types.mjs.map +1 -0
  146. package/fesm2022/acorex-core-utils.mjs +247 -0
  147. package/fesm2022/acorex-core-utils.mjs.map +1 -0
  148. package/fesm2022/acorex-core-validation.mjs +488 -0
  149. package/fesm2022/acorex-core-validation.mjs.map +1 -0
  150. package/fesm2022/acorex-core.mjs +2 -2309
  151. package/fesm2022/acorex-core.mjs.map +1 -1
  152. package/file/README.md +3 -0
  153. package/file/index.d.ts +6 -0
  154. package/file/lib/file-download-ref.class.d.ts +6 -0
  155. package/file/lib/file-download-result.class.d.ts +8 -0
  156. package/file/lib/file-size-formatter.d.ts +16 -0
  157. package/file/lib/file-upload-ref.class.d.ts +5 -0
  158. package/file/lib/file.module.d.ts +7 -0
  159. package/file/lib/file.service.d.ts +18 -0
  160. package/format/README.md +3 -0
  161. package/format/index.d.ts +7 -0
  162. package/format/lib/format.config.d.ts +5 -0
  163. package/format/lib/format.module.d.ts +18 -0
  164. package/format/lib/format.pipe.d.ts +12 -0
  165. package/format/lib/format.service.d.ts +43 -0
  166. package/format/lib/format.types.d.ts +4 -0
  167. package/format/lib/formatters/number-formatter.d.ts +23 -0
  168. package/format/lib/formatters/string-formatter.d.ts +14 -0
  169. package/image/README.md +3 -0
  170. package/image/index.d.ts +1 -0
  171. package/image/lib/image.service.d.ts +11 -0
  172. package/index.d.ts +1 -43
  173. package/memorize/README.md +3 -0
  174. package/memorize/index.d.ts +1 -0
  175. package/memorize/lib/memorize.decorator.d.ts +1 -0
  176. package/package.json +98 -5
  177. package/pipes/README.md +3 -0
  178. package/pipes/index.d.ts +1 -0
  179. package/pipes/lib/safe/safe.pipe.d.ts +10 -0
  180. package/platform/README.md +3 -0
  181. package/platform/index.d.ts +1 -0
  182. package/{lib/platform → platform/lib}/platform.service.d.ts +14 -6
  183. package/storage/README.md +3 -0
  184. package/storage/cookie-storage.service.d.ts +104 -0
  185. package/storage/index.d.ts +4 -0
  186. package/storage/local-storage.service.d.ts +16 -0
  187. package/storage/session-storage.service.d.ts +10 -0
  188. package/storage/storage.interface.d.ts +14 -0
  189. package/translation/README.md +3 -0
  190. package/translation/index.d.ts +8 -0
  191. package/translation/lib/translation-scope.resolver.d.ts +2 -0
  192. package/translation/lib/translation.config.d.ts +14 -0
  193. package/translation/lib/translation.loader.d.ts +14 -0
  194. package/translation/lib/translation.module.d.ts +8 -0
  195. package/translation/lib/translation.service.d.ts +31 -0
  196. package/translation/lib/translation.types.d.ts +10 -0
  197. package/translation/lib/translator.directive.d.ts +12 -0
  198. package/translation/lib/translator.pipe.d.ts +12 -0
  199. package/types/README.md +3 -0
  200. package/types/index.d.ts +2 -0
  201. package/utils/README.md +3 -0
  202. package/utils/index.d.ts +5 -0
  203. package/utils/lib/auto-unsubscribe.d.ts +12 -0
  204. package/utils/lib/color-util.d.ts +24 -0
  205. package/utils/lib/drawing-util.d.ts +18 -0
  206. package/utils/lib/html-util.d.ts +5 -0
  207. package/utils/lib/string-util.d.ts +6 -0
  208. package/validation/README.md +3 -0
  209. package/validation/index.d.ts +14 -0
  210. package/validation/lib/rules/between-rule.d.ts +18 -0
  211. package/validation/lib/rules/callback-rule.d.ts +23 -0
  212. package/validation/lib/rules/equal-rule.d.ts +17 -0
  213. package/validation/lib/rules/greater-than.d.ts +17 -0
  214. package/validation/lib/rules/length-rule.d.ts +17 -0
  215. package/validation/lib/rules/less-than-rule.d.ts +17 -0
  216. package/validation/lib/rules/maxlength-rule.d.ts +16 -0
  217. package/validation/lib/rules/minlength-rule.d.ts +16 -0
  218. package/validation/lib/rules/regex-rule.d.ts +17 -0
  219. package/validation/lib/rules/required-rule.d.ts +16 -0
  220. package/validation/lib/validation.config.d.ts +15 -0
  221. package/validation/lib/validation.module.d.ts +17 -0
  222. package/validation/lib/validation.service.d.ts +35 -0
  223. package/validation/lib/validation.types.d.ts +21 -0
  224. package/esm2022/lib/classes/base-page.class.mjs +0 -26
  225. package/esm2022/lib/classes/color.class.mjs +0 -49
  226. package/esm2022/lib/classes/datetime.class.mjs +0 -323
  227. package/esm2022/lib/classes/menu.class.mjs +0 -35
  228. package/esm2022/lib/classes/navigator.class.mjs +0 -2
  229. package/esm2022/lib/classes/popup.class.mjs +0 -2
  230. package/esm2022/lib/classes/promise.class.mjs +0 -21
  231. package/esm2022/lib/classes/sectionlist.class.mjs +0 -2
  232. package/esm2022/lib/classes/select.class.mjs +0 -8
  233. package/esm2022/lib/core.module.mjs +0 -27
  234. package/esm2022/lib/error/error.class.mjs +0 -2
  235. package/esm2022/lib/error/error.module.mjs +0 -19
  236. package/esm2022/lib/error/error.service.mjs +0 -22
  237. package/esm2022/lib/events/keyboard.mjs +0 -2
  238. package/esm2022/lib/http/http-error.class.mjs +0 -2
  239. package/esm2022/lib/http/http-events.interceptor.mjs +0 -3
  240. package/esm2022/lib/http/http-request.class.mjs +0 -2
  241. package/esm2022/lib/http/http-result.class.mjs +0 -25
  242. package/esm2022/lib/http/http.module.mjs +0 -35
  243. package/esm2022/lib/http/http.service.mjs +0 -148
  244. package/esm2022/lib/locale/en.json +0 -255
  245. package/esm2022/lib/locale/fa.json +0 -245
  246. package/esm2022/lib/pipe/datetime.pipe.mjs +0 -25
  247. package/esm2022/lib/pipe/htmlToText.pipe.mjs +0 -25
  248. package/esm2022/lib/platform/index.mjs +0 -2
  249. package/esm2022/lib/platform/platform.service.mjs +0 -152
  250. package/esm2022/lib/services/config.mjs +0 -29
  251. package/esm2022/lib/services/event.service.mjs +0 -34
  252. package/esm2022/lib/services/navigator.service.mjs +0 -10
  253. package/esm2022/lib/services/storage.service.mjs +0 -16
  254. package/esm2022/lib/translator/translator.mjs +0 -26
  255. package/esm2022/lib/translator/translator.module.mjs +0 -25
  256. package/esm2022/lib/translator/translator.pipe.mjs +0 -24
  257. package/esm2022/lib/translator/translator.service.mjs +0 -21
  258. package/esm2022/lib/utils/array/array-util.mjs +0 -133
  259. package/esm2022/lib/utils/html/html-util.mjs +0 -200
  260. package/esm2022/lib/utils/html/html.module.mjs +0 -19
  261. package/esm2022/lib/utils/math/math-util.mjs +0 -6
  262. package/esm2022/lib/utils/object/object-util.mjs +0 -83
  263. package/esm2022/lib/utils/render/on-demand-preload-strategy.service.mjs +0 -21
  264. package/esm2022/lib/utils/render/render.service.mjs +0 -109
  265. package/esm2022/lib/utils/render/rendering.module.mjs +0 -35
  266. package/esm2022/lib/utils/scroll/scroll.directive.mjs +0 -56
  267. package/esm2022/lib/utils/scroll/scroll.module.mjs +0 -19
  268. package/esm2022/lib/utils/separator/separator.module.mjs +0 -19
  269. package/esm2022/lib/utils/separator/separator.pipe.mjs +0 -33
  270. package/lib/classes/base-page.class.d.ts +0 -13
  271. package/lib/classes/color.class.d.ts +0 -17
  272. package/lib/classes/datetime.class.d.ts +0 -63
  273. package/lib/classes/menu.class.d.ts +0 -34
  274. package/lib/classes/navigator.class.d.ts +0 -5
  275. package/lib/classes/popup.class.d.ts +0 -12
  276. package/lib/classes/promise.class.d.ts +0 -7
  277. package/lib/classes/sectionlist.class.d.ts +0 -8
  278. package/lib/classes/select.class.d.ts +0 -7
  279. package/lib/core.module.d.ts +0 -9
  280. package/lib/error/error.class.d.ts +0 -4
  281. package/lib/error/error.module.d.ts +0 -7
  282. package/lib/error/error.service.d.ts +0 -13
  283. package/lib/events/keyboard.d.ts +0 -2
  284. package/lib/http/http-error.class.d.ts +0 -7
  285. package/lib/http/http-events.interceptor.d.ts +0 -10
  286. package/lib/http/http-request.class.d.ts +0 -14
  287. package/lib/http/http-result.class.d.ts +0 -11
  288. package/lib/http/http.module.d.ts +0 -10
  289. package/lib/http/http.service.d.ts +0 -23
  290. package/lib/pipe/datetime.pipe.d.ts +0 -8
  291. package/lib/pipe/htmlToText.pipe.d.ts +0 -7
  292. package/lib/platform/index.d.ts +0 -1
  293. package/lib/services/config.d.ts +0 -9
  294. package/lib/services/navigator.service.d.ts +0 -8
  295. package/lib/services/storage.service.d.ts +0 -7
  296. package/lib/translator/translator.d.ts +0 -9
  297. package/lib/translator/translator.module.d.ts +0 -8
  298. package/lib/translator/translator.pipe.d.ts +0 -8
  299. package/lib/translator/translator.service.d.ts +0 -8
  300. package/lib/utils/array/array-util.d.ts +0 -6
  301. package/lib/utils/html/html-util.d.ts +0 -62
  302. package/lib/utils/html/html.module.d.ts +0 -8
  303. package/lib/utils/math/math-util.d.ts +0 -3
  304. package/lib/utils/object/object-util.d.ts +0 -7
  305. package/lib/utils/render/on-demand-preload-strategy.service.d.ts +0 -10
  306. package/lib/utils/render/render.service.d.ts +0 -18
  307. package/lib/utils/render/rendering.module.d.ts +0 -8
  308. package/lib/utils/scroll/scroll.directive.d.ts +0 -18
  309. package/lib/utils/scroll/scroll.module.d.ts +0 -8
  310. package/lib/utils/separator/separator.module.d.ts +0 -8
  311. package/lib/utils/separator/separator.pipe.d.ts +0 -8
@@ -0,0 +1,337 @@
1
+ import { isBrowser } from '@acorex/core/platform';
2
+ import { translateSync } from '@acorex/core/translation';
3
+ import { defaults, orderBy } from 'lodash-es';
4
+ export class AXCalendar {
5
+ /**
6
+ * @ignore
7
+ */
8
+ constructor(config) {
9
+ this._config = config;
10
+ }
11
+ get weekend() {
12
+ return this._config.weekend;
13
+ }
14
+ get formats() {
15
+ return this._config.formats;
16
+ }
17
+ get weekdays() {
18
+ return this._config.weekdays;
19
+ }
20
+ }
21
+ export class AXDateTime {
22
+ get date() {
23
+ return this._date;
24
+ }
25
+ get calendar() {
26
+ return this._calendar;
27
+ }
28
+ constructor(value, calendar) {
29
+ //TODO: remove unused items
30
+ this._formatKeys = {
31
+ ss: () => this.pad(this.date.getSeconds(), 2),
32
+ s: () => this.date.getSeconds().toString(),
33
+ //
34
+ dd: () => this.pad(this.calendar.dayOfMonth(this.date), 2),
35
+ DD: () => this.pad(this.calendar.dayOfMonth(this.date), 2),
36
+ d: () => this.calendar.dayOfMonth(this.date).toString(),
37
+ //
38
+ mm: () => this.pad(this.date.getMinutes(), 2),
39
+ m: () => this.date.getMinutes().toString(),
40
+ //
41
+ MMMM: () => translateSync(`dateTime.months.${this.calendar.name()}.long.${this.calendar.monthOfYear(this.date) - 1}`),
42
+ MMM: () => translateSync(`dateTime.months.${this.calendar.name()}.short.${this.calendar.monthOfYear(this.date) - 1}`),
43
+ MM: () => this.pad(this.calendar.monthOfYear(this.date), 2),
44
+ M: () => this.calendar.monthOfYear(this.date),
45
+ //
46
+ E: () => translateSync(`dateTime.weekdays.long.${this.calendar.weekdays[this.calendar.dayOfWeek(this.date) - 1]}`),
47
+ DDD: () => translateSync(`dateTime.weekdays.short.${this.calendar.weekdays[this.calendar.dayOfWeek(this.date) - 1]}`),
48
+ DDDD: () => this._formatKeys['E'](),
49
+ //
50
+ yyyy: () => this.pad(this.calendar.year(this.date), 4),
51
+ YYYY: () => this.pad(this.calendar.year(this.date), 4),
52
+ yy: () => this.pad(this.calendar.year(this.date), 4).substring(2),
53
+ YY: () => this.pad(this.calendar.year(this.date), 4).substring(2),
54
+ //
55
+ HH: () => this.pad(this.date.getHours(), 2),
56
+ H: () => this.date.getHours().toString(),
57
+ //
58
+ hh: () => this.pad(this.date.getHours() % 12 || 12, 2),
59
+ h: () => (this.date.getHours() % 12 || 12).toString(),
60
+ //
61
+ A: () => (this.date.getHours() < 12 ? 'am' : 'pm'),
62
+ a: () => (this.date.getHours() < 12 ? 'am' : 'pm'),
63
+ date: (options) => this.format(this.getDateTimeFormatByLocale(options.locale, 'shortDate')),
64
+ shortDate: (options) => this.format(this.getDateTimeFormatByLocale(options.locale, 'shortDate')),
65
+ longDate: (options) => this.format(this.getDateTimeFormatByLocale(options.locale, 'longDate')),
66
+ //
67
+ shortTime: (options) => this.format(this.getDateTimeFormatByLocale(options.locale, 'shortTime')),
68
+ time: (options) => this.format(this.getDateTimeFormatByLocale(options.locale, 'shortTime')),
69
+ longTime: (options) => this.format(this.getDateTimeFormatByLocale(options.locale, 'longTime')),
70
+ //
71
+ datetime: (options) => this.format('date time', { locale: options.locale }),
72
+ };
73
+ this._language = () => (isBrowser() ? navigator.language : 'en-GB');
74
+ this._calendar = calendar;
75
+ this._date = value;
76
+ }
77
+ clone() {
78
+ return new AXDateTime(this.date, this.calendar);
79
+ }
80
+ get dayOfMonth() {
81
+ return this._calendar.dayOfMonth(this.date);
82
+ }
83
+ get dayOfYear() {
84
+ return this._calendar.dayOfYear(this.date);
85
+ }
86
+ get dayOfWeek() {
87
+ return this._calendar.dayOfWeek(this.date);
88
+ }
89
+ get hour() {
90
+ return this._date.getHours();
91
+ }
92
+ get minute() {
93
+ return this._date.getMinutes();
94
+ }
95
+ get second() {
96
+ return this._date.getSeconds();
97
+ }
98
+ get year() {
99
+ return this._calendar.year(this.date);
100
+ }
101
+ get monthOfYear() {
102
+ return this._calendar.monthOfYear(this.date);
103
+ }
104
+ get weekOfYear() {
105
+ return this._calendar.weekOfYear(this.date);
106
+ }
107
+ get month() {
108
+ return new AXCalendarMonth(this);
109
+ }
110
+ add(unit, amount) {
111
+ return this._calendar.add(this.date, unit, amount);
112
+ }
113
+ set(unit = 'day', value) {
114
+ return this._calendar.set(this.date, unit, value);
115
+ }
116
+ duration(end) {
117
+ const date = end instanceof AXDateTime ? end.date : end;
118
+ const val = new AXDateTime(date, this.calendar);
119
+ const range = new AXDateTimeRange(this, val);
120
+ return range.duration();
121
+ }
122
+ startOf(unit = 'day') {
123
+ return this._calendar.startOf(this.date, unit);
124
+ }
125
+ endOf(unit = 'day') {
126
+ return this._calendar.endOf(this.date, unit);
127
+ }
128
+ format(format = this.getDateTimeFormatByLocale(this._language(), 'shortDate'), options) {
129
+ const effectiveOptions = defaults({}, options, {
130
+ locale: this._language(),
131
+ });
132
+ const re = new RegExp(orderBy(Object.keys(this._formatKeys), (c) => c.length, ['desc']).join('|'), 'gi');
133
+ return format.replace(re, (matched) => {
134
+ const f = this._formatKeys[matched];
135
+ const r = f(effectiveOptions);
136
+ return r;
137
+ });
138
+ }
139
+ getDateTimeFormatByLocale(locale, style) {
140
+ let options = {};
141
+ switch (style) {
142
+ case 'shortDate': // Year, Month, Day
143
+ options = { year: 'numeric', month: '2-digit', day: '2-digit' };
144
+ break;
145
+ case 'longDate': // Weekday, Month name, Day, Year
146
+ options = {
147
+ weekday: 'long',
148
+ year: 'numeric',
149
+ month: 'long',
150
+ day: 'numeric',
151
+ };
152
+ break;
153
+ case 'shortTime': // Hour, Minute
154
+ options = { hour: '2-digit', minute: '2-digit', hour12: false };
155
+ break;
156
+ case 'longTime': // Hour, Minute, Second
157
+ options = {
158
+ hour: '2-digit',
159
+ minute: '2-digit',
160
+ second: '2-digit',
161
+ hour12: false,
162
+ };
163
+ break;
164
+ }
165
+ const formatter = new Intl.DateTimeFormat(locale, options);
166
+ // Get parts of the date and/or time
167
+ const parts = formatter.formatToParts(new Date());
168
+ // Map parts to their respective format
169
+ const formatMap = {
170
+ day: 'dd',
171
+ month: style == 'longDate' ? 'MMMM' : 'MM',
172
+ year: 'yyyy',
173
+ hour: 'HH',
174
+ minute: 'mm',
175
+ second: 'ss',
176
+ weekday: 'E',
177
+ literal: '',
178
+ };
179
+ // Construct the date and/or time format string
180
+ return parts
181
+ .map((part) => {
182
+ if (part.type === 'literal') {
183
+ // Use the literal part directly as separator
184
+ return part.value;
185
+ }
186
+ else {
187
+ return formatMap[part.type] || part.value;
188
+ }
189
+ })
190
+ .join('');
191
+ }
192
+ pad(n, width, z = '0') {
193
+ n = n + '';
194
+ return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
195
+ }
196
+ equal(value, unit = 'day') {
197
+ return this.compare(value, unit) == 0;
198
+ }
199
+ compare(value, unit = 'day') {
200
+ const date = value instanceof AXDateTime ? value.date : value;
201
+ const val = new AXDateTime(date, this.calendar);
202
+ const func = (v1, v2) => {
203
+ if (v1 == v2) {
204
+ return 0;
205
+ }
206
+ else if (v1 > v2) {
207
+ return 1;
208
+ }
209
+ else {
210
+ return -1;
211
+ }
212
+ };
213
+ let p = 0;
214
+ switch (unit) {
215
+ case 'year':
216
+ return func(this.year, val.year);
217
+ case 'week':
218
+ p = this.compare(val, 'year');
219
+ return p == 0 ? func(this.weekOfYear, val.weekOfYear) : p;
220
+ case 'month':
221
+ p = this.compare(val, 'year');
222
+ return p == 0 ? func(this.monthOfYear, val.monthOfYear) : p;
223
+ case 'day':
224
+ p = this.compare(val, 'year');
225
+ return p == 0 ? func(this.dayOfYear, val.dayOfYear) : p;
226
+ case 'hour':
227
+ p = this.compare(val, 'day');
228
+ return p == 0 ? func(this.hour, val.hour) : p;
229
+ case 'minute':
230
+ p = this.compare(val, 'hour');
231
+ return p == 0 ? func(this.minute, val.minute) : p;
232
+ case 'second':
233
+ p = this.compare(val, 'minute');
234
+ return p == 0 ? func(this.second, val.second) : p;
235
+ default:
236
+ return func(this.date.getTime(), val.date.getTime());
237
+ }
238
+ }
239
+ }
240
+ export class AXCalendarMonth {
241
+ get range() {
242
+ return this._range;
243
+ }
244
+ set range(v) {
245
+ this._range = v;
246
+ }
247
+ get totalDays() {
248
+ return this.range.endTime.dayOfMonth;
249
+ }
250
+ constructor(date) {
251
+ this.index = date.date.getMonth();
252
+ this.name = date.format('MMMM');
253
+ this.range = new AXDateTimeRange(new AXDateTime(date.startOf('month').date, date.calendar), new AXDateTime(date.endOf('month').date, date.calendar));
254
+ }
255
+ }
256
+ export class AXDateTimeRange {
257
+ get startTime() {
258
+ return this._startTime;
259
+ }
260
+ get endTime() {
261
+ return this._endTime;
262
+ }
263
+ constructor(startTime, endTime) {
264
+ this._startTime = startTime;
265
+ this._endTime = endTime;
266
+ }
267
+ duration() {
268
+ const result = {
269
+ miliseconds: 0,
270
+ seconds: 0,
271
+ minutes: 0,
272
+ hours: 0,
273
+ days: 0,
274
+ months: 0,
275
+ years: 0,
276
+ total: {
277
+ miliseconds: 0,
278
+ seconds: 0,
279
+ minutes: 0,
280
+ hours: 0,
281
+ days: 0,
282
+ weeks: 0,
283
+ months: 0,
284
+ years: 0,
285
+ },
286
+ };
287
+ const one_second = 1000;
288
+ const one_min = one_second * 60;
289
+ const one_hour = one_min * 60;
290
+ const one_day = one_hour * 24;
291
+ const one_week = one_day * 7;
292
+ const one_year = 365.25 * one_day;
293
+ const one_month = one_year / 12;
294
+ const startTime = this._startTime.date.getTime();
295
+ const endTime = this._endTime.date.getTime();
296
+ const diff = Math.abs(endTime - startTime);
297
+ //
298
+ result.total.miliseconds = diff;
299
+ result.total.seconds = Number((diff / one_second).toFixed(2));
300
+ result.total.minutes = Number((diff / one_min).toFixed(2));
301
+ result.total.hours = Number((diff / one_hour).toFixed(2));
302
+ result.total.days = Number((diff / one_day).toFixed(2));
303
+ result.total.weeks = Number((diff / one_week).toFixed(2));
304
+ //
305
+ // let months = (this.endTime.year - this.startTime.year) * 12;
306
+ // months += this.endTime.monthOfYear - this.startTime.monthOfYear + 1;
307
+ // if (this.endTime.dayOfYear < this.startTime.dayOfYear) {
308
+ // months--;
309
+ // }
310
+ // result.total.months = Math.abs(months);
311
+ // TODO: review
312
+ result.total.months = Number((diff / one_month).toFixed(2));
313
+ result.total.years = Number((diff / one_year).toFixed(2));
314
+ //
315
+ result.miliseconds = result.total.miliseconds % 1000;
316
+ result.seconds = Number((result.total.seconds % 60).toFixed(0));
317
+ result.minutes = Number((result.total.minutes % 60).toFixed(0));
318
+ result.hours = Number((result.total.hours % 24).toFixed(0));
319
+ // TODO: review
320
+ result.days = Number((result.total.days % 30.4).toFixed(0));
321
+ result.months = Number((result.total.months % 12).toFixed(0));
322
+ result.years = Number(result.total.years.toFixed(0));
323
+ return result;
324
+ }
325
+ enumurate(unit = 'day', amount = 1) {
326
+ const result = [];
327
+ let item = this._startTime.clone();
328
+ while (item.compare(this._endTime, unit) < 1) {
329
+ if (!result.some((c) => c.equal(item, unit))) {
330
+ result.push(item);
331
+ }
332
+ item = item.add(unit, amount);
333
+ }
334
+ return result;
335
+ }
336
+ }
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvZGF0ZS10aW1lL3NyYy9saWIvZGF0ZXRpbWUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXNEOUMsTUFBTSxPQUFnQixVQUFVO0lBRzlCOztPQUVHO0lBQ0gsWUFBWSxNQUF3QjtRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUMvQixDQUFDO0NBMkJGO0FBRUQsTUFBTSxPQUFPLFVBQVU7SUFHckIsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFHRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELFlBQVksS0FBVyxFQUFFLFFBQW9CO1FBd0U3QywyQkFBMkI7UUFDbkIsZ0JBQVcsR0FBRztZQUNwQixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDMUMsRUFBRTtZQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUN2RCxFQUFFO1lBQ0YsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQzFDLEVBQUU7WUFDRixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLG1CQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNySCxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLG1CQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNySCxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdDLEVBQUU7WUFDRixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLDBCQUEwQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsSCxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLDJCQUEyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNySCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQyxFQUFFO1lBQ0YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLEVBQUU7WUFDRixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDeEMsRUFBRTtZQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3JELEVBQUU7WUFDRixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbEQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2xELElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFF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c0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSAnQGFjb3JleC9jb3JlL3BsYXRmb3JtJztcbmltcG9ydCB7IHRyYW5zbGF0ZVN5bmMgfSBmcm9tICdAYWNvcmV4L2NvcmUvdHJhbnNsYXRpb24nO1xuaW1wb3J0IHsgZGVmYXVsdHMsIG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5leHBvcnQgdHlwZSBUaW1lVW5pdCA9ICdtcycgfCAnc2Vjb25kJyB8ICdtaW51dGUnIHwgJ2hvdXInIHwgJ2RheScgfCAnbW9udGgnIHwgJ3llYXInIHwgJ3dlZWsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFYRGF0ZVZhbHVlIHtcbiAgeWVhcjogbnVtYmVyO1xuICBtb250aDogbnVtYmVyO1xuICBkYXRlOiBudW1iZXI7XG4gIGhvdXJzPzogbnVtYmVyO1xuICBtaW51dGVzPzogbnVtYmVyO1xuICBzZWNvbmRzPzogbnVtYmVyO1xuICBtcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWERhdGVUaW1lRGlzcGxheUZvcm1hdHMge1xuICBkYXRlSW5wdXQ6IHN0cmluZztcbiAgdGltZUlucHV0OiBzdHJpbmc7XG4gIGRhdGVUaW1lSW5wdXQ6IHN0cmluZztcbiAgZGF0ZURpc3BsYXk6IHN0cmluZztcbiAgdGltZURpc3BsYXk6IHN0cmluZztcbiAgZGF0ZVRpbWVEaXNwbGF5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEFYRGF0ZVRpbWVVbml0TmFtZXMgPSB7XG4gIGxvbmc6IHN0cmluZztcbiAgc2hvcnQ6IHN0cmluZztcbiAgbGV0dGVyOiBzdHJpbmc7XG59W107XG5cbmV4cG9ydCB0eXBlIEFYRGF0ZVRpbWVQYXJ0ID0ge1xuICBrZXk6IHN0cmluZztcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcGxhY2Vob2xkZXJzOiBzdHJpbmdbXTtcbiAgdHlwZWRWYWx1ZT86IHN0cmluZyB8IG51bGw7XG4gIGRlZmF1bHQ6IG51bWJlcjtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgcmVhbFZhbHVlOiAoKSA9PiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBWERhdGVUaW1lUGFydHMgPSB7XG4gIHllYXI6IEFYRGF0ZVRpbWVQYXJ0O1xuICBtb250aDogQVhEYXRlVGltZVBhcnQ7XG4gIGRheTogQVhEYXRlVGltZVBhcnQ7XG4gIGhvdXI6IEFYRGF0ZVRpbWVQYXJ0O1xuICBtaW51dGU6IEFYRGF0ZVRpbWVQYXJ0O1xuICBzZWNvbmQ6IEFYRGF0ZVRpbWVQYXJ0O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBWENhbGVuZGFyQ29uZmlnIHtcbiAgd2Vla2RheXM6IG51bWJlcltdO1xuICB3ZWVrZW5kOiBudW1iZXJbXTtcbiAgZm9ybWF0czogQVhEYXRlVGltZURpc3BsYXlGb3JtYXRzO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQVhDYWxlbmRhciB7XG4gIHByaXZhdGUgX2NvbmZpZzogQVhDYWxlbmRhckNvbmZpZztcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBWENhbGVuZGFyQ29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgcHVibGljIGdldCB3ZWVrZW5kKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLndlZWtlbmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHMoKTogQVhEYXRlVGltZURpc3BsYXlGb3JtYXRzIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmZvcm1hdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdlZWtkYXlzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLndlZWtkYXlzO1xuICB9XG5cbiAgYWJzdHJhY3QgbmFtZSgpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3QgZGF5T2ZNb250aChkYXRlOiBEYXRlKTogbnVtYmVyO1xuXG4gIGFic3RyYWN0IGRheU9mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyO1xuXG4gIGFic3RyYWN0IGRheU9mV2VlayhkYXRlOiBEYXRlKTogbnVtYmVyO1xuXG4gIGFic3RyYWN0IG1vbnRoT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXI7XG5cbiAgYWJzdHJhY3Qgd2Vla09mWWVhcihkYXRlOiBEYXRlKTogbnVtYmVyO1xuXG4gIGFic3RyYWN0IHllYXIoZGF0ZTogRGF0ZSk6IG51bWJlcjtcblxuICBhYnN0cmFjdCBhZGQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIGFtb3VudDogbnVtYmVyKTogQVhEYXRlVGltZTtcblxuICBhYnN0cmFjdCBzZXQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIHZhbHVlOiBudW1iZXIpOiBBWERhdGVUaW1lO1xuXG4gIGFic3RyYWN0IHN0YXJ0T2YoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQpOiBBWERhdGVUaW1lO1xuXG4gIGFic3RyYWN0IGVuZE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZTtcblxuICBhYnN0cmFjdCBjcmVhdGUodmFsdWU6IEFYRGF0ZVZhbHVlKTogQVhEYXRlVGltZTtcblxuICBhYnN0cmFjdCBwYXJzZSh2YWx1ZTogc3RyaW5nKTogQVhEYXRlVGltZTtcbn1cblxuZXhwb3J0IGNsYXNzIEFYRGF0ZVRpbWUge1xuICBwcml2YXRlIF9kYXRlOiBEYXRlO1xuXG4gIGdldCBkYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsZW5kYXI6IEFYQ2FsZW5kYXI7XG4gIGdldCBjYWxlbmRhcigpOiBBWENhbGVuZGFyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogRGF0ZSwgY2FsZW5kYXI6IEFYQ2FsZW5kYXIpIHtcbiAgICB0aGlzLl9jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgIHRoaXMuX2RhdGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGNsb25lKCk6IEFYRGF0ZVRpbWUge1xuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZSh0aGlzLmRhdGUsIHRoaXMuY2FsZW5kYXIpO1xuICB9XG5cbiAgZ2V0IGRheU9mTW9udGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuZGF5T2ZNb250aCh0aGlzLmRhdGUpO1xuICB9XG5cbiAgZ2V0IGRheU9mWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5kYXlPZlllYXIodGhpcy5kYXRlKTtcbiAgfVxuXG4gIGdldCBkYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuZGF5T2ZXZWVrKHRoaXMuZGF0ZSk7XG4gIH1cblxuICBnZXQgaG91cigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRlLmdldEhvdXJzKCk7XG4gIH1cblxuICBnZXQgbWludXRlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0TWludXRlcygpO1xuICB9XG5cbiAgZ2V0IHNlY29uZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFNlY29uZHMoKTtcbiAgfVxuXG4gIGdldCB5ZWFyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyLnllYXIodGhpcy5kYXRlKTtcbiAgfVxuXG4gIGdldCBtb250aE9mWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5tb250aE9mWWVhcih0aGlzLmRhdGUpO1xuICB9XG5cbiAgZ2V0IHdlZWtPZlllYXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIud2Vla09mWWVhcih0aGlzLmRhdGUpO1xuICB9XG5cbiAgZ2V0IG1vbnRoKCk6IEFYQ2FsZW5kYXJNb250aCB7XG4gICAgcmV0dXJuIG5ldyBBWENhbGVuZGFyTW9udGgodGhpcyk7XG4gIH1cblxuICBhZGQodW5pdDogVGltZVVuaXQsIGFtb3VudDogbnVtYmVyKTogQVhEYXRlVGltZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyLmFkZCh0aGlzLmRhdGUsIHVuaXQsIGFtb3VudCk7XG4gIH1cblxuICBzZXQodW5pdDogVGltZVVuaXQgPSAnZGF5JywgdmFsdWU6IG51bWJlcik6IEFYRGF0ZVRpbWUge1xuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5zZXQodGhpcy5kYXRlLCB1bml0LCB2YWx1ZSk7XG4gIH1cblxuICBkdXJhdGlvbihlbmQ6IERhdGUgfCBBWERhdGVUaW1lKTogQVhUaW1lU3BhbiB7XG4gICAgY29uc3QgZGF0ZSA9IGVuZCBpbnN0YW5jZW9mIEFYRGF0ZVRpbWUgPyBlbmQuZGF0ZSA6IChlbmQgYXMgRGF0ZSk7XG4gICAgY29uc3QgdmFsID0gbmV3IEFYRGF0ZVRpbWUoZGF0ZSwgdGhpcy5jYWxlbmRhcik7XG4gICAgY29uc3QgcmFuZ2UgPSBuZXcgQVhEYXRlVGltZVJhbmdlKHRoaXMsIHZhbCk7XG4gICAgcmV0dXJuIHJhbmdlLmR1cmF0aW9uKCk7XG4gIH1cblxuICBzdGFydE9mKHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpOiBBWERhdGVUaW1lIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuc3RhcnRPZih0aGlzLmRhdGUsIHVuaXQpO1xuICB9XG5cbiAgZW5kT2YodW5pdDogVGltZVVuaXQgPSAnZGF5Jyk6IEFYRGF0ZVRpbWUge1xuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5lbmRPZih0aGlzLmRhdGUsIHVuaXQpO1xuICB9XG5cbiAgLy9UT0RPOiByZW1vdmUgdW51c2VkIGl0ZW1zXG4gIHByaXZhdGUgX2Zvcm1hdEtleXMgPSB7XG4gICAgc3M6ICgpID0+IHRoaXMucGFkKHRoaXMuZGF0ZS5nZXRTZWNvbmRzKCksIDIpLFxuICAgIHM6ICgpID0+IHRoaXMuZGF0ZS5nZXRTZWNvbmRzKCkudG9TdHJpbmcoKSxcbiAgICAvL1xuICAgIGRkOiAoKSA9PiB0aGlzLnBhZCh0aGlzLmNhbGVuZGFyLmRheU9mTW9udGgodGhpcy5kYXRlKSwgMiksXG4gICAgREQ6ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIuZGF5T2ZNb250aCh0aGlzLmRhdGUpLCAyKSxcbiAgICBkOiAoKSA9PiB0aGlzLmNhbGVuZGFyLmRheU9mTW9udGgodGhpcy5kYXRlKS50b1N0cmluZygpLFxuICAgIC8vXG4gICAgbW06ICgpID0+IHRoaXMucGFkKHRoaXMuZGF0ZS5nZXRNaW51dGVzKCksIDIpLFxuICAgIG06ICgpID0+IHRoaXMuZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKSxcbiAgICAvL1xuICAgIE1NTU06ICgpID0+IHRyYW5zbGF0ZVN5bmMoYGRhdGVUaW1lLm1vbnRocy4ke3RoaXMuY2FsZW5kYXIubmFtZSgpfS5sb25nLiR7dGhpcy5jYWxlbmRhci5tb250aE9mWWVhcih0aGlzLmRhdGUpIC0gMX1gKSxcbiAgICBNTU06ICgpID0+IHRyYW5zbGF0ZVN5bmMoYGRhdGVUaW1lLm1vbnRocy4ke3RoaXMuY2FsZW5kYXIubmFtZSgpfS5zaG9ydC4ke3RoaXMuY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKSAtIDF9YCksXG4gICAgTU06ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKSwgMiksXG4gICAgTTogKCkgPT4gdGhpcy5jYWxlbmRhci5tb250aE9mWWVhcih0aGlzLmRhdGUpLFxuICAgIC8vXG4gICAgRTogKCkgPT4gdHJhbnNsYXRlU3luYyhgZGF0ZVRpbWUud2Vla2RheXMubG9uZy4ke3RoaXMuY2FsZW5kYXIud2Vla2RheXNbdGhpcy5jYWxlbmRhci5kYXlPZldlZWsodGhpcy5kYXRlKSAtIDFdfWApLFxuICAgIERERDogKCkgPT4gdHJhbnNsYXRlU3luYyhgZGF0ZVRpbWUud2Vla2RheXMuc2hvcnQuJHt0aGlzLmNhbGVuZGFyLndlZWtkYXlzW3RoaXMuY2FsZW5kYXIuZGF5T2ZXZWVrKHRoaXMuZGF0ZSkgLSAxXX1gKSxcbiAgICBEREREOiAoKSA9PiB0aGlzLl9mb3JtYXRLZXlzWydFJ10oKSxcbiAgICAvL1xuICAgIHl5eXk6ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpLCA0KSxcbiAgICBZWVlZOiAoKSA9PiB0aGlzLnBhZCh0aGlzLmNhbGVuZGFyLnllYXIodGhpcy5kYXRlKSwgNCksXG4gICAgeXk6ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpLCA0KS5zdWJzdHJpbmcoMiksXG4gICAgWVk6ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpLCA0KS5zdWJzdHJpbmcoMiksXG4gICAgLy9cbiAgICBISDogKCkgPT4gdGhpcy5wYWQodGhpcy5kYXRlLmdldEhvdXJzKCksIDIpLFxuICAgIEg6ICgpID0+IHRoaXMuZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCksXG4gICAgLy9cbiAgICBoaDogKCkgPT4gdGhpcy5wYWQodGhpcy5kYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgMiksXG4gICAgaDogKCkgPT4gKHRoaXMuZGF0ZS5nZXRIb3VycygpICUgMTIgfHwgMTIpLnRvU3RyaW5nKCksXG4gICAgLy9cbiAgICBBOiAoKSA9PiAodGhpcy5kYXRlLmdldEhvdXJzKCkgPCAxMiA/ICdhbScgOiAncG0nKSxcbiAgICBhOiAoKSA9PiAodGhpcy5kYXRlLmdldEhvdXJzKCkgPCAxMiA/ICdhbScgOiAncG0nKSxcbiAgICBkYXRlOiAob3B0aW9ucykgPT4gdGhpcy5mb3JtYXQodGhpcy5nZXREYXRlVGltZUZvcm1hdEJ5TG9jYWxlKG9wdGlvbnMubG9jYWxlLCAnc2hvcnREYXRlJykpLFxuICAgIHNob3J0RGF0ZTogKG9wdGlvbnMpID0+IHRoaXMuZm9ybWF0KHRoaXMuZ2V0RGF0ZVRpbWVGb3JtYXRCeUxvY2FsZShvcHRpb25zLmxvY2FsZSwgJ3Nob3J0RGF0ZScpKSxcbiAgICBsb25nRGF0ZTogKG9wdGlvbnMpID0+IHRoaXMuZm9ybWF0KHRoaXMuZ2V0RGF0ZVRpbWVGb3JtYXRCeUxvY2FsZShvcHRpb25zLmxvY2FsZSwgJ2xvbmdEYXRlJykpLFxuICAgIC8vXG4gICAgc2hvcnRUaW1lOiAob3B0aW9ucykgPT4gdGhpcy5mb3JtYXQodGhpcy5nZXREYXRlVGltZUZvcm1hdEJ5TG9jYWxlKG9wdGlvbnMubG9jYWxlLCAnc2hvcnRUaW1lJykpLFxuICAgIHRpbWU6IChvcHRpb25zKSA9PiB0aGlzLmZvcm1hdCh0aGlzLmdldERhdGVUaW1lRm9ybWF0QnlMb2NhbGUob3B0aW9ucy5sb2NhbGUsICdzaG9ydFRpbWUnKSksXG4gICAgbG9uZ1RpbWU6IChvcHRpb25zKSA9PiB0aGlzLmZvcm1hdCh0aGlzLmdldERhdGVUaW1lRm9ybWF0QnlMb2NhbGUob3B0aW9ucy5sb2NhbGUsICdsb25nVGltZScpKSxcbiAgICAvL1xuICAgIGRhdGV0aW1lOiAob3B0aW9ucykgPT4gdGhpcy5mb3JtYXQoJ2RhdGUgdGltZScsIHsgbG9jYWxlOiBvcHRpb25zLmxvY2FsZSB9KSxcbiAgfTtcblxuICBwcm90ZWN0ZWQgX2xhbmd1YWdlID0gKCkgPT4gKGlzQnJvd3NlcigpID8gbmF2aWdhdG9yLmxhbmd1YWdlIDogJ2VuLUdCJyk7XG5cbiAgZm9ybWF0KGZvcm1hdDogc3RyaW5nID0gdGhpcy5nZXREYXRlVGltZUZvcm1hdEJ5TG9jYWxlKHRoaXMuX2xhbmd1YWdlKCksICdzaG9ydERhdGUnKSwgb3B0aW9ucz86IHsgbG9jYWxlPzogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGVmZmVjdGl2ZU9wdGlvbnMgPSBkZWZhdWx0cyh7fSwgb3B0aW9ucywge1xuICAgICAgbG9jYWxlOiB0aGlzLl9sYW5ndWFnZSgpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChvcmRlckJ5KE9iamVjdC5rZXlzKHRoaXMuX2Zvcm1hdEtleXMpLCAoYykgPT4gYy5sZW5ndGgsIFsnZGVzYyddKS5qb2luKCd8JyksICdnaScpO1xuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZShyZSwgKG1hdGNoZWQpID0+IHtcbiAgICAgIGNvbnN0IGYgPSB0aGlzLl9mb3JtYXRLZXlzW21hdGNoZWRdO1xuICAgICAgY29uc3QgciA9IGYoZWZmZWN0aXZlT3B0aW9ucyk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGVUaW1lRm9ybWF0QnlMb2NhbGUobG9jYWxlOiBzdHJpbmcsIHN0eWxlOiAnc2hvcnREYXRlJyB8ICdsb25nRGF0ZScgfCAnc2hvcnRUaW1lJyB8ICdsb25nVGltZScpOiBzdHJpbmcge1xuICAgIGxldCBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHt9O1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ3Nob3J0RGF0ZSc6IC8vIFllYXIsIE1vbnRoLCBEYXlcbiAgICAgICAgb3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJzItZGlnaXQnLCBkYXk6ICcyLWRpZ2l0JyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xvbmdEYXRlJzogLy8gV2Vla2RheSwgTW9udGggbmFtZSwgRGF5LCBZZWFyXG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxuICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Nob3J0VGltZSc6IC8vIEhvdXIsIE1pbnV0ZVxuICAgICAgICBvcHRpb25zID0geyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBob3VyMTI6IGZhbHNlIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbG9uZ1RpbWUnOiAvLyBIb3VyLCBNaW51dGUsIFNlY29uZFxuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG9wdGlvbnMpO1xuXG4gICAgLy8gR2V0IHBhcnRzIG9mIHRoZSBkYXRlIGFuZC9vciB0aW1lXG4gICAgY29uc3QgcGFydHMgPSBmb3JtYXR0ZXIuZm9ybWF0VG9QYXJ0cyhuZXcgRGF0ZSgpKTtcblxuICAgIC8vIE1hcCBwYXJ0cyB0byB0aGVpciByZXNwZWN0aXZlIGZvcm1hdFxuICAgIGNvbnN0IGZvcm1hdE1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIGRheTogJ2RkJyxcbiAgICAgIG1vbnRoOiBzdHlsZSA9PSAnbG9uZ0RhdGUnID8gJ01NTU0nIDogJ01NJyxcbiAgICAgIHllYXI6ICd5eXl5JyxcbiAgICAgIGhvdXI6ICdISCcsXG4gICAgICBtaW51dGU6ICdtbScsXG4gICAgICBzZWNvbmQ6ICdzcycsXG4gICAgICB3ZWVrZGF5OiAnRScsXG4gICAgICBsaXRlcmFsOiAnJyxcbiAgICB9O1xuXG4gICAgLy8gQ29uc3RydWN0IHRoZSBkYXRlIGFuZC9vciB0aW1lIGZvcm1hdCBzdHJpbmdcbiAgICByZXR1cm4gcGFydHNcbiAgICAgIC5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSBsaXRlcmFsIHBhcnQgZGlyZWN0bHkgYXMgc2VwYXJhdG9yXG4gICAgICAgICAgcmV0dXJuIHBhcnQudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE1hcFtwYXJ0LnR5cGVdIHx8IHBhcnQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIHBhZChuLCB3aWR0aCwgeiA9ICcwJykge1xuICAgIG4gPSBuICsgJyc7XG4gICAgcmV0dXJuIG4ubGVuZ3RoID49IHdpZHRoID8gbiA6IG5ldyBBcnJheSh3aWR0aCAtIG4ubGVuZ3RoICsgMSkuam9pbih6KSArIG47XG4gIH1cblxuICBlcXVhbCh2YWx1ZTogRGF0ZSB8IEFYRGF0ZVRpbWUsIHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wYXJlKHZhbHVlLCB1bml0KSA9PSAwO1xuICB9XG5cbiAgY29tcGFyZSh2YWx1ZTogRGF0ZSB8IEFYRGF0ZVRpbWUsIHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpIHtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBBWERhdGVUaW1lID8gdmFsdWUuZGF0ZSA6ICh2YWx1ZSBhcyBEYXRlKTtcbiAgICBjb25zdCB2YWwgPSBuZXcgQVhEYXRlVGltZShkYXRlLCB0aGlzLmNhbGVuZGFyKTtcbiAgICBjb25zdCBmdW5jID0gKHYxOiBudW1iZXIsIHYyOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICh2MSA9PSB2Mikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSBpZiAodjEgPiB2Mikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGxldCBwID0gMDtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICByZXR1cm4gZnVuYyh0aGlzLnllYXIsIHZhbC55ZWFyKTtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcbiAgICAgICAgcmV0dXJuIHAgPT0gMCA/IGZ1bmModGhpcy53ZWVrT2ZZZWFyLCB2YWwud2Vla09mWWVhcikgOiBwO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcbiAgICAgICAgcmV0dXJuIHAgPT0gMCA/IGZ1bmModGhpcy5tb250aE9mWWVhciwgdmFsLm1vbnRoT2ZZZWFyKSA6IHA7XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcbiAgICAgICAgcmV0dXJuIHAgPT0gMCA/IGZ1bmModGhpcy5kYXlPZlllYXIsIHZhbC5kYXlPZlllYXIpIDogcDtcbiAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ2RheScpO1xuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLmhvdXIsIHZhbC5ob3VyKSA6IHA7XG4gICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ2hvdXInKTtcbiAgICAgICAgcmV0dXJuIHAgPT0gMCA/IGZ1bmModGhpcy5taW51dGUsIHZhbC5taW51dGUpIDogcDtcbiAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIHAgPSB0aGlzLmNvbXBhcmUodmFsLCAnbWludXRlJyk7XG4gICAgICAgIHJldHVybiBwID09IDAgPyBmdW5jKHRoaXMuc2Vjb25kLCB2YWwuc2Vjb25kKSA6IHA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZnVuYyh0aGlzLmRhdGUuZ2V0VGltZSgpLCB2YWwuZGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVhDYWxlbmRhck1vbnRoIHtcbiAgcHJpdmF0ZSBfcmFuZ2U6IEFYRGF0ZVRpbWVSYW5nZTtcbiAgcHVibGljIGdldCByYW5nZSgpOiBBWERhdGVUaW1lUmFuZ2Uge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhbmdlKHY6IEFYRGF0ZVRpbWVSYW5nZSkge1xuICAgIHRoaXMuX3JhbmdlID0gdjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxEYXlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2UuZW5kVGltZS5kYXlPZk1vbnRoO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZGF0ZTogQVhEYXRlVGltZSkge1xuICAgIHRoaXMuaW5kZXggPSBkYXRlLmRhdGUuZ2V0TW9udGgoKTtcbiAgICB0aGlzLm5hbWUgPSBkYXRlLmZvcm1hdCgnTU1NTScpO1xuICAgIHRoaXMucmFuZ2UgPSBuZXcgQVhEYXRlVGltZVJhbmdlKFxuICAgICAgbmV3IEFYRGF0ZVRpbWUoZGF0ZS5zdGFydE9mKCdtb250aCcpLmRhdGUsIGRhdGUuY2FsZW5kYXIpLFxuICAgICAgbmV3IEFYRGF0ZVRpbWUoZGF0ZS5lbmRPZignbW9udGgnKS5kYXRlLCBkYXRlLmNhbGVuZGFyKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFRpbWVTcGFuVG90YWwge1xuICBtaWxpc2Vjb25kczogbnVtYmVyO1xuICBzZWNvbmRzOiBudW1iZXI7XG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgaG91cnM6IG51bWJlcjtcbiAgZGF5czogbnVtYmVyO1xuICB3ZWVrczogbnVtYmVyO1xuICBtb250aHM6IG51bWJlcjtcbiAgeWVhcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFRpbWVTcGFuIHtcbiAgbWlsaXNlY29uZHM6IG51bWJlcjtcbiAgc2Vjb25kczogbnVtYmVyO1xuICBtaW51dGVzOiBudW1iZXI7XG4gIGhvdXJzOiBudW1iZXI7XG4gIGRheXM6IG51bWJlcjtcbiAgbW9udGhzOiBudW1iZXI7XG4gIHllYXJzOiBudW1iZXI7XG4gIHRvdGFsOiBBWFRpbWVTcGFuVG90YWw7XG59XG5cbmV4cG9ydCBjbGFzcyBBWERhdGVUaW1lUmFuZ2Uge1xuICBwcml2YXRlIF9zdGFydFRpbWU6IEFYRGF0ZVRpbWU7XG4gIHByaXZhdGUgX2VuZFRpbWU6IEFYRGF0ZVRpbWU7XG5cbiAgcHVibGljIGdldCBzdGFydFRpbWUoKTogQVhEYXRlVGltZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0VGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW5kVGltZSgpOiBBWERhdGVUaW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZW5kVGltZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHN0YXJ0VGltZTogQVhEYXRlVGltZSwgZW5kVGltZTogQVhEYXRlVGltZSkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IHN0YXJ0VGltZTtcbiAgICB0aGlzLl9lbmRUaW1lID0gZW5kVGltZTtcbiAgfVxuXG4gIGR1cmF0aW9uKCk6IEFYVGltZVNwYW4ge1xuICAgIGNvbnN0IHJlc3VsdDogQVhUaW1lU3BhbiA9IHtcbiAgICAgIG1pbGlzZWNvbmRzOiAwLFxuICAgICAgc2Vjb25kczogMCxcbiAgICAgIG1pbnV0ZXM6IDAsXG4gICAgICBob3VyczogMCxcbiAgICAgIGRheXM6IDAsXG4gICAgICBtb250aHM6IDAsXG4gICAgICB5ZWFyczogMCxcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIG1pbGlzZWNvbmRzOiAwLFxuICAgICAgICBzZWNvbmRzOiAwLFxuICAgICAgICBtaW51dGVzOiAwLFxuICAgICAgICBob3VyczogMCxcbiAgICAgICAgZGF5czogMCxcbiAgICAgICAgd2Vla3M6IDAsXG4gICAgICAgIG1vbnRoczogMCxcbiAgICAgICAgeWVhcnM6IDAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBvbmVfc2Vjb25kID0gMTAwMDtcbiAgICBjb25zdCBvbmVfbWluID0gb25lX3NlY29uZCAqIDYwO1xuICAgIGNvbnN0IG9uZV9ob3VyID0gb25lX21pbiAqIDYwO1xuICAgIGNvbnN0IG9uZV9kYXkgPSBvbmVfaG91ciAqIDI0O1xuICAgIGNvbnN0IG9uZV93ZWVrID0gb25lX2RheSAqIDc7XG4gICAgY29uc3Qgb25lX3llYXIgPSAzNjUuMjUgKiBvbmVfZGF5O1xuICAgIGNvbnN0IG9uZV9tb250aCA9IG9uZV95ZWFyIC8gMTI7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lLmRhdGUuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lLmRhdGUuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhlbmRUaW1lIC0gc3RhcnRUaW1lKTtcbiAgICAvL1xuICAgIHJlc3VsdC50b3RhbC5taWxpc2Vjb25kcyA9IGRpZmY7XG4gICAgcmVzdWx0LnRvdGFsLnNlY29uZHMgPSBOdW1iZXIoKGRpZmYgLyBvbmVfc2Vjb25kKS50b0ZpeGVkKDIpKTtcbiAgICByZXN1bHQudG90YWwubWludXRlcyA9IE51bWJlcigoZGlmZiAvIG9uZV9taW4pLnRvRml4ZWQoMikpO1xuICAgIHJlc3VsdC50b3RhbC5ob3VycyA9IE51bWJlcigoZGlmZiAvIG9uZV9ob3VyKS50b0ZpeGVkKDIpKTtcbiAgICByZXN1bHQudG90YWwuZGF5cyA9IE51bWJlcigoZGlmZiAvIG9uZV9kYXkpLnRvRml4ZWQoMikpO1xuICAgIHJlc3VsdC50b3RhbC53ZWVrcyA9IE51bWJlcigoZGlmZiAvIG9uZV93ZWVrKS50b0ZpeGVkKDIpKTtcbiAgICAvL1xuICAgIC8vIGxldCBtb250aHMgPSAodGhpcy5lbmRUaW1lLnllYXIgLSB0aGlzLnN0YXJ0VGltZS55ZWFyKSAqIDEyO1xuICAgIC8vIG1vbnRocyArPSB0aGlzLmVuZFRpbWUubW9udGhPZlllYXIgLSB0aGlzLnN0YXJ0VGltZS5tb250aE9mWWVhciArIDE7XG4gICAgLy8gaWYgKHRoaXMuZW5kVGltZS5kYXlPZlllYXIgPCB0aGlzLnN0YXJ0VGltZS5kYXlPZlllYXIpIHtcbiAgICAvLyAgICAgbW9udGhzLS07XG4gICAgLy8gfVxuICAgIC8vIHJlc3VsdC50b3RhbC5tb250aHMgPSBNYXRoLmFicyhtb250aHMpO1xuICAgIC8vIFRPRE86IHJldmlld1xuICAgIHJlc3VsdC50b3RhbC5tb250aHMgPSBOdW1iZXIoKGRpZmYgLyBvbmVfbW9udGgpLnRvRml4ZWQoMikpO1xuICAgIHJlc3VsdC50b3RhbC55ZWFycyA9IE51bWJlcigoZGlmZiAvIG9uZV95ZWFyKS50b0ZpeGVkKDIpKTtcbiAgICAvL1xuICAgIHJlc3VsdC5taWxpc2Vjb25kcyA9IHJlc3VsdC50b3RhbC5taWxpc2Vjb25kcyAlIDEwMDA7XG4gICAgcmVzdWx0LnNlY29uZHMgPSBOdW1iZXIoKHJlc3VsdC50b3RhbC5zZWNvbmRzICUgNjApLnRvRml4ZWQoMCkpO1xuICAgIHJlc3VsdC5taW51dGVzID0gTnVtYmVyKChyZXN1bHQudG90YWwubWludXRlcyAlIDYwKS50b0ZpeGVkKDApKTtcbiAgICByZXN1bHQuaG91cnMgPSBOdW1iZXIoKHJlc3VsdC50b3RhbC5ob3VycyAlIDI0KS50b0ZpeGVkKDApKTtcbiAgICAvLyBUT0RPOiByZXZpZXdcbiAgICByZXN1bHQuZGF5cyA9IE51bWJlcigocmVzdWx0LnRvdGFsLmRheXMgJSAzMC40KS50b0ZpeGVkKDApKTtcbiAgICByZXN1bHQubW9udGhzID0gTnVtYmVyKChyZXN1bHQudG90YWwubW9udGhzICUgMTIpLnRvRml4ZWQoMCkpO1xuICAgIHJlc3VsdC55ZWFycyA9IE51bWJlcihyZXN1bHQudG90YWwueWVhcnMudG9GaXhlZCgwKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGVudW11cmF0ZSh1bml0OiBUaW1lVW5pdCA9ICdkYXknLCBhbW91bnQgPSAxKTogQVhEYXRlVGltZVtdIHtcbiAgICBjb25zdCByZXN1bHQ6IEFYRGF0ZVRpbWVbXSA9IFtdO1xuICAgIGxldCBpdGVtID0gdGhpcy5fc3RhcnRUaW1lLmNsb25lKCk7XG4gICAgd2hpbGUgKGl0ZW0uY29tcGFyZSh0aGlzLl9lbmRUaW1lLCB1bml0KSA8IDEpIHtcbiAgICAgIGlmICghcmVzdWx0LnNvbWUoKGMpID0+IGMuZXF1YWwoaXRlbSwgdW5pdCkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgICAgaXRlbSA9IGl0ZW0uYWRkKHVuaXQsIGFtb3VudCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { AXFormatModule } from '@acorex/core/format';
2
+ import { NgModule } from '@angular/core';
3
+ import { AXDateTimeFormatter } from './formatters/datetime-formatter';
4
+ import { AXTimeLeftFormatter } from './formatters/timeleft-formatter';
5
+ import { AXDateTimePipe } from './datetime.pipe';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@acorex/core/format";
8
+ export class AXDateTimeModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeModule, declarations: [AXDateTimePipe], imports: [i1.AXFormatModule], exports: [AXDateTimePipe] }); }
11
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeModule, imports: [AXFormatModule.forChild({
12
+ formatters: [AXDateTimeFormatter, AXTimeLeftFormatter],
13
+ })] }); }
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeModule, decorators: [{
16
+ type: NgModule,
17
+ args: [{
18
+ imports: [
19
+ AXFormatModule.forChild({
20
+ formatters: [AXDateTimeFormatter, AXTimeLeftFormatter],
21
+ }),
22
+ ],
23
+ exports: [AXDateTimePipe],
24
+ declarations: [AXDateTimePipe],
25
+ }]
26
+ }] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL2RhdGUtdGltZS9zcmMvbGliL2RhdGV0aW1lLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQVdqRCxNQUFNLE9BQU8sZ0JBQWdCOzhHQUFoQixnQkFBZ0I7K0dBQWhCLGdCQUFnQixpQkFGWixjQUFjLDJDQURuQixjQUFjOytHQUdiLGdCQUFnQixZQVB6QixjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUN0QixVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQzthQUN2RCxDQUFDOzsyRkFLTyxnQkFBZ0I7a0JBVDVCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLGNBQWMsQ0FBQyxRQUFRLENBQUM7NEJBQ3RCLFVBQVUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDO3lCQUN2RCxDQUFDO3FCQUNIO29CQUNELE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDekIsWUFBWSxFQUFFLENBQUMsY0FBYyxDQUFDO2lCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYRm9ybWF0TW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb3JlL2Zvcm1hdCc7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhEYXRlVGltZUZvcm1hdHRlciB9IGZyb20gJy4vZm9ybWF0dGVycy9kYXRldGltZS1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgQVhUaW1lTGVmdEZvcm1hdHRlciB9IGZyb20gJy4vZm9ybWF0dGVycy90aW1lbGVmdC1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgQVhEYXRlVGltZVBpcGUgfSBmcm9tICcuL2RhdGV0aW1lLnBpcGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQVhGb3JtYXRNb2R1bGUuZm9yQ2hpbGQoe1xuICAgICAgZm9ybWF0dGVyczogW0FYRGF0ZVRpbWVGb3JtYXR0ZXIsIEFYVGltZUxlZnRGb3JtYXR0ZXJdLFxuICAgIH0pLFxuICBdLFxuICBleHBvcnRzOiBbQVhEYXRlVGltZVBpcGVdLFxuICBkZWNsYXJhdGlvbnM6IFtBWERhdGVUaW1lUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIEFYRGF0ZVRpbWVNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { Pipe, inject } from '@angular/core';
2
+ import { AXCalendarService } from './calendar.service';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * @deprecated The pipe should not be used, use format instead
6
+ */
7
+ export class AXDateTimePipe {
8
+ constructor() {
9
+ this._calendarService = inject(AXCalendarService);
10
+ }
11
+ transform(value, format, calendarName) {
12
+ if (value == null) {
13
+ return '';
14
+ }
15
+ let calendar = this._calendarService.calendar;
16
+ if (calendarName) {
17
+ calendar = this._calendarService.resolveCalendar(calendarName);
18
+ }
19
+ const val = this._calendarService.convert(value, calendar.name());
20
+ return val.format(format);
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
23
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimePipe, name: "axDate" }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimePipe, decorators: [{
26
+ type: Pipe,
27
+ args: [{ name: 'axDate' }]
28
+ }] });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9kYXRlLXRpbWUvc3JjL2xpYi9kYXRldGltZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFHdkQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sY0FBYztJQUQzQjtRQUVVLHFCQUFnQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQW9CekU7SUFsQkMsU0FBUyxDQUNQLEtBQWlDLEVBQ2pDLE1BQWUsRUFDZixZQUFxQjtRQUVyQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzlDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFlLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQ25ELEtBQUssRUFDTCxRQUFRLENBQUMsSUFBSSxFQUFFLENBQ2hCLENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs4R0FwQlUsY0FBYzs0R0FBZCxjQUFjOzsyRkFBZCxjQUFjO2tCQUQxQixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQVhEYXRlVGltZSB9IGZyb20gJy4vZGF0ZXRpbWUuY2xhc3MnO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoZSBwaXBlIHNob3VsZCBub3QgYmUgdXNlZCwgdXNlIGZvcm1hdCBpbnN0ZWFkXG4gKi9cbkBQaXBlKHsgbmFtZTogJ2F4RGF0ZScgfSlcbmV4cG9ydCBjbGFzcyBBWERhdGVUaW1lUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBwcml2YXRlIF9jYWxlbmRhclNlcnZpY2U6IEFYQ2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KEFYQ2FsZW5kYXJTZXJ2aWNlKTtcblxuICB0cmFuc2Zvcm0oXG4gICAgdmFsdWU6IERhdGUgfCBBWERhdGVUaW1lIHwgc3RyaW5nLFxuICAgIGZvcm1hdD86IHN0cmluZyxcbiAgICBjYWxlbmRhck5hbWU/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBsZXQgY2FsZW5kYXIgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuY2FsZW5kYXI7XG4gICAgaWYgKGNhbGVuZGFyTmFtZSkge1xuICAgICAgY2FsZW5kYXIgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UucmVzb2x2ZUNhbGVuZGFyKGNhbGVuZGFyTmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbDogQVhEYXRlVGltZSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5jb252ZXJ0KFxuICAgICAgdmFsdWUsXG4gICAgICBjYWxlbmRhci5uYW1lKClcbiAgICApO1xuICAgIHJldHVybiB2YWwuZm9ybWF0KGZvcm1hdCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { AXCalendarService } from '../calendar.service';
3
+ import * as i0 from "@angular/core";
4
+ export class AXDateTimeFormatter {
5
+ constructor() {
6
+ this.calendarService = inject(AXCalendarService);
7
+ }
8
+ get name() {
9
+ return 'datetime';
10
+ }
11
+ format(value, options) {
12
+ const effectiveOptions = typeof options == 'object'
13
+ ? {
14
+ format: options.format ?? 'date',
15
+ locale: options.locale,
16
+ calendar: options.calendar ?? this.calendarService.calendar.name(),
17
+ }
18
+ : {
19
+ format: options,
20
+ calendar: this.calendarService.calendar.name(),
21
+ };
22
+ return this.calendarService
23
+ .create(value, effectiveOptions.calendar)
24
+ .format(effectiveOptions.format, { locale: effectiveOptions.locale });
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeFormatter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
27
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeFormatter }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXDateTimeFormatter, decorators: [{
30
+ type: Injectable
31
+ }] });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL2RhdGUtdGltZS9zcmMvbGliL2Zvcm1hdHRlcnMvZGF0ZXRpbWUtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQWV4RCxNQUFNLE9BQU8sbUJBQW1CO0lBRGhDO1FBRVUsb0JBQWUsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQTBCckQ7SUF4QkMsSUFBSSxJQUFJO1FBQ04sT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FDSixLQUFjLEVBQ2QsT0FBNkM7UUFFN0MsTUFBTSxnQkFBZ0IsR0FDcEIsT0FBTyxPQUFPLElBQUksUUFBUTtZQUN4QixDQUFDLENBQUM7Z0JBQ0UsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTTtnQkFDaEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7YUFDbkU7WUFDSCxDQUFDLENBQUM7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTthQUMvQyxDQUFDO1FBRVIsT0FBTyxJQUFJLENBQUMsZUFBZTthQUN4QixNQUFNLENBQUMsS0FBYSxFQUFFLGdCQUFnQixDQUFDLFFBQWtCLENBQUM7YUFDMUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7OEdBMUJVLG1CQUFtQjtrSEFBbkIsbUJBQW1COzsyRkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhGb3JtYXRPcHRpb25zLCBBWEZvcm1hdHRlciB9IGZyb20gJ0BhY29yZXgvY29yZS9mb3JtYXQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFYRGF0ZVRpbWVGb3JtYXR0ZXJPcHRpb25zIGV4dGVuZHMgQVhGb3JtYXRPcHRpb25zIHtcbiAgZm9ybWF0Pzogc3RyaW5nO1xuICBjYWxlbmRhcj86IHN0cmluZztcbiAgbG9jYWxlPzogc3RyaW5nO1xufVxuXG5kZWNsYXJlIG1vZHVsZSAnQGFjb3JleC9jb3JlL2Zvcm1hdCcge1xuICBpbnRlcmZhY2UgQVhGb3JtYXRPcHRpb25zTWFwIHtcbiAgICBkYXRldGltZTogQVhEYXRlVGltZUZvcm1hdHRlck9wdGlvbnM7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFYRGF0ZVRpbWVGb3JtYXR0ZXIgaW1wbGVtZW50cyBBWEZvcm1hdHRlciB7XG4gIHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KEFYQ2FsZW5kYXJTZXJ2aWNlKTtcblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZGF0ZXRpbWUnO1xuICB9XG5cbiAgZm9ybWF0KFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBBWERhdGVUaW1lRm9ybWF0dGVyT3B0aW9ucyB8IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVmZmVjdGl2ZU9wdGlvbnMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMgPT0gJ29iamVjdCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0ID8/ICdkYXRlJyxcbiAgICAgICAgICAgIGxvY2FsZTogb3B0aW9ucy5sb2NhbGUsXG4gICAgICAgICAgICBjYWxlbmRhcjogb3B0aW9ucy5jYWxlbmRhciA/PyB0aGlzLmNhbGVuZGFyU2VydmljZS5jYWxlbmRhci5uYW1lKCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGZvcm1hdDogb3B0aW9ucyxcbiAgICAgICAgICAgIGNhbGVuZGFyOiB0aGlzLmNhbGVuZGFyU2VydmljZS5jYWxlbmRhci5uYW1lKCksXG4gICAgICAgICAgfTtcblxuICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU2VydmljZVxuICAgICAgLmNyZWF0ZSh2YWx1ZSBhcyBEYXRlLCBlZmZlY3RpdmVPcHRpb25zLmNhbGVuZGFyIGFzIHN0cmluZylcbiAgICAgIC5mb3JtYXQoZWZmZWN0aXZlT3B0aW9ucy5mb3JtYXQsIHsgbG9jYWxlOiBlZmZlY3RpdmVPcHRpb25zLmxvY2FsZSB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,91 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { isNil } from 'lodash-es';
3
+ import * as i0 from "@angular/core";
4
+ export class AXTimeLeftFormatter {
5
+ get name() {
6
+ return 'timeleft';
7
+ }
8
+ format(value, options) {
9
+ const milliseconds = Number(value);
10
+ if (milliseconds === null || isNaN(milliseconds)) {
11
+ return 'Calculating...';
12
+ }
13
+ const durationInSeconds = Math.round(milliseconds / 1000);
14
+ let format = options?.format;
15
+ // Determine the best format if format is null
16
+ if (isNil(format)) {
17
+ if (durationInSeconds < 45)
18
+ format = 's';
19
+ else if (durationInSeconds < 60 * 45)
20
+ format = 'm';
21
+ else if (durationInSeconds < 60 * 60 * 22)
22
+ format = 'h';
23
+ else if (durationInSeconds < 60 * 60 * 24 * 26)
24
+ format = 'd';
25
+ else if (durationInSeconds < 60 * 60 * 24 * 320)
26
+ format = 'M';
27
+ else
28
+ format = 'y';
29
+ }
30
+ // Helper function for zero-padding
31
+ const pad = (num) => num.toString().padStart(2, '0');
32
+ switch (format) {
33
+ case 's':
34
+ return `${durationInSeconds} seconds left`;
35
+ case 'ss':
36
+ return `${pad(durationInSeconds)} seconds left`;
37
+ case 'm':
38
+ return `${Math.round(durationInSeconds / 60)} minute${durationInSeconds >= 120 ? 's' : ''} left`;
39
+ case 'mm':
40
+ return `${pad(Math.round(durationInSeconds / 60))} minutes left`;
41
+ case 'h':
42
+ case 'H':
43
+ if (durationInSeconds < 60 * 89)
44
+ return 'an hour left';
45
+ return `${Math.round(durationInSeconds / 3600)} hour${durationInSeconds >= 60 * 180 ? 's' : ''} left`;
46
+ case 'hh':
47
+ case 'HH':
48
+ if (durationInSeconds < 60 * 89)
49
+ return '01 hour left';
50
+ return `${pad(Math.round(durationInSeconds / 3600))} hours left`;
51
+ case 'd':
52
+ case 'D':
53
+ if (durationInSeconds < 60 * 60 * 35)
54
+ return 'a day left';
55
+ return `${Math.round(durationInSeconds / (3600 * 24))} day${durationInSeconds >= 60 * 60 * 70 ? 's' : ''} left`;
56
+ case 'dd':
57
+ case 'DD':
58
+ if (durationInSeconds < 60 * 60 * 35)
59
+ return '01 day left';
60
+ return `${pad(Math.round(durationInSeconds / (3600 * 24)))} days left`;
61
+ case 'M':
62
+ if (durationInSeconds < 60 * 60 * 24 * 45)
63
+ return 'a month left';
64
+ return `${Math.round(durationInSeconds / (3600 * 24 * 30))} month${durationInSeconds >= 60 * 60 * 24 * 90 ? 's' : ''} left`;
65
+ case 'MM':
66
+ if (durationInSeconds < 60 * 60 * 24 * 45)
67
+ return '01 month left';
68
+ return `${pad(Math.round(durationInSeconds / (3600 * 24 * 30)))} months left`;
69
+ case 'y':
70
+ case 'Y':
71
+ if (durationInSeconds < 60 * 60 * 24 * 547)
72
+ return 'a year left';
73
+ return `${Math.round(durationInSeconds / (3600 * 24 * 365))} year${durationInSeconds >= 60 * 60 * 24 * 730 ? 's' : ''} left`;
74
+ case 'yy':
75
+ case 'YY':
76
+ case 'yyyy':
77
+ case 'YYYY':
78
+ if (durationInSeconds < 60 * 60 * 24 * 547)
79
+ return '01 year left';
80
+ return `${pad(Math.round(durationInSeconds / (3600 * 24 * 365)))} years left`;
81
+ default:
82
+ return 'Invalid format';
83
+ }
84
+ }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXTimeLeftFormatter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
86
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXTimeLeftFormatter }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: AXTimeLeftFormatter, decorators: [{
89
+ type: Injectable
90
+ }] });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxlZnQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL2RhdGUtdGltZS9zcmMvbGliL2Zvcm1hdHRlcnMvdGltZWxlZnQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFjbEMsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixJQUFJLElBQUk7UUFDTixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQXNCLEVBQUUsT0FBb0M7UUFDakUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUM7UUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFDN0IsOENBQThDO1FBQzlDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEIsSUFBSSxpQkFBaUIsR0FBRyxFQUFFO2dCQUFFLE1BQU0sR0FBRyxHQUFHLENBQUM7aUJBQ3BDLElBQUksaUJBQWlCLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQztpQkFDOUMsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQztpQkFDbkQsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxH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bkZVLG1CQUFtQjtrSEFBbkIsbUJBQW1COzsyRkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQVhGb3JtYXRPcHRpb25zLCBBWEZvcm1hdHRlciB9IGZyb20gJ0BhY29yZXgvY29yZS9mb3JtYXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFYVGltZUxlZnRGb3JtYXR0ZXJPcHRpb25zIGV4dGVuZHMgQVhGb3JtYXRPcHRpb25zIHtcbiAgZm9ybWF0OiBzdHJpbmc7XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAYWNvcmV4L2NvcmUvZm9ybWF0JyB7XG4gIGludGVyZmFjZSBBWEZvcm1hdE9wdGlvbnNNYXAge1xuICAgIHRpbWVsZWZ0OiBBWFRpbWVMZWZ0Rm9ybWF0dGVyT3B0aW9ucztcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQVhUaW1lTGVmdEZvcm1hdHRlciBpbXBsZW1lbnRzIEFYRm9ybWF0dGVyIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3RpbWVsZWZ0JztcbiAgfVxuXG4gIGZvcm1hdCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBvcHRpb25zPzogQVhUaW1lTGVmdEZvcm1hdHRlck9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKG1pbGxpc2Vjb25kcyA9PT0gbnVsbCB8fCBpc05hTihtaWxsaXNlY29uZHMpKSB7XG4gICAgICByZXR1cm4gJ0NhbGN1bGF0aW5nLi4uJztcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb25JblNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgIGxldCBmb3JtYXQgPSBvcHRpb25zPy5mb3JtYXQ7XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBiZXN0IGZvcm1hdCBpZiBmb3JtYXQgaXMgbnVsbFxuICAgIGlmIChpc05pbChmb3JtYXQpKSB7XG4gICAgICBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA0NSkgZm9ybWF0ID0gJ3MnO1xuICAgICAgZWxzZSBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA2MCAqIDQ1KSBmb3JtYXQgPSAnbSc7XG4gICAgICBlbHNlIGlmIChkdXJhdGlvbkluU2Vjb25kcyA8IDYwICogNjAgKiAyMikgZm9ybWF0ID0gJ2gnO1xuICAgICAgZWxzZSBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA2MCAqIDYwICogMjQgKiAyNikgZm9ybWF0ID0gJ2QnO1xuICAgICAgZWxzZSBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA2MCAqIDYwICogMjQgKiAzMjApIGZvcm1hdCA9ICdNJztcbiAgICAgIGVsc2UgZm9ybWF0ID0gJ3knO1xuICAgIH1cblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgemVyby1wYWRkaW5nXG4gICAgY29uc3QgcGFkID0gKG51bTogbnVtYmVyKSA9PiBudW0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ3MnOlxuICAgICAgICByZXR1cm4gYCR7ZHVyYXRpb25JblNlY29uZHN9IHNlY29uZHMgbGVmdGA7XG4gICAgICBjYXNlICdzcyc6XG4gICAgICAgIHJldHVybiBgJHtwYWQoZHVyYXRpb25JblNlY29uZHMpfSBzZWNvbmRzIGxlZnRgO1xuICAgICAgY2FzZSAnbSc6XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKGR1cmF0aW9uSW5TZWNvbmRzIC8gNjApfSBtaW51dGUke1xuICAgICAgICAgIGR1cmF0aW9uSW5TZWNvbmRzID49IDEyMCA/ICdzJyA6ICcnXG4gICAgICAgIH0gbGVmdGA7XG4gICAgICBjYXNlICdtbSc6XG4gICAgICAgIHJldHVybiBgJHtwYWQoTWF0aC5yb3VuZChkdXJhdGlvbkluU2Vjb25kcyAvIDYwKSl9IG1pbnV0ZXMgbGVmdGA7XG4gICAgICBjYXNlICdoJzpcbiAgICAgIGNhc2UgJ0gnOlxuICAgICAgICBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA2MCAqIDg5KSByZXR1cm4gJ2FuIGhvdXIgbGVmdCc7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKGR1cmF0aW9uSW5TZWNvbmRzIC8gMzYwMCl9IGhvdXIke1xuICAgICAgICAgIGR1cmF0aW9uSW5TZWNvbmRzID49IDYwICogMTgwID8gJ3MnIDogJydcbiAgICAgICAgfSBsZWZ0YDtcbiAgICAgIGNhc2UgJ2hoJzpcbiAgICAgIGNhc2UgJ0hIJzpcbiAgICAgICAgaWYgKGR1cmF0aW9uSW5TZWNvbmRzIDwgNjAgKiA4OSkgcmV0dXJuICcwMSBob3VyIGxlZnQnO1xuICAgICAgICByZXR1cm4gYCR7cGFkKE1hdGgucm91bmQoZHVyYXRpb25JblNlY29uZHMgLyAzNjAwKSl9IGhvdXJzIGxlZnRgO1xuICAgICAgY2FzZSAnZCc6XG4gICAgICBjYXNlICdEJzpcbiAgICAgICAgaWYgKGR1cmF0aW9uSW5TZWNvbmRzIDwgNjAgKiA2MCAqIDM1KSByZXR1cm4gJ2EgZGF5IGxlZnQnO1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChkdXJhdGlvbkluU2Vjb25kcyAvICgzNjAwICogMjQpKX0gZGF5JHtcbiAgICAgICAgICBkdXJhdGlvbkluU2Vjb25kcyA+PSA2MCAqIDYwICogNzAgPyAncycgOiAnJ1xuICAgICAgICB9IGxlZnRgO1xuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnREQnOlxuICAgICAgICBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA2MCAqIDYwICogMzUpIHJldHVybiAnMDEgZGF5IGxlZnQnO1xuICAgICAgICByZXR1cm4gYCR7cGFkKE1hdGgucm91bmQoZHVyYXRpb25JblNlY29uZHMgLyAoMzYwMCAqIDI0KSkpfSBkYXlzIGxlZnRgO1xuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIGlmIChkdXJhdGlvbkluU2Vjb25kcyA8IDYwICogNjAgKiAyNCAqIDQ1KSByZXR1cm4gJ2EgbW9udGggbGVmdCc7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKGR1cmF0aW9uSW5TZWNvbmRzIC8gKDM2MDAgKiAyNCAqIDMwKSl9IG1vbnRoJHtcbiAgICAgICAgICBkdXJhdGlvbkluU2Vjb25kcyA+PSA2MCAqIDYwICogMjQgKiA5MCA/ICdzJyA6ICcnXG4gICAgICAgIH0gbGVmdGA7XG4gICAgICBjYXNlICdNTSc6XG4gICAgICAgIGlmIChkdXJhdGlvbkluU2Vjb25kcyA8IDYwICogNjAgKiAyNCAqIDQ1KSByZXR1cm4gJzAxIG1vbnRoIGxlZnQnO1xuICAgICAgICByZXR1cm4gYCR7cGFkKFxuICAgICAgICAgIE1hdGgucm91bmQoZHVyYXRpb25JblNlY29uZHMgLyAoMzYwMCAqIDI0ICogMzApKVxuICAgICAgICApfSBtb250aHMgbGVmdGA7XG4gICAgICBjYXNlICd5JzpcbiAgICAgIGNhc2UgJ1knOlxuICAgICAgICBpZiAoZHVyYXRpb25JblNlY29uZHMgPCA2MCAqIDYwICogMjQgKiA1NDcpIHJldHVybiAnYSB5ZWFyIGxlZnQnO1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChkdXJhdGlvbkluU2Vjb25kcyAvICgzNjAwICogMjQgKiAzNjUpKX0geWVhciR7XG4gICAgICAgICAgZHVyYXRpb25JblNlY29uZHMgPj0gNjAgKiA2MCAqIDI0ICogNzMwID8gJ3MnIDogJydcbiAgICAgICAgfSBsZWZ0YDtcbiAgICAgIGNhc2UgJ3l5JzpcbiAgICAgIGNhc2UgJ1lZJzpcbiAgICAgIGNhc2UgJ3l5eXknOlxuICAgICAgY2FzZSAnWVlZWSc6XG4gICAgICAgIGlmIChkdXJhdGlvbkluU2Vjb25kcyA8IDYwICogNjAgKiAyNCAqIDU0NykgcmV0dXJuICcwMSB5ZWFyIGxlZnQnO1xuICAgICAgICByZXR1cm4gYCR7cGFkKFxuICAgICAgICAgIE1hdGgucm91bmQoZHVyYXRpb25JblNlY29uZHMgLyAoMzYwMCAqIDI0ICogMzY1KSlcbiAgICAgICAgKX0geWVhcnMgbGVmdGA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0ludmFsaWQgZm9ybWF0JztcbiAgICB9XG4gIH1cbn1cbiJdfQ==