cmat 0.0.3

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 (680) hide show
  1. package/README.md +3 -0
  2. package/animations/defaults.d.ts +11 -0
  3. package/animations/drop.d.ts +2 -0
  4. package/animations/expand-collapse.d.ts +2 -0
  5. package/animations/fade.d.ts +11 -0
  6. package/animations/index.d.ts +5 -0
  7. package/animations/public-api.d.ts +1 -0
  8. package/animations/shake.d.ts +2 -0
  9. package/animations/slide.d.ts +9 -0
  10. package/animations/transform.d.ts +2 -0
  11. package/animations/zoom.d.ts +3 -0
  12. package/components/adapter/datetime-adapter.d.ts +45 -0
  13. package/components/adapter/datetime-formats.d.ts +22 -0
  14. package/components/adapter/dayjs-date-adapter.d.ts +63 -0
  15. package/components/adapter/dayjs-date-formats.d.ts +2 -0
  16. package/components/adapter/dayjs-datetime-adapter.d.ts +22 -0
  17. package/components/adapter/dayjs-datetime-formats.d.ts +2 -0
  18. package/components/adapter/index.d.ts +5 -0
  19. package/components/adapter/native-datetime-adapter.d.ts +31 -0
  20. package/components/adapter/native-datetime-formats.d.ts +2 -0
  21. package/components/adapter/public-api.d.ts +8 -0
  22. package/components/breadcrumb/breadcrumb-item.directive.d.ts +10 -0
  23. package/components/breadcrumb/breadcrumb.component.d.ts +57 -0
  24. package/components/breadcrumb/breadcrumb.component.scss +18 -0
  25. package/components/breadcrumb/breadcrumb.service.d.ts +126 -0
  26. package/components/breadcrumb/index.d.ts +5 -0
  27. package/components/breadcrumb/public-api.d.ts +3 -0
  28. package/components/breadcrumb/types/breadcrumb.config.d.ts +33 -0
  29. package/components/breadcrumb/types/breadcrumb.d.ts +23 -0
  30. package/components/card/card.component.d.ts +20 -0
  31. package/components/card/card.component.scss +63 -0
  32. package/components/card/card.types.d.ts +1 -0
  33. package/components/card/index.d.ts +5 -0
  34. package/components/card/public-api.d.ts +1 -0
  35. package/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.d.ts +14 -0
  36. package/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.scss +43 -0
  37. package/components/cascade/cascade-list/cascade-list.component.d.ts +52 -0
  38. package/components/cascade/cascade-list/cascade-list.component.scss +22 -0
  39. package/components/cascade/cascade-menu/cascade-menu.component.d.ts +10 -0
  40. package/components/cascade/cascade-menu/cascade-menu.component.scss +48 -0
  41. package/components/cascade/index.d.ts +5 -0
  42. package/components/cascade/options.interface.d.ts +8 -0
  43. package/components/cascade/public-api.d.ts +2 -0
  44. package/components/date-range/date-range.component.d.ts +134 -0
  45. package/components/date-range/date-range.component.scss +232 -0
  46. package/components/date-range/index.d.ts +5 -0
  47. package/components/date-range/public-api.d.ts +1 -0
  48. package/components/drawer/drawer.component.d.ts +75 -0
  49. package/components/drawer/drawer.component.scss +133 -0
  50. package/components/drawer/drawer.service.d.ts +26 -0
  51. package/components/drawer/drawer.types.d.ts +2 -0
  52. package/components/drawer/index.d.ts +5 -0
  53. package/components/drawer/public-api.d.ts +3 -0
  54. package/components/fullscreen/fullscreen.component.d.ts +18 -0
  55. package/components/fullscreen/fullscreen.types.d.ts +13 -0
  56. package/components/fullscreen/index.d.ts +5 -0
  57. package/components/fullscreen/public-api.d.ts +2 -0
  58. package/components/highlight/highlight.component.d.ts +21 -0
  59. package/components/highlight/highlight.component.scss +3 -0
  60. package/components/highlight/highlight.service.d.ts +7 -0
  61. package/components/highlight/index.d.ts +5 -0
  62. package/components/highlight/public-api.d.ts +2 -0
  63. package/components/masonry/index.d.ts +5 -0
  64. package/components/masonry/masonry.component.d.ts +13 -0
  65. package/components/masonry/public-api.d.ts +1 -0
  66. package/components/material-color-picker/base-color.d.ts +1 -0
  67. package/components/material-color-picker/index.d.ts +5 -0
  68. package/components/material-color-picker/material-color-picker.component.d.ts +35 -0
  69. package/components/material-color-picker/material-color-picker.component.scss +5 -0
  70. package/components/material-color-picker/public-api.d.ts +2 -0
  71. package/components/material-color-picker/selected-color.d.ts +5 -0
  72. package/components/material-datetimepicker/calendar-body.d.ts +43 -0
  73. package/components/material-datetimepicker/calendar-body.scss +58 -0
  74. package/components/material-datetimepicker/calendar.d.ts +146 -0
  75. package/components/material-datetimepicker/calendar.scss +194 -0
  76. package/components/material-datetimepicker/clock.d.ts +74 -0
  77. package/components/material-datetimepicker/clock.scss +90 -0
  78. package/components/material-datetimepicker/datetimepicker-animations.d.ts +4 -0
  79. package/components/material-datetimepicker/datetimepicker-content.scss +151 -0
  80. package/components/material-datetimepicker/datetimepicker-errors.d.ts +1 -0
  81. package/components/material-datetimepicker/datetimepicker-filtertype.d.ts +5 -0
  82. package/components/material-datetimepicker/datetimepicker-input.d.ts +106 -0
  83. package/components/material-datetimepicker/datetimepicker-intl.d.ts +51 -0
  84. package/components/material-datetimepicker/datetimepicker-toggle.d.ts +40 -0
  85. package/components/material-datetimepicker/datetimepicker-types.d.ts +13 -0
  86. package/components/material-datetimepicker/datetimepicker.d.ts +195 -0
  87. package/components/material-datetimepicker/datetimepicker.scss +145 -0
  88. package/components/material-datetimepicker/index.d.ts +5 -0
  89. package/components/material-datetimepicker/month-view.d.ts +64 -0
  90. package/components/material-datetimepicker/multi-year-view.d.ts +74 -0
  91. package/components/material-datetimepicker/public-api.d.ts +9 -0
  92. package/components/material-datetimepicker/time.d.ts +129 -0
  93. package/components/material-datetimepicker/time.scss +82 -0
  94. package/components/material-datetimepicker/year-view.d.ts +56 -0
  95. package/components/navigation/horizontal/components/basic/basic.component.d.ts +27 -0
  96. package/components/navigation/horizontal/components/branch/branch.component.d.ts +39 -0
  97. package/components/navigation/horizontal/components/divider/divider.component.d.ts +23 -0
  98. package/components/navigation/horizontal/components/spacer/spacer.component.d.ts +23 -0
  99. package/components/navigation/horizontal/horizontal.component.d.ts +43 -0
  100. package/components/navigation/horizontal/horizontal.component.scss +167 -0
  101. package/components/navigation/index.d.ts +5 -0
  102. package/components/navigation/navigation.service.d.ts +71 -0
  103. package/components/navigation/navigation.types.d.ts +34 -0
  104. package/components/navigation/public-api.d.ts +4 -0
  105. package/components/navigation/vertical/components/aside/aside.component.d.ts +63 -0
  106. package/components/navigation/vertical/components/basic/basic.component.d.ts +30 -0
  107. package/components/navigation/vertical/components/collapsable/collapsable.component.d.ts +74 -0
  108. package/components/navigation/vertical/components/divider/divider.component.d.ts +26 -0
  109. package/components/navigation/vertical/components/group/group.component.d.ts +36 -0
  110. package/components/navigation/vertical/components/spacer/spacer.component.d.ts +26 -0
  111. package/components/navigation/vertical/styles/appearances/compact.scss +103 -0
  112. package/components/navigation/vertical/styles/appearances/default.scss +550 -0
  113. package/components/navigation/vertical/styles/appearances/dense.scss +171 -0
  114. package/components/navigation/vertical/styles/appearances/thin.scss +91 -0
  115. package/components/navigation/vertical/vertical.component.d.ts +176 -0
  116. package/components/navigation/vertical/vertical.component.scss +4 -0
  117. package/components/pagination/index.d.ts +5 -0
  118. package/components/pagination/pagination.component.d.ts +24 -0
  119. package/components/pagination/pagination.directive.d.ts +40 -0
  120. package/components/pagination/pagination.instance.d.ts +11 -0
  121. package/components/pagination/pagination.pipe.d.ts +29 -0
  122. package/components/pagination/pagination.service.d.ts +20 -0
  123. package/components/pagination/public-api.d.ts +4 -0
  124. package/components/password-strength/animations/index.d.ts +4 -0
  125. package/components/password-strength/enum.d.ts +13 -0
  126. package/components/password-strength/index.d.ts +5 -0
  127. package/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.d.ts +11 -0
  128. package/components/password-strength/mat-password-strength/mat-password-strength.component.d.ts +52 -0
  129. package/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.d.ts +16 -0
  130. package/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.scss +19 -0
  131. package/components/password-strength/mat-password-strength-validator.d.ts +6 -0
  132. package/components/password-strength/public-api.d.ts +3 -0
  133. package/components/password-strength/regexp.class.d.ts +6 -0
  134. package/components/popover/index.d.ts +5 -0
  135. package/components/popover/popover.component.d.ts +139 -0
  136. package/components/popover/popover.component.scss +174 -0
  137. package/components/popover/popover.errors.d.ts +14 -0
  138. package/components/popover/popover.interfaces.d.ts +44 -0
  139. package/components/popover/popover.type.d.ts +5 -0
  140. package/components/popover/public-api.d.ts +1 -0
  141. package/components/progress-bar/index.d.ts +5 -0
  142. package/components/progress-bar/progress-bar.component.d.ts +17 -0
  143. package/components/progress-bar/progress-bar.component.scss +7 -0
  144. package/components/progress-bar/public-api.d.ts +1 -0
  145. package/components/rating/index.d.ts +5 -0
  146. package/components/rating/public-api.d.ts +1 -0
  147. package/components/rating/rating.component.d.ts +28 -0
  148. package/components/rating/rating.component.scss +33 -0
  149. package/components/select-search/default-options.d.ts +8 -0
  150. package/components/select-search/index.d.ts +5 -0
  151. package/components/select-search/public-api.d.ts +2 -0
  152. package/components/select-search/select-no-entries-found.directive.d.ts +5 -0
  153. package/components/select-search/select-search-clear.directive.d.ts +5 -0
  154. package/components/select-search/select-search.component.d.ts +91 -0
  155. package/components/select-search/select-search.component.scss +126 -0
  156. package/components/select-tree/index.d.ts +5 -0
  157. package/components/select-tree/public-api.d.ts +1 -0
  158. package/components/select-tree/select-tree.component.d.ts +85 -0
  159. package/components/select-tree/select-tree.component.scss +54 -0
  160. package/components/select-tree/select-tree.flatnode.d.ts +6 -0
  161. package/components/select-tree/select-tree.node.d.ts +5 -0
  162. package/components/timeline/index.d.ts +5 -0
  163. package/components/timeline/public-api.d.ts +2 -0
  164. package/components/timeline/timeline-item/timeline-item.component.d.ts +25 -0
  165. package/components/timeline/timeline-item/timeline-item.component.scss +329 -0
  166. package/components/timeline/timeline.component.d.ts +32 -0
  167. package/components/timeline/timeline.component.scss +42 -0
  168. package/components/toast/index.d.ts +5 -0
  169. package/components/toast/models/global-config.model.d.ts +12 -0
  170. package/components/toast/models/toast.model.d.ts +6 -0
  171. package/components/toast/models/type.model.d.ts +12 -0
  172. package/components/toast/public-api.d.ts +2 -0
  173. package/components/toast/toast-modal.component.d.ts +18 -0
  174. package/components/toast/toast-modal.component.scss +119 -0
  175. package/components/toast/toast.component.d.ts +17 -0
  176. package/components/toast/toast.component.scss +62 -0
  177. package/components/toast/toast.service.d.ts +26 -0
  178. package/components/transfer-picker/filter/filter.component.d.ts +24 -0
  179. package/components/transfer-picker/filter/filter.component.scss +40 -0
  180. package/components/transfer-picker/index.d.ts +5 -0
  181. package/components/transfer-picker/interface.d.ts +42 -0
  182. package/components/transfer-picker/public-api.d.ts +7 -0
  183. package/components/transfer-picker/search/search.component.d.ts +14 -0
  184. package/components/transfer-picker/search/search.component.scss +7 -0
  185. package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.d.ts +49 -0
  186. package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.scss +25 -0
  187. package/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.d.ts +12 -0
  188. package/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.scss +27 -0
  189. package/components/transfer-picker/transfer-picker.component.d.ts +28 -0
  190. package/components/transfer-picker/transfer-picker.component.scss +8 -0
  191. package/components/transfer-picker/transfer-picker.service.d.ts +31 -0
  192. package/directives/animate-on-scroll/animate-on-scroll.directive.d.ts +29 -0
  193. package/directives/animate-on-scroll/index.d.ts +5 -0
  194. package/directives/animate-on-scroll/public-api.d.ts +1 -0
  195. package/directives/animate-on-scroll/scroll.service.d.ts +15 -0
  196. package/directives/autofocus/autofocus.directive.d.ts +10 -0
  197. package/directives/autofocus/index.d.ts +5 -0
  198. package/directives/autofocus/public-api.d.ts +1 -0
  199. package/directives/debounce/abstract-debounce.directive.d.ts +15 -0
  200. package/directives/debounce/debounce-click.directive.d.ts +8 -0
  201. package/directives/debounce/debounce-keyup.directive.d.ts +8 -0
  202. package/directives/debounce/index.d.ts +5 -0
  203. package/directives/debounce/public-api.d.ts +2 -0
  204. package/directives/digit-only/digit-only.directive.d.ts +34 -0
  205. package/directives/digit-only/index.d.ts +5 -0
  206. package/directives/digit-only/mask.directive.d.ts +14 -0
  207. package/directives/digit-only/public-api.d.ts +2 -0
  208. package/directives/equal-validator/equal-validator.directive.d.ts +14 -0
  209. package/directives/equal-validator/index.d.ts +5 -0
  210. package/directives/equal-validator/public-api.d.ts +1 -0
  211. package/esm2022/animations/cmat-animations.mjs +5 -0
  212. package/esm2022/animations/defaults.mjs +12 -0
  213. package/esm2022/animations/drop.mjs +26 -0
  214. package/esm2022/animations/expand-collapse.mjs +17 -0
  215. package/esm2022/animations/fade.mjs +170 -0
  216. package/esm2022/animations/public-api.mjs +19 -0
  217. package/esm2022/animations/shake.mjs +59 -0
  218. package/esm2022/animations/slide.mjs +124 -0
  219. package/esm2022/animations/transform.mjs +16 -0
  220. package/esm2022/animations/zoom.mjs +38 -0
  221. package/esm2022/cmat.mjs +5 -0
  222. package/esm2022/components/adapter/cmat-components-adapter.mjs +5 -0
  223. package/esm2022/components/adapter/datetime-adapter.mjs +127 -0
  224. package/esm2022/components/adapter/datetime-formats.mjs +3 -0
  225. package/esm2022/components/adapter/dayjs-date-adapter.mjs +198 -0
  226. package/esm2022/components/adapter/dayjs-date-formats.mjs +12 -0
  227. package/esm2022/components/adapter/dayjs-datetime-adapter.mjs +100 -0
  228. package/esm2022/components/adapter/dayjs-datetime-formats.mjs +21 -0
  229. package/esm2022/components/adapter/native-datetime-adapter.mjs +130 -0
  230. package/esm2022/components/adapter/native-datetime-formats.mjs +15 -0
  231. package/esm2022/components/adapter/public-api.mjs +9 -0
  232. package/esm2022/components/breadcrumb/breadcrumb-item.directive.mjs +19 -0
  233. package/esm2022/components/breadcrumb/breadcrumb.component.mjs +95 -0
  234. package/esm2022/components/breadcrumb/breadcrumb.service.mjs +336 -0
  235. package/esm2022/components/breadcrumb/cmat-components-breadcrumb.mjs +5 -0
  236. package/esm2022/components/breadcrumb/public-api.mjs +4 -0
  237. package/esm2022/components/breadcrumb/types/breadcrumb.config.mjs +2 -0
  238. package/esm2022/components/breadcrumb/types/breadcrumb.mjs +2 -0
  239. package/esm2022/components/card/card.component.mjs +58 -0
  240. package/esm2022/components/card/card.types.mjs +2 -0
  241. package/esm2022/components/card/cmat-components-card.mjs +5 -0
  242. package/esm2022/components/card/public-api.mjs +2 -0
  243. package/esm2022/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.mjs +53 -0
  244. package/esm2022/components/cascade/cascade-list/cascade-list.component.mjs +263 -0
  245. package/esm2022/components/cascade/cascade-menu/cascade-menu.component.mjs +29 -0
  246. package/esm2022/components/cascade/cmat-components-cascade.mjs +5 -0
  247. package/esm2022/components/cascade/options.interface.mjs +2 -0
  248. package/esm2022/components/cascade/public-api.mjs +3 -0
  249. package/esm2022/components/date-range/cmat-components-date-range.mjs +5 -0
  250. package/esm2022/components/date-range/date-range.component.mjs +540 -0
  251. package/esm2022/components/date-range/public-api.mjs +2 -0
  252. package/esm2022/components/drawer/cmat-components-drawer.mjs +5 -0
  253. package/esm2022/components/drawer/drawer.component.mjs +301 -0
  254. package/esm2022/components/drawer/drawer.service.mjs +41 -0
  255. package/esm2022/components/drawer/drawer.types.mjs +2 -0
  256. package/esm2022/components/drawer/public-api.mjs +4 -0
  257. package/esm2022/components/fullscreen/cmat-components-fullscreen.mjs +5 -0
  258. package/esm2022/components/fullscreen/fullscreen.component.mjs +101 -0
  259. package/esm2022/components/fullscreen/fullscreen.types.mjs +2 -0
  260. package/esm2022/components/fullscreen/public-api.mjs +3 -0
  261. package/esm2022/components/highlight/cmat-components-highlight.mjs +5 -0
  262. package/esm2022/components/highlight/highlight.component.mjs +80 -0
  263. package/esm2022/components/highlight/highlight.service.mjs +47 -0
  264. package/esm2022/components/highlight/public-api.mjs +3 -0
  265. package/esm2022/components/masonry/cmat-components-masonry.mjs +5 -0
  266. package/esm2022/components/masonry/masonry.component.mjs +54 -0
  267. package/esm2022/components/masonry/public-api.mjs +2 -0
  268. package/esm2022/components/material-color-picker/base-color.mjs +13 -0
  269. package/esm2022/components/material-color-picker/cmat-components-material-color-picker.mjs +5 -0
  270. package/esm2022/components/material-color-picker/material-color-picker.component.mjs +138 -0
  271. package/esm2022/components/material-color-picker/public-api.mjs +3 -0
  272. package/esm2022/components/material-color-picker/selected-color.mjs +3 -0
  273. package/esm2022/components/material-datetimepicker/calendar-body.mjs +80 -0
  274. package/esm2022/components/material-datetimepicker/calendar.mjs +678 -0
  275. package/esm2022/components/material-datetimepicker/clock.mjs +293 -0
  276. package/esm2022/components/material-datetimepicker/cmat-components-material-datetimepicker.mjs +5 -0
  277. package/esm2022/components/material-datetimepicker/datetimepicker-animations.mjs +34 -0
  278. package/esm2022/components/material-datetimepicker/datetimepicker-errors.mjs +6 -0
  279. package/esm2022/components/material-datetimepicker/datetimepicker-filtertype.mjs +8 -0
  280. package/esm2022/components/material-datetimepicker/datetimepicker-input.mjs +340 -0
  281. package/esm2022/components/material-datetimepicker/datetimepicker-intl.mjs +63 -0
  282. package/esm2022/components/material-datetimepicker/datetimepicker-toggle.mjs +88 -0
  283. package/esm2022/components/material-datetimepicker/datetimepicker-types.mjs +2 -0
  284. package/esm2022/components/material-datetimepicker/datetimepicker.mjs +534 -0
  285. package/esm2022/components/material-datetimepicker/month-view.mjs +146 -0
  286. package/esm2022/components/material-datetimepicker/multi-year-view.mjs +198 -0
  287. package/esm2022/components/material-datetimepicker/public-api.mjs +10 -0
  288. package/esm2022/components/material-datetimepicker/time.mjs +456 -0
  289. package/esm2022/components/material-datetimepicker/year-view.mjs +125 -0
  290. package/esm2022/components/navigation/cmat-components-navigation.mjs +5 -0
  291. package/esm2022/components/navigation/horizontal/components/basic/basic.component.mjs +70 -0
  292. package/esm2022/components/navigation/horizontal/components/branch/branch.component.mjs +83 -0
  293. package/esm2022/components/navigation/horizontal/components/divider/divider.component.mjs +47 -0
  294. package/esm2022/components/navigation/horizontal/components/spacer/spacer.component.mjs +47 -0
  295. package/esm2022/components/navigation/horizontal/horizontal.component.mjs +88 -0
  296. package/esm2022/components/navigation/navigation.service.mjs +140 -0
  297. package/esm2022/components/navigation/navigation.types.mjs +3 -0
  298. package/esm2022/components/navigation/public-api.mjs +5 -0
  299. package/esm2022/components/navigation/vertical/components/aside/aside.component.mjs +162 -0
  300. package/esm2022/components/navigation/vertical/components/basic/basic.component.mjs +76 -0
  301. package/esm2022/components/navigation/vertical/components/collapsable/collapsable.component.mjs +279 -0
  302. package/esm2022/components/navigation/vertical/components/divider/divider.component.mjs +56 -0
  303. package/esm2022/components/navigation/vertical/components/group/group.component.mjs +79 -0
  304. package/esm2022/components/navigation/vertical/components/spacer/spacer.component.mjs +56 -0
  305. package/esm2022/components/navigation/vertical/vertical.component.mjs +586 -0
  306. package/esm2022/components/pagination/cmat-components-pagination.mjs +5 -0
  307. package/esm2022/components/pagination/pagination.component.mjs +71 -0
  308. package/esm2022/components/pagination/pagination.directive.mjs +197 -0
  309. package/esm2022/components/pagination/pagination.instance.mjs +2 -0
  310. package/esm2022/components/pagination/pagination.pipe.mjs +100 -0
  311. package/esm2022/components/pagination/pagination.service.mjs +90 -0
  312. package/esm2022/components/pagination/public-api.mjs +5 -0
  313. package/esm2022/components/password-strength/animations/index.mjs +48 -0
  314. package/esm2022/components/password-strength/cmat-components-password-strength.mjs +5 -0
  315. package/esm2022/components/password-strength/enum.mjs +17 -0
  316. package/esm2022/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.mjs +27 -0
  317. package/esm2022/components/password-strength/mat-password-strength/mat-password-strength.component.mjs +206 -0
  318. package/esm2022/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.mjs +151 -0
  319. package/esm2022/components/password-strength/mat-password-strength-validator.mjs +36 -0
  320. package/esm2022/components/password-strength/public-api.mjs +4 -0
  321. package/esm2022/components/password-strength/regexp.class.mjs +8 -0
  322. package/esm2022/components/popover/cmat-components-popover.mjs +5 -0
  323. package/esm2022/components/popover/popover.component.mjs +350 -0
  324. package/esm2022/components/popover/popover.errors.mjs +27 -0
  325. package/esm2022/components/popover/popover.interfaces.mjs +2 -0
  326. package/esm2022/components/popover/popover.type.mjs +2 -0
  327. package/esm2022/components/popover/public-api.mjs +2 -0
  328. package/esm2022/components/progress-bar/cmat-components-progress-bar.mjs +5 -0
  329. package/esm2022/components/progress-bar/progress-bar.component.mjs +55 -0
  330. package/esm2022/components/progress-bar/public-api.mjs +2 -0
  331. package/esm2022/components/rating/cmat-components-rating.mjs +5 -0
  332. package/esm2022/components/rating/public-api.mjs +2 -0
  333. package/esm2022/components/rating/rating.component.mjs +91 -0
  334. package/esm2022/components/select-search/cmat-components-select-search.mjs +5 -0
  335. package/esm2022/components/select-search/default-options.mjs +16 -0
  336. package/esm2022/components/select-search/public-api.mjs +3 -0
  337. package/esm2022/components/select-search/select-no-entries-found.directive.mjs +14 -0
  338. package/esm2022/components/select-search/select-search-clear.directive.mjs +14 -0
  339. package/esm2022/components/select-search/select-search.component.mjs +488 -0
  340. package/esm2022/components/select-tree/cmat-components-select-tree.mjs +5 -0
  341. package/esm2022/components/select-tree/public-api.mjs +2 -0
  342. package/esm2022/components/select-tree/select-tree.component.mjs +458 -0
  343. package/esm2022/components/select-tree/select-tree.flatnode.mjs +3 -0
  344. package/esm2022/components/select-tree/select-tree.node.mjs +3 -0
  345. package/esm2022/components/timeline/cmat-components-timeline.mjs +5 -0
  346. package/esm2022/components/timeline/public-api.mjs +3 -0
  347. package/esm2022/components/timeline/timeline-item/timeline-item.component.mjs +68 -0
  348. package/esm2022/components/timeline/timeline.component.mjs +114 -0
  349. package/esm2022/components/toast/cmat-components-toast.mjs +5 -0
  350. package/esm2022/components/toast/models/global-config.model.mjs +2 -0
  351. package/esm2022/components/toast/models/toast.model.mjs +2 -0
  352. package/esm2022/components/toast/models/type.model.mjs +2 -0
  353. package/esm2022/components/toast/public-api.mjs +3 -0
  354. package/esm2022/components/toast/toast-modal.component.mjs +53 -0
  355. package/esm2022/components/toast/toast.component.mjs +30 -0
  356. package/esm2022/components/toast/toast.service.mjs +122 -0
  357. package/esm2022/components/transfer-picker/cmat-components-transfer-picker.mjs +5 -0
  358. package/esm2022/components/transfer-picker/filter/filter.component.mjs +85 -0
  359. package/esm2022/components/transfer-picker/interface.mjs +17 -0
  360. package/esm2022/components/transfer-picker/public-api.mjs +8 -0
  361. package/esm2022/components/transfer-picker/search/search.component.mjs +34 -0
  362. package/esm2022/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.mjs +178 -0
  363. package/esm2022/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.mjs +34 -0
  364. package/esm2022/components/transfer-picker/transfer-picker.component.mjs +82 -0
  365. package/esm2022/components/transfer-picker/transfer-picker.service.mjs +134 -0
  366. package/esm2022/directives/animate-on-scroll/animate-on-scroll.directive.mjs +126 -0
  367. package/esm2022/directives/animate-on-scroll/cmat-directives-animate-on-scroll.mjs +5 -0
  368. package/esm2022/directives/animate-on-scroll/public-api.mjs +2 -0
  369. package/esm2022/directives/animate-on-scroll/scroll.service.mjs +38 -0
  370. package/esm2022/directives/autofocus/autofocus.directive.mjs +20 -0
  371. package/esm2022/directives/autofocus/cmat-directives-autofocus.mjs +5 -0
  372. package/esm2022/directives/autofocus/public-api.mjs +2 -0
  373. package/esm2022/directives/debounce/abstract-debounce.directive.mjs +34 -0
  374. package/esm2022/directives/debounce/cmat-directives-debounce.mjs +5 -0
  375. package/esm2022/directives/debounce/debounce-click.directive.mjs +25 -0
  376. package/esm2022/directives/debounce/debounce-keyup.directive.mjs +25 -0
  377. package/esm2022/directives/debounce/public-api.mjs +3 -0
  378. package/esm2022/directives/digit-only/cmat-directives-digit-only.mjs +5 -0
  379. package/esm2022/directives/digit-only/digit-only.directive.mjs +282 -0
  380. package/esm2022/directives/digit-only/mask.directive.mjs +69 -0
  381. package/esm2022/directives/digit-only/public-api.mjs +3 -0
  382. package/esm2022/directives/equal-validator/cmat-directives-equal-validator.mjs +5 -0
  383. package/esm2022/directives/equal-validator/equal-validator.directive.mjs +54 -0
  384. package/esm2022/directives/equal-validator/public-api.mjs +2 -0
  385. package/esm2022/lib/mock-api/cmat-lib-mock-api.mjs +5 -0
  386. package/esm2022/lib/mock-api/mock-api.constants.mjs +3 -0
  387. package/esm2022/lib/mock-api/mock-api.interceptor.mjs +73 -0
  388. package/esm2022/lib/mock-api/mock-api.request-handler.mjs +48 -0
  389. package/esm2022/lib/mock-api/mock-api.service.mjs +93 -0
  390. package/esm2022/lib/mock-api/mock-api.types.mjs +2 -0
  391. package/esm2022/lib/mock-api/mock-api.utils.mjs +17 -0
  392. package/esm2022/lib/mock-api/public-api.mjs +6 -0
  393. package/esm2022/pipes/bytes/bytes.pipe.mjs +25 -0
  394. package/esm2022/pipes/bytes/cmat-pipes-bytes.mjs +5 -0
  395. package/esm2022/pipes/bytes/public-api.mjs +2 -0
  396. package/esm2022/pipes/date-format/cmat-pipes-date-format.mjs +5 -0
  397. package/esm2022/pipes/date-format/date-format.pipe.mjs +18 -0
  398. package/esm2022/pipes/date-format/public-api.mjs +2 -0
  399. package/esm2022/pipes/find-by-key/cmat-pipes-find-by-key.mjs +5 -0
  400. package/esm2022/pipes/find-by-key/find-by-key.pipe.mjs +23 -0
  401. package/esm2022/pipes/find-by-key/public-api.mjs +2 -0
  402. package/esm2022/pipes/group-by/cmat-pipes-group-by.mjs +5 -0
  403. package/esm2022/pipes/group-by/group-by.pipe.mjs +29 -0
  404. package/esm2022/pipes/group-by/public-api.mjs +2 -0
  405. package/esm2022/pipes/keys/cmat-pipes-keys.mjs +5 -0
  406. package/esm2022/pipes/keys/keys.pipe.mjs +26 -0
  407. package/esm2022/pipes/keys/public-api.mjs +2 -0
  408. package/esm2022/pipes/secure/cmat-pipes-secure.mjs +5 -0
  409. package/esm2022/pipes/secure/public-api.mjs +2 -0
  410. package/esm2022/pipes/secure/secure-pipe.mjs +43 -0
  411. package/esm2022/pipes/uppercase/cmat-pipes-uppercase.mjs +5 -0
  412. package/esm2022/pipes/uppercase/public-api.mjs +2 -0
  413. package/esm2022/pipes/uppercase/uppercase.pipe.mjs +17 -0
  414. package/esm2022/public-api.mjs +2 -0
  415. package/esm2022/services/alert/alert.dialog.mjs +12 -0
  416. package/esm2022/services/alert/alert.message.mjs +9 -0
  417. package/esm2022/services/alert/alert.service.mjs +165 -0
  418. package/esm2022/services/alert/cmat-services-alert.mjs +5 -0
  419. package/esm2022/services/alert/enum.mjs +15 -0
  420. package/esm2022/services/alert/public-api.mjs +5 -0
  421. package/esm2022/services/config/cmat-services-config.mjs +5 -0
  422. package/esm2022/services/config/config.constants.mjs +3 -0
  423. package/esm2022/services/config/config.service.mjs +35 -0
  424. package/esm2022/services/config/public-api.mjs +4 -0
  425. package/esm2022/services/config/urlStateConfig.service.mjs +30 -0
  426. package/esm2022/services/confirmation/cmat-services-confirmation.mjs +5 -0
  427. package/esm2022/services/confirmation/confirmation.service.mjs +51 -0
  428. package/esm2022/services/confirmation/confirmation.types.mjs +2 -0
  429. package/esm2022/services/confirmation/dialog/dialog.component.mjs +25 -0
  430. package/esm2022/services/confirmation/public-api.mjs +3 -0
  431. package/esm2022/services/data/cmat-services-data.mjs +5 -0
  432. package/esm2022/services/data/data.service.mjs +169 -0
  433. package/esm2022/services/data/public-api.mjs +2 -0
  434. package/esm2022/services/loading/cmat-services-loading.mjs +5 -0
  435. package/esm2022/services/loading/loading.interceptor.mjs +29 -0
  436. package/esm2022/services/loading/loading.service.mjs +72 -0
  437. package/esm2022/services/loading/public-api.mjs +3 -0
  438. package/esm2022/services/local-storage/cmat-services-local-storage.mjs +5 -0
  439. package/esm2022/services/local-storage/local-storage.service.mjs +22 -0
  440. package/esm2022/services/local-storage/public-api.mjs +2 -0
  441. package/esm2022/services/media-watcher/cmat-services-media-watcher.mjs +5 -0
  442. package/esm2022/services/media-watcher/media-watcher.service.mjs +55 -0
  443. package/esm2022/services/media-watcher/public-api.mjs +2 -0
  444. package/esm2022/services/platform/cmat-services-platform.mjs +5 -0
  445. package/esm2022/services/platform/platform.service.mjs +46 -0
  446. package/esm2022/services/platform/public-api.mjs +2 -0
  447. package/esm2022/services/splash-screen/cmat-services-splash-screen.mjs +5 -0
  448. package/esm2022/services/splash-screen/public-api.mjs +2 -0
  449. package/esm2022/services/splash-screen/splash-screen.service.mjs +42 -0
  450. package/esm2022/services/title/cmat-services-title.mjs +5 -0
  451. package/esm2022/services/title/public-api.mjs +2 -0
  452. package/esm2022/services/title/title.service.mjs +46 -0
  453. package/esm2022/services/translation/cmat-services-translation.mjs +5 -0
  454. package/esm2022/services/translation/public-api.mjs +2 -0
  455. package/esm2022/services/translation/translation.service.mjs +62 -0
  456. package/esm2022/services/utils/cmat-services-utils.mjs +5 -0
  457. package/esm2022/services/utils/public-api.mjs +2 -0
  458. package/esm2022/services/utils/utils.service.mjs +391 -0
  459. package/esm2022/validators/cmat-validators.mjs +5 -0
  460. package/esm2022/validators/public-api.mjs +2 -0
  461. package/esm2022/validators/validators.mjs +33 -0
  462. package/esm2022/version/cmat-version.mjs +5 -0
  463. package/esm2022/version/public-api.mjs +2 -0
  464. package/esm2022/version/version.mjs +11 -0
  465. package/fesm2022/cmat-animations.mjs +466 -0
  466. package/fesm2022/cmat-animations.mjs.map +1 -0
  467. package/fesm2022/cmat-components-adapter.mjs +600 -0
  468. package/fesm2022/cmat-components-adapter.mjs.map +1 -0
  469. package/fesm2022/cmat-components-breadcrumb.mjs +449 -0
  470. package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -0
  471. package/fesm2022/cmat-components-card.mjs +65 -0
  472. package/fesm2022/cmat-components-card.mjs.map +1 -0
  473. package/fesm2022/cmat-components-cascade.mjs +334 -0
  474. package/fesm2022/cmat-components-cascade.mjs.map +1 -0
  475. package/fesm2022/cmat-components-date-range.mjs +547 -0
  476. package/fesm2022/cmat-components-date-range.mjs.map +1 -0
  477. package/fesm2022/cmat-components-drawer.mjs +346 -0
  478. package/fesm2022/cmat-components-drawer.mjs.map +1 -0
  479. package/fesm2022/cmat-components-fullscreen.mjs +108 -0
  480. package/fesm2022/cmat-components-fullscreen.mjs.map +1 -0
  481. package/fesm2022/cmat-components-highlight.mjs +131 -0
  482. package/fesm2022/cmat-components-highlight.mjs.map +1 -0
  483. package/fesm2022/cmat-components-masonry.mjs +61 -0
  484. package/fesm2022/cmat-components-masonry.mjs.map +1 -0
  485. package/fesm2022/cmat-components-material-color-picker.mjs +160 -0
  486. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -0
  487. package/fesm2022/cmat-components-material-datetimepicker.mjs +2976 -0
  488. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -0
  489. package/fesm2022/cmat-components-navigation.mjs +1656 -0
  490. package/fesm2022/cmat-components-navigation.mjs.map +1 -0
  491. package/fesm2022/cmat-components-pagination.mjs +455 -0
  492. package/fesm2022/cmat-components-pagination.mjs.map +1 -0
  493. package/fesm2022/cmat-components-password-strength.mjs +489 -0
  494. package/fesm2022/cmat-components-password-strength.mjs.map +1 -0
  495. package/fesm2022/cmat-components-popover.mjs +383 -0
  496. package/fesm2022/cmat-components-popover.mjs.map +1 -0
  497. package/fesm2022/cmat-components-progress-bar.mjs +62 -0
  498. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -0
  499. package/fesm2022/cmat-components-rating.mjs +98 -0
  500. package/fesm2022/cmat-components-rating.mjs.map +1 -0
  501. package/fesm2022/cmat-components-select-search.mjs +531 -0
  502. package/fesm2022/cmat-components-select-search.mjs.map +1 -0
  503. package/fesm2022/cmat-components-select-tree.mjs +467 -0
  504. package/fesm2022/cmat-components-select-tree.mjs.map +1 -0
  505. package/fesm2022/cmat-components-timeline.mjs +186 -0
  506. package/fesm2022/cmat-components-timeline.mjs.map +1 -0
  507. package/fesm2022/cmat-components-toast.mjs +205 -0
  508. package/fesm2022/cmat-components-toast.mjs.map +1 -0
  509. package/fesm2022/cmat-components-transfer-picker.mjs +536 -0
  510. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -0
  511. package/fesm2022/cmat-directives-animate-on-scroll.mjs +166 -0
  512. package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -0
  513. package/fesm2022/cmat-directives-autofocus.mjs +27 -0
  514. package/fesm2022/cmat-directives-autofocus.mjs.map +1 -0
  515. package/fesm2022/cmat-directives-debounce.mjs +85 -0
  516. package/fesm2022/cmat-directives-debounce.mjs.map +1 -0
  517. package/fesm2022/cmat-directives-digit-only.mjs +356 -0
  518. package/fesm2022/cmat-directives-digit-only.mjs.map +1 -0
  519. package/fesm2022/cmat-directives-equal-validator.mjs +61 -0
  520. package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -0
  521. package/fesm2022/cmat-lib-mock-api.mjs +232 -0
  522. package/fesm2022/cmat-lib-mock-api.mjs.map +1 -0
  523. package/fesm2022/cmat-pipes-bytes.mjs +32 -0
  524. package/fesm2022/cmat-pipes-bytes.mjs.map +1 -0
  525. package/fesm2022/cmat-pipes-date-format.mjs +25 -0
  526. package/fesm2022/cmat-pipes-date-format.mjs.map +1 -0
  527. package/fesm2022/cmat-pipes-find-by-key.mjs +30 -0
  528. package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -0
  529. package/fesm2022/cmat-pipes-group-by.mjs +36 -0
  530. package/fesm2022/cmat-pipes-group-by.mjs.map +1 -0
  531. package/fesm2022/cmat-pipes-keys.mjs +33 -0
  532. package/fesm2022/cmat-pipes-keys.mjs.map +1 -0
  533. package/fesm2022/cmat-pipes-secure.mjs +50 -0
  534. package/fesm2022/cmat-pipes-secure.mjs.map +1 -0
  535. package/fesm2022/cmat-pipes-uppercase.mjs +24 -0
  536. package/fesm2022/cmat-pipes-uppercase.mjs.map +1 -0
  537. package/fesm2022/cmat-services-alert.mjs +207 -0
  538. package/fesm2022/cmat-services-alert.mjs.map +1 -0
  539. package/fesm2022/cmat-services-config.mjs +69 -0
  540. package/fesm2022/cmat-services-config.mjs.map +1 -0
  541. package/fesm2022/cmat-services-confirmation.mjs +79 -0
  542. package/fesm2022/cmat-services-confirmation.mjs.map +1 -0
  543. package/fesm2022/cmat-services-data.mjs +176 -0
  544. package/fesm2022/cmat-services-data.mjs.map +1 -0
  545. package/fesm2022/cmat-services-loading.mjs +104 -0
  546. package/fesm2022/cmat-services-loading.mjs.map +1 -0
  547. package/fesm2022/cmat-services-local-storage.mjs +29 -0
  548. package/fesm2022/cmat-services-local-storage.mjs.map +1 -0
  549. package/fesm2022/cmat-services-media-watcher.mjs +62 -0
  550. package/fesm2022/cmat-services-media-watcher.mjs.map +1 -0
  551. package/fesm2022/cmat-services-platform.mjs +53 -0
  552. package/fesm2022/cmat-services-platform.mjs.map +1 -0
  553. package/fesm2022/cmat-services-splash-screen.mjs +49 -0
  554. package/fesm2022/cmat-services-splash-screen.mjs.map +1 -0
  555. package/fesm2022/cmat-services-title.mjs +53 -0
  556. package/fesm2022/cmat-services-title.mjs.map +1 -0
  557. package/fesm2022/cmat-services-translation.mjs +69 -0
  558. package/fesm2022/cmat-services-translation.mjs.map +1 -0
  559. package/fesm2022/cmat-services-utils.mjs +398 -0
  560. package/fesm2022/cmat-services-utils.mjs.map +1 -0
  561. package/fesm2022/cmat-validators.mjs +39 -0
  562. package/fesm2022/cmat-validators.mjs.map +1 -0
  563. package/fesm2022/cmat-version.mjs +17 -0
  564. package/fesm2022/cmat-version.mjs.map +1 -0
  565. package/fesm2022/cmat.mjs +4 -0
  566. package/fesm2022/cmat.mjs.map +1 -0
  567. package/icons/CSV.svg +3 -0
  568. package/icons/EXCEL.svg +3 -0
  569. package/icons/FILE.svg +3 -0
  570. package/icons/GIF.svg +3 -0
  571. package/icons/JPG.svg +3 -0
  572. package/icons/PDF.svg +3 -0
  573. package/icons/PNG.svg +3 -0
  574. package/icons/PPT.svg +3 -0
  575. package/icons/TEXT.svg +3 -0
  576. package/icons/VIDEO.svg +3 -0
  577. package/icons/WORD.svg +3 -0
  578. package/icons/ZIP.svg +3 -0
  579. package/icons/arrow-cursor.svg +3 -0
  580. package/icons/material-icons/heroicons-outline.svg +893 -0
  581. package/icons/material-icons/heroicons-solid.svg +958 -0
  582. package/icons/material-icons/material-outline.svg +3586 -0
  583. package/icons/material-icons/material-solid.svg +3586 -0
  584. package/index.d.ts +5 -0
  585. package/lib/mock-api/index.d.ts +5 -0
  586. package/lib/mock-api/mock-api.constants.d.ts +2 -0
  587. package/lib/mock-api/mock-api.interceptor.d.ts +12 -0
  588. package/lib/mock-api/mock-api.request-handler.d.ts +18 -0
  589. package/lib/mock-api/mock-api.service.d.ts +22 -0
  590. package/lib/mock-api/mock-api.types.d.ts +9 -0
  591. package/lib/mock-api/mock-api.utils.d.ts +3 -0
  592. package/lib/mock-api/public-api.d.ts +5 -0
  593. package/package.json +344 -0
  594. package/pipes/bytes/bytes.pipe.d.ts +7 -0
  595. package/pipes/bytes/index.d.ts +5 -0
  596. package/pipes/bytes/public-api.d.ts +1 -0
  597. package/pipes/date-format/date-format.pipe.d.ts +7 -0
  598. package/pipes/date-format/index.d.ts +5 -0
  599. package/pipes/date-format/public-api.d.ts +1 -0
  600. package/pipes/find-by-key/find-by-key.pipe.d.ts +7 -0
  601. package/pipes/find-by-key/index.d.ts +5 -0
  602. package/pipes/find-by-key/public-api.d.ts +1 -0
  603. package/pipes/group-by/group-by.pipe.d.ts +7 -0
  604. package/pipes/group-by/index.d.ts +5 -0
  605. package/pipes/group-by/public-api.d.ts +1 -0
  606. package/pipes/keys/index.d.ts +5 -0
  607. package/pipes/keys/keys.pipe.d.ts +7 -0
  608. package/pipes/keys/public-api.d.ts +1 -0
  609. package/pipes/secure/index.d.ts +5 -0
  610. package/pipes/secure/public-api.d.ts +1 -0
  611. package/pipes/secure/secure-pipe.d.ts +18 -0
  612. package/pipes/uppercase/index.d.ts +5 -0
  613. package/pipes/uppercase/public-api.d.ts +1 -0
  614. package/pipes/uppercase/uppercase.pipe.d.ts +7 -0
  615. package/public-api.d.ts +1 -0
  616. package/services/alert/alert.dialog.d.ts +11 -0
  617. package/services/alert/alert.message.d.ts +8 -0
  618. package/services/alert/alert.service.d.ts +37 -0
  619. package/services/alert/enum.d.ts +12 -0
  620. package/services/alert/index.d.ts +5 -0
  621. package/services/alert/public-api.d.ts +4 -0
  622. package/services/config/config.constants.d.ts +6 -0
  623. package/services/config/config.service.d.ts +11 -0
  624. package/services/config/index.d.ts +5 -0
  625. package/services/config/public-api.d.ts +3 -0
  626. package/services/config/urlStateConfig.service.d.ts +10 -0
  627. package/services/confirmation/confirmation.service.d.ts +12 -0
  628. package/services/confirmation/confirmation.types.d.ts +21 -0
  629. package/services/confirmation/dialog/dialog.component.d.ts +10 -0
  630. package/services/confirmation/index.d.ts +5 -0
  631. package/services/confirmation/public-api.d.ts +2 -0
  632. package/services/data/data.service.d.ts +20 -0
  633. package/services/data/index.d.ts +5 -0
  634. package/services/data/public-api.d.ts +1 -0
  635. package/services/loading/index.d.ts +5 -0
  636. package/services/loading/loading.interceptor.d.ts +12 -0
  637. package/services/loading/loading.service.d.ts +24 -0
  638. package/services/loading/public-api.d.ts +2 -0
  639. package/services/local-storage/index.d.ts +5 -0
  640. package/services/local-storage/local-storage.service.d.ts +8 -0
  641. package/services/local-storage/public-api.d.ts +1 -0
  642. package/services/media-watcher/index.d.ts +5 -0
  643. package/services/media-watcher/media-watcher.service.d.ts +20 -0
  644. package/services/media-watcher/public-api.d.ts +1 -0
  645. package/services/platform/index.d.ts +5 -0
  646. package/services/platform/platform.service.d.ts +9 -0
  647. package/services/platform/public-api.d.ts +1 -0
  648. package/services/splash-screen/index.d.ts +5 -0
  649. package/services/splash-screen/public-api.d.ts +1 -0
  650. package/services/splash-screen/splash-screen.service.d.ts +14 -0
  651. package/services/title/index.d.ts +5 -0
  652. package/services/title/public-api.d.ts +1 -0
  653. package/services/title/title.service.d.ts +13 -0
  654. package/services/translation/index.d.ts +5 -0
  655. package/services/translation/public-api.d.ts +1 -0
  656. package/services/translation/translation.service.d.ts +20 -0
  657. package/services/utils/index.d.ts +5 -0
  658. package/services/utils/public-api.d.ts +1 -0
  659. package/services/utils/utils.service.d.ts +57 -0
  660. package/styles/components/input.scss +42 -0
  661. package/styles/main.scss +9 -0
  662. package/styles/overrides/angular-material.scss +1403 -0
  663. package/styles/overrides/fullcalendar.scss +550 -0
  664. package/styles/overrides/highlightjs.scss +81 -0
  665. package/styles/styles.scss +3 -0
  666. package/styles/tailwind.scss +86 -0
  667. package/styles/themes.scss +164 -0
  668. package/styles/user-themes.scss +1 -0
  669. package/tailwind/plugins/icon-size.js +49 -0
  670. package/tailwind/plugins/theming.js +256 -0
  671. package/tailwind/plugins/utilities.js +66 -0
  672. package/tailwind/utils/generate-contrasts.js +29 -0
  673. package/tailwind/utils/generate-palette.js +100 -0
  674. package/tailwind/utils/json-to-sass-map.js +67 -0
  675. package/validators/index.d.ts +5 -0
  676. package/validators/public-api.d.ts +1 -0
  677. package/validators/validators.d.ts +5 -0
  678. package/version/index.d.ts +5 -0
  679. package/version/public-api.d.ts +1 -0
  680. package/version/version.d.ts +9 -0
