cmat 0.0.6 → 0.0.8

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 (327) hide show
  1. package/components/adapter/dayjs-datetime-adapter.d.ts +1 -1
  2. package/components/breadcrumb/breadcrumb.service.d.ts +1 -1
  3. package/components/breadcrumb/public-api.d.ts +2 -0
  4. package/components/card/card.component.d.ts +1 -1
  5. package/components/card/public-api.d.ts +1 -0
  6. package/components/cascade/cascade-list/cascade-list.component.d.ts +45 -21
  7. package/components/cascade/public-api.d.ts +1 -0
  8. package/components/chip-input/chip-input.component.d.ts +39 -12
  9. package/components/custom-formly/extension/addons.extension.d.ts +2 -0
  10. package/components/custom-formly/index.d.ts +5 -0
  11. package/components/custom-formly/public-api.d.ts +21 -0
  12. package/components/custom-formly/types/button/button.component.d.ts +18 -0
  13. package/components/custom-formly/types/checklist/checklist.component.d.ts +41 -0
  14. package/components/custom-formly/types/chips/chips.component.d.ts +27 -0
  15. package/components/custom-formly/types/multicheckbox/multicheckbox.component.d.ts +44 -0
  16. package/components/custom-formly/types/number/number.component.d.ts +20 -0
  17. package/components/custom-formly/types/radio/radio.component.d.ts +44 -0
  18. package/components/custom-formly/types/rating/rating.component.d.ts +24 -0
  19. package/components/custom-formly/types/repeat/repeat.component.d.ts +16 -0
  20. package/components/custom-formly/types/select/select.component.d.ts +54 -0
  21. package/components/custom-formly/types/select-tree/select-tree.component.d.ts +43 -0
  22. package/components/custom-formly/types/stepper/horizontal/stepper.component.d.ts +9 -0
  23. package/components/custom-formly/types/stepper/stepper.type.d.ts +6 -0
  24. package/components/custom-formly/types/stepper/vertical/stepper.component.d.ts +9 -0
  25. package/components/custom-formly/types/table/table.component.d.ts +43 -0
  26. package/components/custom-formly/types/tabs/tab.component.d.ts +8 -0
  27. package/components/custom-formly/types/tags/tags.component.d.ts +41 -0
  28. package/components/custom-formly/types/textarea/textarea.component.d.ts +13 -0
  29. package/components/custom-formly/wrappers/addons/addons.component.d.ts +10 -0
  30. package/components/custom-formly/wrappers/card/card.component.d.ts +6 -0
  31. package/components/custom-formly/wrappers/expansion/expansion.component.d.ts +6 -0
  32. package/components/custom-formly/wrappers/panel/panel.component.d.ts +6 -0
  33. package/components/date-range/date-range.component.d.ts +8 -6
  34. package/components/drawer/drawer.component.d.ts +2 -2
  35. package/components/fullscreen/fullscreen.component.d.ts +2 -9
  36. package/components/fullscreen/public-api.d.ts +0 -1
  37. package/components/material-color-picker/material-color-picker.component.d.ts +8 -4
  38. package/components/material-datetimepicker/calendar.d.ts +2 -2
  39. package/components/material-datetimepicker/clock.d.ts +1 -1
  40. package/components/material-datetimepicker/datetimepicker-input.d.ts +1 -1
  41. package/components/material-datetimepicker/datetimepicker-toggle.d.ts +1 -1
  42. package/components/material-datetimepicker/datetimepicker.d.ts +5 -10
  43. package/components/material-datetimepicker/month-view.d.ts +1 -2
  44. package/components/material-datetimepicker/multi-year-view.d.ts +1 -1
  45. package/components/material-datetimepicker/public-api.d.ts +1 -0
  46. package/components/material-datetimepicker/time.d.ts +2 -2
  47. package/components/material-datetimepicker/year-view.d.ts +1 -1
  48. package/components/navigation/horizontal/components/basic/basic.component.d.ts +1 -1
  49. package/components/navigation/horizontal/components/branch/branch.component.d.ts +1 -1
  50. package/components/navigation/horizontal/horizontal.component.d.ts +2 -2
  51. package/components/navigation/vertical/components/aside/aside.component.d.ts +1 -1
  52. package/components/navigation/vertical/components/basic/basic.component.d.ts +1 -7
  53. package/components/navigation/vertical/components/collapsable/collapsable.component.d.ts +1 -1
  54. package/components/navigation/vertical/components/group/group.component.d.ts +1 -1
  55. package/components/navigation/vertical/vertical.component.d.ts +5 -5
  56. package/components/pagination/public-api.d.ts +1 -0
  57. package/components/popover/popover-trigger.d.ts +121 -0
  58. package/components/popover/popover.component.d.ts +3 -3
  59. package/components/popover/popover.target.d.ts +8 -0
  60. package/components/popover/public-api.d.ts +3 -0
  61. package/components/rating/rating.component.d.ts +38 -9
  62. package/components/select-search/select-search.component.d.ts +4 -4
  63. package/components/select-tree/public-api.d.ts +2 -0
  64. package/components/select-tree/select-tree.component.d.ts +50 -21
  65. package/components/toast/public-api.d.ts +4 -0
  66. package/components/toast/toast.component.d.ts +4 -4
  67. package/components/transfer-picker/filter/filter.component.d.ts +1 -1
  68. package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.d.ts +2 -2
  69. package/components/transfer-picker/transfer-picker.component.d.ts +1 -1
  70. package/components/upload/files.type.d.ts +22 -0
  71. package/components/upload/files.util.service.d.ts +20 -0
  72. package/components/upload/index.d.ts +5 -0
  73. package/components/upload/public-api.d.ts +4 -0
  74. package/components/upload/upload-queue/upload-queue.component.d.ts +39 -0
  75. package/components/upload/upload.component.d.ts +32 -0
  76. package/esm2022/animations/public-api.mjs +2 -2
  77. package/esm2022/components/adapter/dayjs-date-adapter.mjs +6 -6
  78. package/esm2022/components/adapter/dayjs-datetime-adapter.mjs +5 -5
  79. package/esm2022/components/adapter/native-datetime-adapter.mjs +3 -3
  80. package/esm2022/components/breadcrumb/breadcrumb-item.directive.mjs +3 -3
  81. package/esm2022/components/breadcrumb/breadcrumb.component.mjs +6 -6
  82. package/esm2022/components/breadcrumb/breadcrumb.service.mjs +5 -5
  83. package/esm2022/components/breadcrumb/public-api.mjs +3 -1
  84. package/esm2022/components/card/card.component.mjs +5 -5
  85. package/esm2022/components/card/public-api.mjs +2 -1
  86. package/esm2022/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.mjs +7 -7
  87. package/esm2022/components/cascade/cascade-list/cascade-list.component.mjs +207 -114
  88. package/esm2022/components/cascade/cascade-menu/cascade-menu.component.mjs +4 -4
  89. package/esm2022/components/cascade/public-api.mjs +2 -1
  90. package/esm2022/components/chip-input/chip-input.component.mjs +152 -49
  91. package/esm2022/components/custom-formly/cmat-components-custom-formly.mjs +5 -0
  92. package/esm2022/components/custom-formly/extension/addons.extension.mjs +13 -0
  93. package/esm2022/components/custom-formly/public-api.mjs +22 -0
  94. package/esm2022/components/custom-formly/types/button/button.component.mjs +39 -0
  95. package/esm2022/components/custom-formly/types/checklist/checklist.component.mjs +161 -0
  96. package/esm2022/components/custom-formly/types/chips/chips.component.mjs +55 -0
  97. package/esm2022/components/custom-formly/types/multicheckbox/multicheckbox.component.mjs +89 -0
  98. package/esm2022/components/custom-formly/types/number/number.component.mjs +27 -0
  99. package/esm2022/components/custom-formly/types/radio/radio.component.mjs +88 -0
  100. package/esm2022/components/custom-formly/types/rating/rating.component.mjs +27 -0
  101. package/esm2022/components/custom-formly/types/repeat/repeat.component.mjs +28 -0
  102. package/esm2022/components/custom-formly/types/select/select.component.mjs +169 -0
  103. package/esm2022/components/custom-formly/types/select-tree/select-tree.component.mjs +66 -0
  104. package/esm2022/components/custom-formly/types/stepper/horizontal/stepper.component.mjs +31 -0
  105. package/esm2022/components/custom-formly/types/stepper/stepper.type.mjs +2 -0
  106. package/esm2022/components/custom-formly/types/stepper/vertical/stepper.component.mjs +31 -0
  107. package/esm2022/components/custom-formly/types/table/table.component.mjs +116 -0
  108. package/esm2022/components/custom-formly/types/tabs/tab.component.mjs +19 -0
  109. package/esm2022/components/custom-formly/types/tags/tags.component.mjs +149 -0
  110. package/esm2022/components/custom-formly/types/textarea/textarea.component.mjs +25 -0
  111. package/esm2022/components/custom-formly/wrappers/addons/addons.component.mjs +92 -0
  112. package/esm2022/components/custom-formly/wrappers/card/card.component.mjs +14 -0
  113. package/esm2022/components/custom-formly/wrappers/expansion/expansion.component.mjs +14 -0
  114. package/esm2022/components/custom-formly/wrappers/panel/panel.component.mjs +12 -0
  115. package/esm2022/components/date-range/date-range.component.mjs +26 -17
  116. package/esm2022/components/drawer/drawer.component.mjs +5 -5
  117. package/esm2022/components/drawer/drawer.service.mjs +3 -3
  118. package/esm2022/components/fullscreen/fullscreen.component.mjs +16 -73
  119. package/esm2022/components/fullscreen/public-api.mjs +1 -2
  120. package/esm2022/components/highlight/highlight.component.mjs +5 -5
  121. package/esm2022/components/highlight/highlight.service.mjs +3 -3
  122. package/esm2022/components/json-editor/json-editor.component.mjs +3 -3
  123. package/esm2022/components/masonry/masonry.component.mjs +5 -5
  124. package/esm2022/components/material-color-picker/material-color-picker.component.mjs +22 -12
  125. package/esm2022/components/material-datetimepicker/calendar-body.mjs +3 -3
  126. package/esm2022/components/material-datetimepicker/calendar.mjs +11 -12
  127. package/esm2022/components/material-datetimepicker/clock.mjs +5 -5
  128. package/esm2022/components/material-datetimepicker/datetimepicker-input.mjs +4 -5
  129. package/esm2022/components/material-datetimepicker/datetimepicker-intl.mjs +3 -3
  130. package/esm2022/components/material-datetimepicker/datetimepicker-toggle.mjs +9 -9
  131. package/esm2022/components/material-datetimepicker/datetimepicker.mjs +17 -22
  132. package/esm2022/components/material-datetimepicker/month-view.mjs +5 -6
  133. package/esm2022/components/material-datetimepicker/multi-year-view.mjs +7 -8
  134. package/esm2022/components/material-datetimepicker/public-api.mjs +2 -1
  135. package/esm2022/components/material-datetimepicker/time.mjs +8 -8
  136. package/esm2022/components/material-datetimepicker/year-view.mjs +7 -8
  137. package/esm2022/components/navigation/horizontal/components/basic/basic.component.mjs +8 -8
  138. package/esm2022/components/navigation/horizontal/components/branch/branch.component.mjs +8 -8
  139. package/esm2022/components/navigation/horizontal/components/divider/divider.component.mjs +5 -5
  140. package/esm2022/components/navigation/horizontal/components/spacer/spacer.component.mjs +6 -6
  141. package/esm2022/components/navigation/horizontal/horizontal.component.mjs +6 -6
  142. package/esm2022/components/navigation/navigation.service.mjs +3 -3
  143. package/esm2022/components/navigation/vertical/components/aside/aside.component.mjs +11 -11
  144. package/esm2022/components/navigation/vertical/components/basic/basic.component.mjs +7 -24
  145. package/esm2022/components/navigation/vertical/components/collapsable/collapsable.component.mjs +10 -10
  146. package/esm2022/components/navigation/vertical/components/divider/divider.component.mjs +5 -5
  147. package/esm2022/components/navigation/vertical/components/group/group.component.mjs +9 -9
  148. package/esm2022/components/navigation/vertical/components/spacer/spacer.component.mjs +6 -6
  149. package/esm2022/components/navigation/vertical/vertical.component.mjs +11 -11
  150. package/esm2022/components/pagination/pagination.component.mjs +10 -10
  151. package/esm2022/components/pagination/pagination.directive.mjs +4 -4
  152. package/esm2022/components/pagination/pagination.pipe.mjs +4 -4
  153. package/esm2022/components/pagination/pagination.service.mjs +3 -3
  154. package/esm2022/components/pagination/public-api.mjs +2 -1
  155. package/esm2022/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.mjs +6 -6
  156. package/esm2022/components/password-strength/mat-password-strength/mat-password-strength.component.mjs +5 -5
  157. package/esm2022/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.mjs +6 -6
  158. package/esm2022/components/popover/popover-trigger.mjs +444 -0
  159. package/esm2022/components/popover/popover.component.mjs +8 -9
  160. package/esm2022/components/popover/popover.target.mjs +18 -0
  161. package/esm2022/components/popover/public-api.mjs +4 -1
  162. package/esm2022/components/progress-bar/progress-bar.component.mjs +6 -6
  163. package/esm2022/components/rating/rating.component.mjs +122 -23
  164. package/esm2022/components/select-search/select-no-entries-found.directive.mjs +3 -3
  165. package/esm2022/components/select-search/select-search-clear.directive.mjs +3 -3
  166. package/esm2022/components/select-search/select-search.component.mjs +15 -15
  167. package/esm2022/components/select-tree/public-api.mjs +3 -1
  168. package/esm2022/components/select-tree/select-tree.component.mjs +281 -157
  169. package/esm2022/components/timeline/timeline-item/timeline-item.component.mjs +9 -9
  170. package/esm2022/components/timeline/timeline.component.mjs +5 -5
  171. package/esm2022/components/toast/public-api.mjs +5 -1
  172. package/esm2022/components/toast/toast-modal.component.mjs +5 -5
  173. package/esm2022/components/toast/toast.component.mjs +6 -6
  174. package/esm2022/components/toast/toast.service.mjs +3 -3
  175. package/esm2022/components/transfer-picker/filter/filter.component.mjs +9 -9
  176. package/esm2022/components/transfer-picker/search/search.component.mjs +6 -6
  177. package/esm2022/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.mjs +11 -11
  178. package/esm2022/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.mjs +5 -5
  179. package/esm2022/components/transfer-picker/transfer-picker.component.mjs +7 -7
  180. package/esm2022/components/transfer-picker/transfer-picker.service.mjs +4 -4
  181. package/esm2022/components/upload/cmat-components-upload.mjs +5 -0
  182. package/esm2022/components/upload/files.type.mjs +2 -0
  183. package/esm2022/components/upload/files.util.service.mjs +100 -0
  184. package/esm2022/components/upload/public-api.mjs +5 -0
  185. package/esm2022/components/upload/upload-queue/upload-queue.component.mjs +154 -0
  186. package/esm2022/components/upload/upload.component.mjs +118 -0
  187. package/esm2022/directives/animate-on-scroll/animate-on-scroll.directive.mjs +3 -3
  188. package/esm2022/directives/animate-on-scroll/scroll.service.mjs +3 -3
  189. package/esm2022/directives/autofocus/autofocus.directive.mjs +3 -3
  190. package/esm2022/directives/debounce/abstract-debounce.directive.mjs +3 -3
  191. package/esm2022/directives/debounce/debounce-click.directive.mjs +3 -3
  192. package/esm2022/directives/debounce/debounce-keyup.directive.mjs +3 -3
  193. package/esm2022/directives/digit-only/digit-only.directive.mjs +3 -3
  194. package/esm2022/directives/digit-only/mask.directive.mjs +3 -3
  195. package/esm2022/directives/equal-validator/equal-validator.directive.mjs +3 -3
  196. package/esm2022/lib/mock-api/mock-api.interceptor.mjs +5 -5
  197. package/esm2022/lib/mock-api/mock-api.service.mjs +3 -3
  198. package/esm2022/pipes/bytes/bytes.pipe.mjs +3 -3
  199. package/esm2022/pipes/date-format/date-format.pipe.mjs +3 -3
  200. package/esm2022/pipes/find-by-key/find-by-key.pipe.mjs +3 -3
  201. package/esm2022/pipes/group-by/group-by.pipe.mjs +3 -3
  202. package/esm2022/pipes/keys/keys.pipe.mjs +3 -3
  203. package/esm2022/pipes/secure/secure-pipe.mjs +5 -5
  204. package/esm2022/pipes/uppercase/uppercase.pipe.mjs +3 -3
  205. package/esm2022/public-api.mjs +1 -1
  206. package/esm2022/services/alert/alert.service.mjs +7 -7
  207. package/esm2022/services/alert/enum.mjs +2 -2
  208. package/esm2022/services/config/config.service.mjs +5 -5
  209. package/esm2022/services/config/urlStateConfig.service.mjs +5 -5
  210. package/esm2022/services/confirmation/confirmation.service.mjs +5 -5
  211. package/esm2022/services/confirmation/dialog/dialog.component.mjs +7 -7
  212. package/esm2022/services/data/data.service.mjs +5 -5
  213. package/esm2022/services/loading/loading.interceptor.mjs +4 -4
  214. package/esm2022/services/loading/loading.service.mjs +3 -3
  215. package/esm2022/services/local-storage/local-storage.service.mjs +3 -3
  216. package/esm2022/services/media-watcher/media-watcher.service.mjs +5 -5
  217. package/esm2022/services/platform/platform.service.mjs +4 -4
  218. package/esm2022/services/splash-screen/splash-screen.service.mjs +6 -6
  219. package/esm2022/services/title/title.service.mjs +4 -4
  220. package/esm2022/services/translation/translation.service.mjs +3 -3
  221. package/esm2022/services/utils/utils.service.mjs +54 -9
  222. package/fesm2022/cmat-animations.mjs +15 -15
  223. package/fesm2022/cmat-animations.mjs.map +1 -1
  224. package/fesm2022/cmat-components-adapter.mjs +11 -11
  225. package/fesm2022/cmat-components-adapter.mjs.map +1 -1
  226. package/fesm2022/cmat-components-breadcrumb.mjs +11 -11
  227. package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -1
  228. package/fesm2022/cmat-components-card.mjs +4 -4
  229. package/fesm2022/cmat-components-card.mjs.map +1 -1
  230. package/fesm2022/cmat-components-cascade.mjs +215 -123
  231. package/fesm2022/cmat-components-cascade.mjs.map +1 -1
  232. package/fesm2022/cmat-components-chip-input.mjs +153 -50
  233. package/fesm2022/cmat-components-chip-input.mjs.map +1 -1
  234. package/fesm2022/cmat-components-custom-formly.mjs +1141 -0
  235. package/fesm2022/cmat-components-custom-formly.mjs.map +1 -0
  236. package/fesm2022/cmat-components-date-range.mjs +27 -18
  237. package/fesm2022/cmat-components-date-range.mjs.map +1 -1
  238. package/fesm2022/cmat-components-drawer.mjs +8 -8
  239. package/fesm2022/cmat-components-drawer.mjs.map +1 -1
  240. package/fesm2022/cmat-components-fullscreen.mjs +16 -73
  241. package/fesm2022/cmat-components-fullscreen.mjs.map +1 -1
  242. package/fesm2022/cmat-components-highlight.mjs +7 -7
  243. package/fesm2022/cmat-components-highlight.mjs.map +1 -1
  244. package/fesm2022/cmat-components-json-editor.mjs +3 -3
  245. package/fesm2022/cmat-components-masonry.mjs +4 -4
  246. package/fesm2022/cmat-components-masonry.mjs.map +1 -1
  247. package/fesm2022/cmat-components-material-color-picker.mjs +21 -11
  248. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
  249. package/fesm2022/cmat-components-material-datetimepicker.mjs +189 -195
  250. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
  251. package/fesm2022/cmat-components-navigation.mjs +166 -183
  252. package/fesm2022/cmat-components-navigation.mjs.map +1 -1
  253. package/fesm2022/cmat-components-pagination.mjs +20 -20
  254. package/fesm2022/cmat-components-pagination.mjs.map +1 -1
  255. package/fesm2022/cmat-components-password-strength.mjs +13 -13
  256. package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
  257. package/fesm2022/cmat-components-popover.mjs +464 -10
  258. package/fesm2022/cmat-components-popover.mjs.map +1 -1
  259. package/fesm2022/cmat-components-progress-bar.mjs +6 -6
  260. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
  261. package/fesm2022/cmat-components-rating.mjs +121 -22
  262. package/fesm2022/cmat-components-rating.mjs.map +1 -1
  263. package/fesm2022/cmat-components-select-search.mjs +41 -41
  264. package/fesm2022/cmat-components-select-search.mjs.map +1 -1
  265. package/fesm2022/cmat-components-select-tree.mjs +285 -158
  266. package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
  267. package/fesm2022/cmat-components-timeline.mjs +12 -12
  268. package/fesm2022/cmat-components-timeline.mjs.map +1 -1
  269. package/fesm2022/cmat-components-toast.mjs +12 -12
  270. package/fesm2022/cmat-components-toast.mjs.map +1 -1
  271. package/fesm2022/cmat-components-transfer-picker.mjs +33 -33
  272. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
  273. package/fesm2022/cmat-components-upload.mjs +366 -0
  274. package/fesm2022/cmat-components-upload.mjs.map +1 -0
  275. package/fesm2022/cmat-directives-animate-on-scroll.mjs +6 -6
  276. package/fesm2022/cmat-directives-autofocus.mjs +3 -3
  277. package/fesm2022/cmat-directives-debounce.mjs +9 -9
  278. package/fesm2022/cmat-directives-digit-only.mjs +6 -6
  279. package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
  280. package/fesm2022/cmat-lib-mock-api.mjs +6 -6
  281. package/fesm2022/cmat-lib-mock-api.mjs.map +1 -1
  282. package/fesm2022/cmat-pipes-bytes.mjs +3 -3
  283. package/fesm2022/cmat-pipes-date-format.mjs +3 -3
  284. package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
  285. package/fesm2022/cmat-pipes-group-by.mjs +3 -3
  286. package/fesm2022/cmat-pipes-keys.mjs +3 -3
  287. package/fesm2022/cmat-pipes-secure.mjs +4 -4
  288. package/fesm2022/cmat-pipes-secure.mjs.map +1 -1
  289. package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
  290. package/fesm2022/cmat-services-alert.mjs +6 -6
  291. package/fesm2022/cmat-services-alert.mjs.map +1 -1
  292. package/fesm2022/cmat-services-config.mjs +7 -7
  293. package/fesm2022/cmat-services-config.mjs.map +1 -1
  294. package/fesm2022/cmat-services-confirmation.mjs +11 -11
  295. package/fesm2022/cmat-services-confirmation.mjs.map +1 -1
  296. package/fesm2022/cmat-services-data.mjs +5 -5
  297. package/fesm2022/cmat-services-data.mjs.map +1 -1
  298. package/fesm2022/cmat-services-loading.mjs +6 -6
  299. package/fesm2022/cmat-services-loading.mjs.map +1 -1
  300. package/fesm2022/cmat-services-local-storage.mjs +3 -3
  301. package/fesm2022/cmat-services-media-watcher.mjs +4 -4
  302. package/fesm2022/cmat-services-media-watcher.mjs.map +1 -1
  303. package/fesm2022/cmat-services-platform.mjs +3 -3
  304. package/fesm2022/cmat-services-platform.mjs.map +1 -1
  305. package/fesm2022/cmat-services-splash-screen.mjs +5 -5
  306. package/fesm2022/cmat-services-splash-screen.mjs.map +1 -1
  307. package/fesm2022/cmat-services-title.mjs +3 -3
  308. package/fesm2022/cmat-services-title.mjs.map +1 -1
  309. package/fesm2022/cmat-services-translation.mjs +3 -3
  310. package/fesm2022/cmat-services-utils.mjs +53 -8
  311. package/fesm2022/cmat-services-utils.mjs.map +1 -1
  312. package/package.json +75 -63
  313. package/pipes/secure/secure-pipe.d.ts +1 -1
  314. package/services/alert/enum.d.ts +1 -1
  315. package/services/confirmation/confirmation.service.d.ts +1 -1
  316. package/services/data/data.service.d.ts +1 -1
  317. package/services/media-watcher/media-watcher.service.d.ts +1 -1
  318. package/services/title/title.service.d.ts +1 -1
  319. package/services/utils/utils.service.d.ts +1 -0
  320. package/styles/components/bundle.scss +18 -5
  321. package/styles/overrides/angular-material.scss +51 -52
  322. package/styles/tailwind.scss +2 -8
  323. package/styles/themes.scss +7 -7
  324. package/styles/user-themes.scss +1 -1
  325. package/tailwind/plugins/utilities.js +1 -1
  326. package/components/fullscreen/fullscreen.types.d.ts +0 -13
  327. package/esm2022/components/fullscreen/fullscreen.types.mjs +0 -2
