@dereekb/dbx-form 12.7.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/LICENSE +1 -1
  2. package/fesm2022/dereekb-dbx-form-calendar.mjs +86 -86
  3. package/fesm2022/dereekb-dbx-form-calendar.mjs.map +1 -1
  4. package/fesm2022/dereekb-dbx-form-mapbox.mjs +28 -28
  5. package/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -1
  6. package/fesm2022/dereekb-dbx-form.mjs +381 -542
  7. package/fesm2022/dereekb-dbx-form.mjs.map +1 -1
  8. package/lib/formly/field/value/phone/_phone.scss +1 -0
  9. package/lib/style/_theming.scss +196 -1
  10. package/package.json +26 -32
  11. package/types/dereekb-dbx-form-calendar.d.ts +679 -0
  12. package/types/dereekb-dbx-form-mapbox.d.ts +216 -0
  13. package/types/dereekb-dbx-form.d.ts +3050 -0
  14. package/calendar/index.d.ts +0 -1
  15. package/calendar/lib/calendar.module.d.ts +0 -19
  16. package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +0 -16
  17. package/calendar/lib/calendar.schedule.selection.component.d.ts +0 -74
  18. package/calendar/lib/calendar.schedule.selection.d.ts +0 -29
  19. package/calendar/lib/calendar.schedule.selection.days.component.d.ts +0 -15
  20. package/calendar/lib/calendar.schedule.selection.days.form.component.d.ts +0 -10
  21. package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +0 -15
  22. package/calendar/lib/calendar.schedule.selection.dialog.component.d.ts +0 -24
  23. package/calendar/lib/calendar.schedule.selection.form.d.ts +0 -4
  24. package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +0 -17
  25. package/calendar/lib/calendar.schedule.selection.popover.component.d.ts +0 -14
  26. package/calendar/lib/calendar.schedule.selection.popover.content.component.d.ts +0 -5
  27. package/calendar/lib/calendar.schedule.selection.range.component.d.ts +0 -52
  28. package/calendar/lib/calendar.schedule.selection.store.d.ts +0 -282
  29. package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +0 -23
  30. package/calendar/lib/calendar.schedule.selection.toggle.button.component.d.ts +0 -18
  31. package/calendar/lib/field/index.d.ts +0 -1
  32. package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +0 -102
  33. package/calendar/lib/field/schedule/calendar.schedule.field.d.ts +0 -6
  34. package/calendar/lib/field/schedule/calendar.schedule.module.d.ts +0 -8
  35. package/calendar/lib/field/schedule/index.d.ts +0 -3
  36. package/calendar/lib/index.d.ts +0 -17
  37. package/esm2022/calendar/dereekb-dbx-form-calendar.mjs +0 -5
  38. package/esm2022/calendar/index.mjs +0 -2
  39. package/esm2022/calendar/lib/calendar.module.mjs +0 -84
  40. package/esm2022/calendar/lib/calendar.schedule.selection.cell.component.mjs +0 -42
  41. package/esm2022/calendar/lib/calendar.schedule.selection.component.mjs +0 -156
  42. package/esm2022/calendar/lib/calendar.schedule.selection.days.component.mjs +0 -47
  43. package/esm2022/calendar/lib/calendar.schedule.selection.days.form.component.mjs +0 -22
  44. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +0 -32
  45. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.component.mjs +0 -59
  46. package/esm2022/calendar/lib/calendar.schedule.selection.form.mjs +0 -15
  47. package/esm2022/calendar/lib/calendar.schedule.selection.mjs +0 -31
  48. package/esm2022/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +0 -50
  49. package/esm2022/calendar/lib/calendar.schedule.selection.popover.component.mjs +0 -41
  50. package/esm2022/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +0 -34
  51. package/esm2022/calendar/lib/calendar.schedule.selection.range.component.mjs +0 -165
  52. package/esm2022/calendar/lib/calendar.schedule.selection.store.mjs +0 -785
  53. package/esm2022/calendar/lib/calendar.schedule.selection.store.provide.mjs +0 -48
  54. package/esm2022/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +0 -67
  55. package/esm2022/calendar/lib/field/index.mjs +0 -3
  56. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +0 -154
  57. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.mjs +0 -28
  58. package/esm2022/calendar/lib/field/schedule/calendar.schedule.module.mjs +0 -26
  59. package/esm2022/calendar/lib/field/schedule/index.mjs +0 -4
  60. package/esm2022/calendar/lib/index.mjs +0 -18
  61. package/esm2022/dereekb-dbx-form.mjs +0 -5
  62. package/esm2022/index.mjs +0 -2
  63. package/esm2022/lib/form/action/form.action.dialog.component.mjs +0 -75
  64. package/esm2022/lib/form/action/form.action.directive.mjs +0 -168
  65. package/esm2022/lib/form/action/form.action.module.mjs +0 -19
  66. package/esm2022/lib/form/action/index.mjs +0 -5
  67. package/esm2022/lib/form/action/transition/form.action.transition.module.mjs +0 -19
  68. package/esm2022/lib/form/action/transition/form.action.transition.safety.directive.mjs +0 -28
  69. package/esm2022/lib/form/action/transition/index.mjs +0 -3
  70. package/esm2022/lib/form/form.angular.util.mjs +0 -13
  71. package/esm2022/lib/form/form.mjs +0 -42
  72. package/esm2022/lib/form/form.module.mjs +0 -17
  73. package/esm2022/lib/form/index.mjs +0 -6
  74. package/esm2022/lib/form/io/form.change.directive.mjs +0 -38
  75. package/esm2022/lib/form/io/form.input.directive.mjs +0 -94
  76. package/esm2022/lib/form/io/form.io.module.mjs +0 -26
  77. package/esm2022/lib/form/io/form.loading.directive.mjs +0 -35
  78. package/esm2022/lib/form/io/index.mjs +0 -5
  79. package/esm2022/lib/form.module.mjs +0 -18
  80. package/esm2022/lib/form.providers.mjs +0 -32
  81. package/esm2022/lib/formly/config/index.mjs +0 -2
  82. package/esm2022/lib/formly/config/validation.mjs +0 -23
  83. package/esm2022/lib/formly/field/checklist/checklist.field.mjs +0 -102
  84. package/esm2022/lib/formly/field/checklist/checklist.item.field.component.mjs +0 -87
  85. package/esm2022/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +0 -50
  86. package/esm2022/lib/formly/field/checklist/checklist.item.field.mjs +0 -14
  87. package/esm2022/lib/formly/field/checklist/checklist.item.field.module.mjs +0 -30
  88. package/esm2022/lib/formly/field/checklist/checklist.item.mjs +0 -2
  89. package/esm2022/lib/formly/field/checklist/index.mjs +0 -7
  90. package/esm2022/lib/formly/field/component/component.field.component.mjs +0 -25
  91. package/esm2022/lib/formly/field/component/component.field.mjs +0 -7
  92. package/esm2022/lib/formly/field/component/component.field.module.mjs +0 -26
  93. package/esm2022/lib/formly/field/component/index.mjs +0 -4
  94. package/esm2022/lib/formly/field/field.mjs +0 -97
  95. package/esm2022/lib/formly/field/form.field.module.mjs +0 -22
  96. package/esm2022/lib/formly/field/index.mjs +0 -9
  97. package/esm2022/lib/formly/field/selection/index.mjs +0 -8
  98. package/esm2022/lib/formly/field/selection/list/index.mjs +0 -4
  99. package/esm2022/lib/formly/field/selection/list/list.field.component.mjs +0 -90
  100. package/esm2022/lib/formly/field/selection/list/list.field.mjs +0 -15
  101. package/esm2022/lib/formly/field/selection/list/list.field.module.mjs +0 -26
  102. package/esm2022/lib/formly/field/selection/pickable/index.mjs +0 -8
  103. package/esm2022/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +0 -37
  104. package/esm2022/lib/formly/field/selection/pickable/pickable.field.directive.mjs +0 -272
  105. package/esm2022/lib/formly/field/selection/pickable/pickable.field.mjs +0 -26
  106. package/esm2022/lib/formly/field/selection/pickable/pickable.field.module.mjs +0 -33
  107. package/esm2022/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +0 -130
  108. package/esm2022/lib/formly/field/selection/pickable/pickable.mjs +0 -2
  109. package/esm2022/lib/formly/field/selection/pickable/pickable.util.mjs +0 -35
  110. package/esm2022/lib/formly/field/selection/searchable/index.mjs +0 -9
  111. package/esm2022/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +0 -70
  112. package/esm2022/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +0 -90
  113. package/esm2022/lib/formly/field/selection/searchable/searchable.field.directive.mjs +0 -288
  114. package/esm2022/lib/formly/field/selection/searchable/searchable.field.mjs +0 -69
  115. package/esm2022/lib/formly/field/selection/searchable/searchable.field.module.mjs +0 -34
  116. package/esm2022/lib/formly/field/selection/searchable/searchable.mjs +0 -2
  117. package/esm2022/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +0 -72
  118. package/esm2022/lib/formly/field/selection/searchable/text.chip.field.mjs +0 -15
  119. package/esm2022/lib/formly/field/selection/selection.field.mjs +0 -39
  120. package/esm2022/lib/formly/field/selection/selection.mjs +0 -2
  121. package/esm2022/lib/formly/field/selection/selection.module.mjs +0 -28
  122. package/esm2022/lib/formly/field/selection/sourceselect/index.mjs +0 -5
  123. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.component.mjs +0 -325
  124. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.mjs +0 -14
  125. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +0 -26
  126. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.mjs +0 -2
  127. package/esm2022/lib/formly/field/texteditor/index.mjs +0 -4
  128. package/esm2022/lib/formly/field/texteditor/texteditor.field.component.mjs +0 -97
  129. package/esm2022/lib/formly/field/texteditor/texteditor.field.mjs +0 -21
  130. package/esm2022/lib/formly/field/texteditor/texteditor.field.module.mjs +0 -26
  131. package/esm2022/lib/formly/field/value/array/array.field.component.mjs +0 -231
  132. package/esm2022/lib/formly/field/value/array/array.field.mjs +0 -28
  133. package/esm2022/lib/formly/field/value/array/array.field.module.mjs +0 -26
  134. package/esm2022/lib/formly/field/value/array/index.mjs +0 -4
  135. package/esm2022/lib/formly/field/value/boolean/boolean.field.mjs +0 -51
  136. package/esm2022/lib/formly/field/value/boolean/boolean.field.module.mjs +0 -19
  137. package/esm2022/lib/formly/field/value/boolean/index.mjs +0 -3
  138. package/esm2022/lib/formly/field/value/date/date.field.module.mjs +0 -36
  139. package/esm2022/lib/formly/field/value/date/date.value.mjs +0 -133
  140. package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +0 -737
  141. package/esm2022/lib/formly/field/value/date/datetime.field.mjs +0 -151
  142. package/esm2022/lib/formly/field/value/date/datetime.field.service.mjs +0 -23
  143. package/esm2022/lib/formly/field/value/date/datetime.mjs +0 -26
  144. package/esm2022/lib/formly/field/value/date/datetime.preset.mjs +0 -31
  145. package/esm2022/lib/formly/field/value/date/fixeddaterange.field.component.mjs +0 -521
  146. package/esm2022/lib/formly/field/value/date/index.mjs +0 -10
  147. package/esm2022/lib/formly/field/value/hidden.field.mjs +0 -8
  148. package/esm2022/lib/formly/field/value/index.mjs +0 -9
  149. package/esm2022/lib/formly/field/value/number/index.mjs +0 -3
  150. package/esm2022/lib/formly/field/value/number/number.field.mjs +0 -75
  151. package/esm2022/lib/formly/field/value/number/number.field.module.mjs +0 -18
  152. package/esm2022/lib/formly/field/value/phone/index.mjs +0 -4
  153. package/esm2022/lib/formly/field/value/phone/phone.field.component.mjs +0 -104
  154. package/esm2022/lib/formly/field/value/phone/phone.field.mjs +0 -66
  155. package/esm2022/lib/formly/field/value/phone/phone.field.module.mjs +0 -26
  156. package/esm2022/lib/formly/field/value/text/index.mjs +0 -5
  157. package/esm2022/lib/formly/field/value/text/text.additional.field.mjs +0 -114
  158. package/esm2022/lib/formly/field/value/text/text.address.field.mjs +0 -73
  159. package/esm2022/lib/formly/field/value/text/text.field.mjs +0 -47
  160. package/esm2022/lib/formly/field/value/text/text.field.module.mjs +0 -20
  161. package/esm2022/lib/formly/field/value/value.module.mjs +0 -31
  162. package/esm2022/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +0 -32
  163. package/esm2022/lib/formly/field/wrapper/expand.wrapper.component.mjs +0 -34
  164. package/esm2022/lib/formly/field/wrapper/expand.wrapper.delegate.mjs +0 -58
  165. package/esm2022/lib/formly/field/wrapper/flex.wrapper.component.mjs +0 -38
  166. package/esm2022/lib/formly/field/wrapper/index.mjs +0 -13
  167. package/esm2022/lib/formly/field/wrapper/info.wrapper.component.mjs +0 -48
  168. package/esm2022/lib/formly/field/wrapper/section.wrapper.component.mjs +0 -31
  169. package/esm2022/lib/formly/field/wrapper/style.wrapper.component.mjs +0 -53
  170. package/esm2022/lib/formly/field/wrapper/subsection.wrapper.component.mjs +0 -30
  171. package/esm2022/lib/formly/field/wrapper/toggle.wrapper.component.mjs +0 -55
  172. package/esm2022/lib/formly/field/wrapper/working.wrapper.component.mjs +0 -45
  173. package/esm2022/lib/formly/field/wrapper/wrapper.key.mjs +0 -10
  174. package/esm2022/lib/formly/field/wrapper/wrapper.mjs +0 -77
  175. package/esm2022/lib/formly/field/wrapper/wrapper.module.mjs +0 -101
  176. package/esm2022/lib/formly/form/form.form.mjs +0 -17
  177. package/esm2022/lib/formly/form/form.form.module.mjs +0 -20
  178. package/esm2022/lib/formly/form/index.mjs +0 -4
  179. package/esm2022/lib/formly/form/search.form.component.mjs +0 -35
  180. package/esm2022/lib/formly/formly.component.template.mjs +0 -29
  181. package/esm2022/lib/formly/formly.context.directive.mjs +0 -23
  182. package/esm2022/lib/formly/formly.context.mjs +0 -102
  183. package/esm2022/lib/formly/formly.directive.mjs +0 -79
  184. package/esm2022/lib/formly/formly.form.component.mjs +0 -193
  185. package/esm2022/lib/formly/formly.module.mjs +0 -40
  186. package/esm2022/lib/formly/formly.providers.mjs +0 -8
  187. package/esm2022/lib/formly/index.mjs +0 -12
  188. package/esm2022/lib/formly/template/available.mjs +0 -18
  189. package/esm2022/lib/formly/template/available.module.mjs +0 -18
  190. package/esm2022/lib/formly/template/index.mjs +0 -8
  191. package/esm2022/lib/formly/template/login.mjs +0 -92
  192. package/esm2022/lib/formly/template/login.module.mjs +0 -17
  193. package/esm2022/lib/formly/template/timezone.mjs +0 -46
  194. package/esm2022/lib/formly/template/timezone.module.mjs +0 -17
  195. package/esm2022/lib/formly/template/website.mjs +0 -25
  196. package/esm2022/lib/index.mjs +0 -7
  197. package/esm2022/lib/layout/form.layout.module.mjs +0 -20
  198. package/esm2022/lib/layout/form.spacer.directive.mjs +0 -20
  199. package/esm2022/lib/layout/index.mjs +0 -3
  200. package/esm2022/lib/validator/available.mjs +0 -31
  201. package/esm2022/lib/validator/boolean.mjs +0 -12
  202. package/esm2022/lib/validator/email.mjs +0 -6
  203. package/esm2022/lib/validator/field.mjs +0 -31
  204. package/esm2022/lib/validator/index.mjs +0 -8
  205. package/esm2022/lib/validator/number.mjs +0 -53
  206. package/esm2022/lib/validator/phone.mjs +0 -61
  207. package/esm2022/lib/validator/website.mjs +0 -68
  208. package/esm2022/mapbox/dereekb-dbx-form-mapbox.mjs +0 -5
  209. package/esm2022/mapbox/index.mjs +0 -3
  210. package/esm2022/mapbox/lib/field/index.mjs +0 -3
  211. package/esm2022/mapbox/lib/field/latlng/index.mjs +0 -5
  212. package/esm2022/mapbox/lib/field/latlng/latlng.field.component.mjs +0 -262
  213. package/esm2022/mapbox/lib/field/latlng/latlng.field.marker.component.mjs +0 -34
  214. package/esm2022/mapbox/lib/field/latlng/latlng.field.mjs +0 -35
  215. package/esm2022/mapbox/lib/field/latlng/latlng.module.mjs +0 -26
  216. package/esm2022/mapbox/lib/field/zoom/index.mjs +0 -4
  217. package/esm2022/mapbox/lib/field/zoom/zoom.field.component.mjs +0 -146
  218. package/esm2022/mapbox/lib/field/zoom/zoom.field.mjs +0 -23
  219. package/esm2022/mapbox/lib/field/zoom/zoom.module.mjs +0 -26
  220. package/esm2022/mapbox/lib/mapbox.module.mjs +0 -16
  221. package/index.d.ts +0 -1
  222. package/lib/form/action/form.action.dialog.component.d.ts +0 -62
  223. package/lib/form/action/form.action.directive.d.ts +0 -65
  224. package/lib/form/action/form.action.module.d.ts +0 -10
  225. package/lib/form/action/index.d.ts +0 -4
  226. package/lib/form/action/transition/form.action.transition.module.d.ts +0 -10
  227. package/lib/form/action/transition/form.action.transition.safety.directive.d.ts +0 -17
  228. package/lib/form/action/transition/index.d.ts +0 -2
  229. package/lib/form/form.angular.util.d.ts +0 -15
  230. package/lib/form/form.d.ts +0 -92
  231. package/lib/form/form.module.d.ts +0 -9
  232. package/lib/form/index.d.ts +0 -5
  233. package/lib/form/io/form.change.directive.d.ts +0 -17
  234. package/lib/form/io/form.input.directive.d.ts +0 -27
  235. package/lib/form/io/form.io.module.d.ts +0 -16
  236. package/lib/form/io/form.loading.directive.d.ts +0 -21
  237. package/lib/form/io/index.d.ts +0 -4
  238. package/lib/form.module.d.ts +0 -10
  239. package/lib/form.providers.d.ts +0 -8
  240. package/lib/formly/config/index.d.ts +0 -1
  241. package/lib/formly/config/validation.d.ts +0 -23
  242. package/lib/formly/field/checklist/checklist.field.d.ts +0 -44
  243. package/lib/formly/field/checklist/checklist.item.d.ts +0 -36
  244. package/lib/formly/field/checklist/checklist.item.field.component.d.ts +0 -43
  245. package/lib/formly/field/checklist/checklist.item.field.content.default.component.d.ts +0 -10
  246. package/lib/formly/field/checklist/checklist.item.field.d.ts +0 -7
  247. package/lib/formly/field/checklist/checklist.item.field.module.d.ts +0 -10
  248. package/lib/formly/field/checklist/index.d.ts +0 -6
  249. package/lib/formly/field/component/component.field.component.d.ts +0 -12
  250. package/lib/formly/field/component/component.field.d.ts +0 -3
  251. package/lib/formly/field/component/component.field.module.d.ts +0 -8
  252. package/lib/formly/field/component/index.d.ts +0 -3
  253. package/lib/formly/field/field.d.ts +0 -99
  254. package/lib/formly/field/form.field.module.d.ts +0 -12
  255. package/lib/formly/field/index.d.ts +0 -8
  256. package/lib/formly/field/selection/index.d.ts +0 -7
  257. package/lib/formly/field/selection/list/index.d.ts +0 -3
  258. package/lib/formly/field/selection/list/list.field.component.d.ts +0 -55
  259. package/lib/formly/field/selection/list/list.field.d.ts +0 -8
  260. package/lib/formly/field/selection/list/list.field.module.d.ts +0 -8
  261. package/lib/formly/field/selection/pickable/index.d.ts +0 -7
  262. package/lib/formly/field/selection/pickable/pickable.chip.field.component.d.ts +0 -10
  263. package/lib/formly/field/selection/pickable/pickable.d.ts +0 -26
  264. package/lib/formly/field/selection/pickable/pickable.field.d.ts +0 -8
  265. package/lib/formly/field/selection/pickable/pickable.field.directive.d.ts +0 -169
  266. package/lib/formly/field/selection/pickable/pickable.field.module.d.ts +0 -9
  267. package/lib/formly/field/selection/pickable/pickable.list.field.component.d.ts +0 -39
  268. package/lib/formly/field/selection/pickable/pickable.util.d.ts +0 -14
  269. package/lib/formly/field/selection/searchable/index.d.ts +0 -8
  270. package/lib/formly/field/selection/searchable/searchable.chip.field.component.d.ts +0 -28
  271. package/lib/formly/field/selection/searchable/searchable.d.ts +0 -39
  272. package/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.d.ts +0 -22
  273. package/lib/formly/field/selection/searchable/searchable.field.d.ts +0 -25
  274. package/lib/formly/field/selection/searchable/searchable.field.directive.d.ts +0 -163
  275. package/lib/formly/field/selection/searchable/searchable.field.module.d.ts +0 -10
  276. package/lib/formly/field/selection/searchable/searchable.text.field.component.d.ts +0 -24
  277. package/lib/formly/field/selection/searchable/text.chip.field.d.ts +0 -8
  278. package/lib/formly/field/selection/selection.d.ts +0 -26
  279. package/lib/formly/field/selection/selection.field.d.ts +0 -38
  280. package/lib/formly/field/selection/selection.module.d.ts +0 -18
  281. package/lib/formly/field/selection/sourceselect/index.d.ts +0 -4
  282. package/lib/formly/field/selection/sourceselect/sourceselect.d.ts +0 -116
  283. package/lib/formly/field/selection/sourceselect/sourceselect.field.component.d.ts +0 -95
  284. package/lib/formly/field/selection/sourceselect/sourceselect.field.d.ts +0 -7
  285. package/lib/formly/field/selection/sourceselect/sourceselect.field.module.d.ts +0 -8
  286. package/lib/formly/field/texteditor/index.d.ts +0 -3
  287. package/lib/formly/field/texteditor/texteditor.field.component.d.ts +0 -24
  288. package/lib/formly/field/texteditor/texteditor.field.d.ts +0 -6
  289. package/lib/formly/field/texteditor/texteditor.field.module.d.ts +0 -8
  290. package/lib/formly/field/value/array/array.field.component.d.ts +0 -89
  291. package/lib/formly/field/value/array/array.field.d.ts +0 -40
  292. package/lib/formly/field/value/array/array.field.module.d.ts +0 -8
  293. package/lib/formly/field/value/array/index.d.ts +0 -3
  294. package/lib/formly/field/value/boolean/boolean.field.d.ts +0 -8
  295. package/lib/formly/field/value/boolean/boolean.field.module.d.ts +0 -9
  296. package/lib/formly/field/value/boolean/index.d.ts +0 -2
  297. package/lib/formly/field/value/date/date.field.module.d.ts +0 -10
  298. package/lib/formly/field/value/date/date.value.d.ts +0 -32
  299. package/lib/formly/field/value/date/datetime.d.ts +0 -56
  300. package/lib/formly/field/value/date/datetime.field.component.d.ts +0 -307
  301. package/lib/formly/field/value/date/datetime.field.d.ts +0 -31
  302. package/lib/formly/field/value/date/datetime.field.service.d.ts +0 -12
  303. package/lib/formly/field/value/date/datetime.preset.d.ts +0 -2
  304. package/lib/formly/field/value/date/fixeddaterange.field.component.d.ts +0 -163
  305. package/lib/formly/field/value/date/index.d.ts +0 -9
  306. package/lib/formly/field/value/hidden.field.d.ts +0 -4
  307. package/lib/formly/field/value/index.d.ts +0 -8
  308. package/lib/formly/field/value/number/index.d.ts +0 -2
  309. package/lib/formly/field/value/number/number.field.d.ts +0 -46
  310. package/lib/formly/field/value/number/number.field.module.d.ts +0 -8
  311. package/lib/formly/field/value/phone/index.d.ts +0 -3
  312. package/lib/formly/field/value/phone/phone.field.component.d.ts +0 -35
  313. package/lib/formly/field/value/phone/phone.field.d.ts +0 -28
  314. package/lib/formly/field/value/phone/phone.field.module.d.ts +0 -8
  315. package/lib/formly/field/value/text/index.d.ts +0 -4
  316. package/lib/formly/field/value/text/text.additional.field.d.ts +0 -24
  317. package/lib/formly/field/value/text/text.address.field.d.ts +0 -43
  318. package/lib/formly/field/value/text/text.field.d.ts +0 -21
  319. package/lib/formly/field/value/text/text.field.module.d.ts +0 -10
  320. package/lib/formly/field/value/value.module.d.ts +0 -21
  321. package/lib/formly/field/wrapper/autotouch.wrapper.component.d.ts +0 -11
  322. package/lib/formly/field/wrapper/expand.wrapper.component.d.ts +0 -14
  323. package/lib/formly/field/wrapper/expand.wrapper.delegate.d.ts +0 -31
  324. package/lib/formly/field/wrapper/flex.wrapper.component.d.ts +0 -25
  325. package/lib/formly/field/wrapper/index.d.ts +0 -12
  326. package/lib/formly/field/wrapper/info.wrapper.component.d.ts +0 -11
  327. package/lib/formly/field/wrapper/section.wrapper.component.d.ts +0 -10
  328. package/lib/formly/field/wrapper/style.wrapper.component.d.ts +0 -27
  329. package/lib/formly/field/wrapper/subsection.wrapper.component.d.ts +0 -10
  330. package/lib/formly/field/wrapper/toggle.wrapper.component.d.ts +0 -17
  331. package/lib/formly/field/wrapper/working.wrapper.component.d.ts +0 -21
  332. package/lib/formly/field/wrapper/wrapper.d.ts +0 -35
  333. package/lib/formly/field/wrapper/wrapper.key.d.ts +0 -9
  334. package/lib/formly/field/wrapper/wrapper.module.d.ts +0 -17
  335. package/lib/formly/form/form.form.d.ts +0 -11
  336. package/lib/formly/form/form.form.module.d.ts +0 -10
  337. package/lib/formly/form/index.d.ts +0 -3
  338. package/lib/formly/form/search.form.component.d.ts +0 -12
  339. package/lib/formly/formly.component.template.d.ts +0 -19
  340. package/lib/formly/formly.context.d.ts +0 -57
  341. package/lib/formly/formly.context.directive.d.ts +0 -17
  342. package/lib/formly/formly.directive.d.ts +0 -54
  343. package/lib/formly/formly.form.component.d.ts +0 -51
  344. package/lib/formly/formly.module.d.ts +0 -15
  345. package/lib/formly/formly.providers.d.ts +0 -1
  346. package/lib/formly/index.d.ts +0 -11
  347. package/lib/formly/template/available.d.ts +0 -7
  348. package/lib/formly/template/available.module.d.ts +0 -8
  349. package/lib/formly/template/index.d.ts +0 -7
  350. package/lib/formly/template/login.d.ts +0 -66
  351. package/lib/formly/template/login.module.d.ts +0 -7
  352. package/lib/formly/template/timezone.d.ts +0 -20
  353. package/lib/formly/template/timezone.module.d.ts +0 -7
  354. package/lib/formly/template/website.d.ts +0 -15
  355. package/lib/index.d.ts +0 -6
  356. package/lib/layout/form.layout.module.d.ts +0 -10
  357. package/lib/layout/form.spacer.directive.d.ts +0 -8
  358. package/lib/layout/index.d.ts +0 -2
  359. package/lib/validator/available.d.ts +0 -30
  360. package/lib/validator/boolean.d.ts +0 -2
  361. package/lib/validator/email.d.ts +0 -2
  362. package/lib/validator/field.d.ts +0 -32
  363. package/lib/validator/index.d.ts +0 -7
  364. package/lib/validator/number.d.ts +0 -23
  365. package/lib/validator/phone.d.ts +0 -16
  366. package/lib/validator/website.d.ts +0 -31
  367. package/mapbox/index.d.ts +0 -2
  368. package/mapbox/lib/field/index.d.ts +0 -2
  369. package/mapbox/lib/field/latlng/index.d.ts +0 -4
  370. package/mapbox/lib/field/latlng/latlng.field.component.d.ts +0 -116
  371. package/mapbox/lib/field/latlng/latlng.field.d.ts +0 -6
  372. package/mapbox/lib/field/latlng/latlng.field.marker.component.d.ts +0 -12
  373. package/mapbox/lib/field/latlng/latlng.module.d.ts +0 -8
  374. package/mapbox/lib/field/zoom/index.d.ts +0 -3
  375. package/mapbox/lib/field/zoom/zoom.field.component.d.ts +0 -68
  376. package/mapbox/lib/field/zoom/zoom.field.d.ts +0 -6
  377. package/mapbox/lib/field/zoom/zoom.module.d.ts +0 -8
  378. package/mapbox/lib/mapbox.module.d.ts +0 -8
