@sbb-esta/lyne-elements 4.11.0 → 4.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/autocomplete/autocomplete-base-element.js +1 -1
  2. package/autocomplete/autocomplete.component.js +3 -2
  3. package/{autocomplete-base-element-DarHnnYC.js → autocomplete-base-element-De2O5Wx-.js} +14 -9
  4. package/autocomplete.js +1 -1
  5. package/autocomplete.pure.js +1 -1
  6. package/{block-link-common-DzGY49Xc.js → block-link-common-1kRa_czx.js} +1 -1
  7. package/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +1 -1
  8. package/breadcrumb/breadcrumb-group.js +1 -1
  9. package/{breadcrumb-group.component-F3-JZkfO.js → breadcrumb-group.component-CKNsaUqs.js} +1 -1
  10. package/breadcrumb.js +1 -1
  11. package/breadcrumb.pure.js +1 -1
  12. package/button/common/button-common.js +1 -1
  13. package/button/common.js +1 -1
  14. package/button-common-BMEhm-dn.js +87 -0
  15. package/button.js +1 -1
  16. package/button.pure.js +1 -1
  17. package/calendar/calendar/calendar.component.js +1 -1
  18. package/calendar/calendar.js +1 -1
  19. package/{calendar.component-DjQOyRGl.js → calendar.component-C1jk_uE0.js} +3 -3
  20. package/calendar.js +1 -1
  21. package/calendar.pure.js +1 -1
  22. package/card/card-badge/card-badge.component.js +1 -1
  23. package/card/card-badge.js +1 -1
  24. package/{card-badge.component-BSOEYrN4.js → card-badge.component-D0r2iixU.js} +1 -1
  25. package/card.js +1 -1
  26. package/card.pure.js +1 -1
  27. package/checkbox/checkbox.component.js +1 -1
  28. package/checkbox/checkbox.js +1 -1
  29. package/checkbox/common/checkbox-common.js +1 -1
  30. package/checkbox/common.js +1 -1
  31. package/{checkbox-common-DdieysTG.js → checkbox-common-BpW4_bbi.js} +1 -1
  32. package/{checkbox.component-ROzxEnPh.js → checkbox.component-DS48CA_v.js} +1 -1
  33. package/checkbox.js +2 -2
  34. package/checkbox.pure.js +2 -2
  35. package/chip/chip-group/chip-group.component.js +1 -1
  36. package/chip/chip-group.js +1 -1
  37. package/{chip-group.component-DJzUToem.js → chip-group.component-BqBYzfXA.js} +1 -1
  38. package/chip.js +1 -1
  39. package/chip.pure.js +1 -1
  40. package/{compact-paginator.component-Cyi-t_YD.js → compact-paginator.component-BIAPutro.js} +1 -1
  41. package/container/sticky-bar/sticky-bar.component.js +1 -1
  42. package/container/sticky-bar.js +1 -1
  43. package/container.js +1 -1
  44. package/container.pure.js +1 -1
  45. package/core/controllers/overlay-position-controller.js +4 -1
  46. package/core/mixins/element-internals-mixin.js +1 -1
  47. package/core/mixins/form-associated-input-mixin.js +1 -1
  48. package/core/mixins/named-slot-list-mixin.js +4 -1
  49. package/core/overlay/position.js +4 -4
  50. package/core/styles/core.scss +62 -77
  51. package/core/styles/mixins/helpers.scss +3 -3
  52. package/core/styles/mixins/overlay.scss +2 -2
  53. package/core/styles/mixins/typo.scss +2 -2
  54. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables-as-css.scss +8 -0
  55. package/core.css +177 -73
  56. package/custom-elements.json +574 -306
  57. package/development/autocomplete/autocomplete-base-element.d.ts +8 -1
  58. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  59. package/development/autocomplete/autocomplete-base-element.js +1 -1
  60. package/development/autocomplete/autocomplete.component.js +4 -3
  61. package/development/autocomplete-base-element-BpCpYcX9.js +692 -0
  62. package/development/autocomplete.js +1 -1
  63. package/development/autocomplete.pure.js +1 -1
  64. package/development/{block-link-common-GckvjULA.js → block-link-common-COY1RI1I.js} +2 -2
  65. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +1 -1
  66. package/development/breadcrumb/breadcrumb-group.js +1 -1
  67. package/development/breadcrumb-group.component-DZslNBlB.js +195 -0
  68. package/development/breadcrumb.js +1 -1
  69. package/development/breadcrumb.pure.js +1 -1
  70. package/development/button/common/button-common.js +1 -1
  71. package/development/button/common.js +1 -1
  72. package/development/{button-common-CAu09Yim.js → button-common-7dmrUx4A.js} +3 -3
  73. package/development/button.js +1 -1
  74. package/development/button.pure.js +1 -1
  75. package/development/calendar/calendar/calendar.component.js +1 -1
  76. package/development/calendar/calendar.js +1 -1
  77. package/development/calendar-cell-base-element-BXohfDSl.js +1 -1
  78. package/development/calendar.component-Dg3D2A7k.js +1453 -0
  79. package/development/calendar.js +1 -1
  80. package/development/calendar.pure.js +1 -1
  81. package/development/card/card-badge/card-badge.component.js +1 -1
  82. package/development/card/card-badge.js +1 -1
  83. package/development/card-action-common-1FDHbfeR.js +1 -1
  84. package/development/card-badge.component-CUZIoVbL.js +84 -0
  85. package/development/card.js +1 -1
  86. package/development/card.pure.js +1 -1
  87. package/development/carousel-list.component-L-nYpHcN.js +1 -1
  88. package/development/carousel.component-Dl48ROSf.js +1 -1
  89. package/development/checkbox/checkbox.component.js +1 -1
  90. package/development/checkbox/checkbox.js +1 -1
  91. package/development/checkbox/common/checkbox-common.js +1 -1
  92. package/development/checkbox/common.js +1 -1
  93. package/development/checkbox-common-Dd5uup8K.js +86 -0
  94. package/development/checkbox-group/checkbox-group.component.js +1 -1
  95. package/development/{checkbox.component-D3_FFSys.js → checkbox.component-CFZrwUTA.js} +2 -2
  96. package/development/checkbox.js +2 -2
  97. package/development/checkbox.pure.js +2 -2
  98. package/development/chip/chip-group/chip-group.component.js +1 -1
  99. package/development/chip/chip-group.js +1 -1
  100. package/development/chip-group.component-BVfHWX2-.js +409 -0
  101. package/development/chip.js +1 -1
  102. package/development/chip.pure.js +1 -1
  103. package/development/clock.component-CVPv4mCp.js +1 -1
  104. package/development/compact-paginator.component-5_Q2Reul.js +51 -0
  105. package/development/container/sticky-bar/sticky-bar.component.js +1 -1
  106. package/development/container/sticky-bar.js +1 -1
  107. package/development/container.js +1 -1
  108. package/development/container.pure.js +1 -1
  109. package/development/core/a11y/input-modality-detector.js +1 -1
  110. package/development/core/base-elements/element.js +1 -1
  111. package/development/core/controllers/media-matchers-controller.js +1 -1
  112. package/development/core/controllers/overlay-position-controller.js +3 -2
  113. package/development/core/datetime/date-adapter.js +1 -1
  114. package/development/core/datetime/native-date-adapter.js +1 -1
  115. package/development/core/datetime/temporal-date-adapter.js +1 -1
  116. package/development/core/eventing/throttle.d.ts +1 -0
  117. package/development/core/eventing/throttle.d.ts.map +1 -1
  118. package/development/core/eventing/throttle.js +2 -1
  119. package/development/core/mixins/disabled-mixin.js +1 -1
  120. package/development/core/mixins/element-internals-mixin.js +2 -2
  121. package/development/core/mixins/form-associated-checkbox-mixin.js +1 -1
  122. package/development/core/mixins/form-associated-input-mixin.js +2 -2
  123. package/development/core/mixins/form-associated-mixin.js +1 -1
  124. package/development/core/mixins/form-associated-radio-button-mixin.js +1 -1
  125. package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  126. package/development/core/mixins/named-slot-list-mixin.js +5 -2
  127. package/development/core/mixins/negative-mixin.js +1 -1
  128. package/development/core/mixins/readonly-mixin.js +1 -1
  129. package/development/core/mixins/required-mixin.js +1 -1
  130. package/development/core/overlay/position.d.ts.map +1 -1
  131. package/development/core/overlay/position.js +4 -2
  132. package/development/core/testing/event-spy.js +1 -1
  133. package/development/datepicker/common/datepicker-button.d.ts +6 -0
  134. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  135. package/development/datepicker/common/datepicker-button.js +1 -1
  136. package/development/datepicker/common.js +1 -1
  137. package/development/datepicker/datepicker/datepicker.component.d.ts +3 -0
  138. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  139. package/development/datepicker/datepicker/datepicker.component.js +1 -1
  140. package/development/datepicker/datepicker.js +1 -1
  141. package/development/datepicker-button-CUPeoQgH.js +169 -0
  142. package/development/datepicker.component-D2DxFng_.js +216 -0
  143. package/development/datepicker.js +2 -2
  144. package/development/datepicker.pure.js +2 -2
  145. package/development/error.component-OBpWoVRL.js +55 -0
  146. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +1 -1
  147. package/development/expansion-panel/expansion-panel-header.js +1 -1
  148. package/development/expansion-panel-header.component-C1xRGcAN.js +85 -0
  149. package/development/expansion-panel.js +1 -1
  150. package/development/expansion-panel.pure.js +1 -1
  151. package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
  152. package/development/file-selector/common/file-selector-common.js +1 -1
  153. package/development/file-selector/common.js +1 -1
  154. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
  155. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
  156. package/development/file-selector/file-selector-dropzone.js +1 -1
  157. package/development/file-selector-common-C7xIEiV4.js +416 -0
  158. package/development/file-selector-dropzone.component-BAWMZW4F.js +111 -0
  159. package/development/file-selector.js +2 -2
  160. package/development/file-selector.pure.js +2 -2
  161. package/development/footer/footer.component.js +1 -1
  162. package/development/footer.component-BmDkxYW9.js +172 -0
  163. package/development/footer.js +1 -1
  164. package/development/footer.pure.js +1 -1
  165. package/development/form-field/error/error.component.js +1 -1
  166. package/development/form-field/error.js +1 -1
  167. package/development/form-field/form-field/form-field.component.js +1 -1
  168. package/development/form-field/form-field-clear/form-field-clear.component.d.ts +3 -0
  169. package/development/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  170. package/development/form-field/form-field-clear/form-field-clear.component.js +4 -1
  171. package/development/form-field/form-field.js +1 -1
  172. package/development/form-field/hint/hint.component.js +1 -1
  173. package/development/form-field.component-BU3Sv2mD.js +707 -0
  174. package/development/form-field.js +3 -3
  175. package/development/form-field.pure.js +3 -3
  176. package/development/header/header/header.component.js +1 -1
  177. package/development/header/header.js +1 -1
  178. package/development/header-action-common-MTYV0dqA.js +1 -1
  179. package/development/header.component-CWJ36jF0.js +340 -0
  180. package/development/header.js +1 -1
  181. package/development/header.pure.js +1 -1
  182. package/development/hint.component-DUtL0RS3.js +38 -0
  183. package/development/icon/icon-name-mixin.js +1 -1
  184. package/development/image.component-BD0jc-u-.js +1 -1
  185. package/development/link/common/block-link-common.js +1 -1
  186. package/development/link/common.js +1 -1
  187. package/development/link-common-DJ2FfG_Q.js +1 -1
  188. package/development/link-list-base-CKMNz30d.js +1 -1
  189. package/development/link.js +1 -1
  190. package/development/link.pure.js +1 -1
  191. package/development/message/message.component.js +1 -1
  192. package/development/message.component-Dlf5V5ba.js +44 -0
  193. package/development/message.js +1 -1
  194. package/development/message.pure.js +1 -1
  195. package/development/mini-calendar.component-BufzKw74.js +1 -1
  196. package/development/navigation/common/navigation-action-common.js +1 -1
  197. package/development/navigation/common.js +1 -1
  198. package/development/navigation/navigation-marker/navigation-marker.component.js +1 -1
  199. package/development/navigation/navigation-marker.js +1 -1
  200. package/development/navigation/navigation-section/navigation-section.component.js +1 -1
  201. package/development/navigation/navigation-section.js +1 -1
  202. package/development/{navigation-action-common-DpBp7-eZ.js → navigation-action-common-Hjr4dI9J.js} +2 -2
  203. package/development/{navigation-marker.component-BpZdT4xz.js → navigation-marker.component-GOv42emC.js} +2 -2
  204. package/development/{navigation-section.component-CtZtuacK.js → navigation-section.component-CnVrRETN.js} +2 -2
  205. package/development/navigation.component-CTNQ1dix.js +1 -1
  206. package/development/navigation.js +3 -3
  207. package/development/navigation.pure.js +3 -3
  208. package/development/notification/notification.component.js +1 -1
  209. package/development/notification.component-Cvq_uViC.js +274 -0
  210. package/development/notification.js +1 -1
  211. package/development/notification.pure.js +1 -1
  212. package/development/option/option/option-base-element.d.ts.map +1 -1
  213. package/development/option/option/option-base-element.js +3 -1
  214. package/development/option/option/option.component.js +1 -1
  215. package/development/option/option.js +1 -1
  216. package/development/option.component-Bb2C7ae5.js +130 -0
  217. package/development/option.js +1 -1
  218. package/development/option.pure.js +1 -1
  219. package/development/paginator/common/paginator-common.js +1 -1
  220. package/development/paginator/compact-paginator/compact-paginator.component.js +1 -1
  221. package/development/paginator/compact-paginator.js +1 -1
  222. package/development/paginator/paginator/paginator.component.js +1 -1
  223. package/development/paginator/paginator.js +1 -1
  224. package/development/paginator.component-Bn5tK0FK.js +259 -0
  225. package/development/paginator.js +2 -2
  226. package/development/paginator.pure.js +2 -2
  227. package/development/panel-mixin-Dj_rsgL9.js +1 -1
  228. package/development/popover/popover.component.d.ts +2 -1
  229. package/development/popover/popover.component.d.ts.map +1 -1
  230. package/development/popover/popover.component.js +1 -1
  231. package/development/popover.component-EgOs-wsR.js +572 -0
  232. package/development/popover.js +1 -1
  233. package/development/popover.pure.js +1 -1
  234. package/development/radio-button/common/radio-button-common.js +1 -1
  235. package/development/radio-button/common.js +1 -1
  236. package/development/radio-button/radio-button.component.js +1 -1
  237. package/development/radio-button/radio-button.js +1 -1
  238. package/development/radio-button-common--d3WX-ZM.js +126 -0
  239. package/development/radio-button-panel/radio-button-panel.component.js +1 -1
  240. package/development/{radio-button.component-BrQF2FfA.js → radio-button.component-BauLEeCV.js} +2 -2
  241. package/development/radio-button.js +2 -2
  242. package/development/radio-button.pure.js +2 -2
  243. package/development/select/select.component.d.ts.map +1 -1
  244. package/development/select/select.component.js +1 -1
  245. package/development/select.component-D9SFG7Lk.js +814 -0
  246. package/development/select.js +1 -1
  247. package/development/select.pure.js +1 -1
  248. package/development/sidebar-container.component-BDSoDAym.js +1 -1
  249. package/development/sidebar.component-BLqO52nH.js +1 -1
  250. package/development/slider/slider.component.js +1 -1
  251. package/development/{slider.component-BjfLnUvP.js → slider.component-C3qZB6ar.js} +2 -2
  252. package/development/slider.js +1 -1
  253. package/development/slider.pure.js +1 -1
  254. package/development/status/status.component.js +1 -1
  255. package/development/status.component-CPi1cPN0.js +111 -0
  256. package/development/status.js +1 -1
  257. package/development/status.pure.js +1 -1
  258. package/development/step-label.component-BJ9eainz.js +131 -0
  259. package/development/stepper/step-label/step-label.component.js +1 -1
  260. package/development/stepper/step-label.js +1 -1
  261. package/development/stepper.component-CxOBayI1.js +1 -1
  262. package/development/stepper.js +1 -1
  263. package/development/stepper.pure.js +1 -1
  264. package/development/{sticky-bar.component-Dzrdsnxu.js → sticky-bar.component-CysAIZTd.js} +3 -3
  265. package/development/styles-D8-q-irv.js +1 -1
  266. package/development/styles-Jlhoev1S.js +14 -0
  267. package/development/tab-group.component-D9jCK26q.js +275 -0
  268. package/development/{tab-label.component-14j2eh4Z.js → tab-label.component-B9e9kgVf.js} +2 -2
  269. package/development/tabs/common/styles.js +1 -1
  270. package/development/tabs/common.js +1 -1
  271. package/development/tabs/tab-group/tab-group.component.d.ts +1 -0
  272. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  273. package/development/tabs/tab-group/tab-group.component.js +1 -1
  274. package/development/tabs/tab-group.js +1 -1
  275. package/development/tabs/tab-label/tab-label.component.js +1 -1
  276. package/development/tabs/tab-label.js +1 -1
  277. package/development/tabs.js +3 -3
  278. package/development/tabs.pure.js +3 -3
  279. package/development/tag/tag/tag.component.js +1 -1
  280. package/development/tag/tag.js +1 -1
  281. package/development/tag.component-Bl1nlIXQ.js +245 -0
  282. package/development/tag.js +1 -1
  283. package/development/tag.pure.js +1 -1
  284. package/development/teaser-hero/teaser-hero.component.js +1 -1
  285. package/development/{teaser-hero.component-DNlc8Tbl.js → teaser-hero.component-BIOpoGME.js} +2 -2
  286. package/development/teaser-hero.js +1 -1
  287. package/development/teaser-hero.pure.js +1 -1
  288. package/development/teaser-product-common-DYX370pm.js +1 -1
  289. package/development/time-input.component-BtdSR8kB.js +1 -1
  290. package/development/timetable-form/timetable-form/timetable-form.component.js +1 -1
  291. package/development/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  292. package/development/timetable-form/timetable-form-details.js +1 -1
  293. package/development/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  294. package/development/timetable-form/timetable-form-field.js +1 -1
  295. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts +3 -0
  296. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts.map +1 -1
  297. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +1 -1
  298. package/development/timetable-form/timetable-form-swap-button.js +1 -1
  299. package/development/timetable-form/timetable-form.js +1 -1
  300. package/development/timetable-form-details.component-DJl5Qt9y.js +26 -0
  301. package/development/timetable-form-field.component-DQ_TzcF4.js +44 -0
  302. package/development/{timetable-form-swap-button.component-BUKUjrpl.js → timetable-form-swap-button.component-Bh9aPmdn.js} +4 -1
  303. package/development/timetable-form.component-N8h4JBlH.js +27 -0
  304. package/development/timetable-form.js +4 -4
  305. package/development/timetable-form.pure.js +4 -4
  306. package/development/timetable-occupancy/timetable-occupancy.component.js +1 -1
  307. package/development/timetable-occupancy.component-BBcznUh0.js +124 -0
  308. package/development/timetable-occupancy.js +1 -1
  309. package/development/timetable-occupancy.pure.js +1 -1
  310. package/development/title/title-base.js +1 -1
  311. package/development/title/title.component.js +1 -1
  312. package/development/{title-base-CBE_2Hkb.js → title-base-BdYKwj3-.js} +2 -2
  313. package/development/{title.component-Dk23JVct.js → title.component-DSXVkddh.js} +2 -2
  314. package/development/title.js +2 -2
  315. package/development/title.pure.js +2 -2
  316. package/development/toast/toast.component.js +1 -1
  317. package/development/toast.component-IhHx0Qt3.js +275 -0
  318. package/development/toast.js +1 -1
  319. package/development/toast.pure.js +1 -1
  320. package/development/toggle/toggle/toggle.component.d.ts.map +1 -1
  321. package/development/toggle/toggle/toggle.component.js +1 -1
  322. package/development/toggle/toggle-option/toggle-option.component.d.ts +1 -0
  323. package/development/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  324. package/development/toggle/toggle-option/toggle-option.component.js +1 -1
  325. package/development/toggle/toggle-option.js +1 -1
  326. package/development/toggle/toggle.js +1 -1
  327. package/development/toggle-check/toggle-check.component.js +1 -1
  328. package/development/toggle-check.component-_fDAuLob.js +159 -0
  329. package/development/toggle-check.js +1 -1
  330. package/development/toggle-check.pure.js +1 -1
  331. package/development/toggle-option.component-DTS3a603.js +167 -0
  332. package/development/toggle.component-BJpD1b9H.js +249 -0
  333. package/development/toggle.js +2 -2
  334. package/development/toggle.pure.js +2 -2
  335. package/development/tooltip/tooltip.component.js +1 -1
  336. package/development/tooltip.component-YaUQA-Id.js +378 -0
  337. package/development/tooltip.js +1 -1
  338. package/development/tooltip.pure.js +1 -1
  339. package/development/train/train-wagon/train-wagon.component.js +1 -1
  340. package/development/train/train-wagon.js +1 -1
  341. package/development/{train-wagon.component-BzA8-S_6.js → train-wagon.component-CNxkffOO.js} +2 -2
  342. package/development/train.js +1 -1
  343. package/development/train.pure.js +1 -1
  344. package/{error.component-B_D8WUP5.js → error.component-DH9Obd7a.js} +1 -1
  345. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +1 -1
  346. package/expansion-panel/expansion-panel-header.js +1 -1
  347. package/{expansion-panel-header.component-B_dQ3ZWT.js → expansion-panel-header.component-uhZcVE_i.js} +2 -2
  348. package/expansion-panel.js +1 -1
  349. package/expansion-panel.pure.js +1 -1
  350. package/file-selector/common/file-selector-common.js +1 -1
  351. package/file-selector/common.js +1 -1
  352. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
  353. package/file-selector/file-selector-dropzone.js +1 -1
  354. package/{file-selector-common-DN4vHMpP.js → file-selector-common-BL9mM4SZ.js} +38 -40
  355. package/{file-selector-dropzone.component-CBKsZsC2.js → file-selector-dropzone.component-Ctar2kEw.js} +3 -4
  356. package/file-selector.js +2 -2
  357. package/file-selector.pure.js +2 -2
  358. package/footer/footer.component.js +1 -1
  359. package/{footer.component-BM91Utiz.js → footer.component-b2docCY_.js} +1 -1
  360. package/footer.js +1 -1
  361. package/footer.pure.js +1 -1
  362. package/form-field/error/error.component.js +1 -1
  363. package/form-field/error.js +1 -1
  364. package/form-field/form-field/form-field.component.js +1 -1
  365. package/form-field/form-field.js +1 -1
  366. package/form-field/hint/hint.component.js +1 -1
  367. package/{form-field.component-Cx5Keg_p.js → form-field.component-BwZDRKbQ.js} +3 -2
  368. package/form-field.js +3 -3
  369. package/form-field.pure.js +3 -3
  370. package/header/header/header.component.js +1 -1
  371. package/header/header.js +1 -1
  372. package/{header.component-hZqs06Yh.js → header.component-UQUFcMOD.js} +1 -1
  373. package/header.js +1 -1
  374. package/header.pure.js +1 -1
  375. package/{hint.component-BVUUrSSu.js → hint.component-CE2D2TLU.js} +1 -1
  376. package/link/common/block-link-common.js +1 -1
  377. package/link/common.js +1 -1
  378. package/link.js +1 -1
  379. package/link.pure.js +1 -1
  380. package/message/message.component.js +1 -1
  381. package/message.component-DhN-aFms.js +27 -0
  382. package/message.js +1 -1
  383. package/message.pure.js +1 -1
  384. package/navigation/common/navigation-action-common.js +1 -1
  385. package/navigation/common.js +1 -1
  386. package/navigation/navigation-marker/navigation-marker.component.js +1 -1
  387. package/navigation/navigation-marker.js +1 -1
  388. package/navigation/navigation-section/navigation-section.component.js +1 -1
  389. package/navigation/navigation-section.js +1 -1
  390. package/{navigation-action-common-2ix0xrBs.js → navigation-action-common-AzRltwrb.js} +1 -1
  391. package/{navigation-marker.component-DKxK16IU.js → navigation-marker.component-BzbbKlfT.js} +1 -1
  392. package/{navigation-section.component-CvjXVn5r.js → navigation-section.component-DQxCi3O_.js} +1 -1
  393. package/navigation.js +3 -3
  394. package/navigation.pure.js +3 -3
  395. package/notification/notification.component.js +1 -1
  396. package/{notification.component-DjXJFh1G.js → notification.component-D80Wl5xM.js} +1 -1
  397. package/notification.js +1 -1
  398. package/notification.pure.js +1 -1
  399. package/off-brand-theme.css +177 -73
  400. package/option/option/option-base-element.js +1 -1
  401. package/option/option/option.component.js +1 -1
  402. package/option/option.js +1 -1
  403. package/{option.component-M-V_tdSC.js → option.component-CMp8QVZT.js} +2 -2
  404. package/option.js +1 -1
  405. package/option.pure.js +1 -1
  406. package/package.json +1 -1
  407. package/paginator/compact-paginator/compact-paginator.component.js +1 -1
  408. package/paginator/compact-paginator.js +1 -1
  409. package/paginator/paginator/paginator.component.js +1 -1
  410. package/paginator/paginator.js +1 -1
  411. package/{paginator.component-CZt7Epaf.js → paginator.component-BEr0qU0m.js} +1 -1
  412. package/paginator.js +2 -2
  413. package/paginator.pure.js +2 -2
  414. package/popover/popover.component.js +1 -1
  415. package/{popover.component-DWNuW4wM.js → popover.component-CnOrQaaa.js} +82 -58
  416. package/popover.js +1 -1
  417. package/popover.pure.js +1 -1
  418. package/radio-button/common/radio-button-common.js +1 -1
  419. package/radio-button/common.js +1 -1
  420. package/radio-button/radio-button.component.js +1 -1
  421. package/radio-button/radio-button.js +1 -1
  422. package/{radio-button-common-DP4Izwwf.js → radio-button-common-C1mIf9KY.js} +1 -1
  423. package/{radio-button.component-BiGeOI5L.js → radio-button.component-Bae-yK_U.js} +1 -1
  424. package/radio-button.js +2 -2
  425. package/radio-button.pure.js +2 -2
  426. package/safety-theme.css +177 -73
  427. package/select/select.component.js +1 -1
  428. package/{select.component-DWLdApt_.js → select.component-BT6RbERH.js} +3 -3
  429. package/select.js +1 -1
  430. package/select.pure.js +1 -1
  431. package/slider/slider.component.js +1 -1
  432. package/{slider.component-CoqCppCq.js → slider.component-BlRVR6iU.js} +1 -1
  433. package/slider.js +1 -1
  434. package/slider.pure.js +1 -1
  435. package/standard-theme.css +177 -73
  436. package/status/status.component.js +1 -1
  437. package/{status.component-BFyXTFXH.js → status.component-lw_WDs7W.js} +1 -1
  438. package/status.js +1 -1
  439. package/status.pure.js +1 -1
  440. package/step-label.component-Dqis4FAN.js +80 -0
  441. package/stepper/step-label/step-label.component.js +1 -1
  442. package/stepper/step-label.js +1 -1
  443. package/stepper.js +1 -1
  444. package/stepper.pure.js +1 -1
  445. package/{sticky-bar.component-DDBq8uXU.js → sticky-bar.component-37iKnzVR.js} +2 -2
  446. package/styles-BNu0Fjw5.js +5 -0
  447. package/{tab-group.component-Doy39cEh.js → tab-group.component-BCJix5Cq.js} +37 -34
  448. package/{tab-label.component-CD56RH1Z.js → tab-label.component-CpdUyfiq.js} +1 -1
  449. package/tabs/common/styles.js +1 -1
  450. package/tabs/common.js +1 -1
  451. package/tabs/tab-group/tab-group.component.js +1 -1
  452. package/tabs/tab-group.js +1 -1
  453. package/tabs/tab-label/tab-label.component.js +1 -1
  454. package/tabs/tab-label.js +1 -1
  455. package/tabs.js +3 -3
  456. package/tabs.pure.js +3 -3
  457. package/tag/tag/tag.component.js +1 -1
  458. package/tag/tag.js +1 -1
  459. package/{tag.component-CzYJZuFT.js → tag.component-CsNszQvB.js} +1 -1
  460. package/tag.js +1 -1
  461. package/tag.pure.js +1 -1
  462. package/teaser-hero/teaser-hero.component.js +1 -1
  463. package/{teaser-hero.component-CHy82SKQ.js → teaser-hero.component-D8yj-N5n.js} +1 -1
  464. package/teaser-hero.js +1 -1
  465. package/teaser-hero.pure.js +1 -1
  466. package/timetable-form/timetable-form/timetable-form.component.js +1 -1
  467. package/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  468. package/timetable-form/timetable-form-details.js +1 -1
  469. package/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  470. package/timetable-form/timetable-form-field.js +1 -1
  471. package/timetable-form/timetable-form.js +1 -1
  472. package/timetable-form-details.component-mWKaBW_9.js +16 -0
  473. package/timetable-form-field.component-Cv_lv8vf.js +32 -0
  474. package/{timetable-form.component-CU1FXAZH.js → timetable-form.component-YcvKAlfz.js} +1 -1
  475. package/timetable-form.js +3 -3
  476. package/timetable-form.pure.js +3 -3
  477. package/timetable-occupancy/timetable-occupancy.component.js +1 -1
  478. package/{timetable-occupancy.component-Db9SfiyD.js → timetable-occupancy.component-BCXPxz68.js} +1 -1
  479. package/timetable-occupancy.js +1 -1
  480. package/timetable-occupancy.pure.js +1 -1
  481. package/title/title-base.js +1 -1
  482. package/title/title.component.js +1 -1
  483. package/{title-base-D72Xo2SW.js → title-base-DV0qhfG9.js} +1 -1
  484. package/{title.component-CoMa84Sz.js → title.component-DAGyXwDm.js} +1 -1
  485. package/title.js +2 -2
  486. package/title.pure.js +2 -2
  487. package/toast/toast.component.js +1 -1
  488. package/{toast.component-BDE1vYLS.js → toast.component-CORnf2Tl.js} +3 -3
  489. package/toast.js +1 -1
  490. package/toast.pure.js +1 -1
  491. package/toggle/toggle/toggle.component.js +1 -1
  492. package/toggle/toggle-option/toggle-option.component.js +1 -1
  493. package/toggle/toggle-option.js +1 -1
  494. package/toggle/toggle.js +1 -1
  495. package/toggle-check/toggle-check.component.js +1 -1
  496. package/toggle-check.component-DvoslSRr.js +119 -0
  497. package/toggle-check.js +1 -1
  498. package/toggle-check.pure.js +1 -1
  499. package/{toggle-option.component-Bw-GXUQK.js → toggle-option.component-pX3tNwjE.js} +5 -7
  500. package/{toggle.component-BPpsMMPG.js → toggle.component-B20xAw1V.js} +6 -10
  501. package/toggle.js +2 -2
  502. package/toggle.pure.js +2 -2
  503. package/tooltip/tooltip.component.js +1 -1
  504. package/{tooltip.component-BY9mV5Sw.js → tooltip.component-ocVpJogs.js} +1 -1
  505. package/tooltip.js +1 -1
  506. package/tooltip.pure.js +1 -1
  507. package/train/train-wagon/train-wagon.component.js +1 -1
  508. package/train/train-wagon.js +1 -1
  509. package/{train-wagon.component-BwCcF4GD.js → train-wagon.component-BT4Xnzxr.js} +1 -1
  510. package/train.js +1 -1
  511. package/train.pure.js +1 -1
  512. package/button-common-yFVzAoGy.js +0 -87
  513. package/development/autocomplete-base-element-YwfObJzm.js +0 -678
  514. package/development/breadcrumb-group.component-HBWRdDpS.js +0 -195
  515. package/development/calendar.component-6p9vsp-V.js +0 -1452
  516. package/development/card-badge.component-D4Mes-Gw.js +0 -84
  517. package/development/checkbox-common-DiTlHvFJ.js +0 -86
  518. package/development/chip-group.component-CvpUdzu1.js +0 -409
  519. package/development/compact-paginator.component-TfDVt_ST.js +0 -51
  520. package/development/datepicker-button-CANzGO5m.js +0 -163
  521. package/development/datepicker.component-C8XQVo45.js +0 -213
  522. package/development/error.component-xD_c9IBA.js +0 -55
  523. package/development/expansion-panel-header.component-Bw4uROTe.js +0 -85
  524. package/development/file-selector-common-C82QR3zb.js +0 -418
  525. package/development/file-selector-dropzone.component-B-cBO4bf.js +0 -112
  526. package/development/footer.component-BblB5218.js +0 -172
  527. package/development/form-field.component-DfMO_ihX.js +0 -706
  528. package/development/header.component-Cg0ZcA1s.js +0 -340
  529. package/development/hint.component-BsIzdUOV.js +0 -38
  530. package/development/message.component-CeJhYXSC.js +0 -44
  531. package/development/notification.component-Co9QChXc.js +0 -274
  532. package/development/option.component-CdL7fdzZ.js +0 -130
  533. package/development/paginator.component-DAdS2mMm.js +0 -259
  534. package/development/popover.component-BCMdJBUR.js +0 -537
  535. package/development/radio-button-common-C3-xuY78.js +0 -126
  536. package/development/select.component-CGNEhqzl.js +0 -812
  537. package/development/status.component-CHC2pBa-.js +0 -111
  538. package/development/step-label.component-CJFPHIZa.js +0 -131
  539. package/development/styles-DCQBzC2C.js +0 -14
  540. package/development/tab-group.component-DRipdAyc.js +0 -272
  541. package/development/tag.component-CnNPL6aI.js +0 -245
  542. package/development/timetable-form-details.component-C8awcdP5.js +0 -26
  543. package/development/timetable-form-field.component-BI24VjkC.js +0 -44
  544. package/development/timetable-form.component-CUG86CSN.js +0 -27
  545. package/development/timetable-occupancy.component-D_PXXvI9.js +0 -124
  546. package/development/toast.component-BnbpuU9L.js +0 -274
  547. package/development/toggle-check.component-BG4w_sE8.js +0 -159
  548. package/development/toggle-option.component-D-F7Fh7i.js +0 -168
  549. package/development/toggle.component-BFYLRN8o.js +0 -254
  550. package/development/tooltip.component-DzSd9VjW.js +0 -378
  551. package/message.component-BQjnZ5Z3.js +0 -27
  552. package/step-label.component-DnQBwnL8.js +0 -80
  553. package/styles-BUpK1iP2.js +0 -5
  554. package/timetable-form-details.component-CBZ7QSAx.js +0 -16
  555. package/timetable-form-field.component-BKxQQqt7.js +0 -32
  556. package/toggle-check.component-B6Ww5pLD.js +0 -119