@@ -0,0 +1,444 @@
1
+ import { isFakeMousedownFromScreenReader } from '@angular/cdk/a11y';
2
+ import { OverlayConfig, } from '@angular/cdk/overlay';
3
+ import { TemplatePortal } from '@angular/cdk/portal';
4
+ import { Directive, EventEmitter, HostBinding, HostListener, Input, Optional, Output, } from '@angular/core';
5
+ import { Subject } from 'rxjs';
6
+ import { takeUntil } from 'rxjs/operators';
7
+ import { throwCmatPopoverMissingError } from './popover.errors';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/cdk/overlay";
10
+ import * as i2 from "@angular/cdk/bidi";
11
+ /**
12
+ * This directive is intended to be used in conjunction with an cmat-popover tag. It is
13
+ * responsible for toggling the display of the provided popover instance.
14
+ */
15
+ export class CmatPopoverTriggerDirective {
16
+ constructor(_overlay, _elementRef, _viewContainerRef, _dir, _changeDetectorRef) {
17
+ this._overlay = _overlay;
18
+ this._elementRef = _elementRef;
19
+ this._viewContainerRef = _viewContainerRef;
20
+ this._dir = _dir;
21
+ this._changeDetectorRef = _changeDetectorRef;
22
+ this.ariaHaspopup = true;
23
+ /** Event emitted when the associated popover is opened. */
24
+ this.popoverOpened = new EventEmitter();
25
+ /** Event emitted when the associated popover is closed. */
26
+ this.popoverClosed = new EventEmitter();
27
+ this.popoverOpened$ = new Subject();
28
+ this.popoverClosed$ = new Subject();
29
+ this._overlayRef = null;
30
+ this._popoverOpen = false;
31
+ this._halt = false;
32
+ // tracking input type is necessary so it's possible to only auto-focus
33
+ // the first item of the list when the popover is opened via the keyboard
34
+ this._openedByMouse = false;
35
+ this._onDestroy = new Subject();
36
+ }
37
+ /** Whether the popover is open. */
38
+ get popoverOpen() {
39
+ return this._popoverOpen;
40
+ }
41
+ /** The text direction of the containing app. */
42
+ get dir() {
43
+ return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';
44
+ }
45
+ onClick() {
46
+ if (this.popover.triggerEvent === 'click') {
47
+ this.togglePopover();
48
+ }
49
+ }
50
+ onMouseEnter() {
51
+ this._halt = false;
52
+ if (this.popover.triggerEvent === 'hover') {
53
+ this._mouseoverTimer = setTimeout(() => {
54
+ this.openPopover();
55
+ }, this.popover.enterDelay);
56
+ }
57
+ }
58
+ onMouseLeave() {
59
+ if (this.popover.triggerEvent === 'hover') {
60
+ if (this._mouseoverTimer) {
61
+ clearTimeout(this._mouseoverTimer);
62
+ this._mouseoverTimer = null;
63
+ }
64
+ if (this._popoverOpen) {
65
+ setTimeout(() => {
66
+ if (!this.popover.closeDisabled) {
67
+ this.closePopover();
68
+ }
69
+ }, this.popover.leaveDelay);
70
+ }
71
+ else {
72
+ this._halt = true;
73
+ }
74
+ }
75
+ }
76
+ handleMousedown(event) {
77
+ if (event && !isFakeMousedownFromScreenReader(event)) {
78
+ this._openedByMouse = true;
79
+ }
80
+ }
81
+ ngAfterViewInit() {
82
+ this._checkPopover();
83
+ this._setCurrentConfig();
84
+ this.popover.closed.subscribe(() => this.closePopover());
85
+ }
86
+ ngOnDestroy() {
87
+ this.destroyPopover();
88
+ }
89
+ /** Toggles the popover between the open and closed states. */
90
+ togglePopover() {
91
+ return this._popoverOpen ? this.closePopover() : this.openPopover();
92
+ }
93
+ /** Opens the popover. */
94
+ openPopover() {
95
+ if (!this._popoverOpen && !this._halt) {
96
+ this._createOverlay().attach(this._portal);
97
+ this._subscribeToBackdrop();
98
+ this._subscribeToDetachments();
99
+ this._initPopover();
100
+ }
101
+ }
102
+ /** Closes the popover. */
103
+ closePopover() {
104
+ if (this._overlayRef) {
105
+ this._overlayRef.detach();
106
+ this._resetPopover();
107
+ }
108
+ this.destroyPopover();
109
+ }
110
+ /** Removes the popover from the DOM. */
111
+ destroyPopover() {
112
+ if (this._mouseoverTimer) {
113
+ clearTimeout(this._mouseoverTimer);
114
+ this._mouseoverTimer = null;
115
+ }
116
+ if (this._overlayRef) {
117
+ this._overlayRef.dispose();
118
+ this._overlayRef = null;
119
+ this._cleanUpSubscriptions();
120
+ }
121
+ this._onDestroy.next();
122
+ this._onDestroy.complete();
123
+ }
124
+ /** Focuses the popover trigger. */
125
+ focus() {
126
+ this._elementRef.nativeElement.focus();
127
+ }
128
+ /**
129
+ * This method ensures that the popover closes when the overlay backdrop is clicked.
130
+ * We do not use first() here because doing so would not catch clicks from within
131
+ * the popover, and it would fail to unsubscribe properly. Instead, we unsubscribe
132
+ * explicitly when the popover is closed or destroyed.
133
+ */
134
+ _subscribeToBackdrop() {
135
+ if (this._overlayRef) {
136
+ /** Only subscribe to backdrop if trigger event is click */
137
+ if (this.triggerEvent === 'click' && this.popover.closeOnBackdropClick === true) {
138
+ this._overlayRef
139
+ .backdropClick()
140
+ .pipe(takeUntil(this.popoverClosed$), takeUntil(this._onDestroy))
141
+ .subscribe(() => {
142
+ this.popover.emitCloseEvent();
143
+ });
144
+ }
145
+ }
146
+ }
147
+ _subscribeToDetachments() {
148
+ if (this._overlayRef) {
149
+ this._overlayRef
150
+ .detachments()
151
+ .pipe(takeUntil(this.popoverClosed$), takeUntil(this._onDestroy))
152
+ .subscribe(() => {
153
+ this._setPopoverClosed();
154
+ });
155
+ }
156
+ }
157
+ /**
158
+ * This method sets the popover state to open and focuses the first item if
159
+ * the popover was opened via the keyboard.
160
+ */
161
+ _initPopover() {
162
+ this._setPopoverOpened();
163
+ }
164
+ /**
165
+ * This method resets the popover when it's closed, most importantly restoring
166
+ * focus to the popover trigger if the popover was opened via the keyboard.
167
+ */
168
+ _resetPopover() {
169
+ this._setPopoverClosed();
170
+ // Focus only needs to be reset to the host element if the popover was opened
171
+ // by the keyboard and manually shifted to the first popover item.
172
+ if (!this._openedByMouse) {
173
+ this.focus();
174
+ }
175
+ this._openedByMouse = false;
176
+ }
177
+ /** set state rather than toggle to support triggers sharing a popover */
178
+ _setPopoverOpened() {
179
+ if (!this._popoverOpen) {
180
+ this._popoverOpen = true;
181
+ this.popoverOpened$.next();
182
+ this.popoverOpened.emit();
183
+ }
184
+ }
185
+ /** set state rather than toggle to support triggers sharing a popover */
186
+ _setPopoverClosed() {
187
+ if (this._popoverOpen) {
188
+ this._popoverOpen = false;
189
+ this.popoverClosed$.next();
190
+ this.popoverClosed.emit();
191
+ }
192
+ }
193
+ /**
194
+ * This method checks that a valid instance of MdPopover has been passed into
195
+ * mdPopoverTriggerFor. If not, an exception is thrown.
196
+ */
197
+ _checkPopover() {
198
+ if (!this.popover) {
199
+ throwCmatPopoverMissingError();
200
+ }
201
+ }
202
+ /**
203
+ * This method creates the overlay from the provided popover's template and saves its
204
+ * OverlayRef so that it can be attached to the DOM when openPopover is called.
205
+ */
206
+ _createOverlay() {
207
+ if (!this._overlayRef) {
208
+ this._portal = new TemplatePortal(this.popover.templateRef, this._viewContainerRef);
209
+ const config = this._getOverlayConfig();
210
+ this._subscribeToPositions(config.positionStrategy);
211
+ this._overlayRef = this._overlay.create(config);
212
+ }
213
+ return this._overlayRef;
214
+ }
215
+ /**
216
+ * This method builds the configuration object needed to create the overlay, the OverlayConfig.
217
+ *
218
+ * @returns OverlayConfig
219
+ */
220
+ _getOverlayConfig() {
221
+ const overlayState = new OverlayConfig();
222
+ overlayState.positionStrategy = this._getPosition();
223
+ /** Display overlay backdrop if trigger event is click */
224
+ if (this.triggerEvent === 'click') {
225
+ overlayState.hasBackdrop = true;
226
+ overlayState.backdropClass = 'cdk-overlay-transparent-backdrop';
227
+ }
228
+ overlayState.direction = this._dir;
229
+ overlayState.scrollStrategy = this._getOverlayScrollStrategy(this.popover.scrollStrategy);
230
+ return overlayState;
231
+ }
232
+ /**
233
+ * This method returns the scroll strategy used by the cdk/overlay.
234
+ */
235
+ _getOverlayScrollStrategy(strategy) {
236
+ switch (strategy) {
237
+ case 'noop':
238
+ return this._overlay.scrollStrategies.noop();
239
+ case 'close':
240
+ return this._overlay.scrollStrategies.close();
241
+ case 'block':
242
+ return this._overlay.scrollStrategies.block();
243
+ case 'reposition':
244
+ default:
245
+ return this._overlay.scrollStrategies.reposition();
246
+ }
247
+ }
248
+ /**
249
+ * Listens to changes in the position of the overlay and sets the correct classes
250
+ * on the popover based on the new position. This ensures the animation origin is always
251
+ * correct, even if a fallback position is used for the overlay.
252
+ */
253
+ _subscribeToPositions(position) {
254
+ this._positionSubscription = position.positionChanges.subscribe((change) => {
255
+ const posX = change.connectionPair.overlayX === 'start'
256
+ ? 'after'
257
+ : change.connectionPair.overlayX === 'end'
258
+ ? 'before'
259
+ : 'center';
260
+ const posY = change.connectionPair.overlayY === 'top'
261
+ ? 'below'
262
+ : change.connectionPair.overlayY === 'bottom'
263
+ ? 'above'
264
+ : 'center';
265
+ const pos = this.popover.position[0] === 'above' || this.popover.position[0] === 'below'
266
+ ? [posY, posX]
267
+ : [posX, posY];
268
+ // required for ChangeDetectionStrategy.OnPush
269
+ this._changeDetectorRef.markForCheck();
270
+ this.popover.zone.run(() => {
271
+ this.popover.setCurrentStyles(pos);
272
+ this.popover.setPositionClasses(pos);
273
+ });
274
+ });
275
+ }
276
+ /**
277
+ * This method builds the position strategy for the overlay, so the popover is properly connected
278
+ * to the trigger.
279
+ *
280
+ * @returns ConnectedPositionStrategy
281
+ */
282
+ _getPosition() {
283
+ const [originX, origin2ndX, origin3rdX] = this.popover.position[0] === 'before' || this.popover.position[1] === 'after'
284
+ ? ['start', 'center', 'end']
285
+ : this.popover.position[0] === 'after' || this.popover.position[1] === 'before'
286
+ ? ['end', 'center', 'start']
287
+ : ['center', 'start', 'end'];
288
+ const [originY, origin2ndY, origin3rdY] = this.popover.position[0] === 'above' || this.popover.position[1] === 'below'
289
+ ? ['top', 'center', 'bottom']
290
+ : this.popover.position[0] === 'below' || this.popover.position[1] === 'above'
291
+ ? ['bottom', 'center', 'top']
292
+ : ['center', 'top', 'bottom'];
293
+ const [overlayX, overlayFallbackX] = this.popover.position[0] === 'below' || this.popover.position[0] === 'above'
294
+ ? [originX, originX]
295
+ : this.popover.position[0] === 'before'
296
+ ? ['end', 'start']
297
+ : ['start', 'end'];
298
+ const [overlayY, overlayFallbackY] = this.popover.position[0] === 'before' || this.popover.position[0] === 'after'
299
+ ? [originY, originY]
300
+ : this.popover.position[0] === 'below'
301
+ ? ['top', 'bottom']
302
+ : ['bottom', 'top'];
303
+ const originFallbackX = overlayX;
304
+ const originFallbackY = overlayY;
305
+ const offsetX = this.popover.xOffset && !isNaN(Number(this.popover.xOffset))
306
+ ? Number(this.dir === 'ltr' ? this.popover.xOffset : -this.popover.xOffset)
307
+ : 0;
308
+ const offsetY = this.popover.yOffset && !isNaN(Number(this.popover.yOffset))
309
+ ? Number(this.popover.yOffset)
310
+ : 0;
311
+ /**
312
+ * For overriding position element, when `cmatPopoverTargetAt` has a valid element reference.
313
+ * Useful for sticking popover to parent element and offsetting arrow to trigger element.
314
+ * If undefined defaults to the trigger element reference.
315
+ */
316
+ let element = this._elementRef;
317
+ if (typeof this.targetElement !== 'undefined') {
318
+ this.popover.containerPositioning = true;
319
+ element = this.targetElement._elementRef;
320
+ }
321
+ let positions = [{ originX, originY, overlayX, overlayY }];
322
+ if (this.popover.position[0] === 'above' || this.popover.position[0] === 'below') {
323
+ positions = [
324
+ { originX, originY, overlayX, overlayY, offsetY },
325
+ { originX: origin2ndX, originY, overlayX: origin2ndX, overlayY, offsetY },
326
+ { originX: origin3rdX, originY, overlayX: origin3rdX, overlayY, offsetY },
327
+ {
328
+ originX,
329
+ originY: originFallbackY,
330
+ overlayX,
331
+ overlayY: overlayFallbackY,
332
+ offsetY: -offsetY,
333
+ },
334
+ {
335
+ originX: origin2ndX,
336
+ originY: originFallbackY,
337
+ overlayX: origin2ndX,
338
+ overlayY: overlayFallbackY,
339
+ offsetY: -offsetY,
340
+ },
341
+ {
342
+ originX: origin3rdX,
343
+ originY: originFallbackY,
344
+ overlayX: origin3rdX,
345
+ overlayY: overlayFallbackY,
346
+ offsetY: -offsetY,
347
+ },
348
+ ];
349
+ }
350
+ if (this.popover.position[0] === 'before' || this.popover.position[0] === 'after') {
351
+ positions = [
352
+ { originX, originY, overlayX, overlayY, offsetX },
353
+ { originX, originY: origin2ndY, overlayX, overlayY: origin2ndY, offsetX },
354
+ { originX, originY: origin3rdY, overlayX, overlayY: origin3rdY, offsetX },
355
+ {
356
+ originX: originFallbackX,
357
+ originY,
358
+ overlayX: overlayFallbackX,
359
+ overlayY,
360
+ offsetX: -offsetX,
361
+ },
362
+ {
363
+ originX: originFallbackX,
364
+ originY: origin2ndY,
365
+ overlayX: overlayFallbackX,
366
+ overlayY: origin2ndY,
367
+ offsetX: -offsetX,
368
+ },
369
+ {
370
+ originX: originFallbackX,
371
+ originY: origin3rdY,
372
+ overlayX: overlayFallbackX,
373
+ overlayY: origin3rdY,
374
+ offsetX: -offsetX,
375
+ },
376
+ ];
377
+ }
378
+ return this._overlay
379
+ .position()
380
+ .flexibleConnectedTo(element)
381
+ .withLockedPosition()
382
+ .withPositions(positions)
383
+ .withDefaultOffsetX(offsetX)
384
+ .withDefaultOffsetY(offsetY);
385
+ }
386
+ _cleanUpSubscriptions() {
387
+ if (this._backdropSubscription) {
388
+ this._backdropSubscription.unsubscribe();
389
+ }
390
+ if (this._positionSubscription) {
391
+ this._positionSubscription.unsubscribe();
392
+ }
393
+ if (this._detachmentsSubscription) {
394
+ this._detachmentsSubscription.unsubscribe();
395
+ }
396
+ }
397
+ _setCurrentConfig() {
398
+ if (this.triggerEvent) {
399
+ this.popover.triggerEvent = this.triggerEvent;
400
+ }
401
+ this.popover.setCurrentStyles();
402
+ }
403
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: CmatPopoverTriggerDirective, deps: [{ token: i1.Overlay }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i2.Directionality, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
404
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.7", type: CmatPopoverTriggerDirective, isStandalone: true, selector: "[cmatPopoverTriggerFor],[cmatPopoverTargetAt],[cmatPopoverTriggerOn]", inputs: { popover: ["cmatPopoverTriggerFor", "popover"], targetElement: ["cmatPopoverTargetAt", "targetElement"], triggerEvent: ["cmatPopoverTriggerOn", "triggerEvent"] }, outputs: { popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onClick($event)", "mouseenter": "onMouseEnter($event)", "mouseleave": "onMouseLeave($event)", "mousedown": "handleMousedown($event)" }, properties: { "attr.aria-haspopup": "this.ariaHaspopup" } }, exportAs: ["cmatPopoverTrigger"], ngImport: i0 }); }
405
+ }
406
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: CmatPopoverTriggerDirective, decorators: [{
407
+ type: Directive,
408
+ args: [{
409
+ selector: '[cmatPopoverTriggerFor],[cmatPopoverTargetAt],[cmatPopoverTriggerOn]',
410
+ standalone: true,
411
+ exportAs: 'cmatPopoverTrigger'
412
+ }]
413
+ }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i2.Directionality, decorators: [{
414
+ type: Optional
415
+ }] }, { type: i0.ChangeDetectorRef }], propDecorators: { ariaHaspopup: [{
416
+ type: HostBinding,
417
+ args: ['attr.aria-haspopup']
418
+ }], popover: [{
419
+ type: Input,
420
+ args: ['cmatPopoverTriggerFor']
421
+ }], targetElement: [{
422
+ type: Input,
423
+ args: ['cmatPopoverTargetAt']
424
+ }], triggerEvent: [{
425
+ type: Input,
426
+ args: ['cmatPopoverTriggerOn']
427
+ }], popoverOpened: [{
428
+ type: Output
429
+ }], popoverClosed: [{
430
+ type: Output
431
+ }], onClick: [{
432
+ type: HostListener,
433
+ args: ['click', ['$event']]
434
+ }], onMouseEnter: [{
435
+ type: HostListener,
436
+ args: ['mouseenter', ['$event']]
437
+ }], onMouseLeave: [{
438
+ type: HostListener,
439
+ args: ['mouseleave', ['$event']]
440
+ }], handleMousedown: [{
441
+ type: HostListener,
442
+ args: ['mousedown', ['$event']]
443
+ }] } });
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci10cmlnZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY21hdC9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci10cmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBFLE9BQU8sRUFLSCxhQUFhLEdBSWhCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBU2hFOzs7R0FHRztBQU9ILE1BQU0sT0FBTywyQkFBMkI7SUFzQ3BDLFlBQ1ksUUFBaUIsRUFDakIsV0FBdUIsRUFDdkIsaUJBQW1DLEVBQ3ZCLElBQW9CLEVBQ2hDLGtCQUFxQztRQUpyQyxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDdkIsU0FBSSxHQUFKLElBQUksQ0FBZ0I7UUFDaEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQTFDZCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQVV2RCwyREFBMkQ7UUFDakQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRW5ELDJEQUEyRDtRQUNqRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7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RUF6Q3NCLFlBQVk7c0JBQTlDLFdBQVc7dUJBQUMsb0JBQW9CO2dCQUVELE9BQU87c0JBQXRDLEtBQUs7dUJBQUMsdUJBQXVCO2dCQUdBLGFBQWE7c0JBQTFDLEtBQUs7dUJBQUMscUJBQXFCO2dCQUdHLFlBQVk7c0JBQTFDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQUduQixhQUFhO3NCQUF0QixNQUFNO2dCQUdHLGFBQWE7c0JBQXRCLE1BQU07Z0JBeUNQLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUWpDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV3RDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBbUJ0QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7IERpcmVjdGlvbiwgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcbmltcG9ydCB7XHJcbiAgICBDb25uZWN0ZWRQb3NpdGlvbixcclxuICAgIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcclxuICAgIEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxyXG4gICAgT3ZlcmxheSxcclxuICAgIE92ZXJsYXlDb25maWcsXHJcbiAgICBPdmVybGF5UmVmLFxyXG4gICAgU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgICBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgRGlyZWN0aXZlLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RCaW5kaW5nLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IHRocm93Q21hdFBvcG92ZXJNaXNzaW5nRXJyb3IgfSBmcm9tICcuL3BvcG92ZXIuZXJyb3JzJztcclxuaW1wb3J0IHsgQ21hdFBvcG92ZXJQYW5lbCwgQ21hdFRhcmdldCB9IGZyb20gJy4vcG9wb3Zlci5pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtcclxuICAgIENtYXRQb3BvdmVyUG9zaXRpb24sXHJcbiAgICBDbWF0UG9wb3ZlclBvc2l0aW9uU3RhcnQsXHJcbiAgICBDbWF0UG9wb3ZlclNjcm9sbFN0cmF0ZWd5LFxyXG4gICAgQ21hdFBvcG92ZXJUcmlnZ2VyRXZlbnQsXHJcbn0gZnJvbSAnLi9wb3BvdmVyLnR5cGUnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbiBjbWF0LXBvcG92ZXIgdGFnLiBJdCBpc1xyXG4gKiByZXNwb25zaWJsZSBmb3IgdG9nZ2xpbmcgdGhlIGRpc3BsYXkgb2YgdGhlIHByb3ZpZGVkIHBvcG92ZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tjbWF0UG9wb3ZlclRyaWdnZXJGb3JdLFtjbWF0UG9wb3ZlclRhcmdldEF0XSxbY21hdFBvcG92ZXJUcmlnZ2VyT25dJyxcclxuICAgIHN0YW5kYWxvbmU6dHJ1ZSxcclxuICAgIGV4cG9ydEFzOiAnY21hdFBvcG92ZXJUcmlnZ2VyJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ21hdFBvcG92ZXJUcmlnZ2VyRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJykgYXJpYUhhc3BvcHVwID0gdHJ1ZTtcclxuICAgIC8qKiBSZWZlcmVuY2VzIHRoZSBwb3BvdmVyIGluc3RhbmNlIHRoYXQgdGhlIHRyaWdnZXIgaXMgYXNzb2NpYXRlZCB3aXRoLiAqL1xyXG4gICAgQElucHV0KCdjbWF0UG9wb3ZlclRyaWdnZXJGb3InKSBwb3BvdmVyITogQ21hdFBvcG92ZXJQYW5lbDtcclxuXHJcbiAgICAvKiogUmVmZXJlbmNlcyB0aGUgcG9wb3ZlciB0YXJnZXQgaW5zdGFuY2UgdGhhdCB0aGUgdHJpZ2dlciBpcyBhc3NvY2lhdGVkIHdpdGguICovXHJcbiAgICBASW5wdXQoJ2NtYXRQb3BvdmVyVGFyZ2V0QXQnKSB0YXJnZXRFbGVtZW50ITogQ21hdFRhcmdldDtcclxuXHJcbiAgICAvKiogUG9wb3ZlciB0cmlnZ2VyIGV2ZW50ICovXHJcbiAgICBASW5wdXQoJ2NtYXRQb3BvdmVyVHJpZ2dlck9uJykgdHJpZ2dlckV2ZW50ITogQ21hdFBvcG92ZXJUcmlnZ2VyRXZlbnQ7XHJcblxyXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBwb3BvdmVyIGlzIG9wZW5lZC4gKi9cclxuICAgIEBPdXRwdXQoKSBwb3BvdmVyT3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgcG9wb3ZlciBpcyBjbG9zZWQuICovXHJcbiAgICBAT3V0cHV0KCkgcG9wb3ZlckNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBwb3BvdmVyT3BlbmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwb3BvdmVyQ2xvc2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfcG9ydGFsITogVGVtcGxhdGVQb3J0YWw7XHJcbiAgICBwcml2YXRlIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9wb3BvdmVyT3BlbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaGFsdCA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfYmFja2Ryb3BTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XHJcbiAgICBwcml2YXRlIF9wb3NpdGlvblN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX2RldGFjaG1lbnRzU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIHByaXZhdGUgX21vdXNlb3ZlclRpbWVyOiBhbnk7XHJcblxyXG4gICAgLy8gdHJhY2tpbmcgaW5wdXQgdHlwZSBpcyBuZWNlc3Nhcnkgc28gaXQncyBwb3NzaWJsZSB0byBvbmx5IGF1dG8tZm9jdXNcclxuICAgIC8vIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBsaXN0IHdoZW4gdGhlIHBvcG92ZXIgaXMgb3BlbmVkIHZpYSB0aGUga2V5Ym9hcmRcclxuICAgIHByaXZhdGUgX29wZW5lZEJ5TW91c2UgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcclxuICAgICAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGlyOiBEaXJlY3Rpb25hbGl0eSxcclxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICAgICkgeyB9XHJcblxyXG4gICAgLyoqIFdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgb3Blbi4gKi9cclxuICAgIGdldCBwb3BvdmVyT3BlbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3Zlck9wZW47XHJcbiAgICB9XHJcbiAgICAvKiogVGhlIHRleHQgZGlyZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGFwcC4gKi9cclxuICAgIGdldCBkaXIoKTogRGlyZWN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlyICYmIHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcgPyAncnRsJyA6ICdsdHInO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuICAgIG9uQ2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9wb3Zlci50cmlnZ2VyRXZlbnQgPT09ICdjbGljaycpIHtcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBbJyRldmVudCddKVxyXG4gICAgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hhbHQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyLnRyaWdnZXJFdmVudCA9PT0gJ2hvdmVyJykge1xyXG4gICAgICAgICAgICB0aGlzLl9tb3VzZW92ZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wb3ZlcigpO1xyXG4gICAgICAgICAgICB9LCB0aGlzLnBvcG92ZXIuZW50ZXJEZWxheSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBbJyRldmVudCddKVxyXG4gICAgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXIudHJpZ2dlckV2ZW50ID09PSAnaG92ZXInKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tb3VzZW92ZXJUaW1lcikge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX21vdXNlb3ZlclRpbWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlb3ZlclRpbWVyID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wb3Zlck9wZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wb3BvdmVyLmNsb3NlRGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBvcG92ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnBvcG92ZXIubGVhdmVEZWxheSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBoYW5kbGVNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnQgJiYgIWlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wZW5lZEJ5TW91c2UgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jaGVja1BvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9zZXRDdXJyZW50Q29uZmlnKCk7XHJcbiAgICAgICAgdGhpcy5wb3BvdmVyLmNsb3NlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZVBvcG92ZXIoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95UG9wb3ZlcigpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqIFRvZ2dsZXMgdGhlIHBvcG92ZXIgYmV0d2VlbiB0aGUgb3BlbiBhbmQgY2xvc2VkIHN0YXRlcy4gKi9cclxuICAgIHRvZ2dsZVBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcG92ZXJPcGVuID8gdGhpcy5jbG9zZVBvcG92ZXIoKSA6IHRoaXMub3BlblBvcG92ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogT3BlbnMgdGhlIHBvcG92ZXIuICovXHJcbiAgICBvcGVuUG9wb3ZlcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BvcG92ZXJPcGVuICYmICF0aGlzLl9oYWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU92ZXJsYXkoKS5hdHRhY2godGhpcy5fcG9ydGFsKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZVRvQmFja2Ryb3AoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlVG9EZXRhY2htZW50cygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5faW5pdFBvcG92ZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENsb3NlcyB0aGUgcG9wb3Zlci4gKi9cclxuICAgIGNsb3NlUG9wb3ZlcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldFBvcG92ZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVtb3ZlcyB0aGUgcG9wb3ZlciBmcm9tIHRoZSBET00uICovXHJcbiAgICBkZXN0cm95UG9wb3ZlcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbW91c2VvdmVyVGltZXIpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX21vdXNlb3ZlclRpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5fbW91c2VvdmVyVGltZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFuVXBTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBGb2N1c2VzIHRoZSBwb3BvdmVyIHRyaWdnZXIuICovXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgcG9wb3ZlciBjbG9zZXMgd2hlbiB0aGUgb3ZlcmxheSBiYWNrZHJvcCBpcyBjbGlja2VkLlxyXG4gICAgICogV2UgZG8gbm90IHVzZSBmaXJzdCgpIGhlcmUgYmVjYXVzZSBkb2luZyBzbyB3b3VsZCBub3QgY2F0Y2ggY2xpY2tzIGZyb20gd2l0aGluXHJcbiAgICAgKiB0aGUgcG9wb3ZlciwgYW5kIGl0IHdvdWxkIGZhaWwgdG8gdW5zdWJzY3JpYmUgcHJvcGVybHkuIEluc3RlYWQsIHdlIHVuc3Vic2NyaWJlXHJcbiAgICAgKiBleHBsaWNpdGx5IHdoZW4gdGhlIHBvcG92ZXIgaXMgY2xvc2VkIG9yIGRlc3Ryb3llZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9CYWNrZHJvcCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICAgICAgICAvKiogT25seSBzdWJzY3JpYmUgdG8gYmFja2Ryb3AgaWYgdHJpZ2dlciBldmVudCBpcyBjbGljayAqL1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmlnZ2VyRXZlbnQgPT09ICdjbGljaycgJiYgdGhpcy5wb3BvdmVyLmNsb3NlT25CYWNrZHJvcENsaWNrID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmXHJcbiAgICAgICAgICAgICAgICAgICAgLmJhY2tkcm9wQ2xpY2soKVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnBvcG92ZXJDbG9zZWQkKSwgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wb3Zlci5lbWl0Q2xvc2VFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N1YnNjcmliZVRvRGV0YWNobWVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZlxyXG4gICAgICAgICAgICAgICAgLmRldGFjaG1lbnRzKClcclxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnBvcG92ZXJDbG9zZWQkKSwgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSkpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRQb3BvdmVyQ2xvc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBwb3BvdmVyIHN0YXRlIHRvIG9wZW4gYW5kIGZvY3VzZXMgdGhlIGZpcnN0IGl0ZW0gaWZcclxuICAgICAqIHRoZSBwb3BvdmVyIHdhcyBvcGVuZWQgdmlhIHRoZSBrZXlib2FyZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdFBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2V0UG9wb3Zlck9wZW5lZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVzZXRzIHRoZSBwb3BvdmVyIHdoZW4gaXQncyBjbG9zZWQsIG1vc3QgaW1wb3J0YW50bHkgcmVzdG9yaW5nXHJcbiAgICAgKiBmb2N1cyB0byB0aGUgcG9wb3ZlciB0cmlnZ2VyIGlmIHRoZSBwb3BvdmVyIHdhcyBvcGVuZWQgdmlhIHRoZSBrZXlib2FyZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzZXRQb3BvdmVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NldFBvcG92ZXJDbG9zZWQoKTtcclxuXHJcbiAgICAgICAgLy8gRm9jdXMgb25seSBuZWVkcyB0byBiZSByZXNldCB0byB0aGUgaG9zdCBlbGVtZW50IGlmIHRoZSBwb3BvdmVyIHdhcyBvcGVuZWRcclxuICAgICAgICAvLyBieSB0aGUga2V5Ym9hcmQgYW5kIG1hbnVhbGx5IHNoaWZ0ZWQgdG8gdGhlIGZpcnN0IHBvcG92ZXIgaXRlbS5cclxuICAgICAgICBpZiAoIXRoaXMuX29wZW5lZEJ5TW91c2UpIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vcGVuZWRCeU1vdXNlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIHNldCBzdGF0ZSByYXRoZXIgdGhhbiB0b2dnbGUgdG8gc3VwcG9ydCB0cmlnZ2VycyBzaGFyaW5nIGEgcG9wb3ZlciAqL1xyXG4gICAgcHJpdmF0ZSBfc2V0UG9wb3Zlck9wZW5lZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BvcG92ZXJPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcG92ZXJPcGVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck9wZW5lZCQubmV4dCgpO1xyXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPcGVuZWQuZW1pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogc2V0IHN0YXRlIHJhdGhlciB0aGFuIHRvZ2dsZSB0byBzdXBwb3J0IHRyaWdnZXJzIHNoYXJpbmcgYSBwb3BvdmVyICovXHJcbiAgICBwcml2YXRlIF9zZXRQb3BvdmVyQ2xvc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdmVyT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdmVyT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3BvdmVyQ2xvc2VkJC5uZXh0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNsb3NlZC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IGEgdmFsaWQgaW5zdGFuY2Ugb2YgTWRQb3BvdmVyIGhhcyBiZWVuIHBhc3NlZCBpbnRvXHJcbiAgICAgKiAgbWRQb3BvdmVyVHJpZ2dlckZvci4gSWYgbm90LCBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jaGVja1BvcG92ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXIpIHtcclxuICAgICAgICAgICAgdGhyb3dDbWF0UG9wb3Zlck1pc3NpbmdFcnJvcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBUaGlzIG1ldGhvZCBjcmVhdGVzIHRoZSBvdmVybGF5IGZyb20gdGhlIHByb3ZpZGVkIHBvcG92ZXIncyB0ZW1wbGF0ZSBhbmQgc2F2ZXMgaXRzXHJcbiAgICAgKiAgT3ZlcmxheVJlZiBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgRE9NIHdoZW4gb3BlblBvcG92ZXIgaXMgY2FsbGVkLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xyXG4gICAgICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5wb3BvdmVyLnRlbXBsYXRlUmVmLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fZ2V0T3ZlcmxheUNvbmZpZygpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmVUb1Bvc2l0aW9ucyhjb25maWcucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kpO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoY29uZmlnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgYnVpbGRzIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBuZWVkZWQgdG8gY3JlYXRlIHRoZSBvdmVybGF5LCB0aGUgT3ZlcmxheUNvbmZpZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBPdmVybGF5Q29uZmlnXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldE92ZXJsYXlDb25maWcoKTogT3ZlcmxheUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3Qgb3ZlcmxheVN0YXRlID0gbmV3IE92ZXJsYXlDb25maWcoKTtcclxuICAgICAgICBvdmVybGF5U3RhdGUucG9zaXRpb25TdHJhdGVneSA9IHRoaXMuX2dldFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgIC8qKiBEaXNwbGF5IG92ZXJsYXkgYmFja2Ryb3AgaWYgdHJpZ2dlciBldmVudCBpcyBjbGljayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJFdmVudCA9PT0gJ2NsaWNrJykge1xyXG4gICAgICAgICAgICBvdmVybGF5U3RhdGUuaGFzQmFja2Ryb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBvdmVybGF5U3RhdGUuYmFja2Ryb3BDbGFzcyA9ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvdmVybGF5U3RhdGUuZGlyZWN0aW9uID0gdGhpcy5fZGlyO1xyXG4gICAgICAgIG92ZXJsYXlTdGF0ZS5zY3JvbGxTdHJhdGVneSA9IHRoaXMuX2dldE92ZXJsYXlTY3JvbGxTdHJhdGVneSh0aGlzLnBvcG92ZXIuc2Nyb2xsU3RyYXRlZ3kpO1xyXG5cclxuICAgICAgICByZXR1cm4gb3ZlcmxheVN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2Nyb2xsIHN0cmF0ZWd5IHVzZWQgYnkgdGhlIGNkay9vdmVybGF5LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9nZXRPdmVybGF5U2Nyb2xsU3RyYXRlZ3koc3RyYXRlZ3k6IENtYXRQb3BvdmVyU2Nyb2xsU3RyYXRlZ3kpOiBTY3JvbGxTdHJhdGVneSB7XHJcbiAgICAgICAgc3dpdGNoIChzdHJhdGVneSkge1xyXG4gICAgICAgICAgICBjYXNlICdub29wJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpO1xyXG4gICAgICAgICAgICBjYXNlICdjbG9zZSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKTtcclxuICAgICAgICAgICAgY2FzZSAncmVwb3NpdGlvbic6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW5zIHRvIGNoYW5nZXMgaW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5IGFuZCBzZXRzIHRoZSBjb3JyZWN0IGNsYXNzZXNcclxuICAgICAqIG9uIHRoZSBwb3BvdmVyIGJhc2VkIG9uIHRoZSBuZXcgcG9zaXRpb24uIFRoaXMgZW5zdXJlcyB0aGUgYW5pbWF0aW9uIG9yaWdpbiBpcyBhbHdheXNcclxuICAgICAqIGNvcnJlY3QsIGV2ZW4gaWYgYSBmYWxsYmFjayBwb3NpdGlvbiBpcyB1c2VkIGZvciB0aGUgb3ZlcmxheS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9Qb3NpdGlvbnMocG9zaXRpb246IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uID0gcG9zaXRpb24ucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc1ggPVxyXG4gICAgICAgICAgICAgICAgY2hhbmdlLmNvbm5lY3Rpb25QYWlyLm92ZXJsYXlYID09PSAnc3RhcnQnXHJcbiAgICAgICAgICAgICAgICAgICAgPyAnYWZ0ZXInXHJcbiAgICAgICAgICAgICAgICAgICAgOiBjaGFuZ2UuY29ubmVjdGlvblBhaXIub3ZlcmxheVggPT09ICdlbmQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JlZm9yZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2VudGVyJztcclxuICAgICAgICAgICAgY29uc3QgcG9zWSA9XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2UuY29ubmVjdGlvblBhaXIub3ZlcmxheVkgPT09ICd0b3AnXHJcbiAgICAgICAgICAgICAgICAgICAgPyAnYmVsb3cnXHJcbiAgICAgICAgICAgICAgICAgICAgOiBjaGFuZ2UuY29ubmVjdGlvblBhaXIub3ZlcmxheVkgPT09ICdib3R0b20nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Fib3ZlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdjZW50ZXInO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcG9zOiBDbWF0UG9wb3ZlclBvc2l0aW9uID1cclxuICAgICAgICAgICAgICAgIHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2Fib3ZlJyB8fCB0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdiZWxvdydcclxuICAgICAgICAgICAgICAgICAgICA/IFtwb3NZIGFzIENtYXRQb3BvdmVyUG9zaXRpb25TdGFydCwgcG9zWF1cclxuICAgICAgICAgICAgICAgICAgICA6IFtwb3NYIGFzIENtYXRQb3BvdmVyUG9zaXRpb25TdGFydCwgcG9zWV07XHJcblxyXG4gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3IgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3BvdmVyLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9wb3Zlci5zZXRDdXJyZW50U3R5bGVzKHBvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvcG92ZXIuc2V0UG9zaXRpb25DbGFzc2VzKHBvcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgYnVpbGRzIHRoZSBwb3NpdGlvbiBzdHJhdGVneSBmb3IgdGhlIG92ZXJsYXksIHNvIHRoZSBwb3BvdmVyIGlzIHByb3Blcmx5IGNvbm5lY3RlZFxyXG4gICAgICogdG8gdGhlIHRyaWdnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9nZXRQb3NpdGlvbigpOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgICAgIGNvbnN0IFtvcmlnaW5YLCBvcmlnaW4ybmRYLCBvcmlnaW4zcmRYXTogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3NbXSA9XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2JlZm9yZScgfHwgdGhpcy5wb3BvdmVyLnBvc2l0aW9uWzFdID09PSAnYWZ0ZXInXHJcbiAgICAgICAgICAgICAgICA/IFsnc3RhcnQnLCAnY2VudGVyJywgJ2VuZCddXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2FmdGVyJyB8fCB0aGlzLnBvcG92ZXIucG9zaXRpb25bMV0gPT09ICdiZWZvcmUnXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbJ2VuZCcsICdjZW50ZXInLCAnc3RhcnQnXVxyXG4gICAgICAgICAgICAgICAgICAgIDogWydjZW50ZXInLCAnc3RhcnQnLCAnZW5kJ107XHJcblxyXG4gICAgICAgIGNvbnN0IFtvcmlnaW5ZLCBvcmlnaW4ybmRZLCBvcmlnaW4zcmRZXTogVmVydGljYWxDb25uZWN0aW9uUG9zW10gPVxyXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdhYm92ZScgfHwgdGhpcy5wb3BvdmVyLnBvc2l0aW9uWzFdID09PSAnYmVsb3cnXHJcbiAgICAgICAgICAgICAgICA/IFsndG9wJywgJ2NlbnRlcicsICdib3R0b20nXVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdiZWxvdycgfHwgdGhpcy5wb3BvdmVyLnBvc2l0aW9uWzFdID09PSAnYWJvdmUnXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbJ2JvdHRvbScsICdjZW50ZXInLCAndG9wJ11cclxuICAgICAgICAgICAgICAgICAgICA6IFsnY2VudGVyJywgJ3RvcCcsICdib3R0b20nXTtcclxuXHJcbiAgICAgICAgY29uc3QgW292ZXJsYXlYLCBvdmVybGF5RmFsbGJhY2tYXTogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3NbXSA9XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2JlbG93JyB8fCB0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdhYm92ZSdcclxuICAgICAgICAgICAgICAgID8gW29yaWdpblgsIG9yaWdpblhdXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2JlZm9yZSdcclxuICAgICAgICAgICAgICAgICAgICA/IFsnZW5kJywgJ3N0YXJ0J11cclxuICAgICAgICAgICAgICAgICAgICA6IFsnc3RhcnQnLCAnZW5kJ107XHJcblxyXG4gICAgICAgIGNvbnN0IFtvdmVybGF5WSwgb3ZlcmxheUZhbGxiYWNrWV06IFZlcnRpY2FsQ29ubmVjdGlvblBvc1tdID1cclxuICAgICAgICAgICAgdGhpcy5wb3BvdmVyLnBvc2l0aW9uWzBdID09PSAnYmVmb3JlJyB8fCB0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdhZnRlcidcclxuICAgICAgICAgICAgICAgID8gW29yaWdpblksIG9yaWdpblldXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2JlbG93J1xyXG4gICAgICAgICAgICAgICAgICAgID8gWyd0b3AnLCAnYm90dG9tJ11cclxuICAgICAgICAgICAgICAgICAgICA6IFsnYm90dG9tJywgJ3RvcCddO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5GYWxsYmFja1ggPSBvdmVybGF5WDtcclxuICAgICAgICBjb25zdCBvcmlnaW5GYWxsYmFja1kgPSBvdmVybGF5WTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlci54T2Zmc2V0ICYmICFpc05hTihOdW1iZXIodGhpcy5wb3BvdmVyLnhPZmZzZXQpKVxyXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIodGhpcy5kaXIgPT09ICdsdHInID8gdGhpcy5wb3BvdmVyLnhPZmZzZXQgOiAtdGhpcy5wb3BvdmVyLnhPZmZzZXQpXHJcbiAgICAgICAgICAgICAgICA6IDA7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlci55T2Zmc2V0ICYmICFpc05hTihOdW1iZXIodGhpcy5wb3BvdmVyLnlPZmZzZXQpKVxyXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIodGhpcy5wb3BvdmVyLnlPZmZzZXQpXHJcbiAgICAgICAgICAgICAgICA6IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZvciBvdmVycmlkaW5nIHBvc2l0aW9uIGVsZW1lbnQsIHdoZW4gYGNtYXRQb3BvdmVyVGFyZ2V0QXRgIGhhcyBhIHZhbGlkIGVsZW1lbnQgcmVmZXJlbmNlLlxyXG4gICAgICAgICAqIFVzZWZ1bCBmb3Igc3RpY2tpbmcgcG9wb3ZlciB0byBwYXJlbnQgZWxlbWVudCBhbmQgb2Zmc2V0dGluZyBhcnJvdyB0byB0cmlnZ2VyIGVsZW1lbnQuXHJcbiAgICAgICAgICogSWYgdW5kZWZpbmVkIGRlZmF1bHRzIHRvIHRoZSB0cmlnZ2VyIGVsZW1lbnQgcmVmZXJlbmNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZjtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGFyZ2V0RWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3BvdmVyLmNvbnRhaW5lclBvc2l0aW9uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMudGFyZ2V0RWxlbWVudC5fZWxlbWVudFJlZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbeyBvcmlnaW5YLCBvcmlnaW5ZLCBvdmVybGF5WCwgb3ZlcmxheVkgfV07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdhYm92ZScgfHwgdGhpcy5wb3BvdmVyLnBvc2l0aW9uWzBdID09PSAnYmVsb3cnKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9ucyA9IFtcclxuICAgICAgICAgICAgICAgIHsgb3JpZ2luWCwgb3JpZ2luWSwgb3ZlcmxheVgsIG92ZXJsYXlZLCBvZmZzZXRZIH0sXHJcbiAgICAgICAgICAgICAgICB7IG9yaWdpblg6IG9yaWdpbjJuZFgsIG9yaWdpblksIG92ZXJsYXlYOiBvcmlnaW4ybmRYLCBvdmVybGF5WSwgb2Zmc2V0WSB9LFxyXG4gICAgICAgICAgICAgICAgeyBvcmlnaW5YOiBvcmlnaW4zcmRYLCBvcmlnaW5ZLCBvdmVybGF5WDogb3JpZ2luM3JkWCwgb3ZlcmxheVksIG9mZnNldFkgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6IG9yaWdpbkZhbGxiYWNrWSxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WCxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogb3ZlcmxheUZhbGxiYWNrWSxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAtb2Zmc2V0WSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogb3JpZ2luMm5kWCxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiBvcmlnaW5GYWxsYmFja1ksXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6IG9yaWdpbjJuZFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6IG92ZXJsYXlGYWxsYmFja1ksXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogLW9mZnNldFksXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6IG9yaWdpbjNyZFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogb3JpZ2luRmFsbGJhY2tZLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiBvcmlnaW4zcmRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiBvdmVybGF5RmFsbGJhY2tZLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IC1vZmZzZXRZLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXIucG9zaXRpb25bMF0gPT09ICdiZWZvcmUnIHx8IHRoaXMucG9wb3Zlci5wb3NpdGlvblswXSA9PT0gJ2FmdGVyJykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgICAgICAgICB7IG9yaWdpblgsIG9yaWdpblksIG92ZXJsYXlYLCBvdmVybGF5WSwgb2Zmc2V0WCB9LFxyXG4gICAgICAgICAgICAgICAgeyBvcmlnaW5YLCBvcmlnaW5ZOiBvcmlnaW4ybmRZLCBvdmVybGF5WCwgb3ZlcmxheVk6IG9yaWdpbjJuZFksIG9mZnNldFggfSxcclxuICAgICAgICAgICAgICAgIHsgb3JpZ2luWCwgb3JpZ2luWTogb3JpZ2luM3JkWSwgb3ZlcmxheVgsIG92ZXJsYXlZOiBvcmlnaW4zcmRZLCBvZmZzZXRYIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogb3JpZ2luRmFsbGJhY2tYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblksXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6IG92ZXJsYXlGYWxsYmFja1gsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVksXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogLW9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6IG9yaWdpbkZhbGxiYWNrWCxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiBvcmlnaW4ybmRZLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiBvdmVybGF5RmFsbGJhY2tYLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiBvcmlnaW4ybmRZLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IC1vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiBvcmlnaW5GYWxsYmFja1gsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogb3JpZ2luM3JkWSxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogb3ZlcmxheUZhbGxiYWNrWCxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogb3JpZ2luM3JkWSxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiAtb2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVxyXG4gICAgICAgICAgICAucG9zaXRpb24oKVxyXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhlbGVtZW50KVxyXG4gICAgICAgICAgICAud2l0aExvY2tlZFBvc2l0aW9uKClcclxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMocG9zaXRpb25zKVxyXG4gICAgICAgICAgICAud2l0aERlZmF1bHRPZmZzZXRYKG9mZnNldFgpXHJcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdE9mZnNldFkob2Zmc2V0WSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2xlYW5VcFN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9wb3NpdGlvblN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZGV0YWNobWVudHNTdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5fZGV0YWNobWVudHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9zZXRDdXJyZW50Q29uZmlnKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXIudHJpZ2dlckV2ZW50ID0gdGhpcy50cmlnZ2VyRXZlbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBvcG92ZXIuc2V0Q3VycmVudFN0eWxlcygpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=