@@ -0,0 +1,678 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Inject, Input, Optional, Output, ViewEncapsulation } from '@angular/core';
2
+ import { first } from 'rxjs/operators';
3
+ import { slideCalendar } from './datetimepicker-animations';
4
+ import { createMissingDateImplError } from './datetimepicker-errors';
5
+ import { CmatDatetimepickerFilterType } from './datetimepicker-filtertype';
6
+ import { getActiveOffset, isSameMultiYearView, yearsPerPage, yearsPerRow } from './multi-year-view';
7
+ import { CMAT_DATETIME_FORMATS } from 'cmat/components/adapter';
8
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
9
+ import { CmatDatetimepickerClockComponent } from './clock';
10
+ import { CmatDatetimepickerTimeComponent } from './time';
11
+ import { CmatDatetimepickerMultiYearViewComponent } from './multi-year-view';
12
+ import { CmatDatetimepickerYearViewComponent } from './year-view';
13
+ import { CmatDatetimepickerMonthViewComponent } from './month-view';
14
+ import { MatButtonModule } from '@angular/material/button';
15
+ import { NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "./datetimepicker-intl";
18
+ import * as i2 from "cmat/components/adapter";
19
+ import * as i3 from "@angular/material/button";
20
+ /**
21
+ * A calendar that is used as part of the datepicker.
22
+ */
23
+ export class CmatDatetimepickerCalendarComponent {
24
+ constructor(_elementRef, _intl, _ngZone, _adapter, _dateFormats, changeDetectorRef) {
25
+ this._elementRef = _elementRef;
26
+ this._intl = _intl;
27
+ this._ngZone = _ngZone;
28
+ this._adapter = _adapter;
29
+ this._dateFormats = _dateFormats;
30
+ this.userSelection = new EventEmitter();
31
+ /** Active multi year view when click on year. */
32
+ this.multiYearSelector = false;
33
+ /** Whether the calendar should be started in month or year view. */
34
+ this.startView = 'month';
35
+ this.twelvehour = false;
36
+ this.timeInterval = 1;
37
+ /** Prevent user to select same date time */
38
+ this.preventSameDateTimeSelection = false;
39
+ /** Emits when the currently selected date changes. */
40
+ this.selectedChange = new EventEmitter();
41
+ /** Emits when the view has been changed. **/
42
+ this.viewChanged = new EventEmitter();
43
+ this.class = 'cmat-datetimepicker-calendar';
44
+ this.label = 'ariaLabel';
45
+ this.role = 'dialog';
46
+ this.tabindex = 0;
47
+ this.clockView = 'hour';
48
+ this._type = 'date';
49
+ this._timeInput = false;
50
+ /** Date filter for the month and year views. */
51
+ this.dateFilterForViews = (date) => !!date &&
52
+ (!this.dateFilter || this.dateFilter(date, CmatDatetimepickerFilterType.DATE)) &&
53
+ (!this.minDate || this._adapter.compareDate(date, this.minDate) >= 0) &&
54
+ (!this.maxDate || this._adapter.compareDate(date, this.maxDate) <= 0);
55
+ if (!this._adapter) {
56
+ throw createMissingDateImplError('CDatetimeAdapter');
57
+ }
58
+ if (!this._dateFormats) {
59
+ throw createMissingDateImplError('CMAT_DATETIME_FORMATS');
60
+ }
61
+ this._intlChanges = _intl.changes
62
+ .subscribe(() => changeDetectorRef.markForCheck());
63
+ }
64
+ get type() {
65
+ return this._type;
66
+ }
67
+ set type(value) {
68
+ this._type = value || 'date';
69
+ if (this.type === 'year') {
70
+ this.multiYearSelector = true;
71
+ }
72
+ }
73
+ /** A date representing the period (month or year) to start the calendar in. */
74
+ // eslint-disable-next-line @typescript-eslint/member-ordering
75
+ get startAt() {
76
+ return this._startAt;
77
+ }
78
+ set startAt(value) {
79
+ this._startAt = this._adapter.getValidDateOrNull(value);
80
+ }
81
+ /**
82
+ * Whether the calendar is in time mode. In time mode the calendar clock gets time input elements rather then just clock
83
+ *
84
+ * When touchUi is enabled this will be disabled
85
+ */
86
+ // eslint-disable-next-line @typescript-eslint/member-ordering
87
+ get timeInput() {
88
+ return this._timeInput;
89
+ }
90
+ set timeInput(value) {
91
+ this._timeInput = coerceBooleanProperty(value);
92
+ }
93
+ /** The currently selected date. */
94
+ // eslint-disable-next-line @typescript-eslint/member-ordering
95
+ get selected() {
96
+ return this._selected;
97
+ }
98
+ set selected(value) {
99
+ this._selected = this._adapter.getValidDateOrNull(value);
100
+ }
101
+ /** The minimum selectable date. */
102
+ // eslint-disable-next-line @typescript-eslint/member-ordering
103
+ get minDate() {
104
+ return this._minDate;
105
+ }
106
+ set minDate(value) {
107
+ this._minDate = this._adapter.getValidDateOrNull(value);
108
+ }
109
+ /** The maximum selectable date. */
110
+ // eslint-disable-next-line @typescript-eslint/member-ordering
111
+ get maxDate() {
112
+ return this._maxDate;
113
+ }
114
+ set maxDate(value) {
115
+ this._maxDate = this._adapter.getValidDateOrNull(value);
116
+ }
117
+ /**
118
+ * The current active date. This determines which time period is shown and which date is
119
+ * highlighted when using keyboard navigation.
120
+ */
121
+ // eslint-disable-next-line @typescript-eslint/member-ordering
122
+ get activeDate() {
123
+ return this._clampedActiveDate;
124
+ }
125
+ set activeDate(value) {
126
+ const oldActiveDate = this._clampedActiveDate;
127
+ this._clampedActiveDate = this._adapter.clampDate(value, this.minDate, this.maxDate);
128
+ if (oldActiveDate && this._clampedActiveDate && this.currentView === 'month' &&
129
+ !this._adapter.sameMonthAndYear(oldActiveDate, this._clampedActiveDate)) {
130
+ if (this._adapter.isInNextMonth(oldActiveDate, this._clampedActiveDate)) {
131
+ this._changeCalendarState('right');
132
+ }
133
+ else {
134
+ this._changeCalendarState('left');
135
+ }
136
+ }
137
+ }
138
+ // eslint-disable-next-line @typescript-eslint/member-ordering
139
+ get currentView() {
140
+ return this._currentView;
141
+ }
142
+ set currentView(view) {
143
+ this._currentView = view;
144
+ this.viewChanged.emit(view);
145
+ }
146
+ /** The label for the current calendar view. */
147
+ // eslint-disable-next-line @typescript-eslint/member-ordering
148
+ get yearButtonText() {
149
+ return this._adapter.getYearName(this.activeDate);
150
+ }
151
+ // eslint-disable-next-line @typescript-eslint/member-ordering
152
+ get yearPeriodText() {
153
+ if (this.currentView === 'multi-year') {
154
+ // The offset from the active year to the "slot" for the starting year is the
155
+ // *actual* first rendered year in the multi-year view, and the last year is
156
+ // just yearsPerPage - 1 away.
157
+ const activeYear = this._adapter.getYear(this.activeDate);
158
+ const minYearOfPage = activeYear - getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate);
159
+ const maxYearOfPage = minYearOfPage + yearsPerPage - 1;
160
+ const minYearName = this._adapter.getYearName(this._adapter.createDate(minYearOfPage, 0, 1));
161
+ const maxYearName = this._adapter.getYearName(this._adapter.createDate(maxYearOfPage, 0, 1));
162
+ return this._intl.formatYearRange(minYearName, maxYearName);
163
+ }
164
+ return this.currentView === 'month' ? this._adapter.getMonthNames('long')[this._adapter.getMonth(this.activeDate)] :
165
+ this._adapter.getYearName(this.activeDate);
166
+ }
167
+ // eslint-disable-next-line @typescript-eslint/member-ordering
168
+ get yearButtonLabel() {
169
+ return this.multiYearSelector
170
+ ? this._intl.switchToMultiYearViewLabel
171
+ : this._intl.switchToYearViewLabel;
172
+ }
173
+ // eslint-disable-next-line @typescript-eslint/member-ordering
174
+ get dateButtonText() {
175
+ switch (this.type) {
176
+ case 'month':
177
+ return this._adapter.getMonthNames('long')[this._adapter.getMonth(this.activeDate)];
178
+ default:
179
+ return this._adapter.format(this.activeDate, this._dateFormats.display.popupHeaderDateLabel);
180
+ }
181
+ }
182
+ // eslint-disable-next-line @typescript-eslint/member-ordering
183
+ get dateButtonLabel() {
184
+ return this._intl.switchToMonthViewLabel;
185
+ }
186
+ // eslint-disable-next-line @typescript-eslint/member-ordering
187
+ get hoursButtonText() {
188
+ let hour = this._adapter.getHour(this.activeDate);
189
+ if (this.twelvehour) {
190
+ if (hour === 0) {
191
+ hour = 24;
192
+ }
193
+ hour = hour > 12 ? (hour - 12) : hour;
194
+ }
195
+ return this._2digit(hour);
196
+ }
197
+ // eslint-disable-next-line @typescript-eslint/member-ordering
198
+ get hourButtonLabel() {
199
+ return this._intl.switchToClockHourViewLabel;
200
+ }
201
+ // eslint-disable-next-line @typescript-eslint/member-ordering
202
+ get minutesButtonText() {
203
+ return this._2digit(this._adapter.getMinute(this.activeDate));
204
+ }
205
+ // eslint-disable-next-line @typescript-eslint/member-ordering
206
+ get minuteButtonLabel() {
207
+ return this._intl.switchToClockMinuteViewLabel;
208
+ }
209
+ // eslint-disable-next-line @typescript-eslint/member-ordering
210
+ get prevButtonLabel() {
211
+ switch (this._currentView) {
212
+ case 'month':
213
+ return this._intl.prevMonthLabel;
214
+ case 'year':
215
+ return this._intl.prevYearLabel;
216
+ case 'multi-year':
217
+ return this._intl.prevMultiYearLabel;
218
+ default:
219
+ return '';
220
+ }
221
+ }
222
+ // eslint-disable-next-line @typescript-eslint/member-ordering
223
+ get nextButtonLabel() {
224
+ switch (this._currentView) {
225
+ case 'month':
226
+ return this._intl.nextMonthLabel;
227
+ case 'year':
228
+ return this._intl.nextYearLabel;
229
+ case 'multi-year':
230
+ return this._intl.nextMultiYearLabel;
231
+ default:
232
+ return '';
233
+ }
234
+ }
235
+ handleCalendarBodyKeydown(event) {
236
+ if (this.currentView === 'month') {
237
+ this._handleCalendarBodyKeydownInMonthView(event);
238
+ }
239
+ else if (this.currentView === 'year') {
240
+ this._handleCalendarBodyKeydownInYearView(event);
241
+ }
242
+ else if (this.currentView === 'multi-year') {
243
+ this._handleCalendarBodyKeydownInMultiYearView(event);
244
+ }
245
+ else {
246
+ this._handleCalendarBodyKeydownInClockView(event);
247
+ }
248
+ }
249
+ userSelected() {
250
+ this.userSelection.emit();
251
+ }
252
+ ngAfterContentInit() {
253
+ this.activeDate = this.startAt || this._adapter.today();
254
+ this.selectAMPM(this.activeDate);
255
+ this.focusActiveCell();
256
+ if (this.type === 'year') {
257
+ this.currentView = 'multi-year';
258
+ }
259
+ else if (this.type === 'month') {
260
+ this.currentView = 'year';
261
+ }
262
+ else if (this.type === 'time') {
263
+ this.currentView = 'clock';
264
+ }
265
+ else {
266
+ this.currentView = this.startView || 'month';
267
+ }
268
+ }
269
+ ngOnDestroy() {
270
+ this._intlChanges.unsubscribe();
271
+ }
272
+ /** Handles date selection in the month view. */
273
+ dateSelected(date) {
274
+ if (this.type === 'date') {
275
+ if (!this._adapter.sameDate(date, this.selected) || !this.preventSameDateTimeSelection) {
276
+ this.selectedChange.emit(date);
277
+ }
278
+ }
279
+ else {
280
+ this.activeDate = date;
281
+ this.currentView = 'clock';
282
+ }
283
+ }
284
+ /** Handles month selection in the year view. */
285
+ monthSelected(month) {
286
+ if (this.type === 'month') {
287
+ if (!this._adapter.sameMonthAndYear(month, this.selected) || !this.preventSameDateTimeSelection) {
288
+ this.selectedChange.emit(this._adapter.getFirstDateOfMonth(month));
289
+ }
290
+ }
291
+ else {
292
+ this.activeDate = month;
293
+ this.currentView = 'month';
294
+ this.clockView = 'hour';
295
+ }
296
+ }
297
+ /** Handles year selection in the multi year view. */
298
+ yearSelected(year) {
299
+ if (this.type === 'year') {
300
+ if ((this.selected && !this._adapter.sameYear(year, this.selected)) || !this.preventSameDateTimeSelection) {
301
+ const normalizedDate = this._adapter.createDatetime(this._adapter.getYear(year), 0, 1, 0, 0);
302
+ this.selectedChange.emit(normalizedDate);
303
+ }
304
+ }
305
+ else {
306
+ this.activeDate = year;
307
+ this.currentView = 'year';
308
+ }
309
+ }
310
+ timeSelected(date) {
311
+ this.activeDate = this.updateDate(date);
312
+ if (!this._adapter.sameDatetime(date, this.selected) || !this.preventSameDateTimeSelection) {
313
+ this.selectedChange.emit(date);
314
+ }
315
+ }
316
+ dialTimeSelected(date) {
317
+ if (this.clockView !== 'minute') {
318
+ this.activeDate = this.updateDate(date);
319
+ this.clockView = 'minute';
320
+ }
321
+ else {
322
+ if (!this._adapter.sameDatetime(date, this.selected) || !this.preventSameDateTimeSelection) {
323
+ this.selectedChange.emit(date);
324
+ }
325
+ }
326
+ }
327
+ onActiveDateChange(date) {
328
+ this.activeDate = date;
329
+ }
330
+ updateDate(date) {
331
+ if (this.twelvehour) {
332
+ const HOUR = this._adapter.getHour(date);
333
+ if (HOUR === 12) {
334
+ if (this.AMPM === 'AM') {
335
+ return this._adapter.addCalendarHours(date, -12);
336
+ }
337
+ }
338
+ else if (this.AMPM === 'PM') {
339
+ return this._adapter.addCalendarHours(date, 12);
340
+ }
341
+ }
342
+ return date;
343
+ }
344
+ selectAMPM(date) {
345
+ if (this._adapter.getHour(date) > 11) {
346
+ this.AMPM = 'PM';
347
+ }
348
+ else {
349
+ this.AMPM = 'AM';
350
+ }
351
+ }
352
+ ampmClicked(source) {
353
+ this._currentView = 'clock';
354
+ if (source === this.AMPM) {
355
+ return;
356
+ }
357
+ this.AMPM = source;
358
+ // if AMPM changed from PM to AM substract 12 hours
359
+ const currentHour = this._adapter.getHour(this.activeDate);
360
+ let newHourValue;
361
+ if (this.AMPM === 'AM') {
362
+ newHourValue = currentHour >= 12 ? this._adapter.getHour(this.activeDate) - 12 : 12;
363
+ }
364
+ // otherwise add 12 hours
365
+ else {
366
+ newHourValue = (currentHour + 12) % 24;
367
+ }
368
+ this.activeDate = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), newHourValue, this._adapter.getMinute(this.activeDate));
369
+ }
370
+ yearClicked() {
371
+ if (this.type === 'year' || this.multiYearSelector) {
372
+ this.currentView = 'multi-year';
373
+ return;
374
+ }
375
+ this.currentView = 'year';
376
+ }
377
+ dateClicked() {
378
+ if (this.type !== 'month') {
379
+ this.currentView = 'month';
380
+ }
381
+ }
382
+ hoursClicked() {
383
+ this.currentView = 'clock';
384
+ this.clockView = 'hour';
385
+ }
386
+ minutesClicked() {
387
+ this.currentView = 'clock';
388
+ this.clockView = 'minute';
389
+ }
390
+ /** Handles user clicks on the previous button. */
391
+ previousClicked() {
392
+ this.activeDate = this.currentView === 'month' ?
393
+ this._adapter.addCalendarMonths(this.activeDate, -1) :
394
+ this._adapter.addCalendarYears(this.activeDate, this.currentView === 'year' ? -1 : -yearsPerPage);
395
+ }
396
+ /** Handles user clicks on the next button. */
397
+ nextClicked() {
398
+ this.activeDate = this.currentView === 'month' ?
399
+ this._adapter.addCalendarMonths(this.activeDate, 1) :
400
+ this._adapter.addCalendarYears(this.activeDate, this.currentView === 'year' ? 1 : yearsPerPage);
401
+ }
402
+ /** Whether the previous period button is enabled. */
403
+ previousEnabled() {
404
+ if (!this.minDate) {
405
+ return true;
406
+ }
407
+ return !this.minDate || !this._isSameView(this.activeDate, this.minDate);
408
+ }
409
+ /** Whether the next period button is enabled. */
410
+ nextEnabled() {
411
+ return !this.maxDate || !this._isSameView(this.activeDate, this.maxDate);
412
+ }
413
+ focusActiveCell() {
414
+ this._ngZone.runOutsideAngular(() => {
415
+ this._ngZone.onStable.asObservable().pipe(first()).subscribe(() => {
416
+ this._elementRef.nativeElement.focus();
417
+ });
418
+ });
419
+ }
420
+ calendarStateDone() {
421
+ this.calendarState = '';
422
+ }
423
+ /** Whether the two dates represent the same view in the current view mode (month or year). */
424
+ _isSameView(date1, date2) {
425
+ if (this.currentView === 'month') {
426
+ return this._adapter.getYear(date1) === this._adapter.getYear(date2) &&
427
+ this._adapter.getMonth(date1) === this._adapter.getMonth(date2);
428
+ }
429
+ if (this.currentView === 'year') {
430
+ return this._adapter.getYear(date1) === this._adapter.getYear(date2);
431
+ }
432
+ // Otherwise we are in 'multi-year' view.
433
+ return isSameMultiYearView(this._adapter, date1, date2, this.minDate, this.maxDate);
434
+ }
435
+ /** Handles keydown events on the calendar body when calendar is in month view. */
436
+ _handleCalendarBodyKeydownInMonthView(event) {
437
+ switch (event.code) {
438
+ case 'ArrowLeft':
439
+ this.activeDate = this._adapter.addCalendarDays(this.activeDate, -1);
440
+ break;
441
+ case 'ArrowRight':
442
+ this.activeDate = this._adapter.addCalendarDays(this.activeDate, 1);
443
+ break;
444
+ case 'ArrowUp':
445
+ this.activeDate = this._adapter.addCalendarDays(this.activeDate, -7);
446
+ break;
447
+ case 'ArrowDown':
448
+ this.activeDate = this._adapter.addCalendarDays(this.activeDate, 7);
449
+ break;
450
+ case 'Home':
451
+ this.activeDate = this._adapter.addCalendarDays(this.activeDate, 1 - this._adapter.getDate(this.activeDate));
452
+ break;
453
+ case 'End':
454
+ this.activeDate = this._adapter.addCalendarDays(this.activeDate, (this._adapter.getNumDaysInMonth(this.activeDate) -
455
+ this._adapter.getDate(this.activeDate)));
456
+ break;
457
+ case 'PageUp':
458
+ this.activeDate = event.altKey ?
459
+ this._adapter.addCalendarYears(this.activeDate, -1) :
460
+ this._adapter.addCalendarMonths(this.activeDate, -1);
461
+ break;
462
+ case 'PageDown':
463
+ this.activeDate = event.altKey ?
464
+ this._adapter.addCalendarYears(this.activeDate, 1) :
465
+ this._adapter.addCalendarMonths(this.activeDate, 1);
466
+ break;
467
+ case 'Enter':
468
+ if (this.dateFilterForViews(this.activeDate)) {
469
+ this.dateSelected(this.activeDate);
470
+ // Prevent unexpected default actions such as form submission.
471
+ event.preventDefault();
472
+ }
473
+ return;
474
+ default:
475
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
476
+ return;
477
+ }
478
+ // Prevent unexpected default actions such as form submission.
479
+ event.preventDefault();
480
+ }
481
+ /** Handles keydown events on the calendar body when calendar is in year view. */
482
+ _handleCalendarBodyKeydownInYearView(event) {
483
+ switch (event.code) {
484
+ case 'ArrowLeft':
485
+ this.activeDate = this._adapter.addCalendarMonths(this.activeDate, -1);
486
+ break;
487
+ case 'ArrowRight':
488
+ this.activeDate = this._adapter.addCalendarMonths(this.activeDate, 1);
489
+ break;
490
+ case 'ArrowUp':
491
+ this.activeDate = this._prevMonthInSameCol(this.activeDate);
492
+ break;
493
+ case 'ArrowDown':
494
+ this.activeDate = this._nextMonthInSameCol(this.activeDate);
495
+ break;
496
+ case 'Home':
497
+ this.activeDate = this._adapter.addCalendarMonths(this.activeDate, -this._adapter.getMonth(this.activeDate));
498
+ break;
499
+ case 'End':
500
+ this.activeDate = this._adapter.addCalendarMonths(this.activeDate, 11 - this._adapter.getMonth(this.activeDate));
501
+ break;
502
+ case 'PageUp':
503
+ this.activeDate =
504
+ this._adapter.addCalendarYears(this.activeDate, event.altKey ? -10 : -1);
505
+ break;
506
+ case 'PageDown':
507
+ this.activeDate =
508
+ this._adapter.addCalendarYears(this.activeDate, event.altKey ? 10 : 1);
509
+ break;
510
+ case 'Enter':
511
+ this.monthSelected(this.activeDate);
512
+ break;
513
+ default:
514
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
515
+ return;
516
+ }
517
+ // Prevent unexpected default actions such as form submission.
518
+ event.preventDefault();
519
+ }
520
+ /** Handles keydown events on the calendar body when calendar is in multi-year view. */
521
+ _handleCalendarBodyKeydownInMultiYearView(event) {
522
+ switch (event.code) {
523
+ case 'ArrowLeft':
524
+ this.activeDate = this._adapter.addCalendarYears(this.activeDate, -1);
525
+ break;
526
+ case 'ArrowRight':
527
+ this.activeDate = this._adapter.addCalendarYears(this.activeDate, 1);
528
+ break;
529
+ case 'ArrowUp':
530
+ this.activeDate = this._adapter.addCalendarYears(this.activeDate, -yearsPerRow);
531
+ break;
532
+ case 'ArrowDown':
533
+ this.activeDate = this._adapter.addCalendarYears(this.activeDate, yearsPerRow);
534
+ break;
535
+ case 'Home':
536
+ this.activeDate = this._adapter.addCalendarYears(this.activeDate, -getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate));
537
+ break;
538
+ case 'End':
539
+ this.activeDate = this._adapter.addCalendarYears(this.activeDate, yearsPerPage - getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate) - 1);
540
+ break;
541
+ case 'PageUp':
542
+ this.activeDate =
543
+ this._adapter.addCalendarYears(this.activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);
544
+ break;
545
+ case 'PageDown':
546
+ this.activeDate =
547
+ this._adapter.addCalendarYears(this.activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);
548
+ break;
549
+ case 'Enter':
550
+ this.yearSelected(this.activeDate);
551
+ break;
552
+ default:
553
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
554
+ return;
555
+ }
556
+ }
557
+ /** Handles keydown events on the calendar body when calendar is in month view. */
558
+ _handleCalendarBodyKeydownInClockView(event) {
559
+ switch (event.code) {
560
+ case 'ArrowUp':
561
+ this.activeDate = this.clockView === 'hour' ?
562
+ this._adapter.addCalendarHours(this.activeDate, 1) :
563
+ this._adapter.addCalendarMinutes(this.activeDate, this.timeInterval);
564
+ // if the hours changed the am/pm we should update the AM/PM
565
+ this.selectAMPM(this.activeDate);
566
+ break;
567
+ case 'ArrowDown':
568
+ this.activeDate = this.clockView === 'hour' ?
569
+ this._adapter.addCalendarHours(this.activeDate, -1) :
570
+ this._adapter.addCalendarMinutes(this.activeDate, -this.timeInterval);
571
+ // if the hours changed the am/pm we should update the AM/PM
572
+ this.selectAMPM(this.activeDate);
573
+ break;
574
+ case 'Enter':
575
+ if (!this.timeInput) {
576
+ this.dialTimeSelected(this.activeDate);
577
+ }
578
+ return;
579
+ default:
580
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
581
+ return;
582
+ }
583
+ // Prevent unexpected default actions such as form submission.
584
+ event.preventDefault();
585
+ }
586
+ /**
587
+ * Determine the date for the month that comes before the given month in the same column in the
588
+ * calendar table.
589
+ */
590
+ _prevMonthInSameCol(date) {
591
+ // Determine how many months to jump forward given that there are 2 empty slots at the beginning
592
+ // of each year.
593
+ const increment = this._adapter.getMonth(date) <= 4 ? -5 :
594
+ (this._adapter.getMonth(date) >= 7 ? -7 : -12);
595
+ return this._adapter.addCalendarMonths(date, increment);
596
+ }
597
+ /**
598
+ * Determine the date for the month that comes after the given month in the same column in the
599
+ * calendar table.
600
+ */
601
+ _nextMonthInSameCol(date) {
602
+ // Determine how many months to jump forward given that there are 2 empty slots at the beginning
603
+ // of each year.
604
+ const increment = this._adapter.getMonth(date) <= 4 ? 7 :
605
+ (this._adapter.getMonth(date) >= 7 ? 5 : 12);
606
+ return this._adapter.addCalendarMonths(date, increment);
607
+ }
608
+ _changeCalendarState(direction) {
609
+ this.calendarState = direction;
610
+ }
611
+ _2digit(n) {
612
+ return ('00' + n).slice(-2);
613
+ }
614
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: CmatDatetimepickerCalendarComponent, deps: [{ token: i0.ElementRef }, { token: i1.CmatDatetimepickerIntl }, { token: i0.NgZone }, { token: i2.DatetimeAdapter, optional: true }, { token: CMAT_DATETIME_FORMATS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
615
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: CmatDatetimepickerCalendarComponent, isStandalone: true, selector: "cmat-datetimepicker-calendar", inputs: { multiYearSelector: "multiYearSelector", startView: "startView", twelvehour: "twelvehour", timeInterval: "timeInterval", dateFilter: "dateFilter", preventSameDateTimeSelection: "preventSameDateTimeSelection", type: "type", startAt: "startAt", timeInput: "timeInput", selected: "selected", minDate: "minDate", maxDate: "maxDate" }, outputs: { userSelection: "userSelection", selectedChange: "selectedChange", viewChanged: "viewChanged" }, host: { listeners: { "keydown": "handleCalendarBodyKeydown($event)" }, properties: { "class.cmat-datetimepicker-calendar-with-time-input": "timeInput", "class": "this.class", "attr.aria-label": "this.label", "role": "this.role", "tabindex": "this.tabindex" } }, exportAs: ["cmatDatetimepickerCalendar"], ngImport: i0, template: "<div class=\"cmat-datetimepicker-calendar-header\">\r\n <div role=\"presentation\" *ngIf=\"type !== 'time'\" class=\"cmat-datetimepicker-calendar-header-year header-button\"\r\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\" [attr.aria-label]=\"yearButtonLabel\"\r\n (click)=\"yearClicked()\">\r\n <span class=\"font-medium\">{{ yearButtonText }}</span>\r\n <svg *ngIf=\"multiYearSelector || type === 'year'\" class=\"cmat-datetimepicker-calendar-header-year-dropdown\"\r\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M7,10L12,15L17,10H7Z\"></path>\r\n </svg>\r\n </div>\r\n <div *ngIf=\"type !== 'year'\" class=\"cmat-datetimepicker-calendar-header-date-time\">\r\n <div role=\"presentation\" *ngIf=\"type !== 'time'\" class=\"cmat-datetimepicker-calendar-header-date header-button\"\r\n [class.active]=\"currentView === 'month'\" [class.not-clickable]=\"type === 'month'\"\r\n [attr.aria-label]=\"dateButtonLabel\" (click)=\"dateClicked()\">{{ dateButtonText }}</div>\r\n <span *ngIf=\"type.endsWith('time')\" class=\"cmat-datetimepicker-calendar-header-time\"\r\n [class.active]=\"currentView === 'clock'\">\r\n <span class=\"cmat-datetimepicker-calendar-header-hour-minute-container flex place-items-center\">\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-hours header-button\"\r\n [class.active]=\"clockView === 'hour'\" [attr.aria-label]=\"hourButtonLabel\" (click)=\"hoursClicked()\">\r\n {{ hoursButtonText }}</div>\r\n <span class=\"cmat-datetimepicker-calendar-header-hour-minute-separator\">&#58;</span>\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-minutes header-button\"\r\n [class.active]=\"clockView === 'minute'\" [attr.aria-label]=\"minuteButtonLabel\"\r\n (click)=\"minutesClicked()\">{{ minutesButtonText }}</div>\r\n </span>\r\n <span *ngIf=\"twelvehour\" class=\"cmat-datetimepicker-calendar-header-ampm-container flex place-items-center\">\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-ampm header-button\"\r\n [class.active]=\"AMPM === 'AM'\" aria-label=\"AM\" (click)=\"ampmClicked('AM')\">AM</div>\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-ampm header-button\"\r\n [class.active]=\"AMPM === 'PM'\" aria-label=\"PM\" (click)=\"ampmClicked('PM')\">PM</div>\r\n </span>\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<div class=\"cmat-datetimepicker-calendar-content\" [ngSwitch]=\"currentView\">\r\n <div *ngIf=\"currentView === 'month' || currentView === 'year' || currentView === 'multi-year'\"\r\n class=\"cmat-datetimepickermonth-content\">\r\n <div class=\"cmat-datetimepicker-calendar-controls\">\r\n <button type=\"button\" mat-icon-button type=\"button\" class=\"cmat-datetimepicker-calendar-previous-button\"\r\n [class.disabled]=\"!previousEnabled()\" [attr.aria-disabled]=\"!previousEnabled()\"\r\n [attr.aria-label]=\"prevButtonLabel\" (click)=\"previousClicked()\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path>\r\n </svg>\r\n </button>\r\n <div class=\"cmat-datetimepicker-calendar-period-button text-default font-medium\"\r\n [@slideCalendar]=\"calendarState\" (@slideCalendar.done)=\"calendarStateDone()\">\r\n <strong>{{ yearPeriodText }}</strong>\r\n </div>\r\n <button type=\"button\" mat-icon-button type=\"button\" class=\"cmat-datetimepicker-calendar-next-button\"\r\n [class.disabled]=\"!nextEnabled()\" [attr.aria-disabled]=\"!nextEnabled()\"\r\n [attr.aria-label]=\"nextButtonLabel\" (click)=\"nextClicked()\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <cmat-datetimepicker-month-view *ngSwitchCase=\"'month'\" (userSelection)=\"userSelected()\"\r\n (selectedChange)=\"dateSelected($event)\" [activeDate]=\"activeDate\" [dateFilter]=\"dateFilterForViews\"\r\n [selected]=\"selected!\" [type]=\"type\">\r\n </cmat-datetimepicker-month-view>\r\n <cmat-datetimepicker-year-view *ngSwitchCase=\"'year'\" (userSelection)=\"userSelected()\"\r\n (selectedChange)=\"monthSelected($event)\" [activeDate]=\"activeDate\" [dateFilter]=\"dateFilterForViews\"\r\n [selected]=\"selected!\" [type]=\"type\">\r\n </cmat-datetimepicker-year-view>\r\n <cmat-datetimepicker-multi-year-view *ngSwitchCase=\"'multi-year'\" (userSelection)=\"userSelected()\"\r\n (selectedChange)=\"yearSelected($event)\" [activeDate]=\"activeDate\" [dateFilter]=\"dateFilterForViews\"\r\n [maxDate]=\"maxDate\" [minDate]=\"minDate\" [selected]=\"selected!\" [type]=\"type\">\r\n </cmat-datetimepicker-multi-year-view>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <cmat-datetimepicker-time *ngIf=\"timeInput; else clock\" (userSelection)=\"userSelected()\"\r\n (activeDateChange)=\"onActiveDateChange($event)\" (selectedChange)=\"timeSelected($event)\" [AMPM]=\"AMPM\"\r\n (ampmChange)=\"ampmClicked($event)\" [clockView]=\"clockView\" (clockViewChange)=\"clockView = $event\"\r\n [twelvehour]=\"twelvehour\" [dateFilter]=\"dateFilter\" [interval]=\"timeInterval\" [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\" [selected]=\"activeDate\">\r\n </cmat-datetimepicker-time>\r\n\r\n <ng-template #clock>\r\n <cmat-datetimepicker-clock (userSelection)=\"userSelected()\" (activeDateChange)=\"onActiveDateChange($event)\"\r\n (selectedChange)=\"dialTimeSelected($event)\" [dateFilter]=\"dateFilter\" [interval]=\"timeInterval\"\r\n [maxDate]=\"maxDate\" [minDate]=\"minDate\" [selected]=\"activeDate\" [startView]=\"clockView\"\r\n [twelvehour]=\"twelvehour\">\r\n </cmat-datetimepicker-clock>\r\n </ng-template>\r\n </ng-container>\r\n</div>", styles: [".cmat-datetimepicker-calendar{display:block;outline:none}.cmat-datetimepicker-calendar-header{box-sizing:border-box;padding:8px;border-radius:4px 4px 0 0}.cmat-datetimepicker-calendar-header .header-button{color:#fff!important;padding:0 4px;font-size:inherit;white-space:normal;word-break:break-word;font-weight:500;cursor:pointer}.cmat-datetimepicker-calendar-header-year.header-button{font-size:26px;line-height:24px}.cmat-datetimepicker-calendar-header-date-time{font-size:24px;line-height:36px;display:flex;flex-direction:row}.cmat-datetimepicker-calendar-header-year:not(.active),.cmat-datetimepicker-calendar-header-date:not(.active),.cmat-datetimepicker-calendar-header-hours:not(.active),.cmat-datetimepicker-calendar-header-minutes:not(.active),.cmat-datetimepicker-calendar-header-ampm:not(.active){opacity:.6}.cmat-datetimepicker-calendar-header-year.not-clickable,.cmat-datetimepicker-calendar-header-date.not-clickable,.cmat-datetimepicker-calendar-header-hours.not-clickable,.cmat-datetimepicker-calendar-header-minutes.not-clickable,.cmat-datetimepicker-calendar-header-ampm.not-clickable{cursor:initial}.cmat-datetimepicker-calendar-header-time{display:inline-flex}.cmat-datetimepicker-calendar-header-time:not(.active){opacity:.6}.cmat-datetimepicker-calendar-header-time:not(.active) .cmat-datetimepicker-calendar-header-hours,.cmat-datetimepicker-calendar-header-time:not(.active) .cmat-datetimepicker-calendar-header-minutes,.cmat-datetimepicker-calendar-header-time:not(.active) .cmat-datetimepicker-calendar-header-ampm{opacity:1}.cmat-datetimepicker-calendar-header-hour-minute-separator{display:inline-block;width:8px;text-align:center}.cmat-datetimepicker-calendar-header-ampm-container{display:inline-flex;flex-direction:column;line-height:18px;font-size:12px}[mode=landscape] .cmat-datetimepicker-calendar{display:flex}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{width:150px;min-width:150px;padding:16px 8px;border-radius:4px 0 0 4px}[dir=rtl] [mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{border-radius:0 4px 4px 0}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-year+.cmat-datetimepicker-calendar-header-date-time,[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date+.cmat-datetimepicker-calendar-header-time{margin-top:12px}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date-time{font-size:28px;flex-direction:column}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-time{display:flex;flex-direction:column}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm-container{flex-direction:row;font-size:24px}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm{padding:4px}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm+.cmat-datetimepicker-calendar-header-ampm{margin:0 8px}@media all and (orientation: landscape){[mode=auto] .cmat-datetimepicker-calendar{display:flex}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{width:150px;min-width:150px;padding:16px 8px;border-radius:4px 0 0 4px}[dir=rtl] [mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{border-radius:0 4px 4px 0}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-year+.cmat-datetimepicker-calendar-header-date-time,[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date+.cmat-datetimepicker-calendar-header-time{margin-top:12px}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date-time{font-size:28px;flex-direction:column}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-time{display:flex;flex-direction:column}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm-container{flex-direction:row;font-size:24px}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm{padding:4px}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm+.cmat-datetimepicker-calendar-header-ampm{margin:0 8px}}.cmat-datetimepicker-calendar-content{width:100%;padding:8px;outline:none;box-sizing:border-box;overflow:hidden}.cmat-datetimepicker-calendar-controls{display:flex;justify-content:space-between;margin:0 calc(4.7142857143% - 16px)}.cmat-datetimepicker-calendar-period-button{display:inline-block;height:40px;line-height:40px;outline:none;border:0;background:transparent;box-sizing:border-box}.cmat-datetimepicker-calendar-previous-button.disabled,.cmat-datetimepicker-calendar-next-button.disabled{pointer-events:none}.cmat-datetimepicker-calendar-previous-button svg,.cmat-datetimepicker-calendar-next-button svg{fill:currentColor;vertical-align:top}[dir=rtl] .cmat-datetimepicker-calendar-previous-button svg,[dir=rtl] .cmat-datetimepicker-calendar-next-button svg{transform:rotate(180deg)}.cmat-datetimepicker-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.cmat-datetimepicker-calendar-table-header th{text-align:center;padding:8px 0}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: CmatDatetimepickerMonthViewComponent, selector: "cmat-datetimepicker-month-view", inputs: ["type", "dateFilter", "activeDate", "selected"], outputs: ["userSelection", "selectedChange"], exportAs: ["cmatDatetimepickerMonthView"] }, { kind: "component", type: CmatDatetimepickerYearViewComponent, selector: "cmat-datetimepicker-year-view", inputs: ["type", "dateFilter", "activeDate", "selected"], outputs: ["userSelection", "selectedChange"], exportAs: ["cmatDatetimepickerYearView"] }, { kind: "component", type: CmatDatetimepickerMultiYearViewComponent, selector: "cmat-datetimepicker-multi-year-view", inputs: ["type", "dateFilter", "activeDate", "selected", "minDate", "maxDate"], outputs: ["userSelection", "selectedChange"], exportAs: ["cmatDatetimepickerMultiYearView"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: CmatDatetimepickerTimeComponent, selector: "cmat-datetimepicker-time", inputs: ["dateFilter", "interval", "AMPM", "twelvehour", "activeDate", "selected", "minDate", "maxDate", "clockView"], outputs: ["selectedChange", "activeDateChange", "userSelection", "ampmChange", "clockViewChange"], exportAs: ["cmatDatetimepickerTime"] }, { kind: "component", type: CmatDatetimepickerClockComponent, selector: "cmat-datetimepicker-clock", inputs: ["dateFilter", "interval", "twelvehour", "activeDate", "selected", "minDate", "maxDate", "startView"], outputs: ["userSelection", "selectedChange", "activeDateChange"], exportAs: ["cmatDatetimepickerClock"] }], animations: [slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
616
+ }
617
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: CmatDatetimepickerCalendarComponent, decorators: [{
618
+ type: Component,
619
+ args: [{ selector: 'cmat-datetimepicker-calendar', animations: [slideCalendar], host: {
620
+ // eslint-disable-next-line @typescript-eslint/naming-convention
621
+ '[class.cmat-datetimepicker-calendar-with-time-input]': 'timeInput',
622
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, exportAs: 'cmatDatetimepickerCalendar', imports: [NgIf, NgSwitch, MatButtonModule, NgSwitchCase, CmatDatetimepickerMonthViewComponent,
623
+ CmatDatetimepickerYearViewComponent, CmatDatetimepickerMultiYearViewComponent, NgSwitchDefault,
624
+ CmatDatetimepickerTimeComponent, CmatDatetimepickerClockComponent], template: "<div class=\"cmat-datetimepicker-calendar-header\">\r\n <div role=\"presentation\" *ngIf=\"type !== 'time'\" class=\"cmat-datetimepicker-calendar-header-year header-button\"\r\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\" [attr.aria-label]=\"yearButtonLabel\"\r\n (click)=\"yearClicked()\">\r\n <span class=\"font-medium\">{{ yearButtonText }}</span>\r\n <svg *ngIf=\"multiYearSelector || type === 'year'\" class=\"cmat-datetimepicker-calendar-header-year-dropdown\"\r\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M7,10L12,15L17,10H7Z\"></path>\r\n </svg>\r\n </div>\r\n <div *ngIf=\"type !== 'year'\" class=\"cmat-datetimepicker-calendar-header-date-time\">\r\n <div role=\"presentation\" *ngIf=\"type !== 'time'\" class=\"cmat-datetimepicker-calendar-header-date header-button\"\r\n [class.active]=\"currentView === 'month'\" [class.not-clickable]=\"type === 'month'\"\r\n [attr.aria-label]=\"dateButtonLabel\" (click)=\"dateClicked()\">{{ dateButtonText }}</div>\r\n <span *ngIf=\"type.endsWith('time')\" class=\"cmat-datetimepicker-calendar-header-time\"\r\n [class.active]=\"currentView === 'clock'\">\r\n <span class=\"cmat-datetimepicker-calendar-header-hour-minute-container flex place-items-center\">\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-hours header-button\"\r\n [class.active]=\"clockView === 'hour'\" [attr.aria-label]=\"hourButtonLabel\" (click)=\"hoursClicked()\">\r\n {{ hoursButtonText }}</div>\r\n <span class=\"cmat-datetimepicker-calendar-header-hour-minute-separator\">&#58;</span>\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-minutes header-button\"\r\n [class.active]=\"clockView === 'minute'\" [attr.aria-label]=\"minuteButtonLabel\"\r\n (click)=\"minutesClicked()\">{{ minutesButtonText }}</div>\r\n </span>\r\n <span *ngIf=\"twelvehour\" class=\"cmat-datetimepicker-calendar-header-ampm-container flex place-items-center\">\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-ampm header-button\"\r\n [class.active]=\"AMPM === 'AM'\" aria-label=\"AM\" (click)=\"ampmClicked('AM')\">AM</div>\r\n <div role=\"presentation\" class=\"cmat-datetimepicker-calendar-header-ampm header-button\"\r\n [class.active]=\"AMPM === 'PM'\" aria-label=\"PM\" (click)=\"ampmClicked('PM')\">PM</div>\r\n </span>\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<div class=\"cmat-datetimepicker-calendar-content\" [ngSwitch]=\"currentView\">\r\n <div *ngIf=\"currentView === 'month' || currentView === 'year' || currentView === 'multi-year'\"\r\n class=\"cmat-datetimepickermonth-content\">\r\n <div class=\"cmat-datetimepicker-calendar-controls\">\r\n <button type=\"button\" mat-icon-button type=\"button\" class=\"cmat-datetimepicker-calendar-previous-button\"\r\n [class.disabled]=\"!previousEnabled()\" [attr.aria-disabled]=\"!previousEnabled()\"\r\n [attr.aria-label]=\"prevButtonLabel\" (click)=\"previousClicked()\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path>\r\n </svg>\r\n </button>\r\n <div class=\"cmat-datetimepicker-calendar-period-button text-default font-medium\"\r\n [@slideCalendar]=\"calendarState\" (@slideCalendar.done)=\"calendarStateDone()\">\r\n <strong>{{ yearPeriodText }}</strong>\r\n </div>\r\n <button type=\"button\" mat-icon-button type=\"button\" class=\"cmat-datetimepicker-calendar-next-button\"\r\n [class.disabled]=\"!nextEnabled()\" [attr.aria-disabled]=\"!nextEnabled()\"\r\n [attr.aria-label]=\"nextButtonLabel\" (click)=\"nextClicked()\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <cmat-datetimepicker-month-view *ngSwitchCase=\"'month'\" (userSelection)=\"userSelected()\"\r\n (selectedChange)=\"dateSelected($event)\" [activeDate]=\"activeDate\" [dateFilter]=\"dateFilterForViews\"\r\n [selected]=\"selected!\" [type]=\"type\">\r\n </cmat-datetimepicker-month-view>\r\n <cmat-datetimepicker-year-view *ngSwitchCase=\"'year'\" (userSelection)=\"userSelected()\"\r\n (selectedChange)=\"monthSelected($event)\" [activeDate]=\"activeDate\" [dateFilter]=\"dateFilterForViews\"\r\n [selected]=\"selected!\" [type]=\"type\">\r\n </cmat-datetimepicker-year-view>\r\n <cmat-datetimepicker-multi-year-view *ngSwitchCase=\"'multi-year'\" (userSelection)=\"userSelected()\"\r\n (selectedChange)=\"yearSelected($event)\" [activeDate]=\"activeDate\" [dateFilter]=\"dateFilterForViews\"\r\n [maxDate]=\"maxDate\" [minDate]=\"minDate\" [selected]=\"selected!\" [type]=\"type\">\r\n </cmat-datetimepicker-multi-year-view>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <cmat-datetimepicker-time *ngIf=\"timeInput; else clock\" (userSelection)=\"userSelected()\"\r\n (activeDateChange)=\"onActiveDateChange($event)\" (selectedChange)=\"timeSelected($event)\" [AMPM]=\"AMPM\"\r\n (ampmChange)=\"ampmClicked($event)\" [clockView]=\"clockView\" (clockViewChange)=\"clockView = $event\"\r\n [twelvehour]=\"twelvehour\" [dateFilter]=\"dateFilter\" [interval]=\"timeInterval\" [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\" [selected]=\"activeDate\">\r\n </cmat-datetimepicker-time>\r\n\r\n <ng-template #clock>\r\n <cmat-datetimepicker-clock (userSelection)=\"userSelected()\" (activeDateChange)=\"onActiveDateChange($event)\"\r\n (selectedChange)=\"dialTimeSelected($event)\" [dateFilter]=\"dateFilter\" [interval]=\"timeInterval\"\r\n [maxDate]=\"maxDate\" [minDate]=\"minDate\" [selected]=\"activeDate\" [startView]=\"clockView\"\r\n [twelvehour]=\"twelvehour\">\r\n </cmat-datetimepicker-clock>\r\n </ng-template>\r\n </ng-container>\r\n</div>", styles: [".cmat-datetimepicker-calendar{display:block;outline:none}.cmat-datetimepicker-calendar-header{box-sizing:border-box;padding:8px;border-radius:4px 4px 0 0}.cmat-datetimepicker-calendar-header .header-button{color:#fff!important;padding:0 4px;font-size:inherit;white-space:normal;word-break:break-word;font-weight:500;cursor:pointer}.cmat-datetimepicker-calendar-header-year.header-button{font-size:26px;line-height:24px}.cmat-datetimepicker-calendar-header-date-time{font-size:24px;line-height:36px;display:flex;flex-direction:row}.cmat-datetimepicker-calendar-header-year:not(.active),.cmat-datetimepicker-calendar-header-date:not(.active),.cmat-datetimepicker-calendar-header-hours:not(.active),.cmat-datetimepicker-calendar-header-minutes:not(.active),.cmat-datetimepicker-calendar-header-ampm:not(.active){opacity:.6}.cmat-datetimepicker-calendar-header-year.not-clickable,.cmat-datetimepicker-calendar-header-date.not-clickable,.cmat-datetimepicker-calendar-header-hours.not-clickable,.cmat-datetimepicker-calendar-header-minutes.not-clickable,.cmat-datetimepicker-calendar-header-ampm.not-clickable{cursor:initial}.cmat-datetimepicker-calendar-header-time{display:inline-flex}.cmat-datetimepicker-calendar-header-time:not(.active){opacity:.6}.cmat-datetimepicker-calendar-header-time:not(.active) .cmat-datetimepicker-calendar-header-hours,.cmat-datetimepicker-calendar-header-time:not(.active) .cmat-datetimepicker-calendar-header-minutes,.cmat-datetimepicker-calendar-header-time:not(.active) .cmat-datetimepicker-calendar-header-ampm{opacity:1}.cmat-datetimepicker-calendar-header-hour-minute-separator{display:inline-block;width:8px;text-align:center}.cmat-datetimepicker-calendar-header-ampm-container{display:inline-flex;flex-direction:column;line-height:18px;font-size:12px}[mode=landscape] .cmat-datetimepicker-calendar{display:flex}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{width:150px;min-width:150px;padding:16px 8px;border-radius:4px 0 0 4px}[dir=rtl] [mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{border-radius:0 4px 4px 0}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-year+.cmat-datetimepicker-calendar-header-date-time,[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date+.cmat-datetimepicker-calendar-header-time{margin-top:12px}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date-time{font-size:28px;flex-direction:column}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-time{display:flex;flex-direction:column}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm-container{flex-direction:row;font-size:24px}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm{padding:4px}[mode=landscape] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm+.cmat-datetimepicker-calendar-header-ampm{margin:0 8px}@media all and (orientation: landscape){[mode=auto] .cmat-datetimepicker-calendar{display:flex}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{width:150px;min-width:150px;padding:16px 8px;border-radius:4px 0 0 4px}[dir=rtl] [mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header{border-radius:0 4px 4px 0}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-year+.cmat-datetimepicker-calendar-header-date-time,[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date+.cmat-datetimepicker-calendar-header-time{margin-top:12px}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-date-time{font-size:28px;flex-direction:column}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-time{display:flex;flex-direction:column}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm-container{flex-direction:row;font-size:24px}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm{padding:4px}[mode=auto] .cmat-datetimepicker-calendar .cmat-datetimepicker-calendar-header-ampm+.cmat-datetimepicker-calendar-header-ampm{margin:0 8px}}.cmat-datetimepicker-calendar-content{width:100%;padding:8px;outline:none;box-sizing:border-box;overflow:hidden}.cmat-datetimepicker-calendar-controls{display:flex;justify-content:space-between;margin:0 calc(4.7142857143% - 16px)}.cmat-datetimepicker-calendar-period-button{display:inline-block;height:40px;line-height:40px;outline:none;border:0;background:transparent;box-sizing:border-box}.cmat-datetimepicker-calendar-previous-button.disabled,.cmat-datetimepicker-calendar-next-button.disabled{pointer-events:none}.cmat-datetimepicker-calendar-previous-button svg,.cmat-datetimepicker-calendar-next-button svg{fill:currentColor;vertical-align:top}[dir=rtl] .cmat-datetimepicker-calendar-previous-button svg,[dir=rtl] .cmat-datetimepicker-calendar-next-button svg{transform:rotate(180deg)}.cmat-datetimepicker-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.cmat-datetimepicker-calendar-table-header th{text-align:center;padding:8px 0}\n"] }]
625
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.CmatDatetimepickerIntl }, { type: i0.NgZone }, { type: i2.DatetimeAdapter, decorators: [{
626
+ type: Optional
627
+ }] }, { type: undefined, decorators: [{
628
+ type: Optional
629
+ }, {
630
+ type: Inject,
631
+ args: [CMAT_DATETIME_FORMATS]
632
+ }] }, { type: i0.ChangeDetectorRef }], propDecorators: { userSelection: [{
633
+ type: Output
634
+ }], multiYearSelector: [{
635
+ type: Input
636
+ }], startView: [{
637
+ type: Input
638
+ }], twelvehour: [{
639
+ type: Input
640
+ }], timeInterval: [{
641
+ type: Input
642
+ }], dateFilter: [{
643
+ type: Input
644
+ }], preventSameDateTimeSelection: [{
645
+ type: Input
646
+ }], selectedChange: [{
647
+ type: Output
648
+ }], viewChanged: [{
649
+ type: Output
650
+ }], class: [{
651
+ type: HostBinding,
652
+ args: ['class']
653
+ }], label: [{
654
+ type: HostBinding,
655
+ args: ['attr.aria-label']
656
+ }], role: [{
657
+ type: HostBinding,
658
+ args: ['role']
659
+ }], tabindex: [{
660
+ type: HostBinding,
661
+ args: ['tabindex']
662
+ }], type: [{
663
+ type: Input
664
+ }], startAt: [{
665
+ type: Input
666
+ }], timeInput: [{
667
+ type: Input
668
+ }], selected: [{
669
+ type: Input
670
+ }], minDate: [{
671
+ type: Input
672
+ }], maxDate: [{
673
+ type: Input
674
+ }], handleCalendarBodyKeydown: [{
675
+ type: HostListener,
676
+ args: ['keydown', ['$event']]
677
+ }] } });
678
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbWF0L2NvbXBvbmVudHMvbWF0ZXJpYWwtZGF0ZXRpbWVwaWNrZXIvY2FsZW5kYXIudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbWF0L2NvbXBvbmVudHMvbWF0ZXJpYWwtZGF0ZXRpbWVwaWNrZXIvY2FsZW5kYXIuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04saUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEcsT0FBTyxFQUFFLHFCQUFxQixFQUF3QyxNQUFNLHlCQUF5QixDQUFDO0FBRXRHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDekQsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xF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LG1DQUFtQyxFQUFFLHdDQUF3QyxFQUFFLGVBQWU7d0JBQzlGLCtCQUErQixFQUFFLGdDQUFnQyxDQUFDOzswQkEyQ2pFLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCO3lFQXpDbkMsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFHRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNlLEtBQUs7c0JBQTFCLFdBQVc7dUJBQUMsT0FBTztnQkFDWSxLQUFLO3NCQUFwQyxXQUFXO3VCQUFDLGlCQUFpQjtnQkFDVCxJQUFJO3NCQUF4QixXQUFXO3VCQUFDLE1BQU07Z0JBQ00sUUFBUTtzQkFBaEMsV0FBVzt1QkFBQyxVQUFVO2dCQXFDbkIsSUFBSTtzQkFEUCxLQUFLO2dCQWVGLE9BQU87c0JBRFYsS0FBSztnQkFnQkYsU0FBUztzQkFEWixLQUFLO2dCQVdGLFFBQVE7c0JBRFgsS0FBSztnQkFZRixPQUFPO3NCQURWLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQW9KTix5QkFBeUI7c0JBRHhCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyQ29udGVudEluaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RCaW5kaW5nLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5wdXQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgc2xpZGVDYWxlbmRhciB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yIH0gZnJvbSAnLi9kYXRldGltZXBpY2tlci1lcnJvcnMnO1xyXG5pbXBvcnQgeyBDbWF0RGF0ZXRpbWVwaWNrZXJGaWx0ZXJUeXBlIH0gZnJvbSAnLi9kYXRldGltZXBpY2tlci1maWx0ZXJ0eXBlJztcclxuaW1wb3J0IHsgZ2V0QWN0aXZlT2Zmc2V0LCBpc1NhbWVNdWx0aVllYXJWaWV3LCB5ZWFyc1BlclBhZ2UsIHllYXJzUGVyUm93IH0gZnJvbSAnLi9tdWx0aS15ZWFyLXZpZXcnO1xyXG5pbXBvcnQgeyBDTUFUX0RBVEVUSU1FX0ZPUk1BVFMsIENtYXREYXRldGltZUZvcm1hdHMsIERhdGV0aW1lQWRhcHRlciB9IGZyb20gJ2NtYXQvY29tcG9uZW50cy9hZGFwdGVyJztcclxuaW1wb3J0IHsgQ21hdEFNUE0sIENtYXRDYWxlbmRhclZpZXcsIENtYXRDbG9ja1ZpZXcsIENtYXREYXRldGltZXBpY2tlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLXR5cGVzJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQ21hdERhdGV0aW1lcGlja2VySW50bCB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItaW50bCc7XHJcbmltcG9ydCB7IENtYXREYXRldGltZXBpY2tlckNsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9jbG9jayc7XHJcbmltcG9ydCB7IENtYXREYXRldGltZXBpY2tlclRpbWVDb21wb25lbnQgfSBmcm9tICcuL3RpbWUnO1xyXG5pbXBvcnQgeyBDbWF0RGF0ZXRpbWVwaWNrZXJNdWx0aVllYXJWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9tdWx0aS15ZWFyLXZpZXcnO1xyXG5pbXBvcnQgeyBDbWF0RGF0ZXRpbWVwaWNrZXJZZWFyVmlld0NvbXBvbmVudCB9IGZyb20gJy4veWVhci12aWV3JztcclxuaW1wb3J0IHsgQ21hdERhdGV0aW1lcGlja2VyTW9udGhWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9tb250aC12aWV3JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdTd2l0Y2hEZWZhdWx0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbi8qKlxyXG4gKiBBIGNhbGVuZGFyIHRoYXQgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBkYXRlcGlja2VyLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhci5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWydjYWxlbmRhci5zY3NzJ10sXHJcbiAgICBhbmltYXRpb25zOiBbc2xpZGVDYWxlbmRhcl0sXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcclxuICAgIGhvc3Q6IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICAgICAgJ1tjbGFzcy5jbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLXdpdGgtdGltZS1pbnB1dF0nOiAndGltZUlucHV0JyxcclxuICAgIH0sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgZXhwb3J0QXM6ICdjbWF0RGF0ZXRpbWVwaWNrZXJDYWxlbmRhcicsXHJcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmdTd2l0Y2gsIE1hdEJ1dHRvbk1vZHVsZSwgTmdTd2l0Y2hDYXNlLCBDbWF0RGF0ZXRpbWVwaWNrZXJNb250aFZpZXdDb21wb25lbnQsXHJcbiAgICAgICAgQ21hdERhdGV0aW1lcGlja2VyWWVhclZpZXdDb21wb25lbnQsIENtYXREYXRldGltZXBpY2tlck11bHRpWWVhclZpZXdDb21wb25lbnQsIE5nU3dpdGNoRGVmYXVsdCxcclxuICAgICAgICBDbWF0RGF0ZXRpbWVwaWNrZXJUaW1lQ29tcG9uZW50LCBDbWF0RGF0ZXRpbWVwaWNrZXJDbG9ja0NvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENtYXREYXRldGltZXBpY2tlckNhbGVuZGFyQ29tcG9uZW50PEQ+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBPdXRwdXQoKSB1c2VyU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gICAgLyoqIEFjdGl2ZSBtdWx0aSB5ZWFyIHZpZXcgd2hlbiBjbGljayBvbiB5ZWFyLiAqL1xyXG4gICAgQElucHV0KCkgbXVsdGlZZWFyU2VsZWN0b3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBzaG91bGQgYmUgc3RhcnRlZCBpbiBtb250aCBvciB5ZWFyIHZpZXcuICovXHJcbiAgICBASW5wdXQoKSBzdGFydFZpZXc6IENtYXRDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xyXG4gICAgQElucHV0KCkgdHdlbHZlaG91cjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdGltZUludGVydmFsOiBudW1iZXIgPSAxO1xyXG4gICAgLyoqIEEgZnVuY3Rpb24gdXNlZCB0byBmaWx0ZXIgd2hpY2ggZGF0ZXMgYXJlIHNlbGVjdGFibGUuICovXHJcbiAgICBASW5wdXQoKSBkYXRlRmlsdGVyOiAoZGF0ZTogRCwgdHlwZTogQ21hdERhdGV0aW1lcGlja2VyRmlsdGVyVHlwZSkgPT4gYm9vbGVhbjtcclxuXHJcbiAgICAvKiogUHJldmVudCB1c2VyIHRvIHNlbGVjdCBzYW1lIGRhdGUgdGltZSAqL1xyXG4gICAgQElucHV0KCkgcHJldmVudFNhbWVEYXRlVGltZVNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlIGNoYW5nZXMuICovXHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcclxuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSB2aWV3IGhhcyBiZWVuIGNoYW5nZWQuICoqL1xyXG4gICAgQE91dHB1dCgpIHZpZXdDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Q21hdENhbGVuZGFyVmlldz4gPSBuZXcgRXZlbnRFbWl0dGVyPENtYXRDYWxlbmRhclZpZXc+KCk7XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3MgPSAnY21hdC1kYXRldGltZXBpY2tlci1jYWxlbmRhcic7XHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbCcpIGxhYmVsID0gJ2FyaWFMYWJlbCc7XHJcbiAgICBASG9zdEJpbmRpbmcoJ3JvbGUnKSByb2xlID0gJ2RpYWxvZyc7XHJcbiAgICBASG9zdEJpbmRpbmcoJ3RhYmluZGV4JykgdGFiaW5kZXggPSAwO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgIEFNUE06IENtYXRBTVBNO1xyXG4gICAgY2xvY2tWaWV3OiBDbWF0Q2xvY2tWaWV3ID0gJ2hvdXInO1xyXG4gICAgY2FsZW5kYXJTdGF0ZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBpcyBpbiBtb250aCB2aWV3LiAqL1xyXG4gICAgcHJpdmF0ZSBfY3VycmVudFZpZXc6IENtYXRDYWxlbmRhclZpZXc7XHJcbiAgICBwcml2YXRlIF9pbnRsQ2hhbmdlczogU3Vic2NyaXB0aW9uO1xyXG4gICAgcHJpdmF0ZSBfY2xhbXBlZEFjdGl2ZURhdGU6IEQ7XHJcbiAgICBwcml2YXRlIF90eXBlOiBDbWF0RGF0ZXRpbWVwaWNrZXJUeXBlID0gJ2RhdGUnO1xyXG4gICAgcHJpdmF0ZSBfc3RhcnRBdDogRCB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZDogRCB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9taW5EYXRlOiBEIHwgbnVsbDtcclxuICAgIHByaXZhdGUgX21heERhdGU6IEQgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfdGltZUlucHV0ID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIF9pbnRsOiBDbWF0RGF0ZXRpbWVwaWNrZXJJbnRsLFxyXG4gICAgICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2FkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxEPixcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENNQVRfREFURVRJTUVfRk9STUFUUykgcHJpdmF0ZSBfZGF0ZUZvcm1hdHM6IENtYXREYXRldGltZUZvcm1hdHMsXHJcbiAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9hZGFwdGVyKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yKCdDRGF0ZXRpbWVBZGFwdGVyJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2RhdGVGb3JtYXRzKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yKCdDTUFUX0RBVEVUSU1FX0ZPUk1BVFMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2ludGxDaGFuZ2VzID0gX2ludGwuY2hhbmdlc1xyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IGNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHR5cGUoKTogQ21hdERhdGV0aW1lcGlja2VyVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHR5cGUodmFsdWU6IENtYXREYXRldGltZXBpY2tlclR5cGUpIHtcclxuICAgICAgICB0aGlzLl90eXBlID0gdmFsdWUgfHwgJ2RhdGUnO1xyXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICd5ZWFyJykge1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpWWVhclNlbGVjdG9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEEgZGF0ZSByZXByZXNlbnRpbmcgdGhlIHBlcmlvZCAobW9udGggb3IgeWVhcikgdG8gc3RhcnQgdGhlIGNhbGVuZGFyIGluLiAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgc3RhcnRBdCgpOiBEIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0QXQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHN0YXJ0QXQodmFsdWU6IEQgfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRBdCA9IHRoaXMuX2FkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGluIHRpbWUgbW9kZS4gSW4gdGltZSBtb2RlIHRoZSBjYWxlbmRhciBjbG9jayBnZXRzIHRpbWUgaW5wdXQgZWxlbWVudHMgcmF0aGVyIHRoZW4ganVzdCBjbG9ja1xyXG4gICAgICpcclxuICAgICAqIFdoZW4gdG91Y2hVaSBpcyBlbmFibGVkIHRoaXMgd2lsbCBiZSBkaXNhYmxlZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCB0aW1lSW5wdXQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVJbnB1dDtcclxuICAgIH1cclxuICAgIHNldCB0aW1lSW5wdXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl90aW1lSW5wdXQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUuICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzZWxlY3RlZCgpOiBEIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzZWxlY3RlZCh2YWx1ZTogRCB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2FkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWluRGF0ZSgpOiBEIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1pbkRhdGUodmFsdWU6IEQgfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWF4RGF0ZSgpOiBEIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1heERhdGUodmFsdWU6IEQgfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMuX2FkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGFjdGl2ZSBkYXRlLiBUaGlzIGRldGVybWluZXMgd2hpY2ggdGltZSBwZXJpb2QgaXMgc2hvd24gYW5kIHdoaWNoIGRhdGUgaXNcclxuICAgICAqIGhpZ2hsaWdodGVkIHdoZW4gdXNpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbi5cclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCBhY3RpdmVEYXRlKCk6IEQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgYWN0aXZlRGF0ZSh2YWx1ZTogRCkge1xyXG4gICAgICAgIGNvbnN0IG9sZEFjdGl2ZURhdGUgPSB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZTtcclxuICAgICAgICB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuY2xhbXBEYXRlKHZhbHVlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSk7XHJcbiAgICAgICAgaWYgKG9sZEFjdGl2ZURhdGUgJiYgdGhpcy5fY2xhbXBlZEFjdGl2ZURhdGUgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJyAmJlxyXG4gICAgICAgICAgICAhdGhpcy5fYWRhcHRlci5zYW1lTW9udGhBbmRZZWFyKG9sZEFjdGl2ZURhdGUsIHRoaXMuX2NsYW1wZWRBY3RpdmVEYXRlKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYWRhcHRlci5pc0luTmV4dE1vbnRoKG9sZEFjdGl2ZURhdGUsIHRoaXMuX2NsYW1wZWRBY3RpdmVEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQ2FsZW5kYXJTdGF0ZSgncmlnaHQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUNhbGVuZGFyU3RhdGUoJ2xlZnQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IGN1cnJlbnRWaWV3KCk6IENtYXRDYWxlbmRhclZpZXcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmlldztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY3VycmVudFZpZXcodmlldzogQ21hdENhbGVuZGFyVmlldykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRWaWV3ID0gdmlldztcclxuICAgICAgICB0aGlzLnZpZXdDaGFuZ2VkLmVtaXQodmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgY2FsZW5kYXIgdmlldy4gKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgeWVhckJ1dHRvblRleHQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRZZWFyTmFtZSh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgeWVhclBlcmlvZFRleHQoKTogc3RyaW5nIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtdWx0aS15ZWFyJykge1xyXG4gICAgICAgICAgICAvLyBUaGUgb2Zmc2V0IGZyb20gdGhlIGFjdGl2ZSB5ZWFyIHRvIHRoZSBcInNsb3RcIiBmb3IgdGhlIHN0YXJ0aW5nIHllYXIgaXMgdGhlXHJcbiAgICAgICAgICAgIC8vICphY3R1YWwqIGZpcnN0IHJlbmRlcmVkIHllYXIgaW4gdGhlIG11bHRpLXllYXIgdmlldywgYW5kIHRoZSBsYXN0IHllYXIgaXNcclxuICAgICAgICAgICAgLy8ganVzdCB5ZWFyc1BlclBhZ2UgLSAxIGF3YXkuXHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9hZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgbWluWWVhck9mUGFnZSA9IGFjdGl2ZVllYXIgLSBnZXRBY3RpdmVPZmZzZXQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLCB0aGlzLmFjdGl2ZURhdGUsIHRoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgbWF4WWVhck9mUGFnZSA9IG1pblllYXJPZlBhZ2UgKyB5ZWFyc1BlclBhZ2UgLSAxO1xyXG4gICAgICAgICAgICBjb25zdCBtaW5ZZWFyTmFtZSA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldFllYXJOYW1lKHRoaXMuX2FkYXB0ZXIuY3JlYXRlRGF0ZShtaW5ZZWFyT2ZQYWdlLCAwLCAxKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heFllYXJOYW1lID1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuZ2V0WWVhck5hbWUodGhpcy5fYWRhcHRlci5jcmVhdGVEYXRlKG1heFllYXJPZlBhZ2UsIDAsIDEpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGwuZm9ybWF0WWVhclJhbmdlKG1pblllYXJOYW1lLCBtYXhZZWFyTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/IHRoaXMuX2FkYXB0ZXIuZ2V0TW9udGhOYW1lcygnbG9uZycpW3RoaXMuX2FkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKV0gOlxyXG4gICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldFllYXJOYW1lKHRoaXMuYWN0aXZlRGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCB5ZWFyQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aVllYXJTZWxlY3RvclxyXG4gICAgICAgICAgICA/IHRoaXMuX2ludGwuc3dpdGNoVG9NdWx0aVllYXJWaWV3TGFiZWxcclxuICAgICAgICAgICAgOiB0aGlzLl9pbnRsLnN3aXRjaFRvWWVhclZpZXdMYWJlbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCBkYXRlQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKVt0aGlzLl9hZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSldO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZm9ybWF0KHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5fZGF0ZUZvcm1hdHMuZGlzcGxheS5wb3B1cEhlYWRlckRhdGVMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgZGF0ZUJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGwuc3dpdGNoVG9Nb250aFZpZXdMYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IGhvdXJzQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBob3VyID0gdGhpcy5fYWRhcHRlci5nZXRIb3VyKHRoaXMuYWN0aXZlRGF0ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMudHdlbHZlaG91cikge1xyXG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaG91ciA9IDI0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGhvdXIgPSBob3VyID4gMTIgPyAoaG91ciAtIDEyKSA6IGhvdXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl8yZGlnaXQoaG91cik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCBob3VyQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW50bC5zd2l0Y2hUb0Nsb2NrSG91clZpZXdMYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IG1pbnV0ZXNCdXR0b25UZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuXzJkaWdpdCh0aGlzLl9hZGFwdGVyLmdldE1pbnV0ZSh0aGlzLmFjdGl2ZURhdGUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IG1pbnV0ZUJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGwuc3dpdGNoVG9DbG9ja01pbnV0ZVZpZXdMYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IHByZXZCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fY3VycmVudFZpZXcpIHtcclxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGwucHJldk1vbnRoTGFiZWw7XHJcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGwucHJldlllYXJMYWJlbDtcclxuICAgICAgICAgICAgY2FzZSAnbXVsdGkteWVhcic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50bC5wcmV2TXVsdGlZZWFyTGFiZWw7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgbmV4dEJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLl9jdXJyZW50Vmlldykge1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50bC5uZXh0TW9udGhMYWJlbDtcclxuICAgICAgICAgICAgY2FzZSAneWVhcic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50bC5uZXh0WWVhckxhYmVsO1xyXG4gICAgICAgICAgICBjYXNlICdtdWx0aS15ZWFyJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnRsLm5leHRNdWx0aVllYXJMYWJlbDtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBoYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluTW9udGhWaWV3KGV2ZW50KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xyXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duSW5ZZWFyVmlldyhldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbXVsdGkteWVhcicpIHtcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluTXVsdGlZZWFyVmlldyhldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluQ2xvY2tWaWV3KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERhdGUgZmlsdGVyIGZvciB0aGUgbW9udGggYW5kIHllYXIgdmlld3MuICovXHJcbiAgICBkYXRlRmlsdGVyRm9yVmlld3MgPSAoZGF0ZTogRCk6IGJvb2xlYW4gPT4gISFkYXRlICYmXHJcbiAgICAgICAgKCF0aGlzLmRhdGVGaWx0ZXIgfHwgdGhpcy5kYXRlRmlsdGVyKGRhdGUsIENtYXREYXRldGltZXBpY2tlckZpbHRlclR5cGUuREFURSkpICYmXHJcbiAgICAgICAgKCF0aGlzLm1pbkRhdGUgfHwgdGhpcy5fYWRhcHRlci5jb21wYXJlRGF0ZShkYXRlLCB0aGlzLm1pbkRhdGUpID49IDApICYmXHJcbiAgICAgICAgKCF0aGlzLm1heERhdGUgfHwgdGhpcy5fYWRhcHRlci5jb21wYXJlRGF0ZShkYXRlLCB0aGlzLm1heERhdGUpIDw9IDApO1xyXG5cclxuICAgIHVzZXJTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJTZWxlY3Rpb24uZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLnN0YXJ0QXQgfHwgdGhpcy5fYWRhcHRlci50b2RheSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0QU1QTSh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmVDZWxsKCk7XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3llYXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnbXVsdGkteWVhcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtb250aCcpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICd5ZWFyJztcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB0aGlzLnN0YXJ0VmlldyB8fCAnbW9udGgnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbnRsQ2hhbmdlcy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIYW5kbGVzIGRhdGUgc2VsZWN0aW9uIGluIHRoZSBtb250aCB2aWV3LiAqL1xyXG4gICAgZGF0ZVNlbGVjdGVkKGRhdGU6IEQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9hZGFwdGVyLnNhbWVEYXRlKGRhdGUsIHRoaXMuc2VsZWN0ZWQpIHx8ICF0aGlzLnByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChkYXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IGRhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogSGFuZGxlcyBtb250aCBzZWxlY3Rpb24gaW4gdGhlIHllYXIgdmlldy4gKi9cclxuICAgIG1vbnRoU2VsZWN0ZWQobW9udGg6IEQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbW9udGgnKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fYWRhcHRlci5zYW1lTW9udGhBbmRZZWFyKG1vbnRoLCB0aGlzLnNlbGVjdGVkKSB8fCAhdGhpcy5wcmV2ZW50U2FtZURhdGVUaW1lU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5fYWRhcHRlci5nZXRGaXJzdERhdGVPZk1vbnRoKG1vbnRoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBtb250aDtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdtb250aCc7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvY2tWaWV3ID0gJ2hvdXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogSGFuZGxlcyB5ZWFyIHNlbGVjdGlvbiBpbiB0aGUgbXVsdGkgeWVhciB2aWV3LiAqL1xyXG4gICAgeWVhclNlbGVjdGVkKHllYXI6IEQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAneWVhcicpIHtcclxuICAgICAgICAgICAgaWYgKCh0aGlzLnNlbGVjdGVkICYmICF0aGlzLl9hZGFwdGVyLnNhbWVZZWFyKHllYXIsIHRoaXMuc2VsZWN0ZWQpKSB8fCAhdGhpcy5wcmV2ZW50U2FtZURhdGVUaW1lU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuY3JlYXRlRGF0ZXRpbWUodGhpcy5fYWRhcHRlci5nZXRZZWFyKHllYXIpLCAwLCAxLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChub3JtYWxpemVkRGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB5ZWFyO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ3llYXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aW1lU2VsZWN0ZWQoZGF0ZTogRCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMudXBkYXRlRGF0ZShkYXRlKTtcclxuICAgICAgICBpZiAoIXRoaXMuX2FkYXB0ZXIuc2FtZURhdGV0aW1lKGRhdGUsIHRoaXMuc2VsZWN0ZWQpIHx8ICF0aGlzLnByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGRhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaWFsVGltZVNlbGVjdGVkKGRhdGU6IEQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jbG9ja1ZpZXcgIT09ICdtaW51dGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMudXBkYXRlRGF0ZShkYXRlKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9ja1ZpZXcgPSAnbWludXRlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FkYXB0ZXIuc2FtZURhdGV0aW1lKGRhdGUsIHRoaXMuc2VsZWN0ZWQpIHx8ICF0aGlzLnByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChkYXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkFjdGl2ZURhdGVDaGFuZ2UoZGF0ZTogRCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRGF0ZShkYXRlOiBEKTogRCB7XHJcbiAgICAgICAgaWYgKHRoaXMudHdlbHZlaG91cikge1xyXG4gICAgICAgICAgICBjb25zdCBIT1VSID0gdGhpcy5fYWRhcHRlci5nZXRIb3VyKGRhdGUpO1xyXG4gICAgICAgICAgICBpZiAoSE9VUiA9PT0gMTIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkFNUE0gPT09ICdBTScpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckhvdXJzKGRhdGUsIC0xMik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5BTVBNID09PSAnUE0nKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckhvdXJzKGRhdGUsIDEyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBTVBNKGRhdGU6IEQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYWRhcHRlci5nZXRIb3VyKGRhdGUpID4gMTEpIHtcclxuICAgICAgICAgICAgdGhpcy5BTVBNID0gJ1BNJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkFNUE0gPSAnQU0nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbXBtQ2xpY2tlZChzb3VyY2U6IENtYXRBTVBNKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFZpZXcgPSAnY2xvY2snO1xyXG5cclxuICAgICAgICBpZiAoc291cmNlID09PSB0aGlzLkFNUE0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFNUE0gPSBzb3VyY2U7XHJcblxyXG4gICAgICAgIC8vIGlmIEFNUE0gY2hhbmdlZCBmcm9tIFBNIHRvIEFNIHN1YnN0cmFjdCAxMiBob3Vyc1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRIb3VyID0gdGhpcy5fYWRhcHRlci5nZXRIb3VyKHRoaXMuYWN0aXZlRGF0ZSk7XHJcbiAgICAgICAgbGV0IG5ld0hvdXJWYWx1ZTogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLkFNUE0gPT09ICdBTScpIHtcclxuICAgICAgICAgICAgbmV3SG91clZhbHVlID0gY3VycmVudEhvdXIgPj0gMTIgPyB0aGlzLl9hZGFwdGVyLmdldEhvdXIodGhpcy5hY3RpdmVEYXRlKSAtIDEyIDogMTI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG90aGVyd2lzZSBhZGQgMTIgaG91cnNcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbmV3SG91clZhbHVlID0gKGN1cnJlbnRIb3VyICsgMTIpICUgMjQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmNyZWF0ZURhdGV0aW1lKFxyXG4gICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKSxcclxuICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpLFxyXG4gICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldERhdGUodGhpcy5hY3RpdmVEYXRlKSxcclxuICAgICAgICAgICAgbmV3SG91clZhbHVlLFxyXG4gICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldE1pbnV0ZSh0aGlzLmFjdGl2ZURhdGUpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFyQ2xpY2tlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAneWVhcicgfHwgdGhpcy5tdWx0aVllYXJTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ211bHRpLXllYXInO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XHJcbiAgICB9XHJcblxyXG4gICAgZGF0ZUNsaWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ21vbnRoJykge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ21vbnRoJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaG91cnNDbGlja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xyXG4gICAgICAgIHRoaXMuY2xvY2tWaWV3ID0gJ2hvdXInO1xyXG4gICAgfVxyXG5cclxuICAgIG1pbnV0ZXNDbGlja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xyXG4gICAgICAgIHRoaXMuY2xvY2tWaWV3ID0gJ21pbnV0ZSc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhhbmRsZXMgdXNlciBjbGlja3Mgb24gdGhlIHByZXZpb3VzIGJ1dHRvbi4gKi9cclxuICAgIHByZXZpb3VzQ2xpY2tlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnID9cclxuICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIC0xKSA6XHJcbiAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyhcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInID8gLTEgOiAteWVhcnNQZXJQYWdlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhhbmRsZXMgdXNlciBjbGlja3Mgb24gdGhlIG5leHQgYnV0dG9uLiAqL1xyXG4gICAgbmV4dENsaWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/XHJcbiAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5hY3RpdmVEYXRlLCAxKSA6XHJcbiAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyhcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInID8gMSA6IHllYXJzUGVyUGFnZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBwZXJpb2QgYnV0dG9uIGlzIGVuYWJsZWQuICovXHJcbiAgICBwcmV2aW91c0VuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1pbkRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhdGhpcy5taW5EYXRlIHx8ICF0aGlzLl9pc1NhbWVWaWV3KHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5taW5EYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogV2hldGhlciB0aGUgbmV4dCBwZXJpb2QgYnV0dG9uIGlzIGVuYWJsZWQuICovXHJcbiAgICBuZXh0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMubWF4RGF0ZSB8fCAhdGhpcy5faXNTYW1lVmlldyh0aGlzLmFjdGl2ZURhdGUsIHRoaXMubWF4RGF0ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZvY3VzQWN0aXZlQ2VsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUuYXNPYnNlcnZhYmxlKCkucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGVuZGFyU3RhdGVEb25lKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTdGF0ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogV2hldGhlciB0aGUgdHdvIGRhdGVzIHJlcHJlc2VudCB0aGUgc2FtZSB2aWV3IGluIHRoZSBjdXJyZW50IHZpZXcgbW9kZSAobW9udGggb3IgeWVhcikuICovXHJcbiAgICBwcml2YXRlIF9pc1NhbWVWaWV3KGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldFllYXIoZGF0ZTEpID09PSB0aGlzLl9hZGFwdGVyLmdldFllYXIoZGF0ZTIpICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldE1vbnRoKGRhdGUxKSA9PT0gdGhpcy5fYWRhcHRlci5nZXRNb250aChkYXRlMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0WWVhcihkYXRlMSkgPT09IHRoaXMuX2FkYXB0ZXIuZ2V0WWVhcihkYXRlMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE90aGVyd2lzZSB3ZSBhcmUgaW4gJ211bHRpLXllYXInIHZpZXcuXHJcbiAgICAgICAgcmV0dXJuIGlzU2FtZU11bHRpWWVhclZpZXcoXHJcbiAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIsIGRhdGUxLCBkYXRlMiwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIYW5kbGVzIGtleWRvd24gZXZlbnRzIG9uIHRoZSBjYWxlbmRhciBib2R5IHdoZW4gY2FsZW5kYXIgaXMgaW4gbW9udGggdmlldy4gKi9cclxuICAgIHByaXZhdGUgX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd25Jbk1vbnRoVmlldyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5hY3RpdmVEYXRlLCAtMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLmFjdGl2ZURhdGUsIDEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5hY3RpdmVEYXRlLCAtNyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuYWN0aXZlRGF0ZSwgNyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnSG9tZSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLmFjdGl2ZURhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgMSAtIHRoaXMuX2FkYXB0ZXIuZ2V0RGF0ZSh0aGlzLmFjdGl2ZURhdGUpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFbmQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5hY3RpdmVEYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLl9hZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHRoaXMuYWN0aXZlRGF0ZSkgLVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmdldERhdGUodGhpcy5hY3RpdmVEYXRlKSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VVcCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBldmVudC5hbHRLZXkgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLmFjdGl2ZURhdGUsIC0xKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIC0xKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdQYWdlRG93bic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBldmVudC5hbHRLZXkgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLmFjdGl2ZURhdGUsIDEpIDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuYWN0aXZlRGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlckZvclZpZXdzKHRoaXMuYWN0aXZlRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTZWxlY3RlZCh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIC8vIERvbid0IHByZXZlbnQgZGVmYXVsdCBvciBmb2N1cyBhY3RpdmUgY2VsbCBvbiBrZXlzIHRoYXQgd2UgZG9uJ3QgZXhwbGljaXRseSBoYW5kbGUuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IHVuZXhwZWN0ZWQgZGVmYXVsdCBhY3Rpb25zIHN1Y2ggYXMgZm9ybSBzdWJtaXNzaW9uLlxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGNhbGVuZGFyIGJvZHkgd2hlbiBjYWxlbmRhciBpcyBpbiB5ZWFyIHZpZXcuICovXHJcbiAgICBwcml2YXRlIF9oYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duSW5ZZWFyVmlldyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIC0xKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5hY3RpdmVEYXRlLCAxKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX3ByZXZNb250aEluU2FtZUNvbCh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9uZXh0TW9udGhJblNhbWVDb2wodGhpcy5hY3RpdmVEYXRlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5hY3RpdmVEYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIC10aGlzLl9hZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0VuZCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAxMSAtIHRoaXMuX2FkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnUGFnZVVwJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuYWN0aXZlRGF0ZSwgZXZlbnQuYWx0S2V5ID8gLTEwIDogLTEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuYWN0aXZlRGF0ZSwgZXZlbnQuYWx0S2V5ID8gMTAgOiAxKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQodGhpcy5hY3RpdmVEYXRlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IG9yIGZvY3VzIGFjdGl2ZSBjZWxsIG9uIGtleXMgdGhhdCB3ZSBkb24ndCBleHBsaWNpdGx5IGhhbmRsZS5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogSGFuZGxlcyBrZXlkb3duIGV2ZW50cyBvbiB0aGUgY2FsZW5kYXIgYm9keSB3aGVuIGNhbGVuZGFyIGlzIGluIG11bHRpLXllYXIgdmlldy4gKi9cclxuICAgIHByaXZhdGUgX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd25Jbk11bHRpWWVhclZpZXcoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLmFjdGl2ZURhdGUsIC0xKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLmFjdGl2ZURhdGUsIDEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuYWN0aXZlRGF0ZSwgLXllYXJzUGVyUm93KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuYWN0aXZlRGF0ZSwgeWVhcnNQZXJSb3cpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0hvbWUnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAtZ2V0QWN0aXZlT2Zmc2V0KHRoaXMuX2FkYXB0ZXIsIHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFbmQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuYWN0aXZlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyc1BlclBhZ2UgLSBnZXRBY3RpdmVPZmZzZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIsIHRoaXMuYWN0aXZlRGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnUGFnZVVwJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUsIGV2ZW50LmFsdEtleSA/IC15ZWFyc1BlclBhZ2UgKiAxMCA6IC15ZWFyc1BlclBhZ2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUsIGV2ZW50LmFsdEtleSA/IHllYXJzUGVyUGFnZSAqIDEwIDogeWVhcnNQZXJQYWdlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnllYXJTZWxlY3RlZCh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBwcmV2ZW50IGRlZmF1bHQgb3IgZm9jdXMgYWN0aXZlIGNlbGwgb24ga2V5cyB0aGF0IHdlIGRvbid0IGV4cGxpY2l0bHkgaGFuZGxlLlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogSGFuZGxlcyBrZXlkb3duIGV2ZW50cyBvbiB0aGUgY2FsZW5kYXIgYm9keSB3aGVuIGNhbGVuZGFyIGlzIGluIG1vbnRoIHZpZXcuICovXHJcbiAgICBwcml2YXRlIF9oYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duSW5DbG9ja1ZpZXcoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmNsb2NrVmlldyA9PT0gJ2hvdXInID9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFySG91cnModGhpcy5hY3RpdmVEYXRlLCAxKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1pbnV0ZXModGhpcy5hY3RpdmVEYXRlLCB0aGlzLnRpbWVJbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaG91cnMgY2hhbmdlZCB0aGUgYW0vcG0gd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgQU0vUE1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QU1QTSh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmNsb2NrVmlldyA9PT0gJ2hvdXInID9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFySG91cnModGhpcy5hY3RpdmVEYXRlLCAtMSkgOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNaW51dGVzKHRoaXMuYWN0aXZlRGF0ZSwgLXRoaXMudGltZUludGVydmFsKTtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBob3VycyBjaGFuZ2VkIHRoZSBhbS9wbSB3ZSBzaG91bGQgdXBkYXRlIHRoZSBBTS9QTVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBTVBNKHRoaXMuYWN0aXZlRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVJbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbFRpbWVTZWxlY3RlZCh0aGlzLmFjdGl2ZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IG9yIGZvY3VzIGFjdGl2ZSBjZWxsIG9uIGtleXMgdGhhdCB3ZSBkb24ndCBleHBsaWNpdGx5IGhhbmRsZS5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSB0aGUgZGF0ZSBmb3IgdGhlIG1vbnRoIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBnaXZlbiBtb250aCBpbiB0aGUgc2FtZSBjb2x1bW4gaW4gdGhlXHJcbiAgICAgKiBjYWxlbmRhciB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfcHJldk1vbnRoSW5TYW1lQ29sKGRhdGU6IEQpOiBEIHtcclxuICAgICAgICAvLyBEZXRlcm1pbmUgaG93IG1hbnkgbW9udGhzIHRvIGp1bXAgZm9yd2FyZCBnaXZlbiB0aGF0IHRoZXJlIGFyZSAyIGVtcHR5IHNsb3RzIGF0IHRoZSBiZWdpbm5pbmdcclxuICAgICAgICAvLyBvZiBlYWNoIHllYXIuXHJcbiAgICAgICAgY29uc3QgaW5jcmVtZW50ID0gdGhpcy5fYWRhcHRlci5nZXRNb250aChkYXRlKSA8PSA0ID8gLTUgOlxyXG4gICAgICAgICAgICAodGhpcy5fYWRhcHRlci5nZXRNb250aChkYXRlKSA+PSA3ID8gLTcgOiAtMTIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKGRhdGUsIGluY3JlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgdGhlIGRhdGUgZm9yIHRoZSBtb250aCB0aGF0IGNvbWVzIGFmdGVyIHRoZSBnaXZlbiBtb250aCBpbiB0aGUgc2FtZSBjb2x1bW4gaW4gdGhlXHJcbiAgICAgKiBjYWxlbmRhciB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbmV4dE1vbnRoSW5TYW1lQ29sKGRhdGU6IEQpOiBEIHtcclxuICAgICAgICAvLyBEZXRlcm1pbmUgaG93IG1hbnkgbW9udGhzIHRvIGp1bXAgZm9yd2FyZCBnaXZlbiB0aGF0IHRoZXJlIGFyZSAyIGVtcHR5IHNsb3RzIGF0IHRoZSBiZWdpbm5pbmdcclxuICAgICAgICAvLyBvZiBlYWNoIHllYXIuXHJcbiAgICAgICAgY29uc3QgaW5jcmVtZW50ID0gdGhpcy5fYWRhcHRlci5nZXRNb250aChkYXRlKSA8PSA0ID8gNyA6XHJcbiAgICAgICAgICAgICh0aGlzLl9hZGFwdGVyLmdldE1vbnRoKGRhdGUpID49IDcgPyA1IDogMTIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKGRhdGUsIGluY3JlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlQ2FsZW5kYXJTdGF0ZShkaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTdGF0ZSA9IGRpcmVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF8yZGlnaXQobjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gKCcwMCcgKyBuKS5zbGljZSgtMik7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXItaGVhZGVyXCI+XHJcbiAgICA8ZGl2IHJvbGU9XCJwcmVzZW50YXRpb25cIiAqbmdJZj1cInR5cGUgIT09ICd0aW1lJ1wiIGNsYXNzPVwiY21hdC1kYXRldGltZXBpY2tlci1jYWxlbmRhci1oZWFkZXIteWVhciBoZWFkZXItYnV0dG9uXCJcclxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRWaWV3ID09PSAneWVhcicgfHwgY3VycmVudFZpZXcgPT09ICdtdWx0aS15ZWFyJ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwieWVhckJ1dHRvbkxhYmVsXCJcclxuICAgICAgICAoY2xpY2spPVwieWVhckNsaWNrZWQoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1tZWRpdW1cIj57eyB5ZWFyQnV0dG9uVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwibXVsdGlZZWFyU2VsZWN0b3IgfHwgdHlwZSA9PT0gJ3llYXInXCIgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLWhlYWRlci15ZWFyLWRyb3Bkb3duXCJcclxuICAgICAgICAgICAgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk03LDEwTDEyLDE1TDE3LDEwSDdaXCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidHlwZSAhPT0gJ3llYXInXCIgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLWhlYWRlci1kYXRlLXRpbWVcIj5cclxuICAgICAgICA8ZGl2IHJvbGU9XCJwcmVzZW50YXRpb25cIiAqbmdJZj1cInR5cGUgIT09ICd0aW1lJ1wiIGNsYXNzPVwiY21hdC1kYXRldGltZXBpY2tlci1jYWxlbmRhci1oZWFkZXItZGF0ZSBoZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjdXJyZW50VmlldyA9PT0gJ21vbnRoJ1wiIFtjbGFzcy5ub3QtY2xpY2thYmxlXT1cInR5cGUgPT09ICdtb250aCdcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRhdGVCdXR0b25MYWJlbFwiIChjbGljayk9XCJkYXRlQ2xpY2tlZCgpXCI+e3sgZGF0ZUJ1dHRvblRleHQgfX08L2Rpdj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cInR5cGUuZW5kc1dpdGgoJ3RpbWUnKVwiIGNsYXNzPVwiY21hdC1kYXRldGltZXBpY2tlci1jYWxlbmRhci1oZWFkZXItdGltZVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFZpZXcgPT09ICdjbG9jaydcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLWhlYWRlci1ob3VyLW1pbnV0ZS1jb250YWluZXIgZmxleCBwbGFjZS1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwiY21hdC1kYXRldGltZXBpY2tlci1jYWxlbmRhci1oZWFkZXItaG91cnMgaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjbG9ja1ZpZXcgPT09ICdob3VyJ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiaG91ckJ1dHRvbkxhYmVsXCIgKGNsaWNrKT1cImhvdXJzQ2xpY2tlZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgaG91cnNCdXR0b25UZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXItaGVhZGVyLWhvdXItbWludXRlLXNlcGFyYXRvclwiPiYjNTg7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiByb2xlPVwicHJlc2VudGF0aW9uXCIgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLWhlYWRlci1taW51dGVzIGhlYWRlci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY2xvY2tWaWV3ID09PSAnbWludXRlJ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwibWludXRlQnV0dG9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtaW51dGVzQ2xpY2tlZCgpXCI+e3sgbWludXRlc0J1dHRvblRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInR3ZWx2ZWhvdXJcIiBjbGFzcz1cImNtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXItaGVhZGVyLWFtcG0tY29udGFpbmVyIGZsZXggcGxhY2UtaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cImNtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXItaGVhZGVyLWFtcG0gaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJBTVBNID09PSAnQU0nXCIgYXJpYS1sYWJlbD1cIkFNXCIgKGNsaWNrKT1cImFtcG1DbGlja2VkKCdBTScpXCI+QU08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwiY21hdC1kYXRldGltZXBpY2tlci1jYWxlbmRhci1oZWFkZXItYW1wbSBoZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIkFNUE0gPT09ICdQTSdcIiBhcmlhLWxhYmVsPVwiUE1cIiAoY2xpY2spPVwiYW1wbUNsaWNrZWQoJ1BNJylcIj5QTTwvZGl2PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImNtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXItY29udGVudFwiIFtuZ1N3aXRjaF09XCJjdXJyZW50Vmlld1wiPlxyXG4gICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnbW9udGgnIHx8IGN1cnJlbnRWaWV3ID09PSAneWVhcicgfHwgY3VycmVudFZpZXcgPT09ICdtdWx0aS15ZWFyJ1wiXHJcbiAgICAgICAgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VybW9udGgtY29udGVudFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIXByZXZpb3VzRW5hYmxlZCgpXCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhcHJldmlvdXNFbmFibGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwcmV2QnV0dG9uTGFiZWxcIiAoY2xpY2spPVwicHJldmlvdXNDbGlja2VkKClcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbWF0LWRhdGV0aW1lcGlja2VyLWNhbGVuZGFyLXBlcmlvZC1idXR0b24gdGV4dC1kZWZhdWx0IGZvbnQtbWVkaXVtXCJcclxuICAgICAgICAgICAgICAgIFtAc2xpZGVDYWxlbmRhcl09XCJjYWxlbmRhclN0YXRlXCIgKEBzbGlkZUNhbGVuZGFyLmRvbmUpPVwiY2FsZW5kYXJTdGF0ZURvbmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz57eyB5ZWFyUGVyaW9kVGV4dCB9fTwvc3Ryb25nPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNtYXQtZGF0ZXRpbWVwaWNrZXItY2FsZW5kYXItbmV4dC1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFuZXh0RW5hYmxlZCgpXCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhbmV4dEVuYWJsZWQoKVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5leHRCdXR0b25MYWJlbFwiIChjbGljayk9XCJuZXh0Q2xpY2tlZCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGNtYXQtZGF0ZXRpbWVwaWNrZXItbW9udGgtdmlldyAqbmdTd2l0Y2hDYXNlPVwiJ21vbnRoJ1wiICh1c2VyU2VsZWN0aW9uKT1cInVzZXJTZWxlY3RlZCgpXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiZGF0ZVNlbGVjdGVkKCRldmVudClcIiBbYWN0aXZlRGF0ZV09XCJhY3RpdmVEYXRlXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlckZvclZpZXdzXCJcclxuICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWQhXCIgW3R5cGVdPVwidHlwZVwiPlxyXG4gICAgPC9jbWF0LWRhdGV0aW1lcGlja2VyLW1vbnRoLXZpZXc+XHJcbiAgICA8Y21hdC1kYXRldGltZXBpY2tlci15ZWFyLXZpZXcgKm5nU3dpdGNoQ2FzZT1cIid5ZWFyJ1wiICh1c2VyU2VsZWN0aW9uKT1cInVzZXJTZWxlY3RlZCgpXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwibW9udGhTZWxlY3RlZCgkZXZlbnQpXCIgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXJGb3JWaWV3c1wiXHJcbiAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkIVwiIFt0eXBlXT1cInR5cGVcIj5cclxuICAgIDwvY21hdC1kYXRldGltZXBpY2tlci15ZWFyLXZpZXc+XHJcbiAgICA8Y21hdC1kYXRldGltZXBpY2tlci1tdWx0aS15ZWFyLXZpZXcgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aS15ZWFyJ1wiICh1c2VyU2VsZWN0aW9uKT1cInVzZXJTZWxlY3RlZCgpXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwieWVhclNlbGVjdGVkKCRldmVudClcIiBbYWN0aXZlRGF0ZV09XCJhY3RpdmVEYXRlXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlckZvclZpZXdzXCJcclxuICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiIFtzZWxlY3RlZF09XCJzZWxlY3RlZCFcIiBbdHlwZV09XCJ0eXBlXCI+XHJcbiAgICA8L2NtYXQtZGF0ZXRpbWVwaWNrZXItbXVsdGkteWVhci12aWV3PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICA8Y21hdC1kYXRldGltZXBpY2tlci10aW1lICpuZ0lmPVwidGltZUlucHV0OyBlbHNlIGNsb2NrXCIgKHVzZXJTZWxlY3Rpb24pPVwidXNlclNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAoYWN0aXZlRGF0ZUNoYW5nZSk9XCJvbkFjdGl2ZURhdGVDaGFuZ2UoJGV2ZW50KVwiIChzZWxlY3RlZENoYW5nZSk9XCJ0aW1lU2VsZWN0ZWQoJGV2ZW50KVwiIFtBTVBNXT1cIkFNUE1cIlxyXG4gICAgICAgICAgICAoYW1wbUNoYW5nZSk9XCJhbXBtQ2xpY2tlZCgkZXZlbnQpXCIgW2Nsb2NrVmlld109XCJjbG9ja1ZpZXdcIiAoY2xvY2tWaWV3Q2hhbmdlKT1cImNsb2NrVmlldyA9ICRldmVudFwiXHJcbiAgICAgICAgICAgIFt0d2VsdmVob3VyXT1cInR3ZWx2ZWhvdXJcIiBbZGF0ZUZpbHRlcl09XCJkYXRlRmlsdGVyXCIgW2ludGVydmFsXT1cInRpbWVJbnRlcnZhbFwiIFttYXhEYXRlXT1cIm1heERhdGVcIlxyXG4gICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCIgW3NlbGVjdGVkXT1cImFjdGl2ZURhdGVcIj5cclxuICAgICAgICA8L2NtYXQtZGF0ZXRpbWVwaWNrZXItdGltZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNjbG9jaz5cclxuICAgICAgICAgICAgPGNtYXQtZGF0ZXRpbWVwaWNrZXItY2xvY2sgKHVzZXJTZWxlY3Rpb24pPVwidXNlclNlbGVjdGVkKClcIiAoYWN0aXZlRGF0ZUNoYW5nZSk9XCJvbkFjdGl2ZURhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiZGlhbFRpbWVTZWxlY3RlZCgkZXZlbnQpXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiIFtpbnRlcnZhbF09XCJ0aW1lSW50ZXJ2YWxcIlxyXG4gICAgICAgICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiIFttaW5EYXRlXT1cIm1pbkRhdGVcIiBbc2VsZWN0ZWRdPVwiYWN0aXZlRGF0ZVwiIFtzdGFydFZpZXddPVwiY2xvY2tWaWV3XCJcclxuICAgICAgICAgICAgICAgIFt0d2VsdmVob3VyXT1cInR3ZWx2ZWhvdXJcIj5cclxuICAgICAgICAgICAgPC9jbWF0LWRhdGV0aW1lcGlja2VyLWNsb2NrPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+Il19