@@ -0,0 +1,572 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { html, isServer, nothing, unsafeCSS } from "lit";
3
+ import { property, state } from "lit/decorators.js";
4
+ import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
5
+ import { forceType, idReference } from "./core/decorators.js";
6
+ import { isZeroAnimationDuration } from "./core/dom.js";
7
+ import { composedPathHasAttribute } from "./core/eventing.js";
8
+ import { ɵstateController } from "./core/mixins.js";
9
+ import { boxSizingStyles } from "./core/styles.js";
10
+ import { SbbSecondaryButtonElement } from "./button.pure.js";
11
+ import { SbbEscapableOverlayController, SbbLanguageController, SbbMediaQueryPointerCoarse } from "./core/controllers.js";
12
+ import { i18nClosePopover } from "./core/i18n.js";
13
+ import { ResizeController } from "@lit-labs/observers/resize-controller.js";
14
+ import { ref } from "lit/directives/ref.js";
15
+ import { getElementPosition, isEventOnElement, removeAriaOverlayTriggerAttributes, setAriaOverlayTriggerAttributes } from "./core/overlay.js";
16
+ import { IS_FOCUSABLE_QUERY, SbbFocusTrapController, isFakeMousedownFromScreenReader, sbbInputModalityDetector } from "./core/a11y.js";
17
+ import { readConfig } from "./core/config.js";
18
+ //#region src/elements/popover/popover.scss?inline
19
+ var popover_default = ":host {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-default);\n --sbb-focus-outline-color: light-dark(\n var(--sbb-focus-outline-color-default),\n var(--sbb-focus-outline-color-dark)\n );\n --sbb-popover-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n --_sbb-popover-inset: 0 auto auto 0;\n --_sbb-popover-transform: translateY(var(--sbb-spacing-fixed-2x));\n --_sbb-popover-box-shadow: var(--sbb-box-shadow-level-9-hard);\n outline: none !important;\n display: none;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --_sbb-popover-inset: 0;\n display: block;\n}\n\n:host(:is(:state(position-above),[state--position-above])) {\n --_sbb-popover-transform: translateY(calc(var(--sbb-spacing-fixed-2x) * -1));\n}\n\n:host(:not([hide-close-button], :is(:state(hover-trigger),[state--hover-trigger]))) {\n --sbb-popover-min-height: calc(var(--sbb-size-element-xs) + 2 * var(--sbb-popover-padding));\n}\n\n.sbb-popover::after,\n.sbb-popover__content::before {\n content: \"\";\n position: absolute;\n display: block;\n width: var(--sbb-popover-arrow-size);\n height: var(--sbb-popover-arrow-size);\n left: var(--_sbb-popover-arrow-position-x, 0);\n bottom: calc(100% - var(--sbb-popover-arrow-size) / 2);\n background-color: var(--sbb-popover-background);\n border-radius: var(--sbb-border-radius-2x) 0;\n transform: rotate(45deg);\n}\n\n.sbb-popover__container {\n position: fixed;\n inset: var(--_sbb-popover-inset);\n pointer-events: none;\n z-index: var(--sbb-popover-z-index, var(--sbb-overlay-default-z-index));\n}\n\n.sbb-popover {\n display: none;\n position: var(--sbb-popover-position, absolute);\n top: var(--_sbb-popover-position-y, 0);\n bottom: unset;\n left: var(--_sbb-popover-position-x, 0);\n right: unset;\n background-color: var(--sbb-popover-background);\n max-width: var(--sbb-popover-max-width);\n width: max-content;\n padding: 0;\n box-shadow: var(--_sbb-popover-box-shadow);\n border: none;\n border-radius: var(--sbb-popover-border-radius);\n outline: none;\n pointer-events: all;\n}\n:host(:focus-visible) .sbb-popover {\n outline-offset: var(--sbb-focus-outline-offset);\n outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-popover {\n display: block;\n animation-name: open;\n animation-duration: var(--sbb-popover-animation-duration);\n animation-timing-function: var(--sbb-popover-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-popover {\n pointer-events: none;\n animation-name: close;\n animation-duration: var(--sbb-popover-animation-duration);\n animation-timing-function: var(--sbb-popover-animation-easing);\n}\n.sbb-popover::after {\n z-index: -1;\n box-shadow: var(--_sbb-popover-box-shadow);\n}\n@media (forced-colors: active) {\n .sbb-popover::after {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n:host(:is(:state(position-above),[state--position-above])) .sbb-popover::after {\n top: calc(100% - var(--sbb-popover-arrow-size) / 2);\n}\n@media (forced-colors: active) {\n .sbb-popover {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n.sbb-popover::before {\n content: \"\";\n display: block;\n position: absolute;\n inset: 0;\n z-index: -1;\n background-color: transparent;\n}\n:host(:is(:state(position-below),[state--position-below])) .sbb-popover::before {\n inset-block-start: calc(-1 * var(--sbb-spacing-fixed-6x));\n}\n:host(:is(:state(position-above),[state--position-above])) .sbb-popover::before {\n inset-block-end: calc(-1 * var(--sbb-spacing-fixed-6x));\n}\n\n.sbb-popover__content {\n display: flex;\n gap: var(--sbb-spacing-fixed-4x);\n border-radius: var(--sbb-popover-border-radius);\n padding-block: var(--sbb-popover-padding) 0;\n padding-inline: var(--sbb-popover-padding);\n outline: none;\n background-color: var(--sbb-popover-background);\n flex-direction: row-reverse;\n min-height: var(--sbb-popover-min-height);\n}\n:host(:is(:state(position-above),[state--position-above])) .sbb-popover__content::before {\n top: calc(100% - var(--sbb-popover-arrow-size) / 2);\n}\n\n.sbb-popover__scrollable-content {\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-popover__scrollable-content::-webkit-scrollbar-button, .sbb-popover__scrollable-content::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-popover__scrollable-content {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-popover__scrollable-content {\n display: block;\n padding-block-end: var(--sbb-popover-padding);\n max-height: calc(var(--_sbb-popover-max-height));\n overflow: auto;\n}\n\n@keyframes open {\n from {\n opacity: 0;\n transform: var(--_sbb-popover-transform);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: var(--_sbb-popover-transform);\n }\n}";
20
+ //#endregion
21
+ //#region src/elements/popover/popover.component.ts
22
+ SbbSecondaryButtonElement.define();
23
+ var VERTICAL_OFFSET = 16;
24
+ var HORIZONTAL_OFFSET = 32;
25
+ var nextId = 0;
26
+ var popoversRef = /* @__PURE__ */ new Set();
27
+ var pointerCoarse = isServer ? false : matchMedia(SbbMediaQueryPointerCoarse).matches;
28
+ var SbbPopoverBaseElement = (() => {
29
+ let _classSuper = SbbOpenCloseBaseElement;
30
+ let _trigger_decorators;
31
+ let _trigger_initializers = [];
32
+ let _trigger_extraInitializers = [];
33
+ return class SbbPopoverBaseElement extends _classSuper {
34
+ constructor() {
35
+ super(...arguments);
36
+ this.#trigger_accessor_storage = __runInitializers(this, _trigger_initializers, null);
37
+ this._nextFocusedElement = __runInitializers(this, _trigger_extraInitializers);
38
+ this._skipCloseFocus = false;
39
+ this._resizeController = new ResizeController(this, {
40
+ target: null,
41
+ callback: () => this._setPopoverPosition()
42
+ });
43
+ this._escapableOverlayController = new SbbEscapableOverlayController(this);
44
+ this._focusTrapController = new SbbFocusTrapController(this);
45
+ this._blurTimeout = null;
46
+ this._pointerDownListener = (event) => {
47
+ this._isPointerDownEventOnPopover = isEventOnElement(this.overlay, event);
48
+ };
49
+ this._closeOnBackdropClick = (event) => {
50
+ const composedPath = event.composedPath();
51
+ if (!this._isPointerDownEventOnPopover && !isEventOnElement(this.overlay, event) && (!this.trigger || !composedPath.includes(this.trigger))) {
52
+ this._nextFocusedElement = composedPath.filter((el) => el instanceof window.HTMLElement).find((el) => el.matches(IS_FOCUSABLE_QUERY));
53
+ clearTimeout(this.closeTimeout);
54
+ this.close();
55
+ }
56
+ };
57
+ }
58
+ static {
59
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
60
+ _trigger_decorators = [idReference(), property()];
61
+ __esDecorate(this, null, _trigger_decorators, {
62
+ kind: "accessor",
63
+ name: "trigger",
64
+ static: false,
65
+ private: false,
66
+ access: {
67
+ has: (obj) => "trigger" in obj,
68
+ get: (obj) => obj.trigger,
69
+ set: (obj, value) => {
70
+ obj.trigger = value;
71
+ }
72
+ },
73
+ metadata: _metadata
74
+ }, _trigger_initializers, _trigger_extraInitializers);
75
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
76
+ enumerable: true,
77
+ configurable: true,
78
+ writable: true,
79
+ value: _metadata
80
+ });
81
+ }
82
+ static {
83
+ this.styles = [boxSizingStyles, unsafeCSS(popover_default)];
84
+ }
85
+ #trigger_accessor_storage;
86
+ /**
87
+ * The element that will trigger the popover overlay.
88
+ *
89
+ * For attribute usage, provide an id reference.
90
+ */
91
+ get trigger() {
92
+ return this.#trigger_accessor_storage;
93
+ }
94
+ set trigger(value) {
95
+ this.#trigger_accessor_storage = value;
96
+ }
97
+ /** Opens the popover on trigger click. */
98
+ open() {
99
+ if (this.state !== "closed" && this.state !== "closing" || !this.overlay || !this.dispatchBeforeOpenEvent()) return;
100
+ for (const popover of popoversRef) if (popover.state === "opened" || popover.state === "opening") popover.close();
101
+ this.showPopover?.();
102
+ this.state = "opening";
103
+ this.inert = true;
104
+ this._setPopoverPosition();
105
+ this._attachWindowEvents();
106
+ this._escapableOverlayController.connect();
107
+ this._triggerElement?.setAttribute("aria-expanded", "true");
108
+ this._nextFocusedElement = void 0;
109
+ this._skipCloseFocus = false;
110
+ if (this._isZeroAnimationDuration()) this._handleOpening();
111
+ }
112
+ /** Closes the popover. */
113
+ close(target) {
114
+ if (this.state !== "opened" && this.state !== "opening") return;
115
+ this._popoverCloseElement = target;
116
+ if (!this.dispatchBeforeCloseEvent({ closeTarget: target ?? null })) return;
117
+ this.state = "closing";
118
+ this.inert = true;
119
+ this._triggerElement?.setAttribute("aria-expanded", "false");
120
+ if (this._isZeroAnimationDuration()) this._handleClosing();
121
+ }
122
+ _isZeroAnimationDuration() {
123
+ return isZeroAnimationDuration(this, "--sbb-popover-animation-duration");
124
+ }
125
+ _handleClosing() {
126
+ this.state = "closed";
127
+ this.hidePopover?.();
128
+ if (this.overlay) {
129
+ this._resizeController.unobserve(this.overlay);
130
+ this.overlay.firstElementChild?.scrollTo(0, 0);
131
+ }
132
+ this.removeAttribute("tabindex");
133
+ if (!this._skipCloseFocus) (this._nextFocusedElement || this._triggerElement)?.focus();
134
+ this._escapableOverlayController.disconnect();
135
+ this._openStateController?.abort();
136
+ this._focusTrapController.enabled = false;
137
+ this.dispatchCloseEvent({ closeTarget: this._popoverCloseElement ?? null });
138
+ }
139
+ _handleOpening() {
140
+ this.state = "opened";
141
+ this.inert = false;
142
+ this._setPopoverFocus();
143
+ this._focusTrapController.enabled = true;
144
+ if (this.overlay) this._resizeController.observe(this.overlay);
145
+ this.dispatchOpenEvent();
146
+ }
147
+ connectedCallback() {
148
+ this.popover = "manual";
149
+ super.connectedCallback();
150
+ this.id ||= `sbb-popover-${++nextId}`;
151
+ this.state = "closed";
152
+ popoversRef.add(this);
153
+ if (this.hasUpdated) this._configureTrigger();
154
+ }
155
+ requestUpdate(name, oldValue, options) {
156
+ super.requestUpdate(name, oldValue, options);
157
+ if (!isServer && (!name || name === "trigger" || name === "hoverTrigger") && this.hasUpdated) this._configureTrigger();
158
+ }
159
+ firstUpdated(changedProperties) {
160
+ super.firstUpdated(changedProperties);
161
+ this._configureTrigger();
162
+ }
163
+ disconnectedCallback() {
164
+ super.disconnectedCallback();
165
+ this._triggerElement = null;
166
+ this._triggerAbortController?.abort();
167
+ this._openStateController?.abort();
168
+ popoversRef.delete(this);
169
+ if (this._blurTimeout) clearTimeout(this._blurTimeout);
170
+ }
171
+ _configureTrigger() {
172
+ if (isServer) return;
173
+ else if (this.hydrationRequired) {
174
+ this.hydrationComplete.then(() => this._configureTrigger());
175
+ return;
176
+ }
177
+ this.configureTrigger(this._triggerElement ?? null);
178
+ }
179
+ configureTrigger(_oldTrigger) {
180
+ this._triggerAbortController?.abort();
181
+ removeAriaOverlayTriggerAttributes(this._triggerElement);
182
+ this._triggerElement = this.trigger;
183
+ if (!this._triggerElement) return;
184
+ setAriaOverlayTriggerAttributes(this._triggerElement, "dialog", this.id, this.state);
185
+ this._triggerAbortController = new AbortController();
186
+ this.registerTriggerListeners(this._triggerAbortController.signal);
187
+ }
188
+ registerTriggerListeners(signal) {
189
+ this._triggerElement.addEventListener("click", () => this.open(), { signal });
190
+ }
191
+ _attachWindowEvents() {
192
+ this._openStateController = new AbortController();
193
+ document.addEventListener("scroll", () => this._setPopoverPosition(), {
194
+ passive: true,
195
+ signal: this._openStateController.signal,
196
+ capture: true
197
+ });
198
+ window.addEventListener("resize", () => this._setPopoverPosition(), {
199
+ passive: true,
200
+ signal: this._openStateController.signal
201
+ });
202
+ window.addEventListener("pointerdown", this._pointerDownListener, { signal: this._openStateController.signal });
203
+ window.addEventListener("pointerup", this._closeOnBackdropClick, { signal: this._openStateController.signal });
204
+ }
205
+ _closeOnSbbPopoverCloseClick(event) {
206
+ const closeElement = composedPathHasAttribute(event, "sbb-popover-close", this);
207
+ if (closeElement && !closeElement.hasAttribute("disabled")) {
208
+ clearTimeout(this.closeTimeout);
209
+ this.close(closeElement);
210
+ }
211
+ }
212
+ _onPopoverAnimationEnd(event) {
213
+ if (event.animationName === "open" && this.state === "opening") this._handleOpening();
214
+ else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
215
+ }
216
+ _setPopoverFocus() {
217
+ if (!this._focusTrapController.focusInitialElement() && this._openStateController) {
218
+ this.setAttribute("tabindex", "0");
219
+ this.focus();
220
+ this.addEventListener("blur", (e) => {
221
+ this._blurTimeout = setTimeout(() => {
222
+ if (document.visibilityState !== "hidden") {
223
+ this.removeAttribute("tabindex");
224
+ if (this.contains(e.relatedTarget) || e.relatedTarget === this.trigger) return;
225
+ if (this.state === "opened" || this.state === "opening") this._skipCloseFocus = true;
226
+ this.close();
227
+ }
228
+ });
229
+ }, { signal: this._openStateController.signal });
230
+ }
231
+ }
232
+ _setPopoverPosition() {
233
+ if (!this.overlay || !this._triggerElement) return;
234
+ const popoverPosition = getElementPosition(this.overlay, this._triggerElement, this.shadowRoot.querySelector(".sbb-popover__container"), {
235
+ verticalOffset: VERTICAL_OFFSET,
236
+ horizontalOffset: HORIZONTAL_OFFSET,
237
+ centered: true,
238
+ responsiveHeight: true
239
+ });
240
+ const verticalPosition = popoverPosition.alignment.vertical;
241
+ for (const position of ["above", "below"]) this.toggleState(`position-${position}`, position === verticalPosition);
242
+ const arrowXPosition = this._triggerElement.getBoundingClientRect().left - popoverPosition.left + this._triggerElement.clientWidth / 2 - 8;
243
+ this.style.setProperty("--_sbb-popover-position-x", `${popoverPosition.left}px`);
244
+ this.style.setProperty("--_sbb-popover-position-y", `${popoverPosition.top}px`);
245
+ this.style.setProperty("--_sbb-popover-arrow-position-x", `${arrowXPosition}px`);
246
+ this.style.setProperty("--_sbb-popover-max-height", popoverPosition.maxHeight);
247
+ }
248
+ dispatchBeforeCloseEvent(detail) {
249
+ /**
250
+ * @type {CustomEvent<{ closeTarget: HTMLElement | null }>}
251
+ * Emits whenever the component begins the closing transition. Can be canceled.
252
+ */
253
+ return this.dispatchEvent(new CustomEvent("beforeclose", {
254
+ detail,
255
+ cancelable: true
256
+ }));
257
+ }
258
+ dispatchCloseEvent(detail) {
259
+ /**
260
+ * @type {CustomEvent<{ closeTarget: HTMLElement | null }>}
261
+ * Emits whenever the component is closed.
262
+ */
263
+ return this.dispatchEvent(new CustomEvent("close", { detail }));
264
+ }
265
+ render() {
266
+ return html`
267
+ <div class="sbb-popover__container">
268
+ <div
269
+ @animationend=${this._onPopoverAnimationEnd}
270
+ class="sbb-popover"
271
+ role="tooltip"
272
+ ${ref((el) => this.overlay = el)}
273
+ >
274
+ <div
275
+ @click=${(event) => this._closeOnSbbPopoverCloseClick(event)}
276
+ class="sbb-popover__content"
277
+ >
278
+ ${this.renderContent()}
279
+ </div>
280
+ </div>
281
+ </div>
282
+ `;
283
+ }
284
+ };
285
+ })();
286
+ /**
287
+ * It displays contextual information within a popover.
288
+ *
289
+ * @slot - Use the unnamed slot to add content into the popover.
290
+ * @cssprop [--sbb-popover-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
291
+ * the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
292
+ * component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
293
+ */
294
+ var SbbPopoverElement = (() => {
295
+ let _classSuper = SbbPopoverBaseElement;
296
+ let _instanceExtraInitializers = [];
297
+ let _hideCloseButton_decorators;
298
+ let _hideCloseButton_initializers = [];
299
+ let _hideCloseButton_extraInitializers = [];
300
+ let _hoverTrigger_decorators;
301
+ let _hoverTrigger_initializers = [];
302
+ let _hoverTrigger_extraInitializers = [];
303
+ let _set_openDelay_decorators;
304
+ let _set_closeDelay_decorators;
305
+ let _accessibilityCloseLabel_decorators;
306
+ let _accessibilityCloseLabel_initializers = [];
307
+ let _accessibilityCloseLabel_extraInitializers = [];
308
+ let __hoverTrigger_decorators;
309
+ let __hoverTrigger_initializers = [];
310
+ let __hoverTrigger_extraInitializers = [];
311
+ return class SbbPopoverElement extends _classSuper {
312
+ constructor() {
313
+ super(...arguments);
314
+ this.#hideCloseButton_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _hideCloseButton_initializers, false));
315
+ this.#hoverTrigger_accessor_storage = (__runInitializers(this, _hideCloseButton_extraInitializers), __runInitializers(this, _hoverTrigger_initializers, false));
316
+ this._openDelay = __runInitializers(this, _hoverTrigger_extraInitializers);
317
+ this.#accessibilityCloseLabel_accessor_storage = __runInitializers(this, _accessibilityCloseLabel_initializers, "");
318
+ this.#_hoverTrigger_accessor_storage = (__runInitializers(this, _accessibilityCloseLabel_extraInitializers), __runInitializers(this, __hoverTrigger_initializers, false));
319
+ this._openTimeout = __runInitializers(this, __hoverTrigger_extraInitializers);
320
+ this._language = new SbbLanguageController(this);
321
+ this._overlayAbortController = null;
322
+ this._onTriggerMouseEnter = () => {
323
+ if (this.state === "closed" || this.state === "closing") this._openTimeout = setTimeout(() => {
324
+ sbbInputModalityDetector.reset();
325
+ this.open();
326
+ }, this.openDelay);
327
+ else clearTimeout(this.closeTimeout);
328
+ };
329
+ this._onTriggerMouseLeave = () => {
330
+ if (this.state === "opened" || this.state === "opening") this.closeTimeout = setTimeout(() => this.close(), this.closeDelay);
331
+ else clearTimeout(this._openTimeout);
332
+ };
333
+ this._onOverlayMouseEnter = () => {
334
+ if (this.state !== "opening") clearTimeout(this.closeTimeout);
335
+ };
336
+ this._onOverlayMouseLeave = () => {
337
+ if (this.state !== "opening") this.closeTimeout = setTimeout(() => this.close(), this.closeDelay);
338
+ };
339
+ }
340
+ static {
341
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
342
+ _hideCloseButton_decorators = [forceType(), property({
343
+ attribute: "hide-close-button",
344
+ type: Boolean,
345
+ reflect: true
346
+ })];
347
+ _hoverTrigger_decorators = [forceType(), property({
348
+ attribute: "hover-trigger",
349
+ type: Boolean
350
+ })];
351
+ _set_openDelay_decorators = [property({
352
+ attribute: "open-delay",
353
+ type: Number
354
+ })];
355
+ _set_closeDelay_decorators = [property({
356
+ attribute: "close-delay",
357
+ type: Number
358
+ })];
359
+ _accessibilityCloseLabel_decorators = [forceType(), property({ attribute: "accessibility-close-label" })];
360
+ __hoverTrigger_decorators = [state()];
361
+ __esDecorate(this, null, _hideCloseButton_decorators, {
362
+ kind: "accessor",
363
+ name: "hideCloseButton",
364
+ static: false,
365
+ private: false,
366
+ access: {
367
+ has: (obj) => "hideCloseButton" in obj,
368
+ get: (obj) => obj.hideCloseButton,
369
+ set: (obj, value) => {
370
+ obj.hideCloseButton = value;
371
+ }
372
+ },
373
+ metadata: _metadata
374
+ }, _hideCloseButton_initializers, _hideCloseButton_extraInitializers);
375
+ __esDecorate(this, null, _hoverTrigger_decorators, {
376
+ kind: "accessor",
377
+ name: "hoverTrigger",
378
+ static: false,
379
+ private: false,
380
+ access: {
381
+ has: (obj) => "hoverTrigger" in obj,
382
+ get: (obj) => obj.hoverTrigger,
383
+ set: (obj, value) => {
384
+ obj.hoverTrigger = value;
385
+ }
386
+ },
387
+ metadata: _metadata
388
+ }, _hoverTrigger_initializers, _hoverTrigger_extraInitializers);
389
+ __esDecorate(this, null, _set_openDelay_decorators, {
390
+ kind: "setter",
391
+ name: "openDelay",
392
+ static: false,
393
+ private: false,
394
+ access: {
395
+ has: (obj) => "openDelay" in obj,
396
+ set: (obj, value) => {
397
+ obj.openDelay = value;
398
+ }
399
+ },
400
+ metadata: _metadata
401
+ }, null, _instanceExtraInitializers);
402
+ __esDecorate(this, null, _set_closeDelay_decorators, {
403
+ kind: "setter",
404
+ name: "closeDelay",
405
+ static: false,
406
+ private: false,
407
+ access: {
408
+ has: (obj) => "closeDelay" in obj,
409
+ set: (obj, value) => {
410
+ obj.closeDelay = value;
411
+ }
412
+ },
413
+ metadata: _metadata
414
+ }, null, _instanceExtraInitializers);
415
+ __esDecorate(this, null, _accessibilityCloseLabel_decorators, {
416
+ kind: "accessor",
417
+ name: "accessibilityCloseLabel",
418
+ static: false,
419
+ private: false,
420
+ access: {
421
+ has: (obj) => "accessibilityCloseLabel" in obj,
422
+ get: (obj) => obj.accessibilityCloseLabel,
423
+ set: (obj, value) => {
424
+ obj.accessibilityCloseLabel = value;
425
+ }
426
+ },
427
+ metadata: _metadata
428
+ }, _accessibilityCloseLabel_initializers, _accessibilityCloseLabel_extraInitializers);
429
+ __esDecorate(this, null, __hoverTrigger_decorators, {
430
+ kind: "accessor",
431
+ name: "_hoverTrigger",
432
+ static: false,
433
+ private: false,
434
+ access: {
435
+ has: (obj) => "_hoverTrigger" in obj,
436
+ get: (obj) => obj._hoverTrigger,
437
+ set: (obj, value) => {
438
+ obj._hoverTrigger = value;
439
+ }
440
+ },
441
+ metadata: _metadata
442
+ }, __hoverTrigger_initializers, __hoverTrigger_extraInitializers);
443
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
444
+ enumerable: true,
445
+ configurable: true,
446
+ writable: true,
447
+ value: _metadata
448
+ });
449
+ }
450
+ static {
451
+ this.elementName = "sbb-popover";
452
+ }
453
+ #hideCloseButton_accessor_storage;
454
+ /** Whether the close button should be hidden. */
455
+ get hideCloseButton() {
456
+ return this.#hideCloseButton_accessor_storage;
457
+ }
458
+ set hideCloseButton(value) {
459
+ this.#hideCloseButton_accessor_storage = value;
460
+ }
461
+ #hoverTrigger_accessor_storage;
462
+ /** Whether the popover should be triggered on hover. */
463
+ get hoverTrigger() {
464
+ return this.#hoverTrigger_accessor_storage;
465
+ }
466
+ set hoverTrigger(value) {
467
+ this.#hoverTrigger_accessor_storage = value;
468
+ }
469
+ /**
470
+ * Open the popover after a given delay in milliseconds.
471
+ * Global configuration is used as default, if not set.
472
+ *
473
+ * @default 0
474
+ */
475
+ set openDelay(value) {
476
+ this._openDelay = +value;
477
+ }
478
+ get openDelay() {
479
+ return this._openDelay ?? readConfig().popover?.openDelay ?? 0;
480
+ }
481
+ /**
482
+ * Close the popover after a given delay in milliseconds.
483
+ * Global configuration is used as default, if not set.
484
+ *
485
+ * @default 0
486
+ */
487
+ set closeDelay(value) {
488
+ this._closeDelay = +value;
489
+ }
490
+ get closeDelay() {
491
+ return this._closeDelay ?? readConfig().popover?.closeDelay ?? 0;
492
+ }
493
+ #accessibilityCloseLabel_accessor_storage;
494
+ /** This will be forwarded as aria-label to the close button element. */
495
+ get accessibilityCloseLabel() {
496
+ return this.#accessibilityCloseLabel_accessor_storage;
497
+ }
498
+ set accessibilityCloseLabel(value) {
499
+ this.#accessibilityCloseLabel_accessor_storage = value;
500
+ }
501
+ #_hoverTrigger_accessor_storage;
502
+ get _hoverTrigger() {
503
+ return this.#_hoverTrigger_accessor_storage;
504
+ }
505
+ set _hoverTrigger(value) {
506
+ this.#_hoverTrigger_accessor_storage = value;
507
+ }
508
+ configureTrigger(oldTrigger) {
509
+ const hoverTrigger = this.hoverTrigger && !pointerCoarse;
510
+ if (this.trigger === oldTrigger && hoverTrigger === this._hoverTrigger) return;
511
+ if (this._hoverTrigger !== hoverTrigger) {
512
+ this._hoverTrigger = hoverTrigger;
513
+ this.toggleState("hover-trigger", this._hoverTrigger);
514
+ this._registerOverlayListeners();
515
+ }
516
+ super.configureTrigger(oldTrigger);
517
+ }
518
+ _registerOverlayListeners() {
519
+ this._overlayAbortController?.abort();
520
+ if (this._hoverTrigger) {
521
+ this._overlayAbortController = new AbortController();
522
+ this.overlay?.addEventListener("mouseenter", () => this._onOverlayMouseEnter(), { signal: this._overlayAbortController.signal });
523
+ this.overlay?.addEventListener("mouseleave", () => this._onOverlayMouseLeave(), { signal: this._overlayAbortController.signal });
524
+ }
525
+ }
526
+ registerTriggerListeners(signal) {
527
+ if (this._hoverTrigger && this.trigger) {
528
+ this.trigger.addEventListener("mouseenter", this._onTriggerMouseEnter, { signal });
529
+ this.trigger.addEventListener("mouseleave", this._onTriggerMouseLeave, { signal });
530
+ this.trigger.addEventListener("keydown", (evt) => {
531
+ if (evt.code === "Space" || evt.code === "Enter") this.open();
532
+ }, { signal });
533
+ this.trigger.addEventListener("mousedown", (evt) => {
534
+ if (isFakeMousedownFromScreenReader(evt)) this.open();
535
+ }, { signal });
536
+ } else super.registerTriggerListeners(signal);
537
+ }
538
+ firstUpdated(changedProperties) {
539
+ super.firstUpdated(changedProperties);
540
+ this._registerOverlayListeners();
541
+ }
542
+ open() {
543
+ super.open();
544
+ if (this.hoverTrigger && this.trigger) ɵstateController(this.trigger).add("force-hover");
545
+ }
546
+ close() {
547
+ super.close();
548
+ ɵstateController(this.trigger)?.delete("force-hover");
549
+ }
550
+ renderContent() {
551
+ const closeButton = html`
552
+ <sbb-secondary-button
553
+ aria-label=${this.accessibilityCloseLabel || i18nClosePopover[this._language.current]}
554
+ size="s"
555
+ type="button"
556
+ icon-name="cross-small"
557
+ sbb-popover-close
558
+ ></sbb-secondary-button>
559
+ `;
560
+ return html`
561
+ ${!this.hideCloseButton && !this._hoverTrigger ? closeButton : nothing}
562
+ <span class="sbb-popover__scrollable-content">
563
+ <slot>No content</slot>
564
+ </span>
565
+ `;
566
+ }
567
+ };
568
+ })();
569
+ //#endregion
570
+ export { SbbPopoverElement as n, SbbPopoverBaseElement as t };
571
+
572
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQtRWdPcy13c1IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3BvcG92ZXIvcG9wb3Zlci5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLy8gQXMgdGhlIHBvcG92ZXIgaGFzIGFsd2F5cyBhIHdoaXRlIGJhY2tncm91bmQsIHdlIGhhdmUgdG8gZml4IHRoZSBmb2N1cyBvdXRsaW5lIGNvbG9yXG4gIC8vIHRvIGRlZmF1bHQgY29sb3IgZm9yIGNhc2VzIHdoZXJlIHRoZSBwb3BvdmVyIGlzIHVzZWQgaW4gYSBuZWdhdGl2ZSBjb250ZXh0LlxuICAtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yOiBsaWdodC1kYXJrKFxuICAgIHZhcigtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yLWRlZmF1bHQpLFxuICAgIHZhcigtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yLWRhcmspXG4gICk7XG4gIC0tc2JiLXBvcG92ZXItYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi00eClcbiAgKTtcbiAgLS1fc2JiLXBvcG92ZXItaW5zZXQ6IDAgYXV0byBhdXRvIDA7XG4gIC0tX3NiYi1wb3BvdmVyLXRyYW5zZm9ybTogdHJhbnNsYXRlWSh2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCkpO1xuICAtLV9zYmItcG9wb3Zlci1ib3gtc2hhZG93OiB2YXIoLS1zYmItYm94LXNoYWRvdy1sZXZlbC05LWhhcmQpO1xuXG4gIC8vIFVzZSAhaW1wb3J0YW50IGhlcmUgdG8gbm90IGludGVyZmVyZSB3aXRoIEZpcmVmb3ggZm9jdXMgcmluZyBkZWZpbml0aW9uXG4gIC8vIHdoaWNoIGFwcGVhcnMgaW4gbm9ybWFsaXplIENTUyBvZiBzZXZlcmFsIGZyYW1ld29ya3MuXG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpIHtcbiAgLS1fc2JiLXBvcG92ZXItaW5zZXQ6IDA7XG5cbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbjpob3N0KDpzdGF0ZShwb3NpdGlvbi1hYm92ZSkpIHtcbiAgLS1fc2JiLXBvcG92ZXItdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGModmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpICogLTEpKTtcbn1cblxuOmhvc3QoOm5vdChbaGlkZS1jbG9zZS1idXR0b25dLCA6c3RhdGUoaG92ZXItdHJpZ2dlcikpKSB7XG4gIC0tc2JiLXBvcG92ZXItbWluLWhlaWdodDogY2FsYyh2YXIoLS1zYmItc2l6ZS1lbGVtZW50LXhzKSArIDIgKiB2YXIoLS1zYmItcG9wb3Zlci1wYWRkaW5nKSk7XG59XG5cbi8vIFBvcG92ZXIgYXJyb3cgYW5kIGFycm93IHRvcCBjb3ZlclxuLnNiYi1wb3BvdmVyOjphZnRlcixcbi5zYmItcG9wb3Zlcl9fY29udGVudDo6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiB2YXIoLS1zYmItcG9wb3Zlci1hcnJvdy1zaXplKTtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItcG9wb3Zlci1hcnJvdy1zaXplKTtcbiAgbGVmdDogdmFyKC0tX3NiYi1wb3BvdmVyLWFycm93LXBvc2l0aW9uLXgsIDApO1xuICBib3R0b206IGNhbGMoMTAwJSAtIGNhbGModmFyKC0tc2JiLXBvcG92ZXItYXJyb3ctc2l6ZSkgLyAyKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1wb3BvdmVyLWJhY2tncm91bmQpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItYm9yZGVyLXJhZGl1cy0yeCkgMDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xufVxuXG4uc2JiLXBvcG92ZXJfX2NvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IHZhcigtLV9zYmItcG9wb3Zlci1pbnNldCk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiB2YXIoLS1zYmItcG9wb3Zlci16LWluZGV4LCB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpKTtcbn1cblxuLnNiYi1wb3BvdmVyIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IHZhcigtLXNiYi1wb3BvdmVyLXBvc2l0aW9uLCBhYnNvbHV0ZSk7XG4gIHRvcDogdmFyKC0tX3NiYi1wb3BvdmVyLXBvc2l0aW9uLXksIDApO1xuICBib3R0b206IHVuc2V0O1xuICBsZWZ0OiB2YXIoLS1fc2JiLXBvcG92ZXItcG9zaXRpb24teCwgMCk7XG4gIHJpZ2h0OiB1bnNldDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXBvcG92ZXItYmFja2dyb3VuZCk7XG4gIG1heC13aWR0aDogdmFyKC0tc2JiLXBvcG92ZXItbWF4LXdpZHRoKTtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xuICBwYWRkaW5nOiAwO1xuICBib3gtc2hhZG93OiB2YXIoLS1fc2JiLXBvcG92ZXItYm94LXNoYWRvdyk7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXBvcG92ZXItYm9yZGVyLXJhZGl1cyk7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBvaW50ZXItZXZlbnRzOiBhbGw7XG5cbiAgOmhvc3QoOmZvY3VzLXZpc2libGUpICYge1xuICAgIEBpbmNsdWRlIHNiYi5mb2N1cy1vdXRsaW5lO1xuICB9XG5cbiAgOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpICYge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBvcGVuO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi1wb3BvdmVyLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1wb3BvdmVyLWFuaW1hdGlvbi1lYXNpbmcpO1xuICAgIH1cbiAgfVxuXG4gIDpob3N0KDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkgJiB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBjbG9zZTtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItcG9wb3Zlci1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItcG9wb3Zlci1hbmltYXRpb24tZWFzaW5nKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3BvdmVyIGFycm93XG4gICY6OmFmdGVyIHtcbiAgICB6LWluZGV4OiAtMTtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1fc2JiLXBvcG92ZXItYm94LXNoYWRvdyk7XG5cbiAgICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgICBvdXRsaW5lOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICAgIH1cblxuICAgIDpob3N0KDpzdGF0ZShwb3NpdGlvbi1hYm92ZSkpICYge1xuICAgICAgdG9wOiBjYWxjKDEwMCUgLSBjYWxjKHZhcigtLXNiYi1wb3BvdmVyLWFycm93LXNpemUpIC8gMikpO1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICBvdXRsaW5lOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICB9XG5cbiAgLy8gVHJhbnNwYXJlbnQgYXJlYSB3aGljaCBpbmNyZWFzZXMgaG92ZXIgYXJlYSBpbiBvcmRlciB0byBub3QgdHJpZ2dlciBjbG9zaW5nIHRvbyBlYXJseS5cbiAgJjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaW5zZXQ6IDA7XG4gICAgei1pbmRleDogLTE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICA6aG9zdCg6c3RhdGUocG9zaXRpb24tYmVsb3cpKSAmIHtcbiAgICAgIGluc2V0LWJsb2NrLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNngpKTtcbiAgICB9XG5cbiAgICA6aG9zdCg6c3RhdGUocG9zaXRpb24tYWJvdmUpKSAmIHtcbiAgICAgIGluc2V0LWJsb2NrLWVuZDogY2FsYygtMSAqIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTZ4KSk7XG4gICAgfVxuICB9XG59XG5cbi5zYmItcG9wb3Zlcl9fY29udGVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNHgpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItcG9wb3Zlci1ib3JkZXItcmFkaXVzKTtcbiAgcGFkZGluZy1ibG9jazogdmFyKC0tc2JiLXBvcG92ZXItcGFkZGluZykgMDtcbiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLXNiYi1wb3BvdmVyLXBhZGRpbmcpO1xuICBvdXRsaW5lOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItcG9wb3Zlci1iYWNrZ3JvdW5kKTtcbiAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICBtaW4taGVpZ2h0OiB2YXIoLS1zYmItcG9wb3Zlci1taW4taGVpZ2h0KTtcblxuICA6aG9zdCg6c3RhdGUocG9zaXRpb24tYWJvdmUpKSAmIHtcbiAgICAmOjpiZWZvcmUge1xuICAgICAgdG9wOiBjYWxjKDEwMCUgLSBjYWxjKHZhcigtLXNiYi1wb3BvdmVyLWFycm93LXNpemUpIC8gMikpO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXBvcG92ZXJfX3Njcm9sbGFibGUtY29udGVudCB7XG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXI7XG5cbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zYmItcG9wb3Zlci1wYWRkaW5nKTtcbiAgbWF4LWhlaWdodDogY2FsYyh2YXIoLS1fc2JiLXBvcG92ZXItbWF4LWhlaWdodCkpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuQGtleWZyYW1lcyBvcGVuIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHZhcigtLV9zYmItcG9wb3Zlci10cmFuc2Zvcm0pO1xuICB9XG5cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2xvc2Uge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxuXG4gIHRvIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogdmFyKC0tX3NiYi1wb3BvdmVyLXRyYW5zZm9ybSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlc2l6ZUNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL3Jlc2l6ZS1jb250cm9sbGVyLmpzJztcbmltcG9ydCB7XG4gIGh0bWwsXG4gIGlzU2VydmVyLFxuICBub3RoaW5nLFxuICB1bnNhZmVDU1MsXG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5cbmltcG9ydCB7IFNiYlNlY29uZGFyeUJ1dHRvbkVsZW1lbnQgfSBmcm9tICcuLi9idXR0b24ucHVyZS50cyc7XG5pbXBvcnQge1xuICBJU19GT0NVU0FCTEVfUVVFUlksXG4gIGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIsXG4gIFNiYkZvY3VzVHJhcENvbnRyb2xsZXIsXG4gIHNiYklucHV0TW9kYWxpdHlEZXRlY3Rvcixcbn0gZnJvbSAnLi4vY29yZS9hMTF5LnRzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLnRzJztcbmltcG9ydCB7IHJlYWRDb25maWcgfSBmcm9tICcuLi9jb3JlL2NvbmZpZy50cyc7XG5pbXBvcnQge1xuICBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcixcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBTYmJNZWRpYVF1ZXJ5UG9pbnRlckNvYXJzZSxcbn0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy50cyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUsIGlkUmVmZXJlbmNlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLnRzJztcbmltcG9ydCB7IGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi4vY29yZS9kb20udHMnO1xuaW1wb3J0IHsgY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9ldmVudGluZy50cyc7XG5pbXBvcnQgeyBpMThuQ2xvc2VQb3BvdmVyIH0gZnJvbSAnLi4vY29yZS9pMThuLnRzJztcbmltcG9ydCB7IMm1c3RhdGVDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9taXhpbnMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RWxlbWVudFBvc2l0aW9uLFxuICBpc0V2ZW50T25FbGVtZW50LFxuICByZW1vdmVBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzLFxuICBzZXRBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzLFxufSBmcm9tICcuLi9jb3JlL292ZXJsYXkudHMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnLi4vY29yZS9zdHlsZXMudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9wb3BvdmVyLnNjc3M/aW5saW5lJztcblxuLy8gVE9ETyhicmVha2luZy1jaGFuZ2UpOiBSZW1vdmUgY2FsbCB0byBkZWZpbmUuXG5TYmJTZWNvbmRhcnlCdXR0b25FbGVtZW50LmRlZmluZSgpO1xuXG5jb25zdCBWRVJUSUNBTF9PRkZTRVQgPSAxNjtcbmNvbnN0IEhPUklaT05UQUxfT0ZGU0VUID0gMzI7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG5jb25zdCBwb3BvdmVyc1JlZiA9IG5ldyBTZXQ8U2JiUG9wb3ZlckJhc2VFbGVtZW50PigpO1xuY29uc3QgcG9pbnRlckNvYXJzZSA9IGlzU2VydmVyID8gZmFsc2UgOiBtYXRjaE1lZGlhKFNiYk1lZGlhUXVlcnlQb2ludGVyQ29hcnNlKS5tYXRjaGVzO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2JiUG9wb3ZlckJhc2VFbGVtZW50IGV4dGVuZHMgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCB1bnNhZmVDU1Moc3R5bGUpXTtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHBvcG92ZXIgb3ZlcmxheS5cbiAgICpcbiAgICogRm9yIGF0dHJpYnV0ZSB1c2FnZSwgcHJvdmlkZSBhbiBpZCByZWZlcmVuY2UuXG4gICAqL1xuICBAaWRSZWZlcmVuY2UoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgZWxlbWVudCB3aGljaCBzaG91bGQgcmVjZWl2ZSBmb2N1cyBhZnRlciBjbG9zaW5nIGJhc2VkIG9uIHdoZXJlIGluIHRoZSBiYWNrZHJvcCB0aGUgdXNlciBjbGlja3MuXG4gIHByaXZhdGUgX25leHRGb2N1c2VkRWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9za2lwQ2xvc2VGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wb3BvdmVyQ2xvc2VFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2lzUG9pbnRlckRvd25FdmVudE9uUG9wb3Zlcj86IGJvb2xlYW47XG4gIHByaXZhdGUgX3RyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIF90cmlnZ2VyQWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9vcGVuU3RhdGVDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9yZXNpemVDb250cm9sbGVyID0gbmV3IFJlc2l6ZUNvbnRyb2xsZXIodGhpcywge1xuICAgIHRhcmdldDogbnVsbCxcbiAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5fc2V0UG9wb3ZlclBvc2l0aW9uKCksXG4gIH0pO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfZm9jdXNUcmFwQ29udHJvbGxlciA9IG5ldyBTYmJGb2N1c1RyYXBDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9ibHVyVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGNsb3NlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcm90ZWN0ZWQgb3ZlcmxheT86IEhUTUxEaXZFbGVtZW50O1xuXG4gIC8qKiBPcGVucyB0aGUgcG9wb3ZlciBvbiB0cmlnZ2VyIGNsaWNrLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAodGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgJiYgdGhpcy5zdGF0ZSAhPT0gJ2Nsb3NpbmcnKSB8fFxuICAgICAgIXRoaXMub3ZlcmxheSB8fFxuICAgICAgIXRoaXMuZGlzcGF0Y2hCZWZvcmVPcGVuRXZlbnQoKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBvdGhlciBwb3BvdmVyc1xuICAgIGZvciAoY29uc3QgcG9wb3ZlciBvZiBwb3BvdmVyc1JlZikge1xuICAgICAgaWYgKHBvcG92ZXIuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHBvcG92ZXIuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLmluZXJ0ID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRQb3BvdmVyUG9zaXRpb24oKTtcbiAgICB0aGlzLl9hdHRhY2hXaW5kb3dFdmVudHMoKTtcbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5jb25uZWN0KCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgdGhpcy5fbmV4dEZvY3VzZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NraXBDbG9zZUZvY3VzID0gZmFsc2U7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZXMgdGhlIHBvcG92ZXIuICovXG4gIHB1YmxpYyBjbG9zZSh0YXJnZXQ/OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmVkJyAmJiB0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BvdmVyQ2xvc2VFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoeyBjbG9zZVRhcmdldDogdGFyZ2V0ID8/IG51bGwgfSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMuaW5lcnQgPSB0cnVlO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi1wb3BvdmVyLWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgdGhpcy5oaWRlUG9wb3Zlcj8uKCk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5fcmVzaXplQ29udHJvbGxlci51bm9ic2VydmUodGhpcy5vdmVybGF5KTtcbiAgICAgIHRoaXMub3ZlcmxheS5maXJzdEVsZW1lbnRDaGlsZD8uc2Nyb2xsVG8oMCwgMCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBDbG9zZUZvY3VzKSB7XG4gICAgICBjb25zdCBlbGVtZW50VG9Gb2N1cyA9IHRoaXMuX25leHRGb2N1c2VkRWxlbWVudCB8fCB0aGlzLl90cmlnZ2VyRWxlbWVudDtcblxuICAgICAgLy8gVG8gZW5hYmxlIGZvY3VzaW5nIG90aGVyIGVsZW1lbnQgdGhhbiB0aGUgdHJpZ2dlciwgd2UgbmVlZCB0byBjYWxsIGZvY3VzKCkgYSBzZWNvbmQgdGltZS5cbiAgICAgIGVsZW1lbnRUb0ZvY3VzPy5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX2ZvY3VzVHJhcENvbnRyb2xsZXIuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KHsgY2xvc2VUYXJnZXQ6IHRoaXMuX3BvcG92ZXJDbG9zZUVsZW1lbnQgPz8gbnVsbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuaW5lcnQgPSBmYWxzZTtcbiAgICB0aGlzLl9zZXRQb3BvdmVyRm9jdXMoKTtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgIHRoaXMuX3Jlc2l6ZUNvbnRyb2xsZXIub2JzZXJ2ZSh0aGlzLm92ZXJsYXkpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlkIHx8PSBgc2JiLXBvcG92ZXItJHsrK25leHRJZH1gO1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICBwb3BvdmVyc1JlZi5hZGQodGhpcyk7XG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgLy8gQ2hlY2tpbmcgZm9yIGhvdmVyVHJpZ2dlciBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgb25seSB0aGUgU2JiUG9wb3ZlckVsZW1lbnRcbiAgICAvLyBzdWJjbGFzcyBoYXMgdGhpcyBwcm9wZXJ0eS5cbiAgICBpZiAoIWlzU2VydmVyICYmICghbmFtZSB8fCBuYW1lID09PSAndHJpZ2dlcicgfHwgbmFtZSA9PT0gJ2hvdmVyVHJpZ2dlcicpICYmIHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9jb25maWd1cmVUcmlnZ2VyKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHBvcG92ZXJzUmVmLmRlbGV0ZSh0aGlzKTtcbiAgICBpZiAodGhpcy5fYmx1clRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ibHVyVGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHRyaWdnZXIgaXMgdmFsaWQgYW5kIGF0dGFjaCBjbGljayBldmVudCBsaXN0ZW5lcnMuXG4gIHByaXZhdGUgX2NvbmZpZ3VyZVRyaWdnZXIoKTogdm9pZCB7XG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVRyaWdnZXIodGhpcy5fdHJpZ2dlckVsZW1lbnQgPz8gbnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlVHJpZ2dlcihfb2xkVHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICByZW1vdmVBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzKHRoaXMuX3RyaWdnZXJFbGVtZW50KTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlcjtcblxuICAgIGlmICghdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzKHRoaXMuX3RyaWdnZXJFbGVtZW50LCAnZGlhbG9nJywgdGhpcy5pZCwgdGhpcy5zdGF0ZSk7XG5cbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMucmVnaXN0ZXJUcmlnZ2VyTGlzdGVuZXJzKHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclRyaWdnZXJMaXN0ZW5lcnMoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50IS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlbigpLCB7IHNpZ25hbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaFdpbmRvd0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldFBvcG92ZXJQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRQb3BvdmVyUG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgLy8gQ2xvc2UgcG9wb3ZlciBvbiBiYWNrZHJvcCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIsIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xvc2UgdGhlIHBvcG92ZXIgb24gY2xpY2sgb2YgYW55IGVsZW1lbnQgdGhhdCBoYXMgdGhlICdzYmItcG9wb3Zlci1jbG9zZScgYXR0cmlidXRlLlxuICBwcml2YXRlIF9jbG9zZU9uU2JiUG9wb3ZlckNsb3NlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2xvc2VFbGVtZW50ID0gY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlKGV2ZW50LCAnc2JiLXBvcG92ZXItY2xvc2UnLCB0aGlzKTtcblxuICAgIGlmIChjbG9zZUVsZW1lbnQgJiYgIWNsb3NlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XG4gICAgICB0aGlzLmNsb3NlKGNsb3NlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIHBvcG92ZXIuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uUG9wb3ZlciA9IGlzRXZlbnRPbkVsZW1lbnQodGhpcy5vdmVybGF5ISwgZXZlbnQpO1xuICB9O1xuXG4gIC8vIENsb3NlIHBvcG92ZXIgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25Qb3BvdmVyICYmXG4gICAgICAhaXNFdmVudE9uRWxlbWVudCh0aGlzLm92ZXJsYXkhLCBldmVudCkgJiZcbiAgICAgICghdGhpcy50cmlnZ2VyIHx8ICFjb21wb3NlZFBhdGguaW5jbHVkZXModGhpcy50cmlnZ2VyKSlcbiAgICApIHtcbiAgICAgIHRoaXMuX25leHRGb2N1c2VkRWxlbWVudCA9IGNvbXBvc2VkUGF0aFxuICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpXG4gICAgICAgIC5maW5kKChlbCkgPT4gKGVsIGFzIEhUTUxFbGVtZW50KS5tYXRjaGVzKElTX0ZPQ1VTQUJMRV9RVUVSWSkpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gU2V0IHBvcG92ZXIgcG9zaXRpb24gKHgsIHkpIHRvICcwJyBvbmNlIHRoZSBwb3BvdmVyIGlzIGNsb3NlZCBhbmQgdGhlIHRyYW5zaXRpb24gZW5kZWQgdG8gcHJldmVudCB0aGVcbiAgLy8gdmlld3BvcnQgZnJvbSBvdmVyZmxvd2luZy4gQW5kIHNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IG9uY2UgdGhlIHBvcG92ZXIgaXMgb3Blbi5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vblBvcG92ZXJBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuJyAmJiB0aGlzLnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZScgJiYgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IGZvY3VzIG9uIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudC5cbiAgcHJpdmF0ZSBfc2V0UG9wb3ZlckZvY3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmZvY3VzSW5pdGlhbEVsZW1lbnQoKTtcblxuICAgIGlmICghZm9jdXNlZCAmJiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAvLyBXaGVuIGEgYmx1ciBvY2N1cnMsIHdlIGtub3cgdGhhdCB0aGUgcG9wb3ZlciBoYXMgdG8gYmUgY2xvc2VkLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW50ZXJhY3RpdmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3BvdmVyLlxuICAgICAgLy8gV2hlbiBhIHdpbmRvdy90YWIgY2hhbmdlIG9jY3VycywgYSBibHVyIGV2ZW50IGlzIGFsc28gZmlyZWQuIEhvd2V2ZXIsIHdoZW4gdGhlIGN1cnJlbnQgd2luZG93L3RhYlxuICAgICAgLy8gYmVjb21lcyBhY3RpdmUgYWdhaW4sIGl0IGZvY3VzZXMgb25jZSBhZ2FpbiB0aGUgcG9wb3Zlci5cbiAgICAgIC8vIFRoZXJlZm9yZSwgd2UgY2Fubm90IGxpc3RlbiB0byB0aGUgYmx1ciBldmVudCBvbmx5IG9uY2UuXG4gICAgICAvLyBUbyBwcmV2ZW50IGFjY2lkZW50YWxseSBjbG9zaW5nIHRoZSBwb3BvdmVyLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgd2luZG93L3RhYiBzdGF0ZS5cbiAgICAgIC8vIFdlIGNhbiBhY2hpZXZlIHRoaXMgYnkgdXNpbmcgdmlzaWJpbGl0eVN0YXRlLCB3aGljaCBvbmx5IHdvcmtzIHdpdGggc2V0VGltZW91dCgpLlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnYmx1cicsXG4gICAgICAgIChlOiBGb2N1c0V2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5fYmx1clRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuXG4gICAgICAgICAgICAgIC8vIEluIFNhZmFyaSBvbiBpT1MgaXQgY2FuIG9jY3VyLCB0aGF0IGEgYmx1ciBldmVudCB0cmlnZ2VycyBvbiB0aGUgcG9wb3ZlclxuICAgICAgICAgICAgICAvLyBhbHRob3VnaCB0aGUgZm9jdXMgcmVtYWlucyBpbnNpZGUgdGhlIHBvcG92ZXIuXG4gICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBzdG9wIHRoZSBjbG9zaW5nIGlmIHRoZSByZWxhdGVkVGFyZ2V0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcG9wb3ZlciBvciBpdCBpcyB0aGUgdHJpZ2dlci5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpIHx8IGUucmVsYXRlZFRhcmdldCA9PT0gdGhpcy50cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NraXBDbG9zZUZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzaWduYWw6IHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRQb3BvdmVyUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXkgfHwgIXRoaXMuX3RyaWdnZXJFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9wb3ZlclBvc2l0aW9uID0gZ2V0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgdGhpcy5vdmVybGF5LFxuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQsXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItcG9wb3Zlcl9fY29udGFpbmVyJykhLFxuICAgICAge1xuICAgICAgICB2ZXJ0aWNhbE9mZnNldDogVkVSVElDQUxfT0ZGU0VULFxuICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiBIT1JJWk9OVEFMX09GRlNFVCxcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgIHJlc3BvbnNpdmVIZWlnaHQ6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgdmVydGljYWxQb3NpdGlvbiA9IHBvcG92ZXJQb3NpdGlvbi5hbGlnbm1lbnQudmVydGljYWw7XG4gICAgZm9yIChjb25zdCBwb3NpdGlvbiBvZiBbJ2Fib3ZlJywgJ2JlbG93J10pIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGUoYHBvc2l0aW9uLSR7cG9zaXRpb259YCwgcG9zaXRpb24gPT09IHZlcnRpY2FsUG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGFycm93WFBvc2l0aW9uID1cbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuICAgICAgcG9wb3ZlclBvc2l0aW9uLmxlZnQgK1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuY2xpZW50V2lkdGggLyAyIC1cbiAgICAgIDg7IC8vIGhhbGYgdGhlIHNpemUgb2YgdGhlIHBvcG92ZXIgYXJyb3dcblxuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tX3NiYi1wb3BvdmVyLXBvc2l0aW9uLXgnLCBgJHtwb3BvdmVyUG9zaXRpb24ubGVmdH1weGApO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tX3NiYi1wb3BvdmVyLXBvc2l0aW9uLXknLCBgJHtwb3BvdmVyUG9zaXRpb24udG9wfXB4YCk7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1fc2JiLXBvcG92ZXItYXJyb3ctcG9zaXRpb24teCcsIGAke2Fycm93WFBvc2l0aW9ufXB4YCk7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1fc2JiLXBvcG92ZXItbWF4LWhlaWdodCcsIHBvcG92ZXJQb3NpdGlvbi5tYXhIZWlnaHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlbmRlckNvbnRlbnQoKTogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRpc3BhdGNoQmVmb3JlQ2xvc2VFdmVudChkZXRhaWw/OiB7XG4gICAgY2xvc2VUYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgfSk6IGJvb2xlYW4ge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDx7IGNsb3NlVGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwgfT59XG4gICAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBiZWdpbnMgdGhlIGNsb3NpbmcgdHJhbnNpdGlvbi4gQ2FuIGJlIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0+KCdiZWZvcmVjbG9zZScsIHtcbiAgICAgICAgZGV0YWlsLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkaXNwYXRjaENsb3NlRXZlbnQoZGV0YWlsPzogeyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0pOiBib29sZWFuIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8eyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0+fVxuICAgICAqIEVtaXRzIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBjbG9zZVRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsIH0+KCdjbG9zZScsIHsgZGV0YWlsIH0pLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItcG9wb3Zlcl9fY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25Qb3BvdmVyQW5pbWF0aW9uRW5kfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXBvcG92ZXJcIlxuICAgICAgICAgIHJvbGU9XCJ0b29sdGlwXCJcbiAgICAgICAgICAke3JlZigoZWw/OiBFbGVtZW50KSA9PiAodGhpcy5vdmVybGF5ID0gZWwgYXMgSFRNTERpdkVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBjbGljaz0keyhldmVudDogRXZlbnQpID0+IHRoaXMuX2Nsb3NlT25TYmJQb3BvdmVyQ2xvc2VDbGljayhldmVudCl9XG4gICAgICAgICAgICBjbGFzcz1cInNiYi1wb3BvdmVyX19jb250ZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke3RoaXMucmVuZGVyQ29udGVudCgpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHdpdGhpbiBhIHBvcG92ZXIuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgY29udGVudCBpbnRvIHRoZSBwb3BvdmVyLlxuICogQGNzc3Byb3AgWy0tc2JiLXBvcG92ZXItei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5leHBvcnQgY2xhc3MgU2JiUG9wb3ZlckVsZW1lbnQgZXh0ZW5kcyBTYmJQb3BvdmVyQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXBvcG92ZXInO1xuICAvKiogV2hldGhlciB0aGUgY2xvc2UgYnV0dG9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoaWRlLWNsb3NlLWJ1dHRvbicsIHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhpZGVDbG9zZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBiZSB0cmlnZ2VyZWQgb24gaG92ZXIuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdob3Zlci10cmlnZ2VyJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaG92ZXJUcmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIHBvcG92ZXIgYWZ0ZXIgYSBnaXZlbiBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEdsb2JhbCBjb25maWd1cmF0aW9uIGlzIHVzZWQgYXMgZGVmYXVsdCwgaWYgbm90IHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnb3Blbi1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IG9wZW5EZWxheSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fb3BlbkRlbGF5ID0gK3ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgb3BlbkRlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29wZW5EZWxheSA/PyByZWFkQ29uZmlnKCkucG9wb3Zlcj8ub3BlbkRlbGF5ID8/IDA7XG4gIH1cbiAgcHJpdmF0ZSBfb3BlbkRlbGF5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcG9wb3ZlciBhZnRlciBhIGdpdmVuIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBhcyBkZWZhdWx0LCBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdjbG9zZS1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IGNsb3NlRGVsYXkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nsb3NlRGVsYXkgPSArdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBjbG9zZURlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NlRGVsYXkgPz8gcmVhZENvbmZpZygpLnBvcG92ZXI/LmNsb3NlRGVsYXkgPz8gMDtcbiAgfVxuICBwcml2YXRlIF9jbG9zZURlbGF5PzogbnVtYmVyO1xuXG4gIC8qKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIGFzIGFyaWEtbGFiZWwgdG8gdGhlIGNsb3NlIGJ1dHRvbiBlbGVtZW50LiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWNjZXNzaWJpbGl0eS1jbG9zZS1sYWJlbCcgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFjY2Vzc2liaWxpdHlDbG9zZUxhYmVsOiBzdHJpbmcgPSAnJztcblxuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF9ob3ZlclRyaWdnZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlblRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9vdmVybGF5QWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY29uZmlndXJlVHJpZ2dlcihvbGRUcmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0cmlnZ2VyIGNhbiBiZSBob3ZlcmVkLiBTb21lIGRldmljZXMgbWlnaHQgaW50ZXJwcmV0IHRoZSBtZWRpYSBxdWVyeSAoaG92ZXI6IGhvdmVyKSBkaWZmZXJlbnRseSxcbiAgICAvLyBhbmQgbm90IHJlc3BlY3QgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbSBvbiB0aGUgY2xpY2suIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpcyBwcmVmZXJyZWQgdG8gaWRlbnRpZnlcbiAgICAvLyBhbGwgbm9uLXRvdWNoc2NyZWVuIGRldmljZXMuXG4gICAgY29uc3QgaG92ZXJUcmlnZ2VyID0gdGhpcy5ob3ZlclRyaWdnZXIgJiYgIXBvaW50ZXJDb2Fyc2U7XG5cbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSBvbGRUcmlnZ2VyICYmIGhvdmVyVHJpZ2dlciA9PT0gdGhpcy5faG92ZXJUcmlnZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hvdmVyVHJpZ2dlciAhPT0gaG92ZXJUcmlnZ2VyKSB7XG4gICAgICB0aGlzLl9ob3ZlclRyaWdnZXIgPSBob3ZlclRyaWdnZXI7XG4gICAgICB0aGlzLnRvZ2dsZVN0YXRlKCdob3Zlci10cmlnZ2VyJywgdGhpcy5faG92ZXJUcmlnZ2VyKTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyT3ZlcmxheUxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHN1cGVyLmNvbmZpZ3VyZVRyaWdnZXIob2xkVHJpZ2dlcik7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3Rlck92ZXJsYXlMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3ZlcmxheUFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcblxuICAgIGlmICh0aGlzLl9ob3ZlclRyaWdnZXIpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICB0aGlzLm92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLl9vbk92ZXJsYXlNb3VzZUVudGVyKCksIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLl9vdmVybGF5QWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vdmVybGF5Py5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5fb25PdmVybGF5TW91c2VMZWF2ZSgpLCB7XG4gICAgICAgIHNpZ25hbDogdGhpcy5fb3ZlcmxheUFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVnaXN0ZXJUcmlnZ2VyTGlzdGVuZXJzKHNpZ25hbDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faG92ZXJUcmlnZ2VyICYmIHRoaXMudHJpZ2dlcikge1xuICAgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLl9vblRyaWdnZXJNb3VzZUVudGVyLCB7IHNpZ25hbCB9KTtcbiAgICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5fb25UcmlnZ2VyTW91c2VMZWF2ZSwgeyBzaWduYWwgfSk7XG4gICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2tleWRvd24nLFxuICAgICAgICAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2dC5jb2RlID09PSAnU3BhY2UnIHx8IGV2dC5jb2RlID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgc2lnbmFsIH0sXG4gICAgICApO1xuICAgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdtb3VzZWRvd24nLFxuICAgICAgICAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gV2l0aG91dCB0aGlzIGNoZWNrLCBOVkRBIGNhbid0IG9wZW4gdGhlIHBvcG92ZXIgb24ga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgaWYgKGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZ0KSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IHNpZ25hbCB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIucmVnaXN0ZXJUcmlnZ2VyTGlzdGVuZXJzKHNpZ25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXJPdmVybGF5TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb3BlbigpOiB2b2lkIHtcbiAgICBzdXBlci5vcGVuKCk7XG5cbiAgICBpZiAodGhpcy5ob3ZlclRyaWdnZXIgJiYgdGhpcy50cmlnZ2VyKSB7XG4gICAgICDJtXN0YXRlQ29udHJvbGxlcih0aGlzLnRyaWdnZXIpLmFkZCgnZm9yY2UtaG92ZXInKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY2xvc2UoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xvc2UoKTtcblxuICAgIMm1c3RhdGVDb250cm9sbGVyKHRoaXMudHJpZ2dlcik/LmRlbGV0ZSgnZm9yY2UtaG92ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVHJpZ2dlck1vdXNlRW50ZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5fb3BlblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gSWYgdGhlIHRyaWdnZXIgaXMgZm9jdXNlZCBieSBrZXlib2FyZCBhbmQgaG92ZXJlZCB3aXRoIHRoZSBtb3VzZSwgdGhlIG91dGxpbmUgd291bGQgYmUgdmlzaWJsZS5cbiAgICAgICAgLy8gU28gd2UgcmVzZXQgdGhlIGlucHV0IG1vZGFsaXR5IHRvIGhpZGUgdGhlIG91dGxpbmUuXG4gICAgICAgIHNiYklucHV0TW9kYWxpdHlEZXRlY3Rvci5yZXNldCgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0sIHRoaXMub3BlbkRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfb25UcmlnZ2VyTW91c2VMZWF2ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLmNsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLmNsb3NlRGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vbk92ZXJsYXlNb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX29uT3ZlcmxheU1vdXNlTGVhdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5jbG9zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2xvc2UoKSwgdGhpcy5jbG9zZURlbGF5KTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlckNvbnRlbnQoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gaHRtbGBcbiAgICAgIDxzYmItc2Vjb25kYXJ5LWJ1dHRvblxuICAgICAgICBhcmlhLWxhYmVsPSR7dGhpcy5hY2Nlc3NpYmlsaXR5Q2xvc2VMYWJlbCB8fCBpMThuQ2xvc2VQb3BvdmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfVxuICAgICAgICBzaXplPVwic1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpY29uLW5hbWU9XCJjcm9zcy1zbWFsbFwiXG4gICAgICAgIHNiYi1wb3BvdmVyLWNsb3NlXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICAkeyF0aGlzLmhpZGVDbG9zZUJ1dHRvbiAmJiAhdGhpcy5faG92ZXJUcmlnZ2VyID8gY2xvc2VCdXR0b24gOiBub3RoaW5nfVxuICAgICAgPHNwYW4gY2xhc3M9XCJzYmItcG9wb3Zlcl9fc2Nyb2xsYWJsZS1jb250ZW50XCI+XG4gICAgICAgIDxzbG90Pk5vIGNvbnRlbnQ8L3Nsb3Q+XG4gICAgICA8L3NwYW4+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXBvcG92ZXInOiBTYmJQb3BvdmVyRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM0Q0EsMEJBQTBCLFFBQVE7QUFFbEMsSUFBTSxrQkFBa0I7QUFDeEIsSUFBTSxvQkFBb0I7QUFFMUIsSUFBSSxTQUFTO0FBRWIsSUFBTSw4QkFBYyxJQUFJLEtBQTRCO0FBQ3BELElBQU0sZ0JBQWdCLFdBQVcsUUFBUSxXQUFXLDJCQUEyQixDQUFDO0lBRTFELCtCQUFxQjttQkFBUzs7OztjQUE5Qiw4QkFBOEIsWUFBdUI7OztBQVV6RCxTQUFBLDJCQUFBLGtCQUFBLE1BQUEsdUJBQThCLEtBQUk7QUFHMUMsUUFBQSxzQkFBbUIsa0JBQUEsTUFBQSwyQkFBQTtBQUNuQixRQUFBLGtCQUEyQjtBQU0zQixRQUFBLG9CQUFvQixJQUFJLGlCQUFpQixNQUFNO0lBQ3JELFFBQVE7SUFDUixnQkFBZ0IsS0FBSyxxQkFBQTtJQUN0QixDQUFDO0FBQ00sUUFBQSw4QkFBOEIsSUFBSSw4QkFBOEIsS0FBSztBQUNyRSxRQUFBLHVCQUF1QixJQUFJLHVCQUF1QixLQUFLO0FBQ3ZELFFBQUEsZUFBcUQ7QUEyTXJELFFBQUEsd0JBQXdCLFVBQTZCO0FBQzNELFNBQUssK0JBQStCLGlCQUFpQixLQUFLLFNBQVUsTUFBTTs7QUFJcEUsUUFBQSx5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