@@ -1,521 +0,0 @@
1
- import { isMonthDaySlashDate, MS_IN_MINUTE } from '@dereekb/util';
2
- import { guessCurrentTimezone, dateTimezoneUtcNormal, isSameDateDayRange, dateRange, isDateInDateRange, clampDateRangeToDateRange, isSameDateRange, isSameDateDay, limitDateTimeInstance, dateTimeMinuteWholeDayDecisionFunction } from '@dereekb/date';
3
- import { switchMap, shareReplay, map, startWith, distinctUntilChanged, debounceTime, throttleTime, BehaviorSubject, Subject, of, combineLatestWith, filter, combineLatest, scan, first, timer } from 'rxjs';
4
- import { ChangeDetectionStrategy, Component, ElementRef, Injectable, forwardRef, inject, signal, viewChild } from '@angular/core';
5
- import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
6
- import { FieldType } from '@ngx-formly/material';
7
- import { MAT_DATE_RANGE_SELECTION_STRATEGY, DateRange as DatePickerDateRange, MatCalendar, MatDatepickerModule } from '@angular/material/datepicker';
8
- import { asObservableFromGetter, filterMaybe, skipFirstMaybe, SubscriptionObject, switchMapMaybeDefault } from '@dereekb/rxjs';
9
- import { DbxDateTimeValueMode, dbxDateRangeIsSameDateRangeFieldValue, dbxDateTimeInputValueParseFactory, dbxDateTimeOutputValueFactory } from './date.value';
10
- import { DbxDateTimeFieldMenuPresetsService } from './datetime.field.service';
11
- import { DateAdapter } from '@angular/material/core';
12
- import { isBefore } from 'date-fns';
13
- import { MatError, MatFormFieldModule } from '@angular/material/form-field';
14
- import { MatInputModule } from '@angular/material/input';
15
- import { toSignal } from '@angular/core/rxjs-interop';
16
- import { NgClass } from '@angular/common';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "@angular/material/datepicker";
19
- import * as i2 from "@angular/material/form-field";
20
- import * as i3 from "@angular/forms";
21
- function dbxFixedDateRangeInputValueFactory(mode, timezoneInstance) {
22
- const dateInputTransformer = dbxDateTimeInputValueParseFactory(mode, timezoneInstance);
23
- return (y) => {
24
- let result;
25
- if (y) {
26
- result = {
27
- start: dateInputTransformer(y.start),
28
- end: dateInputTransformer(y.end)
29
- };
30
- }
31
- return result;
32
- };
33
- }
34
- function dbxFixedDateRangeOutputValueFactory(mode, timezoneInstance) {
35
- const dateOutputTransformer = dbxDateTimeOutputValueFactory(mode, timezoneInstance);
36
- return (y) => {
37
- let result;
38
- if (y) {
39
- result = {
40
- start: dateOutputTransformer(y.start),
41
- end: dateOutputTransformer(y.end)
42
- };
43
- }
44
- return result;
45
- };
46
- }
47
- const TIME_OUTPUT_THROTTLE_TIME = 10;
48
- export class DbxFixedDateRangeFieldComponent extends FieldType {
49
- dbxDateTimeFieldMenuPresetsService = inject(DbxDateTimeFieldMenuPresetsService);
50
- calendar = viewChild.required(MatCalendar);
51
- startDateInputElement = viewChild('startDateInput', { read: ElementRef });
52
- endDateInputElement = viewChild('endDateInput', { read: ElementRef });
53
- currentDateRangeInputSignal = signal(undefined);
54
- currentSelectionModeSignal = signal('single');
55
- _sub = new SubscriptionObject();
56
- _inputRangeFormSub = new SubscriptionObject();
57
- _inputRangeFormValueSub = new SubscriptionObject();
58
- _dateRangeInputSub = new SubscriptionObject();
59
- _currentSelectionModeSub = new SubscriptionObject();
60
- _latestBoundarySub = new SubscriptionObject();
61
- _disableEndSub = new SubscriptionObject();
62
- _activeDateSub = new SubscriptionObject();
63
- _config = new BehaviorSubject(undefined);
64
- _selectionMode = new BehaviorSubject(undefined);
65
- _dateRangeInput = new BehaviorSubject(undefined);
66
- _timezone = new BehaviorSubject(undefined);
67
- _presets = new BehaviorSubject(of([]));
68
- _selectionEvent = new Subject();
69
- selectedDateRange$ = this._selectionEvent.pipe(map((x) => x.range));
70
- _formControlObs = new BehaviorSubject(undefined);
71
- formControl$ = this._formControlObs.pipe(filterMaybe());
72
- config$ = this._config.pipe(filterMaybe(), switchMap((x) => x), distinctUntilChanged(), shareReplay(1));
73
- limitDateTimeInstance$ = this.config$.pipe(map(limitDateTimeInstance), shareReplay(1));
74
- selectionMode$ = this._selectionMode.pipe(switchMapMaybeDefault('single'), map((x) => x ?? 'single'), distinctUntilChanged(), shareReplay(1));
75
- dateRangeInput$ = this._dateRangeInput.pipe(switchMapMaybeDefault(), shareReplay(1));
76
- timezone$ = this._timezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
77
- return defaultTimezone ?? guessCurrentTimezone();
78
- }), distinctUntilChanged(), shareReplay(1));
79
- timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
80
- valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
81
- return x.pipe(map(dbxFixedDateRangeInputValueFactory(this.valueMode, timezoneInstance)));
82
- }), throttleTime(20, undefined, { leading: false, trailing: true }), // throttle incoming values and timezone changes
83
- distinctUntilChanged(isSameDateDayRange), shareReplay(1));
84
- dateRangeSelectionForMode(mode) {
85
- const result = combineLatest([this.dateRangeInput$, this.limitDateTimeInstance$]).pipe(switchMap(([dateRangeInput, limitInstance]) => {
86
- const hasDateRangeConfiguration = Boolean(dateRangeInput);
87
- const minMaxClamp = (dateRange) => limitInstance.clampDateRange(dateRange);
88
- if (mode === 'single') {
89
- // only use the start date.
90
- return this.selectedDateRange$.pipe(distinctUntilChanged(isSameDateDayRange), map((inputDateRange) => {
91
- const date = inputDateRange?.start;
92
- return date ? minMaxClamp(dateRange({ ...dateRangeInput, date })) : null;
93
- }));
94
- }
95
- else {
96
- // take the first date, then wait unless the date is outside of the range.
97
- return this.selectedDateRange$.pipe(scan((acc, nextDateRange) => {
98
- let result;
99
- let pickType = 'start';
100
- if (nextDateRange && nextDateRange.start != null) {
101
- const { start: startOrNextDate, end } = nextDateRange;
102
- const potentialBoundary = dateRange({ ...dateRangeInput, date: startOrNextDate });
103
- // only comes through when passed by the text inputs
104
- if (startOrNextDate && end) {
105
- const range = clampDateRangeToDateRange(nextDateRange, potentialBoundary);
106
- result = {
107
- lastDateRange: nextDateRange,
108
- boundary: range,
109
- range
110
- };
111
- // for normal mode we want to protect against "start" being input, then the output being passed,
112
- // and then the next click being treated as another "start" instead of an "end".
113
- if (mode === 'normal' && acc.lastPickType === 'start' && isSameDateDay(startOrNextDate, end)) {
114
- if (isSameDateDay(startOrNextDate, acc.lastDateRange?.start)) {
115
- pickType = 'startRepeat';
116
- }
117
- }
118
- }
119
- else {
120
- let range = undefined;
121
- let boundary = potentialBoundary;
122
- if (mode === 'normal') {
123
- if (!hasDateRangeConfiguration) {
124
- // if there is no configured range/boundary, then just set the pick type based on the last type
125
- boundary = undefined;
126
- pickType = acc.lastPickType === 'start' ? 'end' : 'start';
127
- }
128
- else if (acc.lastPickType === 'startRepeat') {
129
- pickType = 'end';
130
- }
131
- else {
132
- // if the pick is outside the boundary, then consider it a start pick type.
133
- pickType = acc.lastPickType === 'start' && acc.boundary && isDateInDateRange(startOrNextDate, acc.boundary) ? 'end' : 'start';
134
- }
135
- // react based on how this
136
- switch (pickType) {
137
- case 'end':
138
- const lastStart = acc.lastDateRange?.start;
139
- let boundaryToCheck;
140
- const selectionIsBeforePreviousSelection = !lastStart || isBefore(startOrNextDate, lastStart);
141
- let nextStart;
142
- let nextEnd;
143
- if (selectionIsBeforePreviousSelection) {
144
- nextStart = startOrNextDate;
145
- nextEnd = lastStart;
146
- boundaryToCheck = potentialBoundary;
147
- }
148
- else {
149
- nextStart = lastStart;
150
- nextEnd = startOrNextDate;
151
- boundaryToCheck = dateRange({ ...dateRangeInput, date: nextStart });
152
- }
153
- // Recalculate the boundary using the next start date. If it is outside the selectable range, then it becomes a "start" pick type.
154
- if (isBefore(boundaryToCheck.end, nextEnd)) {
155
- // TODO: Allow changing the behavior to fill the entire range instead of just resetting it entirely
156
- nextStart = startOrNextDate;
157
- nextEnd = startOrNextDate;
158
- pickType = 'start';
159
- boundary = boundaryToCheck;
160
- }
161
- else {
162
- boundary = range;
163
- }
164
- // if we're picking the end then set the range.
165
- range = {
166
- start: nextStart,
167
- end: nextEnd
168
- };
169
- break;
170
- case 'start':
171
- // retain the boundary as potential boundary, and set our new range from the single date.
172
- range = {
173
- start: startOrNextDate,
174
- end: startOrNextDate
175
- };
176
- break;
177
- }
178
- }
179
- else if (acc.boundary && isDateInDateRange(startOrNextDate, acc.boundary)) {
180
- // if in the date range, uses the pick as the last date.
181
- range = {
182
- start: acc.boundary.start,
183
- end: startOrNextDate
184
- };
185
- if (mode === 'arbitrary_quick') {
186
- // modify boundary to match range
187
- if (isSameDateRange(acc.range, range) && isSameDateDay(range.end, startOrNextDate)) {
188
- // if we clicked on the end range, then expand the boundary again to the full range.
189
- range = dateRange({ ...dateRangeInput, date: range.start });
190
- boundary = range;
191
- }
192
- else {
193
- boundary = range;
194
- }
195
- }
196
- else {
197
- // retain same boundary
198
- boundary = acc.boundary;
199
- }
200
- }
201
- else if (mode === 'arbitrary_quick') {
202
- range = potentialBoundary;
203
- }
204
- result = {
205
- lastDateRange: nextDateRange,
206
- boundary,
207
- range
208
- };
209
- }
210
- }
211
- else {
212
- result = {
213
- lastDateRange: nextDateRange
214
- };
215
- }
216
- if (result) {
217
- result = {
218
- lastPickType: pickType,
219
- lastDateRange: result.lastDateRange,
220
- boundary: result.boundary ? minMaxClamp(result.boundary) : undefined,
221
- range: result.range ? minMaxClamp(result.range) : undefined
222
- };
223
- }
224
- return result;
225
- }, {}), filter((x) => !x.lastDateRange || x.range != null), // pass through null/date clearings or ranges
226
- map((x) => x.range ?? null) // return the range
227
- );
228
- }
229
- }));
230
- return result;
231
- }
232
- fullBoundary$ = this.dateRangeSelectionForMode('single').pipe(shareReplay(1));
233
- latestBoundary$ = this.selectionMode$.pipe(switchMap((mode) => {
234
- if (mode === 'arbitrary_quick') {
235
- // in arbitrary_quick mode, the latest value is the boundary, since we always set the value immediately.
236
- return this.valueInSystemTimezone$;
237
- }
238
- else {
239
- return this.fullBoundary$;
240
- }
241
- }));
242
- /**
243
- * Focuses on the date any time the selection event from the picker occured, otherwise use the system value
244
- */
245
- calendarFocusDate$ = this._selectionEvent.pipe(startWith(null)).pipe(switchMap((selectionEvent) => {
246
- if (selectionEvent && selectionEvent.type === 'calendar' && selectionEvent.range?.start) {
247
- return of(selectionEvent.range.start);
248
- }
249
- else {
250
- return this.fullBoundary$.pipe(first(), map((fullBoundary) => {
251
- return fullBoundary?.start ?? selectionEvent?.range?.start;
252
- }));
253
- }
254
- }), filterMaybe(), shareReplay(1));
255
- dateRangeSelection$ = this.selectionMode$.pipe(switchMap((mode) => this.dateRangeSelectionForMode(mode)));
256
- calendarSelection$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? new DatePickerDateRange(x.start, x.end) : null)), shareReplay(1));
257
- endDisabled$ = this.selectionMode$.pipe(map((x) => x === 'single'), distinctUntilChanged(), shareReplay(1));
258
- inputRangeForm = new FormGroup({
259
- start: new FormControl(null),
260
- end: new FormControl(null)
261
- });
262
- get fixedDateRangeField() {
263
- return this.field.props;
264
- }
265
- get selectionMode() {
266
- return this.field.props.selectionMode;
267
- }
268
- get valueMode() {
269
- return this.field.props.valueMode ?? DbxDateTimeValueMode.DATE;
270
- }
271
- get description() {
272
- return this.field.props.description;
273
- }
274
- get timezone() {
275
- return this.field.props.timezone;
276
- }
277
- get showTimezone() {
278
- return this.field.props.showTimezone ?? true;
279
- }
280
- get presets() {
281
- return this.field.props.presets;
282
- }
283
- get showRangeInput() {
284
- return this.field.props.showRangeInput ?? true;
285
- }
286
- minMaxRange$ = this.limitDateTimeInstance$.pipe(combineLatestWith(timer(MS_IN_MINUTE)), // refresh every minute
287
- map(([x]) => x.dateRange()), distinctUntilChanged(isSameDateDayRange), shareReplay(1));
288
- min$ = this.minMaxRange$.pipe(map((x) => x?.start ?? null), distinctUntilChanged(), shareReplay(1));
289
- max$ = this.minMaxRange$.pipe(map((x) => x?.end ?? null), distinctUntilChanged(), shareReplay(1));
290
- pickerFilter$ = this.config$.pipe(distinctUntilChanged(), map((x) => {
291
- if (x) {
292
- const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
293
- return (x) => (x != null ? filter(x) : true);
294
- }
295
- else {
296
- return () => true;
297
- }
298
- }), shareReplay(1));
299
- defaultPickerFilter = () => true;
300
- minDateSignal = toSignal(this.min$, { initialValue: null });
301
- maxDateSignal = toSignal(this.max$, { initialValue: null });
302
- endDisabledSignal = toSignal(this.endDisabled$);
303
- latestBoundarySignal = toSignal(this.latestBoundary$);
304
- calendarSelectionSignal = toSignal(this.calendarSelection$, { initialValue: null });
305
- pickerFilterSignal = toSignal(this.pickerFilter$, { initialValue: this.defaultPickerFilter });
306
- ngOnInit() {
307
- this._formControlObs.next(this.formControl);
308
- const dateRangeSelection = this.dateRangeSelection$.pipe(shareReplay(1));
309
- const setInputFormValue = (value) => {
310
- if (!isSameDateDayRange(value, this.inputRangeForm.value)) {
311
- this.inputRangeForm.setValue({
312
- start: value?.start ?? null,
313
- end: value?.end ?? null
314
- });
315
- }
316
- };
317
- this._sub.subscription = this.valueInSystemTimezone$
318
- .pipe(combineLatestWith(this.timezoneInstance$.pipe(map((timezoneInstance) => dbxFixedDateRangeOutputValueFactory(this.valueMode, timezoneInstance)))), throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), switchMap(([currentValue, valueFactory]) => {
319
- return dateRangeSelection.pipe(skipFirstMaybe(), distinctUntilChanged(isSameDateDayRange), map((x) => [x, currentValue, valueFactory]));
320
- }))
321
- .subscribe(([rawValue, currentValue, valueFactory]) => {
322
- const value = rawValue ? valueFactory(rawValue) : null;
323
- const isSameRange = dbxDateRangeIsSameDateRangeFieldValue(value, currentValue);
324
- if (!isSameRange) {
325
- this.formControl.setValue(value);
326
- this.formControl.markAsDirty();
327
- this.formControl.markAsTouched();
328
- }
329
- else if (rawValue != null) {
330
- // update the input text again
331
- setInputFormValue(rawValue);
332
- }
333
- });
334
- if (this.selectionMode) {
335
- this._selectionMode.next(asObservableFromGetter(this.selectionMode));
336
- }
337
- this._currentSelectionModeSub.subscription = this.selectionMode$.subscribe((x) => this.currentSelectionModeSignal.set(x));
338
- this._dateRangeInputSub.subscription = this.dateRangeInput$.subscribe((x) => this.currentDateRangeInputSignal.set(x));
339
- this._inputRangeFormSub.subscription = this.valueInSystemTimezone$.subscribe((x) => {
340
- setInputFormValue(x);
341
- });
342
- if (this.showRangeInput) {
343
- this._inputRangeFormValueSub.subscription = this.valueInSystemTimezone$
344
- .pipe(throttleTime(100), // throttle to prevent the value from changing too fast
345
- switchMap(() => {
346
- return this.inputRangeForm.valueChanges.pipe(debounceTime(500), filter(() => {
347
- const startString = this.startDateInputElement()?.nativeElement?.value;
348
- let valid = isMonthDaySlashDate(startString);
349
- if (valid && this.currentSelectionModeSignal() !== 'single') {
350
- const endString = this.endDateInputElement()?.nativeElement?.value;
351
- valid = isMonthDaySlashDate(endString);
352
- }
353
- return valid; // must be a valid text input
354
- }), map((x) => x));
355
- }), distinctUntilChanged(isSameDateRange))
356
- .subscribe((x) => {
357
- const currentSelectionMode = this.currentSelectionModeSignal();
358
- if (currentSelectionMode === 'single') {
359
- this.setDateRange(x?.start ? { start: x.start } : null, 'input');
360
- }
361
- else {
362
- let rangeToSet = x;
363
- const latestBoundary = this.latestBoundarySignal();
364
- if (currentSelectionMode === 'arbitrary_quick' && latestBoundary && x?.start && x?.end) {
365
- if (!isDateInDateRange(x.start, latestBoundary)) {
366
- // if the end date it outside of the current range (i.e. a range was typed in only to the start date) then set the end to the boundary end
367
- const boundary = dateRange({ ...this.currentDateRangeInputSignal(), date: x.start });
368
- rangeToSet = { start: x.start, end: boundary.end };
369
- }
370
- }
371
- this.setDateRange(rangeToSet, 'input');
372
- }
373
- });
374
- }
375
- this._dateRangeInput.next(asObservableFromGetter(this.fixedDateRangeField.dateRangeInput));
376
- this._disableEndSub.subscription = this.endDisabled$.subscribe((disabled) => {
377
- const end = this.inputRangeForm.get('end');
378
- if (end) {
379
- if (disabled) {
380
- end.disable();
381
- }
382
- else {
383
- end.enable();
384
- }
385
- }
386
- });
387
- const inputPickerConfig = this.fixedDateRangeField.pickerConfig;
388
- this._config.next(inputPickerConfig ? asObservableFromGetter(inputPickerConfig) : undefined);
389
- // Set default timezone if provided.
390
- if (this.timezone && !this.fixedDateRangeField.fullDayInUTC) {
391
- this._timezone.next(asObservableFromGetter(this.timezone));
392
- }
393
- // Watch for disabled changes so we can propogate them properly.
394
- this.formControl.registerOnDisabledChange((disabled) => {
395
- if (disabled) {
396
- this.inputRangeForm.disable();
397
- }
398
- else {
399
- this.inputRangeForm.enable();
400
- this.endDisabled$.pipe(first()).subscribe((disabled) => {
401
- const end = this.inputRangeForm.get('end');
402
- if (end) {
403
- if (disabled) {
404
- end.disable();
405
- }
406
- else {
407
- end.enable();
408
- }
409
- }
410
- });
411
- }
412
- });
413
- if (this.presets != null) {
414
- this._presets.next(asObservableFromGetter(this.presets));
415
- }
416
- else {
417
- this._presets.next(this.dbxDateTimeFieldMenuPresetsService.configurations$);
418
- }
419
- this._activeDateSub.subscription = this.calendarFocusDate$.subscribe((x) => {
420
- this.calendar().activeDate = x;
421
- });
422
- }
423
- ngOnDestroy() {
424
- super.ngOnDestroy();
425
- this._sub.destroy();
426
- this._inputRangeFormSub.destroy();
427
- this._inputRangeFormValueSub.destroy();
428
- this._dateRangeInputSub.destroy();
429
- this._currentSelectionModeSub.destroy();
430
- this._latestBoundarySub.destroy();
431
- this._disableEndSub.destroy();
432
- this._activeDateSub.destroy();
433
- this._config.complete();
434
- this._selectionMode.complete();
435
- this._dateRangeInput.complete();
436
- this._timezone.complete();
437
- this._presets.complete();
438
- this._selectionEvent.complete();
439
- this._formControlObs.complete();
440
- }
441
- selectedChange(date) {
442
- this.setDateRange(date ? { start: date } : null, 'calendar');
443
- }
444
- setDateRange(range, type) {
445
- this._selectionEvent.next({ type, range });
446
- }
447
- _createDateRange(date) {
448
- return date ? dateRange({ ...this.currentDateRangeInputSignal(), date }) : undefined;
449
- }
450
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFixedDateRangeFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
451
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DbxFixedDateRangeFieldComponent, isStandalone: true, selector: "ng-component", providers: [
452
- {
453
- provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
454
- useClass: forwardRef(() => DbxFixedDateRangeFieldSelectionStrategy)
455
- }
456
- ], viewQueries: [{ propertyName: "calendar", first: true, predicate: MatCalendar, descendants: true, isSignal: true }, { propertyName: "startDateInputElement", first: true, predicate: ["startDateInput"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "endDateInputElement", first: true, predicate: ["endDateInput"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelectionSignal()\" [dateFilter]=\"pickerFilterSignal()\" [minDate]=\"minDateSignal()\" [maxDate]=\"maxDateSignal()\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n @if (showRangeInput) {\n <mat-date-range-input [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"endDisabledSignal() ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"endDisabledSignal() ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n }\n </mat-form-field>\n @if (formControl.hasError('required')) {\n <mat-error>Date range is required</mat-error>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "component", type: i1.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i1.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i1.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
457
- }
458
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFixedDateRangeFieldComponent, decorators: [{
459
- type: Component,
460
- args: [{ providers: [
461
- {
462
- provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
463
- useClass: forwardRef(() => DbxFixedDateRangeFieldSelectionStrategy)
464
- }
465
- ], imports: [MatDatepickerModule, MatFormFieldModule, FormsModule, ReactiveFormsModule, MatInputModule, MatError, NgClass], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelectionSignal()\" [dateFilter]=\"pickerFilterSignal()\" [minDate]=\"minDateSignal()\" [maxDate]=\"maxDateSignal()\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n @if (showRangeInput) {\n <mat-date-range-input [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"endDisabledSignal() ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"endDisabledSignal() ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n }\n </mat-form-field>\n @if (formControl.hasError('required')) {\n <mat-error>Date range is required</mat-error>\n }\n</div>\n" }]
466
- }] });
467
- export class DbxFixedDateRangeFieldSelectionStrategy {
468
- _dateAdapter = inject((DateAdapter));
469
- dbxFixedDateRangeFieldComponent = inject(DbxFixedDateRangeFieldComponent);
470
- selectionFinished(date, currentRange, event) {
471
- // unused
472
- return currentRange;
473
- }
474
- createPreview(activeDate, currentRange, event) {
475
- const { currentSelectionModeSignal, latestBoundarySignal } = this.dbxFixedDateRangeFieldComponent;
476
- const currentSelectionMode = currentSelectionModeSignal();
477
- if (activeDate != null && currentSelectionMode !== 'single') {
478
- const latestBoundary = latestBoundarySignal();
479
- const date = this.dateFromAdapterDate(activeDate);
480
- if (latestBoundary && (currentSelectionMode === 'normal' || isDateInDateRange(date, latestBoundary))) {
481
- const exampleDateRange = this._createDateRange(latestBoundary);
482
- return exampleDateRange;
483
- }
484
- }
485
- return this._createDateRangeWithDate(activeDate);
486
- }
487
- _createDateRangeWithDate(input) {
488
- let dateRange;
489
- if (input) {
490
- const date = this.dateFromAdapterDate(input);
491
- dateRange = this.dbxFixedDateRangeFieldComponent._createDateRange(date);
492
- }
493
- return this._createDateRange(dateRange);
494
- }
495
- _createDateRange(input) {
496
- if (input) {
497
- return new DatePickerDateRange(this.adapterDateFromDate(input.start), this.adapterDateFromDate(input.end));
498
- }
499
- else {
500
- return new DatePickerDateRange(null, null);
501
- }
502
- }
503
- dateFromAdapterDate(input) {
504
- const day = this._dateAdapter.getDate(input);
505
- const monthIndex = this._dateAdapter.getMonth(input);
506
- const year = this._dateAdapter.getYear(input);
507
- return new Date(year, monthIndex, day);
508
- }
509
- adapterDateFromDate(date) {
510
- const day = date.getDate();
511
- const monthIndex = date.getMonth();
512
- const year = date.getFullYear();
513
- return this._dateAdapter.createDate(year, monthIndex, day);
514
- }
515
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
516
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy });
517
- }
518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, decorators: [{
519
- type: Injectable
520
- }] });
521
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWRkYXRlcmFuZ2UuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9maXhlZGRhdGVyYW5nZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0gsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9MLE9BQU8sRUFBRSxvQkFBb0IsRUFBaUMscUJBQXFCLEVBQTZCLGtCQUFrQixFQUF3RCxTQUFTLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4VyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4TixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQW1CLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixF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QyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFlLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBVTtRQUM1QixNQUFNLEdBQUcsR0FBZSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQWMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFlLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU1QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0QsQ0FBQzt3R0ExRFUsdUNBQXVDOzRHQUF2Qyx1Q0FBdUM7OzRGQUF2Qyx1Q0FBdUM7a0JBRG5ELFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE1heWJlLCB0eXBlIERlY2lzaW9uRnVuY3Rpb24sIHR5cGUgTWlsbGlzZWNvbmRzLCB0eXBlIFRpbWV6b25lU3RyaW5nLCB0eXBlIERhdGVNb250aCwgdHlwZSBEYXlPZk1vbnRoLCB0eXBlIFllYXJOdW1iZXIsIGlzTW9udGhEYXlTbGFzaERhdGUsIE1TX0lOX01JTlVURSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgZ3Vlc3NDdXJyZW50VGltZXpvbmUsIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLCBkYXRlVGltZXpvbmVVdGNOb3JtYWwsIERhdGVSYW5nZUlucHV0LCBEYXRlUmFuZ2UsIGlzU2FtZURhdGVEYXlSYW5nZSwgRGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlLCBEYXRlVGltZU1pbnV0ZUNvbmZpZywgZGF0ZVJhbmdlLCBpc0RhdGVJbkRhdGVSYW5nZSwgY2xhbXBEYXRlUmFuZ2VUb0RhdGVSYW5nZSwgaXNTYW1lRGF0ZVJhbmdlLCBpc1NhbWVEYXRlRGF5LCBsaW1pdERhdGVUaW1lSW5zdGFuY2UsIGRhdGVUaW1lTWludXRlV2hvbGVEYXlEZWNpc2lvbkZ1bmN0aW9uIH0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHNoYXJlUmVwbGF5LCBtYXAsIHN0YXJ0V2l0aCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGRlYm91bmNlVGltZSwgdGhyb3R0bGVUaW1lLCBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCBjb21iaW5lTGF0ZXN0V2l0aCwgZmlsdGVyLCBjb21iaW5lTGF0ZXN0LCBzY2FuLCBmaXJzdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT25Jbml0LCBmb3J3YXJkUmVmLCBpbmplY3QsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlQ29uZmlnLCBGb3JtbHlGaWVsZFByb3BzIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlUmFuZ2VTZWxlY3Rpb25TdHJhdGVneSwgTUFUX0RBVEVfUkFOR0VfU0VMRUNUSU9OX1NUUkFURUdZLCBEYXRlUmFuZ2UgYXMgRGF0ZVBpY2tlckRhdGVSYW5nZSwgTWF0Q2FsZW5kYXIsIE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIsIGZpbHRlck1heWJlLCBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlciwgc2tpcEZpcnN0TWF5YmUsIFN1YnNjcmlwdGlvbk9iamVjdCwgc3dpdGNoTWFwTWF5YmVEZWZhdWx0IH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBEYnhEYXRlVGltZVZhbHVlTW9kZSwgZGJ4RGF0ZVJhbmdlSXNTYW1lRGF0ZVJhbmdlRmllbGRWYWx1ZSwgZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5LCBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeSB9IGZyb20gJy4vZGF0ZS52YWx1ZSc7XG5pbXBvcnQgeyBEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UgfSBmcm9tICcuL2RhdGV0aW1lLmZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IGlzQmVmb3JlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgTWF0RXJyb3IsIE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBEYnhGaXhlZERhdGVSYW5nZURhdGVSYW5nZUlucHV0ID0gT21pdDxEYXRlUmFuZ2VJbnB1dCwgJ2RhdGUnPjtcblxuZXhwb3J0IHR5cGUgRGJ4Rml4ZWREYXRlUmFuZ2VQaWNrZXJDb25maWd1cmF0aW9uID0gT21pdDxEYXRlVGltZU1pbnV0ZUNvbmZpZywgJ2RhdGUnPjtcblxuZXhwb3J0IHR5cGUgRGJ4Rml4ZWREYXRlUmFuZ2VTZWxlY3Rpb25Nb2RlID0gJ3NpbmdsZScgfCAnbm9ybWFsJyB8ICdhcmJpdHJhcnknIHwgJ2FyYml0cmFyeV9xdWljayc7XG5leHBvcnQgdHlwZSBEYnhGaXhlZERhdGVSYW5nZVBpY2tpbmcgPSAnc3RhcnQnIHwgJ2VuZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFByb3BzIGV4dGVuZHMgRm9ybWx5RmllbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBEYXRlIHJhbmdlIGlucHV0IHRvIGJ1aWxkIHRoZSBkYXRlIHJhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlSW5wdXQ6IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieEZpeGVkRGF0ZVJhbmdlRGF0ZVJhbmdlSW5wdXQ+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gbW9kZSB0byB1c2Ugd2hlbiBwaWNraW5nIGRhdGVzIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGU+PjtcblxuICAvKipcbiAgICogVmFsdWUgbW9kZSBmb3IgdGhlIGRhdGVzIGluIHRoZSBvdXRwdXQgRGF0ZVJhbmdlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBEQVRFXG4gICAqL1xuICByZWFkb25seSB2YWx1ZU1vZGU/OiBEYnhEYXRlVGltZVZhbHVlTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcGFzcyB0aGUgZGF0ZSB2YWx1ZSBhcyBhIFVUQyBkYXRlLCBvciBhIGRhdGUgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICByZWFkb25seSBmdWxsRGF5SW5VVEM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBpY2tlckNvbmZpZz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieEZpeGVkRGF0ZVJhbmdlUGlja2VyQ29uZmlndXJhdGlvbj47XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVGhlIGlucHV0IHRpbWV6b25lIHRvIGRlZmF1bHQgdG8uXG4gICAqXG4gICAqIElnbm9yZWQgaWYgZnVsbERheUluVVRDIGlzIHRydWUuXG4gICAqL1xuICByZWFkb25seSB0aW1lem9uZT86IE1heWJlPE9ic2VydmFibGVPclZhbHVlR2V0dGVyPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSB0aW1lem9uZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1RpbWV6b25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHByZXNldHMgdG8gc2hvdyBpbiB0aGUgZHJvcGRvd24uXG4gICAqL1xuICByZWFkb25seSBwcmVzZXRzPzogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSByYW5nZSBpbnB1dC4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dSYW5nZUlucHV0PzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZGJ4Rml4ZWREYXRlUmFuZ2VJbnB1dFZhbHVlRmFjdG9yeShtb2RlOiBEYnhEYXRlVGltZVZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZTogTWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+KTogKGlucHV0OiBNYXliZTxEYXRlUmFuZ2VXaXRoRGF0ZU9yU3RyaW5nVmFsdWU+KSA9PiBNYXliZTxEYXRlUmFuZ2U+IHtcbiAgY29uc3QgZGF0ZUlucHV0VHJhbnNmb3JtZXIgPSBkYnhEYXRlVGltZUlucHV0VmFsdWVQYXJzZUZhY3RvcnkobW9kZSwgdGltZXpvbmVJbnN0YW5jZSk7XG5cbiAgcmV0dXJuICh5KSA9PiB7XG4gICAgbGV0IHJlc3VsdDogTWF5YmU8RGF0ZVJhbmdlPjtcblxuICAgIGlmICh5KSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHN0YXJ0OiBkYXRlSW5wdXRUcmFuc2Zvcm1lcih5LnN0YXJ0KSBhcyBEYXRlLFxuICAgICAgICBlbmQ6IGRhdGVJbnB1dFRyYW5zZm9ybWVyKHkuZW5kKSBhcyBEYXRlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRieEZpeGVkRGF0ZVJhbmdlT3V0cHV0VmFsdWVGYWN0b3J5KG1vZGU6IERieERhdGVUaW1lVmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlOiBNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT4pOiAoZGF0ZTogTWF5YmU8RGF0ZVJhbmdlPikgPT4gTWF5YmU8RGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlPiB7XG4gIGNvbnN0IGRhdGVPdXRwdXRUcmFuc2Zvcm1lciA9IGRieERhdGVUaW1lT3V0cHV0VmFsdWVGYWN0b3J5KG1vZGUsIHRpbWV6b25lSW5zdGFuY2UpO1xuXG4gIHJldHVybiAoeSkgPT4ge1xuICAgIGxldCByZXN1bHQ6IE1heWJlPERhdGVSYW5nZT47XG5cbiAgICBpZiAoeSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBzdGFydDogZGF0ZU91dHB1dFRyYW5zZm9ybWVyKHkuc3RhcnQpIGFzIERhdGUsXG4gICAgICAgIGVuZDogZGF0ZU91dHB1dFRyYW5zZm9ybWVyKHkuZW5kKSBhcyBEYXRlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmNvbnN0IFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUU6IE1pbGxpc2Vjb25kcyA9IDEwO1xuXG5leHBvcnQgdHlwZSBGaXhlZERhdGVSYW5nZVNjYW5UeXBlID0gJ3N0YXJ0JyB8ICdlbmQnIHwgJ3N0YXJ0UmVwZWF0JztcblxuZXhwb3J0IGludGVyZmFjZSBGaXhlZERhdGVSYW5nZVNjYW4ge1xuICAvKipcbiAgICogUGlja2VkIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHJhbmdlIG9uIHRoZSBsYXN0IHBpY2suXG4gICAqL1xuICByZWFkb25seSBsYXN0UGlja1R5cGU/OiBNYXliZTxGaXhlZERhdGVSYW5nZVNjYW5UeXBlPjtcbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgZGF0ZSBwYXNzZWQsIGlmIGFwcGxpY2FibGUuXG4gICAqL1xuICByZWFkb25seSBsYXN0RGF0ZVJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0ZWQgYm91bmRhcnkgcmFuZ2UuXG4gICAqL1xuICByZWFkb25seSBib3VuZGFyeT86IERhdGVSYW5nZTtcbiAgLyoqXG4gICAqIE5ldyBEYXRlIFJhbmdlXG4gICAqL1xuICByZWFkb25seSByYW5nZT86IERhdGVSYW5nZTtcbn1cblxudHlwZSBTZWxlY3RlZERhdGVFdmVudFR5cGUgPSAnY2FsZW5kYXInIHwgJ2lucHV0JztcblxuaW50ZXJmYWNlIFNlbGVjdGVkRGF0ZUV2ZW50IHtcbiAgcmVhZG9ubHkgdHlwZTogU2VsZWN0ZWREYXRlRXZlbnRUeXBlO1xuICByZWFkb25seSByYW5nZT86IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj47XG59XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTUFUX0RBVEVfUkFOR0VfU0VMRUNUSU9OX1NUUkFURUdZLFxuICAgICAgdXNlQ2xhc3M6IGZvcndhcmRSZWYoKCkgPT4gRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFNlbGVjdGlvblN0cmF0ZWd5KVxuICAgIH1cbiAgXSxcbiAgaW1wb3J0czogW01hdERhdGVwaWNrZXJNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRFcnJvciwgTmdDbGFzc10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPERieEZpeGVkRGF0ZVJhbmdlRmllbGRQcm9wcz4+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UgPSBpbmplY3QoRGJ4RGF0ZVRpbWVGaWVsZE1lbnVQcmVzZXRzU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgY2FsZW5kYXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8TWF0Q2FsZW5kYXI8RGF0ZT4+KE1hdENhbGVuZGFyKTtcbiAgcmVhZG9ubHkgc3RhcnREYXRlSW5wdXRFbGVtZW50ID0gdmlld0NoaWxkPHN0cmluZywgRWxlbWVudFJlZj4oJ3N0YXJ0RGF0ZUlucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICByZWFkb25seSBlbmREYXRlSW5wdXRFbGVtZW50ID0gdmlld0NoaWxkPHN0cmluZywgRWxlbWVudFJlZj4oJ2VuZERhdGVJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICByZWFkb25seSBjdXJyZW50RGF0ZVJhbmdlSW5wdXRTaWduYWwgPSBzaWduYWw8TWF5YmU8RGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dD4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25Nb2RlU2lnbmFsID0gc2lnbmFsPERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4oJ3NpbmdsZScpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dFJhbmdlRm9ybVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXRSYW5nZUZvcm1WYWx1ZVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRlUmFuZ2VJbnB1dFN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudFNlbGVjdGlvbk1vZGVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhdGVzdEJvdW5kYXJ5U3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNhYmxlRW5kU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVEYXRlU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVBpY2tlckNvbmZpZ3VyYXRpb24+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uTW9kZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGU+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0ZVJhbmdlSW5wdXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8RGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dD4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RpbWV6b25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3Rpb25FdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGVkRGF0ZUV2ZW50PigpO1xuICByZWFkb25seSBzZWxlY3RlZERhdGVSYW5nZSQ6IE9ic2VydmFibGU8TWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pj4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKG1hcCgoeCkgPT4geC5yYW5nZSkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1Db250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZVJhbmdlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHJlYWRvbmx5IGNvbmZpZyQ6IE9ic2VydmFibGU8RGJ4Rml4ZWREYXRlUmFuZ2VQaWNrZXJDb25maWd1cmF0aW9uPiA9IHRoaXMuX2NvbmZpZy5waXBlKFxuICAgIGZpbHRlck1heWJlKCksXG4gICAgc3dpdGNoTWFwKCh4KSA9PiB4KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbGltaXREYXRlVGltZUluc3RhbmNlJCA9IHRoaXMuY29uZmlnJC5waXBlKG1hcChsaW1pdERhdGVUaW1lSW5zdGFuY2UpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uTW9kZSQ6IE9ic2VydmFibGU8RGJ4Rml4ZWREYXRlUmFuZ2VTZWxlY3Rpb25Nb2RlPiA9IHRoaXMuX3NlbGVjdGlvbk1vZGUucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZURlZmF1bHQ8RGJ4Rml4ZWREYXRlUmFuZ2VTZWxlY3Rpb25Nb2RlPignc2luZ2xlJyksXG4gICAgbWFwKCh4KSA9PiB4ID8/ICdzaW5nbGUnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlSW5wdXQkID0gdGhpcy5fZGF0ZVJhbmdlSW5wdXQucGlwZShzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5fdGltZXpvbmUucGlwZShzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkucGlwZShcbiAgICBtYXAoKGRlZmF1bHRUaW1lem9uZSkgPT4ge1xuICAgICAgcmV0dXJuIGRlZmF1bHRUaW1lem9uZSA/PyBndWVzc0N1cnJlbnRUaW1lem9uZSgpO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lem9uZUluc3RhbmNlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT4+ID0gdGhpcy50aW1lem9uZSQucGlwZShcbiAgICBtYXAoKHRpbWV6b25lKSA9PiAodGltZXpvbmUgPyBkYXRlVGltZXpvbmVVdGNOb3JtYWwoeyB0aW1lem9uZSB9KSA6IHVuZGVmaW5lZCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdmFsdWVJblN5c3RlbVRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlUmFuZ2U+PiA9IHRoaXMuZm9ybUNvbnRyb2wkLnBpcGUoXG4gICAgbWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aDxNYXliZTxEYXRlUmFuZ2VXaXRoRGF0ZU9yU3RyaW5nVmFsdWU+Pihjb250cm9sLnZhbHVlKSwgc2hhcmVSZXBsYXkoMSkpKSxcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkKSxcbiAgICBzd2l0Y2hNYXAoKFt4LCB0aW1lem9uZUluc3RhbmNlXSkgPT4ge1xuICAgICAgcmV0dXJuIHgucGlwZShtYXAoZGJ4Rml4ZWREYXRlUmFuZ2VJbnB1dFZhbHVlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKTtcbiAgICB9KSxcbiAgICB0aHJvdHRsZVRpbWUoMjAsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiBmYWxzZSwgdHJhaWxpbmc6IHRydWUgfSksIC8vIHRocm90dGxlIGluY29taW5nIHZhbHVlcyBhbmQgdGltZXpvbmUgY2hhbmdlc1xuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPE1heWJlPERhdGVSYW5nZT4+KGlzU2FtZURhdGVEYXlSYW5nZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBkYXRlUmFuZ2VTZWxlY3Rpb25Gb3JNb2RlKG1vZGU6IERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZSkge1xuICAgIGNvbnN0IHJlc3VsdDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlUmFuZ2U+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZVJhbmdlSW5wdXQkLCB0aGlzLmxpbWl0RGF0ZVRpbWVJbnN0YW5jZSRdKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChbZGF0ZVJhbmdlSW5wdXQsIGxpbWl0SW5zdGFuY2VdKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc0RhdGVSYW5nZUNvbmZpZ3VyYXRpb24gPSBCb29sZWFuKGRhdGVSYW5nZUlucHV0KTtcbiAgICAgICAgY29uc3QgbWluTWF4Q2xhbXAgPSAoZGF0ZVJhbmdlOiBEYXRlUmFuZ2UpID0+IGxpbWl0SW5zdGFuY2UuY2xhbXBEYXRlUmFuZ2UoZGF0ZVJhbmdlKTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAvLyBvbmx5IHVzZSB0aGUgc3RhcnQgZGF0ZS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVSYW5nZSQucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXlSYW5nZSksXG4gICAgICAgICAgICBtYXAoKGlucHV0RGF0ZVJhbmdlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBpbnB1dERhdGVSYW5nZT8uc3RhcnQ7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRlID8gKG1pbk1heENsYW1wKGRhdGVSYW5nZSh7IC4uLmRhdGVSYW5nZUlucHV0LCBkYXRlIH0gYXMgRGF0ZVJhbmdlSW5wdXQpKSBhcyBEYXRlUmFuZ2UpIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0YWtlIHRoZSBmaXJzdCBkYXRlLCB0aGVuIHdhaXQgdW5sZXNzIHRoZSBkYXRlIGlzIG91dHNpZGUgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlJC5waXBlKFxuICAgICAgICAgICAgc2NhbigoYWNjOiBGaXhlZERhdGVSYW5nZVNjYW4sIG5leHREYXRlUmFuZ2U6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4pID0+IHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdDogRml4ZWREYXRlUmFuZ2VTY2FuO1xuICAgICAgICAgICAgICBsZXQgcGlja1R5cGU6IE1heWJlPEZpeGVkRGF0ZVJhbmdlU2NhblR5cGU+ID0gJ3N0YXJ0JztcblxuICAgICAgICAgICAgICBpZiAobmV4dERhdGVSYW5nZSAmJiBuZXh0RGF0ZVJhbmdlLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXJ0OiBzdGFydE9yTmV4dERhdGUsIGVuZCB9ID0gbmV4dERhdGVSYW5nZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3RlbnRpYWxCb3VuZGFyeSA9IGRhdGVSYW5nZSh7IC4uLmRhdGVSYW5nZUlucHV0LCBkYXRlOiBzdGFydE9yTmV4dERhdGUgfSBhcyBEYXRlUmFuZ2VJbnB1dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBvbmx5IGNvbWVzIHRocm91Z2ggd2hlbiBwYXNzZWQgYnkgdGhlIHRleHQgaW5wdXRzXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0T3JOZXh0RGF0ZSAmJiBlbmQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gY2xhbXBEYXRlUmFuZ2VUb0RhdGVSYW5nZShuZXh0RGF0ZVJhbmdlLCBwb3RlbnRpYWxCb3VuZGFyeSkgYXMgRGF0ZVJhbmdlO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0RGF0ZVJhbmdlOiBuZXh0RGF0ZVJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBib3VuZGFyeTogcmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlXG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBmb3Igbm9ybWFsIG1vZGUgd2Ugd2FudCB0byBwcm90ZWN0IGFnYWluc3QgXCJzdGFydFwiIGJlaW5nIGlucHV0LCB0aGVuIHRoZSBvdXRwdXQgYmVpbmcgcGFzc2VkLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gdGhlIG5leHQgY2xpY2sgYmVpbmcgdHJlYXRlZCBhcyBhbm90aGVyIFwic3RhcnRcIiBpbnN0ZWFkIG9mIGFuIFwiZW5kXCIuXG4gICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ25vcm1hbCcgJiYgYWNjLmxhc3RQaWNrVHlwZSA9PT0gJ3N0YXJ0JyAmJiBpc1NhbWVEYXRlRGF5KHN0YXJ0T3JOZXh0RGF0ZSwgZW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGF0ZURheShzdGFydE9yTmV4dERhdGUsIGFjYy5sYXN0RGF0ZVJhbmdlPy5zdGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9ICdzdGFydFJlcGVhdCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IGJvdW5kYXJ5OiBNYXliZTxEYXRlUmFuZ2U+ID0gcG90ZW50aWFsQm91bmRhcnk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGVSYW5nZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb25maWd1cmVkIHJhbmdlL2JvdW5kYXJ5LCB0aGVuIGp1c3Qgc2V0IHRoZSBwaWNrIHR5cGUgYmFzZWQgb24gdGhlIGxhc3QgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIHBpY2tUeXBlID0gYWNjLmxhc3RQaWNrVHlwZSA9PT0gJ3N0YXJ0JyA/ICdlbmQnIDogJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2MubGFzdFBpY2tUeXBlID09PSAnc3RhcnRSZXBlYXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGlja1R5cGUgPSAnZW5kJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGljayBpcyBvdXRzaWRlIHRoZSBib3VuZGFyeSwgdGhlbiBjb25zaWRlciBpdCBhIHN0YXJ0IHBpY2sgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9IGFjYy5sYXN0UGlja1R5cGUgPT09ICdzdGFydCcgJiYgYWNjLmJvdW5kYXJ5ICYmIGlzRGF0ZUluRGF0ZVJhbmdlKHN0YXJ0T3JOZXh0RGF0ZSwgYWNjLmJvdW5kYXJ5KSA/ICdlbmQnIDogJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWN0IGJhc2VkIG9uIGhvdyB0aGlzXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGlja1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFN0YXJ0ID0gYWNjLmxhc3REYXRlUmFuZ2U/LnN0YXJ0IGFzIERhdGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBib3VuZGFyeVRvQ2hlY2s6IERhdGVSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbklzQmVmb3JlUHJldmlvdXNTZWxlY3Rpb24gPSAhbGFzdFN0YXJ0IHx8IGlzQmVmb3JlKHN0YXJ0T3JOZXh0RGF0ZSwgbGFzdFN0YXJ0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdGFydDogRGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0RW5kOiBEYXRlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXNCZWZvcmVQcmV2aW91c1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhcnQgPSBzdGFydE9yTmV4dERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmQgPSBsYXN0U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5VG9DaGVjayA9IHBvdGVudGlhbEJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXJ0ID0gbGFzdFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kID0gc3RhcnRPck5leHREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeVRvQ2hlY2sgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogbmV4dFN0YXJ0IH0gYXMgRGF0ZVJhbmdlSW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgYm91bmRhcnkgdXNpbmcgdGhlIG5leHQgc3RhcnQgZGF0ZS4gSWYgaXQgaXMgb3V0c2lkZSB0aGUgc2VsZWN0YWJsZSByYW5nZSwgdGhlbiBpdCBiZWNvbWVzIGEgXCJzdGFydFwiIHBpY2sgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0JlZm9yZShib3VuZGFyeVRvQ2hlY2suZW5kLCBuZXh0RW5kKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBbGxvdyBjaGFuZ2luZyB0aGUgYmVoYXZpb3IgdG8gZmlsbCB0aGUgZW50aXJlIHJhbmdlIGluc3RlYWQgb2YganVzdCByZXNldHRpbmcgaXQgZW50aXJlbHlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhcnQgPSBzdGFydE9yTmV4dERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmQgPSBzdGFydE9yTmV4dERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tUeXBlID0gJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSBib3VuZGFyeVRvQ2hlY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBwaWNraW5nIHRoZSBlbmQgdGhlbiBzZXQgdGhlIHJhbmdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBuZXh0U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbmV4dEVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldGFpbiB0aGUgYm91bmRhcnkgYXMgcG90ZW50aWFsIGJvdW5kYXJ5LCBhbmQgc2V0IG91ciBuZXcgcmFuZ2UgZnJvbSB0aGUgc2luZ2xlIGRhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0T3JOZXh0RGF0ZSBhcyBEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHN0YXJ0T3JOZXh0RGF0ZSBhcyBEYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjLmJvdW5kYXJ5ICYmIGlzRGF0ZUluRGF0ZVJhbmdlKHN0YXJ0T3JOZXh0RGF0ZSwgYWNjLmJvdW5kYXJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbiB0aGUgZGF0ZSByYW5nZSwgdXNlcyB0aGUgcGljayBhcyB0aGUgbGFzdCBkYXRlLlxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydDogYWNjLmJvdW5kYXJ5LnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgIGVuZDogc3RhcnRPck5leHREYXRlXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gbW9kaWZ5IGJvdW5kYXJ5IHRvIG1hdGNoIHJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZURhdGVSYW5nZShhY2MucmFuZ2UsIHJhbmdlKSAmJiBpc1NhbWVEYXRlRGF5KHJhbmdlLmVuZCwgc3RhcnRPck5leHREYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY2xpY2tlZCBvbiB0aGUgZW5kIHJhbmdlLCB0aGVuIGV4cGFuZCB0aGUgYm91bmRhcnkgYWdhaW4gdG8gdGhlIGZ1bGwgcmFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGRhdGVSYW5nZSh7IC4uLmRhdGVSYW5nZUlucHV0LCBkYXRlOiByYW5nZS5zdGFydCB9IGFzIERhdGVSYW5nZUlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gcmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gcmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldGFpbiBzYW1lIGJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSBhY2MuYm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2FyYml0cmFyeV9xdWljaycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBwb3RlbnRpYWxCb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0RGF0ZVJhbmdlOiBuZXh0RGF0ZVJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgIGxhc3REYXRlUmFuZ2U6IG5leHREYXRlUmFuZ2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgIGxhc3RQaWNrVHlwZTogcGlja1R5cGUsXG4gICAgICAgICAgICAgICAgICBsYXN0RGF0ZVJhbmdlOiByZXN1bHQubGFzdERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5OiByZXN1bHQuYm91bmRhcnkgPyAobWluTWF4Q2xhbXAocmVzdWx0LmJvdW5kYXJ5KSBhcyBEYXRlUmFuZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IChtaW5NYXhDbGFtcChyZXN1bHQucmFuZ2UpIGFzIERhdGVSYW5nZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAgIGZpbHRlcigoeCkgPT4gIXgubGFzdERhdGVSYW5nZSB8fCB4LnJhbmdlICE9IG51bGwpLCAvLyBwYXNzIHRocm91Z2ggbnVsbC9kYXRlIGNsZWFyaW5ncyBvciByYW5nZXNcbiAgICAgICAgICAgIG1hcCgoeCkgPT4geC5yYW5nZSA/PyBudWxsKSAvLyByZXR1cm4gdGhlIHJhbmdlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlYWRvbmx5IGZ1bGxCb3VuZGFyeSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLmRhdGVSYW5nZVNlbGVjdGlvbkZvck1vZGUoJ3NpbmdsZScpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICByZWFkb25seSBsYXRlc3RCb3VuZGFyeSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChtb2RlKSA9PiB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2FyYml0cmFyeV9xdWljaycpIHtcbiAgICAgICAgLy8gaW4gYXJiaXRyYXJ5X3F1aWNrIG1vZGUsIHRoZSBsYXRlc3QgdmFsdWUgaXMgdGhlIGJvdW5kYXJ5LCBzaW5jZSB3ZSBhbHdheXMgc2V0IHRoZSB2YWx1ZSBpbW1lZGlhdGVseS5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bGxCb3VuZGFyeSQ7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcblxuICAvKipcbiAgICogRm9jdXNlcyBvbiB0aGUgZGF0ZSBhbnkgdGltZSB0aGUgc2VsZWN0aW9uIGV2ZW50IGZyb20gdGhlIHBpY2tlciBvY2N1cmVkLCBvdGhlcndpc2UgdXNlIHRoZSBzeXN0ZW0gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGNhbGVuZGFyRm9jdXNEYXRlJDogT2JzZXJ2YWJsZTxEYXRlPiA9IHRoaXMuX3NlbGVjdGlvbkV2ZW50LnBpcGUoc3RhcnRXaXRoKG51bGwpKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoc2VsZWN0aW9uRXZlbnQpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rpb25FdmVudCAmJiBzZWxlY3Rpb25FdmVudC50eXBlID09PSAnY2FsZW5kYXInICYmIHNlbGVjdGlvbkV2ZW50LnJhbmdlPy5zdGFydCkge1xuICAgICAgICByZXR1cm4gb2Yoc2VsZWN0aW9uRXZlbnQucmFuZ2Uuc3RhcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVsbEJvdW5kYXJ5JC5waXBlKFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgbWFwKChmdWxsQm91bmRhcnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdWxsQm91bmRhcnk/LnN0YXJ0ID8/IHNlbGVjdGlvbkV2ZW50Py5yYW5nZT8uc3RhcnQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBmaWx0ZXJNYXliZSgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlU2VsZWN0aW9uJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlUmFuZ2U+PiA9IHRoaXMuc2VsZWN0aW9uTW9kZSQucGlwZShzd2l0Y2hNYXAoKG1vZGUpID0+IHRoaXMuZGF0ZVJhbmdlU2VsZWN0aW9uRm9yTW9kZShtb2RlKSkpO1xuXG4gIHJlYWRvbmx5IGNhbGVuZGFyU2VsZWN0aW9uJDogT2JzZXJ2YWJsZTxEYXRlUGlja2VyRGF0ZVJhbmdlPERhdGU+IHwgbnVsbD4gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4ID8gbmV3IERhdGVQaWNrZXJEYXRlUmFuZ2U8RGF0ZT4oeC5zdGFydCwgeC5lbmQpIDogbnVsbCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZW5kRGlzYWJsZWQkID0gdGhpcy5zZWxlY3Rpb25Nb2RlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geCA9PT0gJ3NpbmdsZScpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFJhbmdlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2w8TWF5YmU8RGF0ZT4+KG51bGwpLFxuICAgIGVuZDogbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsKVxuICB9KTtcblxuICBnZXQgZml4ZWREYXRlUmFuZ2VGaWVsZCgpOiBEYnhGaXhlZERhdGVSYW5nZUZpZWxkUHJvcHMge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2VsZWN0aW9uTW9kZTtcbiAgfVxuXG4gIGdldCB2YWx1ZU1vZGUoKTogRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnZhbHVlTW9kZSA/PyBEYnhEYXRlVGltZVZhbHVlTW9kZS5EQVRFO1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IE1heWJlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0IHRpbWV6b25lKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnRpbWV6b25lO1xuICB9XG5cbiAgZ2V0IHNob3dUaW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5zaG93VGltZXpvbmUgPz8gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwcmVzZXRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnByZXNldHM7XG4gIH1cblxuICBnZXQgc2hvd1JhbmdlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1JhbmdlSW5wdXQgPz8gdHJ1ZTtcbiAgfVxuXG4gIHJlYWRvbmx5IG1pbk1heFJhbmdlJCA9IHRoaXMubGltaXREYXRlVGltZUluc3RhbmNlJC5waXBlKFxuICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRpbWVyKE1TX0lOX01JTlVURSkpLCAvLyByZWZyZXNoIGV2ZXJ5IG1pbnV0ZVxuICAgIG1hcCgoW3hdKSA9PiB4LmRhdGVSYW5nZSgpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbWluJCA9IHRoaXMubWluTWF4UmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5zdGFydCA/PyBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbWF4JCA9IHRoaXMubWluTWF4UmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5lbmQgPz8gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHBpY2tlckZpbHRlciQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4+ID0gdGhpcy5jb25maWckLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGRhdGVUaW1lTWludXRlV2hvbGVEYXlEZWNpc2lvbkZ1bmN0aW9uKHgsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuICh4OiBEYXRlIHwgbnVsbCkgPT4gKHggIT0gbnVsbCA/IGZpbHRlcih4KSA6IHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkZWZhdWx0UGlja2VyRmlsdGVyOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGUgfCBudWxsPiA9ICgpID0+IHRydWU7XG5cbiAgcmVhZG9ubHkgbWluRGF0ZVNpZ25hbCA9IHRvU2lnbmFsKHRoaXMubWluJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IG1heERhdGVTaWduYWwgPSB0b1NpZ25hbCh0aGlzLm1heCQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBlbmREaXNhYmxlZFNpZ25hbCA9IHRvU2lnbmFsKHRoaXMuZW5kRGlzYWJsZWQkKTtcbiAgcmVhZG9ubHkgbGF0ZXN0Qm91bmRhcnlTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmxhdGVzdEJvdW5kYXJ5JCk7XG4gIHJlYWRvbmx5IGNhbGVuZGFyU2VsZWN0aW9uU2lnbmFsID0gdG9TaWduYWwodGhpcy5jYWxlbmRhclNlbGVjdGlvbiQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBwaWNrZXJGaWx0ZXJTaWduYWwgPSB0b1NpZ25hbCh0aGlzLnBpY2tlckZpbHRlciQsIHsgaW5pdGlhbFZhbHVlOiB0aGlzLmRlZmF1bHRQaWNrZXJGaWx0ZXIgfSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMubmV4dCh0aGlzLmZvcm1Db250cm9sKTtcblxuICAgIGNvbnN0IGRhdGVSYW5nZVNlbGVjdGlvbiA9IHRoaXMuZGF0ZVJhbmdlU2VsZWN0aW9uJC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgIGNvbnN0IHNldElucHV0Rm9ybVZhbHVlID0gKHZhbHVlOiBNYXliZTxEYXRlUmFuZ2U+KSA9PiB7XG4gICAgICBpZiAoIWlzU2FtZURhdGVEYXlSYW5nZSh2YWx1ZSwgdGhpcy5pbnB1dFJhbmdlRm9ybS52YWx1ZSBhcyBQYXJ0aWFsPERhdGVSYW5nZT4pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRSYW5nZUZvcm0uc2V0VmFsdWUoe1xuICAgICAgICAgIHN0YXJ0OiB2YWx1ZT8uc3RhcnQgPz8gbnVsbCxcbiAgICAgICAgICBlbmQ6IHZhbHVlPy5lbmQgPz8gbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fc3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMudGltZXpvbmVJbnN0YW5jZSQucGlwZShtYXAoKHRpbWV6b25lSW5zdGFuY2UpID0+IGRieEZpeGVkRGF0ZVJhbmdlT3V0cHV0VmFsdWVGYWN0b3J5KHRoaXMudmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlKSkpKSxcbiAgICAgICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiBmYWxzZSwgdHJhaWxpbmc6IHRydWUgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2N1cnJlbnRWYWx1ZSwgdmFsdWVGYWN0b3J5XSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRlUmFuZ2VTZWxlY3Rpb24ucGlwZShcbiAgICAgICAgICAgIHNraXBGaXJzdE1heWJlKCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlUmFuZ2U+Pihpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgICAgICAgICAgbWFwKCh4KSA9PiBbeCwgY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldIGFzIFt0eXBlb2YgeCwgdHlwZW9mIGN1cnJlbnRWYWx1ZSwgdHlwZW9mIHZhbHVlRmFjdG9yeV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFtyYXdWYWx1ZSwgY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWUgPyB2YWx1ZUZhY3RvcnkocmF3VmFsdWUpIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXNTYW1lUmFuZ2UgPSBkYnhEYXRlUmFuZ2VJc1NhbWVEYXRlUmFuZ2VGaWVsZFZhbHVlKHZhbHVlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgIGlmICghaXNTYW1lUmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmF3VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgdGV4dCBhZ2FpblxuICAgICAgICAgIHNldElucHV0Rm9ybVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnNlbGVjdGlvbk1vZGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnN1YnNjcmliZSgoeCkgPT4gdGhpcy5jdXJyZW50U2VsZWN0aW9uTW9kZVNpZ25hbC5zZXQoeCkpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0ZVJhbmdlSW5wdXQkLnN1YnNjcmliZSgoeCkgPT4gdGhpcy5jdXJyZW50RGF0ZVJhbmdlSW5wdXRTaWduYWwuc2V0KHgpKTtcblxuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5zdWJzY3JpYmUoKHg6IE1heWJlPERhdGVSYW5nZT4pID0+IHtcbiAgICAgIHNldElucHV0Rm9ybVZhbHVlKHgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2hvd1JhbmdlSW5wdXQpIHtcbiAgICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRocm90dGxlVGltZSgxMDApLCAvLyB0aHJvdHRsZSB0byBwcmV2ZW50IHRoZSB2YWx1ZSBmcm9tIGNoYW5naW5nIHRvbyBmYXN0XG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0UmFuZ2VGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFN0cmluZyA9IHRoaXMuc3RhcnREYXRlSW5wdXRFbGVtZW50KCk/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCB2YWxpZCA9IGlzTW9udGhEYXlTbGFzaERhdGUoc3RhcnRTdHJpbmcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkICYmIHRoaXMuY3VycmVudFNlbGVjdGlvbk1vZGVTaWduYWwoKSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFN0cmluZyA9IHRoaXMuZW5kRGF0ZUlucHV0RWxlbWVudCgpPy5uYXRpdmVFbGVtZW50Py52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHZhbGlkID0gaXNNb250aERheVNsYXNoRGF0ZShlbmRTdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZDsgLy8gbXVzdCBiZSBhIHZhbGlkIHRleHQgaW5wdXRcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG1hcCgoeCkgPT4geCBhcyBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlUmFuZ2UpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoeDogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PikgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb25Nb2RlID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uTW9kZVNpZ25hbCgpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2UoeD8uc3RhcnQgPyB7IHN0YXJ0OiB4LnN0YXJ0IH0gOiBudWxsLCAnaW5wdXQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJhbmdlVG9TZXQ6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4gPSB4O1xuXG4gICAgICAgICAgICBjb25zdCBsYXRlc3RCb3VuZGFyeSA9IHRoaXMubGF0ZXN0Qm91bmRhcnlTaWduYWwoKTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnYXJiaXRyYXJ5X3F1aWNrJyAmJiBsYXRlc3RCb3VuZGFyeSAmJiB4Py5zdGFydCAmJiB4Py5lbmQpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc0RhdGVJbkRhdGVSYW5nZSh4LnN0YXJ0LCBsYXRlc3RCb3VuZGFyeSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZW5kIGRhdGUgaXQgb3V0c2lkZSBvZiB0aGUgY3VycmVudCByYW5nZSAoaS5lLiBhIHJhbmdlIHdhcyB0eXBlZCBpbiBvbmx5IHRvIHRoZSBzdGFydCBkYXRlKSB0aGVuIHNldCB0aGUgZW5kIHRvIHRoZSBib3VuZGFyeSBlbmRcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZGFyeSA9IGRhdGVSYW5nZSh7IC4uLnRoaXMuY3VycmVudERhdGVSYW5nZUlucHV0U2lnbmFsKCksIGRhdGU6IHguc3RhcnQgfSBhcyBEYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgICAgICAgICAgcmFuZ2VUb1NldCA9IHsgc3RhcnQ6IHguc3RhcnQsIGVuZDogYm91bmRhcnkuZW5kIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2UocmFuZ2VUb1NldCwgJ2lucHV0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlUmFuZ2VJbnB1dC5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy5maXhlZERhdGVSYW5nZUZpZWxkLmRhdGVSYW5nZUlucHV0KSk7XG5cbiAgICB0aGlzLl9kaXNhYmxlRW5kU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMuZW5kRGlzYWJsZWQkLnN1YnNjcmliZSgoZGlzYWJsZWQpID0+IHtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuaW5wdXRSYW5nZUZvcm0uZ2V0KCdlbmQnKTtcblxuICAgICAgaWYgKGVuZCkge1xuICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICBlbmQuZGlzYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5wdXRQaWNrZXJDb25maWcgPSB0aGlzLmZpeGVkRGF0ZVJhbmdlRmllbGQucGlja2VyQ29uZmlnO1xuICAgIHRoaXMuX2NvbmZpZy5uZXh0KGlucHV0UGlja2VyQ29uZmlnID8gYXNPYnNlcnZhYmxlRnJvbUdldHRlcihpbnB1dFBpY2tlckNvbmZpZykgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdGltZXpvbmUgaWYgcHJvdmlkZWQuXG4gICAgaWYgKHRoaXMudGltZXpvbmUgJiYgIXRoaXMuZml4ZWREYXRlUmFuZ2VGaWVsZC5mdWxsRGF5SW5VVEMpIHtcbiAgICAgIHRoaXMuX3RpbWV6b25lLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnRpbWV6b25lKSk7XG4gICAgfVxuXG4gICAgLy8gV2F0Y2ggZm9yIGRpc2FibGVkIGNoYW5nZXMgc28gd2UgY2FuIHByb3BvZ2F0ZSB0aGVtIHByb3Blcmx5LlxuICAgIHRoaXMuZm9ybUNvbnRyb2wucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKChkaXNhYmxlZCkgPT4ge1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuaW5wdXRSYW5nZUZvcm0uZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnB1dFJhbmdlRm9ybS5lbmFibGUoKTtcblxuICAgICAgICB0aGlzLmVuZERpc2FibGVkJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoZGlzYWJsZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLmlucHV0UmFuZ2VGb3JtLmdldCgnZW5kJyk7XG5cbiAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgZW5kLmRpc2FibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVuZC5lbmFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJlc2V0cyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnByZXNldHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcHJlc2V0cy5uZXh0KHRoaXMuZGJ4RGF0ZVRpbWVGaWVsZE1lbnVQcmVzZXRzU2VydmljZS5jb25maWd1cmF0aW9ucyQpO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZURhdGVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5jYWxlbmRhckZvY3VzRGF0ZSQuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICB0aGlzLmNhbGVuZGFyKCkuYWN0aXZlRGF0ZSA9IHg7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5faW5wdXRSYW5nZUZvcm1TdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF0ZXN0Qm91bmRhcnlTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rpc2FibGVFbmRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2FjdGl2ZURhdGVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9kYXRlUmFuZ2VJbnB1dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3RpbWV6b25lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbkV2ZW50LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdGVkQ2hhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlUmFuZ2UoZGF0ZSA/IHsgc3RhcnQ6IGRhdGUgfSA6IG51bGwsICdjYWxlbmRhcicpO1xuICB9XG5cbiAgc2V0RGF0ZVJhbmdlKHJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+LCB0eXBlOiBTZWxlY3RlZERhdGVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25FdmVudC5uZXh0KHsgdHlwZSwgcmFuZ2UgfSk7XG4gIH1cblxuICBfY3JlYXRlRGF0ZVJhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gICAgcmV0dXJuIGRhdGUgPyBkYXRlUmFuZ2UoeyAuLi50aGlzLmN1cnJlbnREYXRlUmFuZ2VJbnB1dFNpZ25hbCgpLCBkYXRlIH0gYXMgRGF0ZVJhbmdlSW5wdXQpIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYnhGaXhlZERhdGVSYW5nZUZpZWxkU2VsZWN0aW9uU3RyYXRlZ3k8RD4gaW1wbGVtZW50cyBNYXREYXRlUmFuZ2VTZWxlY3Rpb25TdHJhdGVneTxEPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGVBZGFwdGVyID0gaW5qZWN0KERhdGVBZGFwdGVyPEQ+KTtcbiAgcmVhZG9ubHkgZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudCA9IGluamVjdChEYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50KTtcblxuICBzZWxlY3Rpb25GaW5pc2hlZChkYXRlOiBEIHwgbnVsbCwgY3VycmVudFJhbmdlOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+LCBldmVudDogRXZlbnQpOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+IHtcbiAgICAvLyB1bnVzZWRcbiAgICByZXR1cm4gY3VycmVudFJhbmdlO1xuICB9XG5cbiAgY3JlYXRlUHJldmlldyhhY3RpdmVEYXRlOiBEIHwgbnVsbCwgY3VycmVudFJhbmdlOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+LCBldmVudDogRXZlbnQpOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+IHtcbiAgICBjb25zdCB7IGN1cnJlbnRTZWxlY3Rpb25Nb2RlU2lnbmFsLCBsYXRlc3RCb3VuZGFyeVNpZ25hbCB9ID0gdGhpcy5kYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50O1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb25Nb2RlID0gY3VycmVudFNlbGVjdGlvbk1vZGVTaWduYWwoKTtcblxuICAgIGlmIChhY3RpdmVEYXRlICE9IG51bGwgJiYgY3VycmVudFNlbGVjdGlvbk1vZGUgIT09ICdzaW5nbGUnKSB7XG4gICAgICBjb25zdCBsYXRlc3RCb3VuZGFyeSA9IGxhdGVzdEJvdW5kYXJ5U2lnbmFsKCk7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGFjdGl2ZURhdGUpO1xuXG4gICAgICBpZiAobGF0ZXN0Qm91bmRhcnkgJiYgKGN1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnbm9ybWFsJyB8fCBpc0RhdGVJbkRhdGVSYW5nZShkYXRlLCBsYXRlc3RCb3VuZGFyeSkpKSB7XG4gICAgICAgIGNvbnN0IGV4YW1wbGVEYXRlUmFuZ2UgPSB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UobGF0ZXN0Qm91bmRhcnkpO1xuICAgICAgICByZXR1cm4gZXhhbXBsZURhdGVSYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVJhbmdlV2l0aERhdGUoYWN0aXZlRGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEYXRlUmFuZ2VXaXRoRGF0ZShpbnB1dDogRCB8IG51bGwpOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+IHtcbiAgICBsZXQgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+O1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGlucHV0KTtcbiAgICAgIGRhdGVSYW5nZSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudC5fY3JlYXRlRGF0ZVJhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UoZGF0ZVJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVSYW5nZShpbnB1dDogTWF5YmU8RGF0ZVJhbmdlPik6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGlmIChpbnB1dCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5zdGFydCksIHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5lbmQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KG51bGwsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGRhdGVGcm9tQWRhcHRlckRhdGUoaW5wdXQ6IEQpIHtcbiAgICBjb25zdCBkYXk6IERheU9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGlucHV0KTtcbiAgICBjb25zdCBtb250aEluZGV4OiBEYXRlTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChpbnB1dCk7XG4gICAgY29uc3QgeWVhcjogWWVhck51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoaW5wdXQpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG5cbiAgYWRhcHRlckRhdGVGcm9tRGF0ZShkYXRlOiBEYXRlKTogRCB7XG4gICAgY29uc3QgZGF5OiBEYXlPZk1vbnRoID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleDogRGF0ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXI6IFllYXJOdW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkXCI+XG4gIDxtYXQtY2FsZW5kYXIgI2NhbGVuZGFyVmlldyBbc2VsZWN0ZWRdPVwiY2FsZW5kYXJTZWxlY3Rpb25TaWduYWwoKVwiIFtkYXRlRmlsdGVyXT1cInBpY2tlckZpbHRlclNpZ25hbCgpXCIgW21pbkRhdGVdPVwibWluRGF0ZVNpZ25hbCgpXCIgW21heERhdGVdPVwibWF4RGF0ZVNpZ25hbCgpXCIgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdGVkQ2hhbmdlKCRldmVudClcIj48L21hdC1jYWxlbmRhcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0XCIgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICBAaWYgKHNob3dSYW5nZUlucHV0KSB7XG4gICAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXQgW2Zvcm1Hcm91cF09XCJpbnB1dFJhbmdlRm9ybVwiPlxuICAgICAgICA8aW5wdXQgI3N0YXJ0RGF0ZUlucHV0IG1hdFN0YXJ0RGF0ZSBmb3JtQ29udHJvbE5hbWU9XCJzdGFydFwiIHBsYWNlaG9sZGVyPVwiU3RhcnQgZGF0ZVwiIC8+XG4gICAgICAgIDxpbnB1dCAjZW5kRGF0ZUlucHV0IFtuZ0NsYXNzXT1cImVuZERpc2FibGVkU2lnbmFsKCkgPyAnZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0LWVuZCcgOiAnJ1wiIFthdHRyLnRhYmluZGV4XT1cImVuZERpc2FibGVkU2lnbmFsKCkgPyAtMSA6IDBcIiBtYXRFbmREYXRlIGZvcm1Db250cm9sTmFtZT1cImVuZFwiIHBsYWNlaG9sZGVyPVwiRW5kIGRhdGVcIiAvPlxuICAgICAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICB9XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICA8bWF0LWVycm9yPkRhdGUgcmFuZ2UgaXMgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbiAgfVxuPC9kaXY+XG4iXX0=