@sbb-esta/lyne-elements 3.0.0-next.0 → 3.0.0-next.2

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 (567) hide show
  1. package/accordion/accordion.component.js +19 -22
  2. package/action-group/action-group.component.js +3 -5
  3. package/alert/alert/alert.component.d.ts +5 -7
  4. package/alert/alert/alert.component.d.ts.map +1 -1
  5. package/alert/alert/alert.component.js +69 -84
  6. package/alert/alert-group/alert-group.component.js +2 -3
  7. package/autocomplete/autocomplete-base-element.js +83 -95
  8. package/autocomplete/autocomplete.component.js +28 -33
  9. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +42 -50
  10. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts +1 -1
  11. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
  12. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +4 -5
  13. package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +17 -20
  14. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts +1 -1
  15. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  16. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +21 -24
  17. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +5 -5
  18. package/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +27 -31
  19. package/button/mini-button/mini-button.component.js +1 -1
  20. package/button/mini-button-group/mini-button-group.component.js +1 -2
  21. package/calendar/calendar.component.d.ts +0 -5
  22. package/calendar/calendar.component.d.ts.map +1 -1
  23. package/calendar/calendar.component.js +129 -147
  24. package/card/card/card.component.js +12 -12
  25. package/card/card-badge/card-badge.component.js +17 -17
  26. package/card/common/card-action-common.js +20 -22
  27. package/checkbox/checkbox/checkbox.component.js +17 -20
  28. package/checkbox/checkbox-group/checkbox-group.component.js +39 -52
  29. package/checkbox/checkbox-panel/checkbox-panel.component.js +18 -21
  30. package/checkbox/common/checkbox-common.js +13 -15
  31. package/chip/chip-group/chip-group.component.js +66 -80
  32. package/clock/clock.component.js +50 -60
  33. package/container/container/container.component.js +28 -29
  34. package/container/sticky-bar/sticky-bar.component.js +25 -26
  35. package/core/a11y/focus-trap-controller.js +11 -14
  36. package/core/a11y/input-modality-detector.js +15 -16
  37. package/core/a11y/interactivity-checker.js +10 -10
  38. package/core/a11y/live-announcer.js +12 -14
  39. package/core/base-elements/button-base-element.js +58 -63
  40. package/core/base-elements/link-base-element.js +3 -6
  41. package/core/base-elements/open-close-base-element.js +1 -1
  42. package/core/config/config.d.ts.map +1 -1
  43. package/core/controllers/escapable-overlay-controller.js +10 -12
  44. package/core/controllers/id-reference-controller.js +13 -14
  45. package/core/controllers/inert-controller.js +8 -10
  46. package/core/controllers/slot-state-controller.js +16 -26
  47. package/core/datetime/date-adapter.d.ts +1 -1
  48. package/core/datetime/date-adapter.d.ts.map +1 -1
  49. package/core/datetime/date-adapter.js +21 -21
  50. package/core/datetime/native-date-adapter.d.ts +1 -1
  51. package/core/datetime/native-date-adapter.d.ts.map +1 -1
  52. package/core/datetime/native-date-adapter.js +28 -28
  53. package/core/decorators/force-type.js +4 -5
  54. package/core/decorators/id-reference.js +34 -37
  55. package/core/decorators/plain-date.js +16 -19
  56. package/core/dom/breakpoint.js +8 -8
  57. package/core/eventing/event-emitter.js +4 -5
  58. package/core/i18n/i18n.js +41 -41
  59. package/core/mixins/element-internals-mixin.d.ts +21 -0
  60. package/core/mixins/element-internals-mixin.d.ts.map +1 -1
  61. package/core/mixins/element-internals-mixin.js +109 -23
  62. package/core/mixins/form-associated-checkbox-mixin.js +32 -37
  63. package/core/mixins/form-associated-input-mixin.d.ts.map +1 -1
  64. package/core/mixins/form-associated-input-mixin.js +69 -93
  65. package/core/mixins/form-associated-mixin.js +32 -35
  66. package/core/mixins/form-associated-radio-button-mixin.js +3 -5
  67. package/core/mixins/hydration-mixin.js +12 -13
  68. package/core/mixins/named-slot-list-mixin.js +32 -37
  69. package/core/mixins/panel-mixin.js +26 -27
  70. package/core/mixins/readonly-mixin.d.ts.map +1 -1
  71. package/core/mixins/readonly-mixin.js +10 -11
  72. package/core/mixins.js +27 -25
  73. package/core/overlay/position.js +23 -23
  74. package/core/styles/core/mediaqueries.scss +1 -1
  75. package/core/styles/core.scss +70 -37
  76. package/core/styles/mixins/table.scss +1 -24
  77. package/core/styles/mixins/typo.scss +0 -1
  78. package/core/testing/event-spy.js +2 -4
  79. package/core/testing/wait-for-image-ready.js +8 -9
  80. package/core/testing/wait-for-render.js +8 -9
  81. package/core.css +29 -1
  82. package/custom-elements.json +5804 -3207
  83. package/date-input/date-input.component.d.ts +16 -1
  84. package/date-input/date-input.component.d.ts.map +1 -1
  85. package/date-input/date-input.component.js +71 -58
  86. package/datepicker/common/datepicker-button.d.ts +31 -20
  87. package/datepicker/common/datepicker-button.d.ts.map +1 -1
  88. package/datepicker/common/datepicker-button.js +79 -74
  89. package/datepicker/common.d.ts +0 -1
  90. package/datepicker/common.d.ts.map +1 -1
  91. package/datepicker/common.js +3 -5
  92. package/datepicker/datepicker/datepicker.component.d.ts +23 -102
  93. package/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  94. package/datepicker/datepicker/datepicker.component.js +91 -233
  95. package/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts +2 -2
  96. package/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -1
  97. package/datepicker/datepicker-next-day/datepicker-next-day.component.js +27 -18
  98. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts +2 -2
  99. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -1
  100. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +27 -18
  101. package/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts +6 -26
  102. package/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts.map +1 -1
  103. package/datepicker/datepicker-toggle/datepicker-toggle.component.js +36 -145
  104. package/datepicker.js +9 -11
  105. package/development/accordion/accordion.component.js +4 -7
  106. package/development/action-group/action-group.component.js +3 -5
  107. package/development/alert/alert/alert.component.d.ts +5 -7
  108. package/development/alert/alert/alert.component.d.ts.map +1 -1
  109. package/development/alert/alert/alert.component.js +34 -52
  110. package/development/alert/alert-group/alert-group.component.js +2 -3
  111. package/development/autocomplete/autocomplete-base-element.js +20 -32
  112. package/development/autocomplete/autocomplete.component.js +7 -12
  113. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +10 -18
  114. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts +1 -1
  115. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
  116. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +4 -9
  117. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  118. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +4 -7
  119. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts +1 -1
  120. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  121. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +4 -7
  122. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -2
  123. package/development/breadcrumb/breadcrumb/breadcrumb.component.js +1 -1
  124. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +5 -9
  125. package/development/button/accent-button/accent-button.component.js +1 -1
  126. package/development/button/accent-button-link/accent-button-link.component.js +1 -1
  127. package/development/button/accent-button-static/accent-button-static.component.js +1 -1
  128. package/development/button/button/button.component.js +1 -1
  129. package/development/button/button-link/button-link.component.js +1 -1
  130. package/development/button/button-static/button-static.component.js +1 -1
  131. package/development/button/common/button-common.js +1 -1
  132. package/development/button/mini-button/mini-button.component.js +1 -1
  133. package/development/button/mini-button-group/mini-button-group.component.js +2 -3
  134. package/development/button/secondary-button/secondary-button.component.js +1 -1
  135. package/development/button/secondary-button-link/secondary-button-link.component.js +1 -1
  136. package/development/button/secondary-button-static/secondary-button-static.component.js +1 -1
  137. package/development/button/transparent-button/transparent-button.component.js +1 -1
  138. package/development/button/transparent-button-link/transparent-button-link.component.js +1 -1
  139. package/development/button/transparent-button-static/transparent-button-static.component.js +1 -1
  140. package/development/calendar/calendar.component.d.ts +0 -5
  141. package/development/calendar/calendar.component.d.ts.map +1 -1
  142. package/development/calendar/calendar.component.js +20 -44
  143. package/development/card/card/card.component.js +1 -1
  144. package/development/card/card-badge/card-badge.component.js +2 -2
  145. package/development/card/card-button/card-button.component.js +1 -1
  146. package/development/card/card-link/card-link.component.js +1 -1
  147. package/development/card/common/card-action-common.js +4 -6
  148. package/development/checkbox/checkbox/checkbox.component.js +2 -5
  149. package/development/checkbox/checkbox-group/checkbox-group.component.js +8 -21
  150. package/development/checkbox/checkbox-panel/checkbox-panel.component.js +2 -5
  151. package/development/checkbox/common/checkbox-common.js +3 -5
  152. package/development/chip/chip/chip.component.js +1 -1
  153. package/development/chip/chip-group/chip-group.component.js +18 -32
  154. package/development/chip-label/chip-label.component.js +1 -1
  155. package/development/clock/clock.component.js +23 -33
  156. package/development/container/container/container.component.js +2 -3
  157. package/development/container/sticky-bar/sticky-bar.component.js +3 -4
  158. package/development/core/a11y/arrow-navigation.js +1 -1
  159. package/development/core/a11y/fake-event-detection.js +1 -1
  160. package/development/core/a11y/focus-trap-controller.js +6 -9
  161. package/development/core/a11y/focus-visible-within-controller.js +1 -1
  162. package/development/core/a11y/input-modality-detector.js +2 -3
  163. package/development/core/a11y/interactivity-checker.js +2 -2
  164. package/development/core/a11y/live-announcer.js +6 -8
  165. package/development/core/base-elements/action-base-element.js +2 -3
  166. package/development/core/base-elements/button-base-element.js +6 -11
  167. package/development/core/base-elements/link-base-element.js +4 -7
  168. package/development/core/base-elements/open-close-base-element.js +2 -2
  169. package/development/core/config/config.d.ts.map +1 -1
  170. package/development/core/config/config.js +1 -1
  171. package/development/core/controllers/escapable-overlay-controller.js +3 -5
  172. package/development/core/controllers/id-reference-controller.js +2 -3
  173. package/development/core/controllers/inert-controller.js +4 -6
  174. package/development/core/controllers/language-controller.js +1 -1
  175. package/development/core/controllers/media-matchers-controller.js +1 -1
  176. package/development/core/controllers/slot-state-controller.js +8 -18
  177. package/development/core/datetime/date-adapter.d.ts +1 -1
  178. package/development/core/datetime/date-adapter.d.ts.map +1 -1
  179. package/development/core/datetime/date-adapter.js +5 -5
  180. package/development/core/datetime/native-date-adapter.d.ts +1 -1
  181. package/development/core/datetime/native-date-adapter.d.ts.map +1 -1
  182. package/development/core/datetime/native-date-adapter.js +4 -4
  183. package/development/core/decorators/force-type.js +3 -4
  184. package/development/core/decorators/get-override.js +1 -1
  185. package/development/core/decorators/handle-distinct-change.js +1 -1
  186. package/development/core/decorators/host-attributes.js +1 -1
  187. package/development/core/decorators/id-reference.js +4 -7
  188. package/development/core/decorators/plain-date.js +5 -8
  189. package/development/core/decorators/slot-state.js +1 -1
  190. package/development/core/dom/animation.js +1 -1
  191. package/development/core/dom/breakpoint.js +2 -2
  192. package/development/core/dom/host-context.js +1 -1
  193. package/development/core/dom/platform.js +1 -1
  194. package/development/core/dom/scroll.js +1 -1
  195. package/development/core/dom/set-or-remove-attribute.js +1 -1
  196. package/development/core/eventing/composed-path-has-attribute.js +1 -1
  197. package/development/core/eventing/event-emitter.js +2 -3
  198. package/development/core/eventing/form-element-handlers.js +1 -1
  199. package/development/core/eventing/forward-event.js +1 -1
  200. package/development/core/eventing/throttle.js +1 -1
  201. package/development/core/i18n/i18n.js +18 -18
  202. package/development/core/mixins/animation-complete-mixin.js +1 -1
  203. package/development/core/mixins/disabled-mixin.js +1 -1
  204. package/development/core/mixins/element-internals-mixin.d.ts +21 -0
  205. package/development/core/mixins/element-internals-mixin.d.ts.map +1 -1
  206. package/development/core/mixins/element-internals-mixin.js +123 -2
  207. package/development/core/mixins/form-associated-checkbox-mixin.js +6 -9
  208. package/development/core/mixins/form-associated-input-mixin.d.ts.map +1 -1
  209. package/development/core/mixins/form-associated-input-mixin.js +29 -59
  210. package/development/core/mixins/form-associated-mixin.js +6 -9
  211. package/development/core/mixins/form-associated-radio-button-mixin.js +7 -9
  212. package/development/core/mixins/hydration-mixin.js +3 -4
  213. package/development/core/mixins/named-slot-list-mixin.js +4 -7
  214. package/development/core/mixins/negative-mixin.js +1 -1
  215. package/development/core/mixins/panel-mixin.js +2 -3
  216. package/development/core/mixins/readonly-mixin.d.ts.map +1 -1
  217. package/development/core/mixins/readonly-mixin.js +4 -6
  218. package/development/core/mixins/required-mixin.js +1 -1
  219. package/development/core/mixins/update-scheduler-mixin.js +1 -1
  220. package/development/core/mixins.js +4 -2
  221. package/development/core/overlay/overlay-option-panel.js +1 -1
  222. package/development/core/overlay/overlay-trigger-attributes.js +1 -1
  223. package/development/core/overlay/overlay.js +1 -1
  224. package/development/core/overlay/position.js +5 -5
  225. package/development/core/testing/event-spy.js +3 -5
  226. package/development/core/testing/mocha-extensions.js +1 -1
  227. package/development/core/testing/wait-for-condition.js +1 -1
  228. package/development/core/testing/wait-for-image-ready.js +2 -3
  229. package/development/core/testing/wait-for-render.js +2 -3
  230. package/development/date-input/date-input.component.d.ts +16 -1
  231. package/development/date-input/date-input.component.d.ts.map +1 -1
  232. package/development/date-input/date-input.component.js +28 -11
  233. package/development/datepicker/common/datepicker-button.d.ts +31 -20
  234. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  235. package/development/datepicker/common/datepicker-button.js +103 -90
  236. package/development/datepicker/common.d.ts +0 -1
  237. package/development/datepicker/common.d.ts.map +1 -1
  238. package/development/datepicker/common.js +4 -6
  239. package/development/datepicker/datepicker/datepicker.component.d.ts +23 -102
  240. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  241. package/development/datepicker/datepicker/datepicker.component.js +94 -337
  242. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts +2 -2
  243. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -1
  244. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.js +18 -6
  245. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts +2 -2
  246. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -1
  247. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +18 -6
  248. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts +6 -26
  249. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts.map +1 -1
  250. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.js +137 -224
  251. package/development/datepicker.js +3 -5
  252. package/development/dialog/dialog/dialog.component.d.ts +7 -16
  253. package/development/dialog/dialog/dialog.component.d.ts.map +1 -1
  254. package/development/dialog/dialog/dialog.component.js +78 -149
  255. package/development/dialog/dialog-actions/dialog-actions.component.d.ts +2 -2
  256. package/development/dialog/dialog-actions/dialog-actions.component.d.ts.map +1 -1
  257. package/development/dialog/dialog-actions/dialog-actions.component.js +20 -17
  258. package/development/dialog/dialog-content/dialog-content.component.d.ts.map +1 -1
  259. package/development/dialog/dialog-content/dialog-content.component.js +5 -46
  260. package/development/dialog/dialog-title/dialog-title.component.d.ts +2 -26
  261. package/development/dialog/dialog-title/dialog-title.component.d.ts.map +1 -1
  262. package/development/dialog/dialog-title/dialog-title.component.js +12 -179
  263. package/development/divider/divider.component.js +2 -2
  264. package/development/expansion-panel/expansion-panel/expansion-panel.component.js +9 -13
  265. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +2 -2
  266. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +5 -6
  267. package/development/file-selector/common/file-selector-common.js +2 -3
  268. package/development/file-selector/file-selector/file-selector.component.js +1 -1
  269. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
  270. package/development/flip-card/flip-card/flip-card.component.js +7 -13
  271. package/development/flip-card/flip-card-details/flip-card-details.component.js +3 -4
  272. package/development/flip-card/flip-card-summary/flip-card-summary.component.js +3 -4
  273. package/development/footer/footer.component.js +1 -1
  274. package/development/form-error/form-error.component.js +3 -4
  275. package/development/form-field/form-field/form-field.component.d.ts +1 -1
  276. package/development/form-field/form-field/form-field.component.d.ts.map +1 -1
  277. package/development/form-field/form-field/form-field.component.js +39 -67
  278. package/development/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  279. package/development/form-field/form-field-clear/form-field-clear.component.js +6 -8
  280. package/development/header/common/header-action-common.js +1 -1
  281. package/development/header/header/header.component.js +5 -8
  282. package/development/header/header-button/header-button.component.js +1 -1
  283. package/development/header/header-link/header-link.component.js +1 -1
  284. package/development/icon/icon-base.d.ts +5 -3
  285. package/development/icon/icon-base.d.ts.map +1 -1
  286. package/development/icon/icon-base.js +4 -7
  287. package/development/icon/icon-name-mixin.js +1 -1
  288. package/development/icon/icon-request.js +2 -3
  289. package/development/icon/icon-validate.js +1 -1
  290. package/development/icon/icon.component.d.ts +1 -2
  291. package/development/icon/icon.component.d.ts.map +1 -1
  292. package/development/icon/icon.component.js +8 -19
  293. package/development/image/image.component.js +7 -9
  294. package/development/journey-header/journey-header.component.d.ts +5 -5
  295. package/development/journey-header/journey-header.component.d.ts.map +1 -1
  296. package/development/journey-header/journey-header.component.js +26 -40
  297. package/development/lead-container/lead-container.component.js +1 -1
  298. package/development/link/block-link/block-link.component.js +1 -1
  299. package/development/link/block-link-button/block-link-button.component.js +1 -1
  300. package/development/link/block-link-static/block-link-static.component.js +1 -1
  301. package/development/link/common/block-link-common.js +1 -1
  302. package/development/link/common/inline-link-common.js +1 -1
  303. package/development/link/link/link.component.js +1 -1
  304. package/development/link/link-button/link-button.component.js +1 -1
  305. package/development/link/link-static/link-static.component.js +1 -1
  306. package/development/link-common-DPLJx5Uo.js +1 -1
  307. package/development/link-list/common/link-list-base.js +1 -1
  308. package/development/link-list/link-list/link-list.component.js +1 -1
  309. package/development/link-list/link-list-anchor/link-list-anchor.component.js +1 -1
  310. package/development/loading-indicator/loading-indicator.component.js +1 -1
  311. package/development/loading-indicator-circle/loading-indicator-circle.component.js +1 -1
  312. package/development/logo/logo.component.js +1 -1
  313. package/development/map-container/map-container.component.js +2 -3
  314. package/development/menu/common/menu-action-common.js +1 -1
  315. package/development/menu/menu/menu.component.js +17 -25
  316. package/development/menu/menu-button/menu-button.component.js +1 -1
  317. package/development/menu/menu-link/menu-link.component.js +1 -1
  318. package/development/message/message.component.d.ts +4 -8
  319. package/development/message/message.component.d.ts.map +1 -1
  320. package/development/message/message.component.js +12 -54
  321. package/development/navigation/common/navigation-action-common.js +3 -5
  322. package/development/navigation/navigation/navigation.component.js +19 -35
  323. package/development/navigation/navigation-button/navigation-button.component.js +1 -1
  324. package/development/navigation/navigation-link/navigation-link.component.js +1 -1
  325. package/development/navigation/navigation-list/navigation-list.component.js +1 -1
  326. package/development/navigation/navigation-marker/navigation-marker.component.js +4 -6
  327. package/development/navigation/navigation-section/navigation-section.component.d.ts +1 -1
  328. package/development/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
  329. package/development/navigation/navigation-section/navigation-section.component.js +27 -37
  330. package/development/notification/notification.component.d.ts +7 -9
  331. package/development/notification/notification.component.d.ts.map +1 -1
  332. package/development/notification/notification.component.js +47 -77
  333. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  334. package/development/option/optgroup/optgroup-base-element.js +8 -14
  335. package/development/option/optgroup/optgroup.component.js +6 -10
  336. package/development/option/option/option-base-element.js +3 -4
  337. package/development/option/option/option.component.js +7 -10
  338. package/development/overlay/overlay-base-element.d.ts +24 -6
  339. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  340. package/development/overlay/overlay-base-element.js +114 -15
  341. package/development/overlay/overlay.component.d.ts +2 -12
  342. package/development/overlay/overlay.component.d.ts.map +1 -1
  343. package/development/overlay/overlay.component.js +33 -98
  344. package/development/paginator/common/paginator-common.js +1 -1
  345. package/development/paginator/compact-paginator/compact-paginator.component.js +1 -1
  346. package/development/paginator/paginator/paginator.component.js +2 -3
  347. package/development/popover/popover/popover.component.d.ts +45 -34
  348. package/development/popover/popover/popover.component.d.ts.map +1 -1
  349. package/development/popover/popover/popover.component.js +215 -172
  350. package/development/popover/popover-trigger/popover-trigger.component.js +1 -1
  351. package/development/popover/popover.js +2 -1
  352. package/development/popover.js +2 -1
  353. package/development/radio-button/common/radio-button-common.js +6 -10
  354. package/development/radio-button/radio-button/radio-button.component.js +2 -5
  355. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts +1 -1
  356. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -1
  357. package/development/radio-button/radio-button-group/radio-button-group.component.js +8 -24
  358. package/development/radio-button/radio-button-panel/radio-button-panel.component.js +3 -7
  359. package/development/screen-reader-only/screen-reader-only.component.js +1 -1
  360. package/development/select/select.component.js +26 -49
  361. package/development/selection-expansion-panel/selection-expansion-panel.component.js +7 -11
  362. package/development/sidebar/icon-sidebar/icon-sidebar.component.js +1 -1
  363. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +1 -1
  364. package/development/sidebar/icon-sidebar-container/icon-sidebar-container.component.js +4 -7
  365. package/development/sidebar/icon-sidebar-content/icon-sidebar-content.component.js +1 -1
  366. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +1 -1
  367. package/development/sidebar/sidebar/sidebar.component.js +9 -16
  368. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +0 -1
  369. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -1
  370. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.js +3 -8
  371. package/development/sidebar/sidebar-container/sidebar-container.component.js +9 -13
  372. package/development/sidebar/sidebar-content/sidebar-content.component.js +1 -1
  373. package/development/sidebar/sidebar-title/sidebar-title.component.d.ts +2 -0
  374. package/development/sidebar/sidebar-title/sidebar-title.component.d.ts.map +1 -1
  375. package/development/sidebar/sidebar-title/sidebar-title.component.js +3 -9
  376. package/development/signet/signet.component.js +1 -1
  377. package/development/skiplink-list/skiplink-list.component.d.ts.map +1 -1
  378. package/development/skiplink-list/skiplink-list.component.js +19 -10
  379. package/development/slider/slider.component.js +4 -6
  380. package/development/status/status.component.d.ts +4 -7
  381. package/development/status/status.component.d.ts.map +1 -1
  382. package/development/status/status.component.js +23 -56
  383. package/development/stepper/step/step.component.d.ts +2 -1
  384. package/development/stepper/step/step.component.d.ts.map +1 -1
  385. package/development/stepper/step/step.component.js +16 -15
  386. package/development/stepper/step-label/step-label.component.d.ts +3 -3
  387. package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
  388. package/development/stepper/step-label/step-label.component.js +16 -17
  389. package/development/stepper/stepper/stepper.component.js +16 -29
  390. package/development/table/table-wrapper/table-wrapper.component.js +2 -7
  391. package/development/tabs/tab/tab.component.js +1 -1
  392. package/development/tabs/tab-group/tab-group.component.js +23 -38
  393. package/development/tabs/tab-label/tab-label.component.js +1 -1
  394. package/development/tag/tag/tag.component.js +7 -13
  395. package/development/tag/tag-group/tag-group.component.js +5 -13
  396. package/development/teaser/teaser.component.d.ts +6 -10
  397. package/development/teaser/teaser.component.d.ts.map +1 -1
  398. package/development/teaser/teaser.component.js +48 -76
  399. package/development/teaser-hero/teaser-hero.component.js +1 -1
  400. package/development/teaser-product/common/teaser-product-common.js +1 -1
  401. package/development/teaser-product/teaser-product/teaser-product.component.js +1 -1
  402. package/development/teaser-product/teaser-product-static/teaser-product-static.component.js +1 -1
  403. package/development/time-input/time-input.component.js +10 -14
  404. package/development/timetable-occupancy/timetable-occupancy.component.js +1 -1
  405. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.d.ts.map +1 -1
  406. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.js +2 -5
  407. package/development/title/title-base.d.ts +0 -8
  408. package/development/title/title-base.d.ts.map +1 -1
  409. package/development/title/title-base.js +17 -50
  410. package/development/title/title.component.d.ts +2 -0
  411. package/development/title/title.component.d.ts.map +1 -1
  412. package/development/title/title.component.js +9 -14
  413. package/development/toast/toast.component.d.ts.map +1 -1
  414. package/development/toast/toast.component.js +7 -16
  415. package/development/toggle/toggle/toggle.component.js +28 -30
  416. package/development/toggle/toggle-option/toggle-option.component.d.ts +1 -1
  417. package/development/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  418. package/development/toggle/toggle-option/toggle-option.component.js +12 -19
  419. package/development/toggle-check/toggle-check.component.js +1 -1
  420. package/development/train/train/train.component.js +1 -1
  421. package/development/train/train-blocked-passage/train-blocked-passage.component.js +1 -1
  422. package/development/train/train-formation/train-formation.component.js +5 -7
  423. package/development/train/train-wagon/train-wagon.component.js +1 -1
  424. package/development/visual-checkbox/visual-checkbox.component.js +1 -1
  425. package/dialog/dialog/dialog.component.d.ts +7 -16
  426. package/dialog/dialog/dialog.component.d.ts.map +1 -1
  427. package/dialog/dialog/dialog.component.js +57 -87
  428. package/dialog/dialog-actions/dialog-actions.component.d.ts +2 -2
  429. package/dialog/dialog-actions/dialog-actions.component.d.ts.map +1 -1
  430. package/dialog/dialog-actions/dialog-actions.component.js +16 -16
  431. package/dialog/dialog-content/dialog-content.component.d.ts.map +1 -1
  432. package/dialog/dialog-content/dialog-content.component.js +14 -19
  433. package/dialog/dialog-title/dialog-title.component.d.ts +2 -26
  434. package/dialog/dialog-title/dialog-title.component.d.ts.map +1 -1
  435. package/dialog/dialog-title/dialog-title.component.js +16 -111
  436. package/divider/divider.component.js +3 -3
  437. package/expansion-panel/expansion-panel/expansion-panel.component.js +5 -9
  438. package/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +1 -1
  439. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +30 -31
  440. package/file-selector/common/file-selector-common.js +1 -2
  441. package/flip-card/flip-card/flip-card.component.js +48 -54
  442. package/flip-card/flip-card-details/flip-card-details.component.js +15 -16
  443. package/flip-card/flip-card-summary/flip-card-summary.component.js +19 -20
  444. package/form-error/form-error.component.js +13 -14
  445. package/form-field/form-field/form-field.component.d.ts +1 -1
  446. package/form-field/form-field/form-field.component.d.ts.map +1 -1
  447. package/form-field/form-field/form-field.component.js +149 -168
  448. package/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  449. package/form-field/form-field-clear/form-field-clear.component.js +19 -21
  450. package/header/header/header.component.js +26 -29
  451. package/icon/icon-base.d.ts +5 -3
  452. package/icon/icon-base.d.ts.map +1 -1
  453. package/icon/icon-base.js +32 -34
  454. package/icon/icon-request.js +10 -11
  455. package/icon/icon.component.d.ts +1 -2
  456. package/icon/icon.component.d.ts.map +1 -1
  457. package/icon/icon.component.js +37 -37
  458. package/icon-sidebar-button-common-CM-ueEhH.js +7 -0
  459. package/image/image.component.js +4 -6
  460. package/journey-header/journey-header.component.d.ts +5 -5
  461. package/journey-header/journey-header.component.d.ts.map +1 -1
  462. package/journey-header/journey-header.component.js +50 -63
  463. package/map-container/map-container.component.js +1 -2
  464. package/menu/menu/menu.component.js +47 -55
  465. package/message/message.component.d.ts +4 -8
  466. package/message/message.component.d.ts.map +1 -1
  467. package/message/message.component.js +18 -47
  468. package/navigation/common/navigation-action-common.js +19 -21
  469. package/navigation/navigation/navigation.component.js +73 -92
  470. package/navigation/navigation-marker/navigation-marker.component.js +26 -28
  471. package/navigation/navigation-section/navigation-section.component.d.ts +1 -1
  472. package/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
  473. package/navigation/navigation-section/navigation-section.component.js +72 -82
  474. package/notification/notification.component.d.ts +7 -9
  475. package/notification/notification.component.d.ts.map +1 -1
  476. package/notification/notification.component.js +77 -95
  477. package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  478. package/option/optgroup/optgroup-base-element.js +36 -38
  479. package/option/optgroup/optgroup.component.js +16 -20
  480. package/option/option/option-base-element.js +3 -4
  481. package/option/option/option.component.js +26 -29
  482. package/overlay/overlay-base-element.d.ts +24 -6
  483. package/overlay/overlay-base-element.d.ts.map +1 -1
  484. package/overlay/overlay-base-element.js +98 -51
  485. package/overlay/overlay.component.d.ts +2 -12
  486. package/overlay/overlay.component.d.ts.map +1 -1
  487. package/overlay/overlay.component.js +57 -95
  488. package/package.json +1 -1
  489. package/paginator/paginator/paginator.component.js +3 -4
  490. package/popover/popover/popover.component.d.ts +45 -34
  491. package/popover/popover/popover.component.d.ts.map +1 -1
  492. package/popover/popover/popover.component.js +194 -168
  493. package/popover/popover-trigger/popover-trigger.component.js +1 -1
  494. package/popover/popover.js +2 -1
  495. package/popover.js +5 -4
  496. package/radio-button/common/radio-button-common.js +11 -15
  497. package/radio-button/radio-button/radio-button.component.js +16 -19
  498. package/radio-button/radio-button-group/radio-button-group.component.d.ts +1 -1
  499. package/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -1
  500. package/radio-button/radio-button-group/radio-button-group.component.js +27 -43
  501. package/radio-button/radio-button-panel/radio-button-panel.component.js +33 -37
  502. package/select/select.component.js +94 -117
  503. package/selection-expansion-panel/selection-expansion-panel.component.js +35 -39
  504. package/sidebar/common.js +1 -1
  505. package/sidebar/icon-sidebar-container/icon-sidebar-container.component.js +10 -13
  506. package/sidebar/sidebar/sidebar.component.js +62 -69
  507. package/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +0 -1
  508. package/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -1
  509. package/sidebar/sidebar-close-button/sidebar-close-button.component.js +18 -18
  510. package/sidebar/sidebar-container/sidebar-container.component.js +29 -33
  511. package/sidebar/sidebar-title/sidebar-title.component.d.ts +2 -0
  512. package/sidebar/sidebar-title/sidebar-title.component.d.ts.map +1 -1
  513. package/sidebar/sidebar-title/sidebar-title.component.js +16 -16
  514. package/sidebar.js +1 -1
  515. package/skiplink-list/skiplink-list.component.d.ts.map +1 -1
  516. package/skiplink-list/skiplink-list.component.js +36 -39
  517. package/slider/slider.component.js +11 -13
  518. package/standard-theme.css +29 -26
  519. package/status/status.component.d.ts +4 -7
  520. package/status/status.component.d.ts.map +1 -1
  521. package/status/status.component.js +34 -50
  522. package/stepper/step/step.component.d.ts +2 -1
  523. package/stepper/step/step.component.d.ts.map +1 -1
  524. package/stepper/step/step.component.js +26 -24
  525. package/stepper/step-label/step-label.component.d.ts +3 -3
  526. package/stepper/step-label/step-label.component.d.ts.map +1 -1
  527. package/stepper/step-label/step-label.component.js +15 -15
  528. package/stepper/stepper/stepper.component.js +72 -86
  529. package/table/table-wrapper/table-wrapper.component.js +17 -18
  530. package/table.css +0 -25
  531. package/tabs/tab-group/tab-group.component.js +77 -92
  532. package/tabs/tab-label/tab-label.component.js +12 -12
  533. package/tag/tag/tag.component.js +49 -55
  534. package/tag/tag-group/tag-group.component.js +37 -45
  535. package/teaser/teaser.component.d.ts +6 -10
  536. package/teaser/teaser.component.d.ts.map +1 -1
  537. package/teaser/teaser.component.js +45 -68
  538. package/teaser-product/common.js +1 -1
  539. package/teaser-product/teaser-product/teaser-product.component.js +1 -1
  540. package/teaser-product-common-C8oSkIxy.js +5 -0
  541. package/teaser-product.js +1 -1
  542. package/time-input/time-input.component.js +29 -33
  543. package/timetable-occupancy-icon/timetable-occupancy-icon.component.d.ts.map +1 -1
  544. package/timetable-occupancy-icon/timetable-occupancy-icon.component.js +22 -25
  545. package/title/title-base.d.ts +0 -8
  546. package/title/title-base.d.ts.map +1 -1
  547. package/title/title-base.js +34 -53
  548. package/title/title.component.d.ts +2 -0
  549. package/title/title.component.d.ts.map +1 -1
  550. package/title/title.component.js +9 -9
  551. package/toast/toast.component.d.ts.map +1 -1
  552. package/toast/toast.component.js +6 -9
  553. package/toggle/toggle/toggle.component.js +36 -40
  554. package/toggle/toggle-option/toggle-option.component.d.ts +1 -1
  555. package/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  556. package/toggle/toggle-option/toggle-option.component.js +44 -51
  557. package/train/train-formation/train-formation.component.js +41 -43
  558. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +0 -530
  559. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss +0 -1123
  560. package/datepicker/common/datepicker-association-controllers.d.ts +0 -21
  561. package/datepicker/common/datepicker-association-controllers.d.ts.map +0 -1
  562. package/datepicker/common/datepicker-association-controllers.js +0 -58
  563. package/development/datepicker/common/datepicker-association-controllers.d.ts +0 -21
  564. package/development/datepicker/common/datepicker-association-controllers.d.ts.map +0 -1
  565. package/development/datepicker/common/datepicker-association-controllers.js +0 -82
  566. package/icon-sidebar-button-common-DG8bnrBu.js +0 -7
  567. package/teaser-product-common-CpMAlYEp.js +0 -5
@@ -7,9 +7,9 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
7
7
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
8
  import { __runInitializers, __esDecorate } from "tslib";
9
9
  import { css, isServer, html, nothing } from "lit";
10
- import { customElement, property } from "lit/decorators.js";
10
+ import { property, customElement } from "lit/decorators.js";
11
11
  import { ref } from "lit/directives/ref.js";
12
- import { SbbFocusTrapController, IS_FOCUSABLE_QUERY, sbbInputModalityDetector } from "../../core/a11y.js";
12
+ import { SbbFocusTrapController, IS_FOCUSABLE_QUERY, sbbInputModalityDetector, isFakeMousedownFromScreenReader } from "../../core/a11y.js";
13
13
  import { SbbOpenCloseBaseElement } from "../../core/base-elements.js";
14
14
  import { SbbMediaQueryPointerCoarse, SbbEscapableOverlayController, SbbLanguageController } from "../../core/controllers.js";
15
15
  import { idReference, forceType } from "../../core/decorators.js";
@@ -183,90 +183,32 @@ const HORIZONTAL_OFFSET = 32;
183
183
  let nextId = 0;
184
184
  const popoversRef = /* @__PURE__ */ new Set();
185
185
  const pointerCoarse = isServer ? false : matchMedia(SbbMediaQueryPointerCoarse).matches;
186
- let SbbPopoverElement = (() => {
187
- var _trigger_accessor_storage, _hideCloseButton_accessor_storage, _hoverTrigger_accessor_storage, _openDelay_accessor_storage, _closeDelay_accessor_storage, _accessibilityCloseLabel_accessor_storage, _a;
188
- let _classDecorators = [customElement("sbb-popover")];
189
- let _classDescriptor;
190
- let _classExtraInitializers = [];
191
- let _classThis;
186
+ let SbbPopoverBaseElement = (() => {
187
+ var _trigger_accessor_storage, _a;
192
188
  let _classSuper = SbbHydrationMixin(SbbOpenCloseBaseElement);
193
189
  let _trigger_decorators;
194
190
  let _trigger_initializers = [];
195
191
  let _trigger_extraInitializers = [];
196
- let _hideCloseButton_decorators;
197
- let _hideCloseButton_initializers = [];
198
- let _hideCloseButton_extraInitializers = [];
199
- let _hoverTrigger_decorators;
200
- let _hoverTrigger_initializers = [];
201
- let _hoverTrigger_extraInitializers = [];
202
- let _openDelay_decorators;
203
- let _openDelay_initializers = [];
204
- let _openDelay_extraInitializers = [];
205
- let _closeDelay_decorators;
206
- let _closeDelay_initializers = [];
207
- let _closeDelay_extraInitializers = [];
208
- let _accessibilityCloseLabel_decorators;
209
- let _accessibilityCloseLabel_initializers = [];
210
- let _accessibilityCloseLabel_extraInitializers = [];
211
- var SbbPopoverElement2 = (_a = class extends _classSuper {
192
+ return _a = class extends _classSuper {
212
193
  constructor() {
213
194
  super(...arguments);
214
195
  __privateAdd(this, _trigger_accessor_storage);
215
- __privateAdd(this, _hideCloseButton_accessor_storage);
216
- __privateAdd(this, _hoverTrigger_accessor_storage);
217
- __privateAdd(this, _openDelay_accessor_storage);
218
- __privateAdd(this, _closeDelay_accessor_storage);
219
- __privateAdd(this, _accessibilityCloseLabel_accessor_storage);
220
196
  __privateSet(this, _trigger_accessor_storage, __runInitializers(this, _trigger_initializers, null));
221
- __privateSet(this, _hideCloseButton_accessor_storage, (__runInitializers(this, _trigger_extraInitializers), __runInitializers(this, _hideCloseButton_initializers, false)));
222
- __privateSet(this, _hoverTrigger_accessor_storage, (__runInitializers(this, _hideCloseButton_extraInitializers), __runInitializers(this, _hoverTrigger_initializers, false)));
223
- __privateSet(this, _openDelay_accessor_storage, (__runInitializers(this, _hoverTrigger_extraInitializers), __runInitializers(this, _openDelay_initializers, 0)));
224
- __privateSet(this, _closeDelay_accessor_storage, (__runInitializers(this, _openDelay_extraInitializers), __runInitializers(this, _closeDelay_initializers, 0)));
225
- __privateSet(this, _accessibilityCloseLabel_accessor_storage, (__runInitializers(this, _closeDelay_extraInitializers), __runInitializers(this, _accessibilityCloseLabel_initializers, "")));
226
- this.willClose = (__runInitializers(this, _accessibilityCloseLabel_extraInitializers), new EventEmitter(this, SbbPopoverElement2.events.willClose, { cancelable: true }));
227
- this.didClose = new EventEmitter(this, SbbPopoverElement2.events.didClose, { cancelable: true });
197
+ this.willClose = (__runInitializers(this, _trigger_extraInitializers), new EventEmitter(this, SbbOpenCloseBaseElement.events.willClose, { cancelable: true }));
198
+ this.didClose = new EventEmitter(this, SbbOpenCloseBaseElement.events.didClose, { cancelable: true });
228
199
  this._skipCloseFocus = false;
229
- this._hoverTrigger = false;
230
200
  this._escapableOverlayController = new SbbEscapableOverlayController(this);
231
201
  this._focusTrapController = new SbbFocusTrapController(this);
232
- this._language = new SbbLanguageController(this);
233
202
  this._pointerDownListener = (event) => {
234
- this._isPointerDownEventOnPopover = isEventOnElement(this._overlay, event);
203
+ this._isPointerDownEventOnPopover = isEventOnElement(this.overlay, event);
235
204
  };
236
205
  this._closeOnBackdropClick = (event) => {
237
- if (!this._isPointerDownEventOnPopover && !isEventOnElement(this._overlay, event)) {
206
+ if (!this._isPointerDownEventOnPopover && !isEventOnElement(this.overlay, event)) {
238
207
  this._nextFocusedElement = event.composedPath().filter((el) => el instanceof window.HTMLElement).find((el) => el.matches(IS_FOCUSABLE_QUERY));
239
- clearTimeout(this._closeTimeout);
208
+ clearTimeout(this.closeTimeout);
240
209
  this.close();
241
210
  }
242
211
  };
243
- this._onTriggerMouseEnter = () => {
244
- if (this.state === "closed" || this.state === "closing") {
245
- this._openTimeout = setTimeout(() => {
246
- sbbInputModalityDetector.reset();
247
- this.open();
248
- }, this.openDelay);
249
- } else {
250
- clearTimeout(this._closeTimeout);
251
- }
252
- };
253
- this._onTriggerMouseLeave = () => {
254
- if (this.state === "opened" || this.state === "opening") {
255
- this._closeTimeout = setTimeout(() => this.close(), this.closeDelay);
256
- } else {
257
- clearTimeout(this._openTimeout);
258
- }
259
- };
260
- this._onOverlayMouseEnter = () => {
261
- if (this.state !== "opening") {
262
- clearTimeout(this._closeTimeout);
263
- }
264
- };
265
- this._onOverlayMouseLeave = () => {
266
- if (this.state !== "opening") {
267
- this._closeTimeout = setTimeout(() => this.close(), this.closeDelay);
268
- }
269
- };
270
212
  }
271
213
  /**
272
214
  * The element that will trigger the popover overlay.
@@ -279,45 +221,9 @@ let SbbPopoverElement = (() => {
279
221
  set trigger(value) {
280
222
  __privateSet(this, _trigger_accessor_storage, value);
281
223
  }
282
- /** Whether the close button should be hidden. */
283
- get hideCloseButton() {
284
- return __privateGet(this, _hideCloseButton_accessor_storage);
285
- }
286
- set hideCloseButton(value) {
287
- __privateSet(this, _hideCloseButton_accessor_storage, value);
288
- }
289
- /** Whether the popover should be triggered on hover. */
290
- get hoverTrigger() {
291
- return __privateGet(this, _hoverTrigger_accessor_storage);
292
- }
293
- set hoverTrigger(value) {
294
- __privateSet(this, _hoverTrigger_accessor_storage, value);
295
- }
296
- /** Open the popover after a certain delay. */
297
- get openDelay() {
298
- return __privateGet(this, _openDelay_accessor_storage);
299
- }
300
- set openDelay(value) {
301
- __privateSet(this, _openDelay_accessor_storage, value);
302
- }
303
- /** Close the popover after a certain delay. */
304
- get closeDelay() {
305
- return __privateGet(this, _closeDelay_accessor_storage);
306
- }
307
- set closeDelay(value) {
308
- __privateSet(this, _closeDelay_accessor_storage, value);
309
- }
310
- /** This will be forwarded as aria-label to the close button element. */
311
- get accessibilityCloseLabel() {
312
- return __privateGet(this, _accessibilityCloseLabel_accessor_storage);
313
- }
314
- set accessibilityCloseLabel(value) {
315
- __privateSet(this, _accessibilityCloseLabel_accessor_storage, value);
316
- }
317
224
  /** Opens the popover on trigger click. */
318
225
  open() {
319
- var _a2, _b;
320
- if (this.state !== "closed" && this.state !== "closing" || !this._overlay || !this.willOpen.emit()) {
226
+ if (this.state !== "closed" && this.state !== "closing" || !this.overlay || !this.willOpen.emit()) {
321
227
  return;
322
228
  }
323
229
  for (const popover of popoversRef) {
@@ -326,11 +232,11 @@ let SbbPopoverElement = (() => {
326
232
  popover.close();
327
233
  }
328
234
  }
329
- (_a2 = this.showPopover) == null ? void 0 : _a2.call(this);
235
+ this.showPopover?.();
330
236
  this.state = "opening";
331
237
  this.inert = true;
332
238
  this._setPopoverPosition();
333
- (_b = this._triggerElement) == null ? void 0 : _b.setAttribute("aria-expanded", "true");
239
+ this._triggerElement?.setAttribute("aria-expanded", "true");
334
240
  this._nextFocusedElement = void 0;
335
241
  this._skipCloseFocus = false;
336
242
  if (this._isZeroAnimationDuration()) {
@@ -339,7 +245,6 @@ let SbbPopoverElement = (() => {
339
245
  }
340
246
  /** Closes the popover. */
341
247
  close(target) {
342
- var _a2;
343
248
  if (this.state !== "opened" && this.state !== "opening") {
344
249
  return;
345
250
  }
@@ -349,7 +254,7 @@ let SbbPopoverElement = (() => {
349
254
  }
350
255
  this.state = "closing";
351
256
  this.inert = true;
352
- (_a2 = this._triggerElement) == null ? void 0 : _a2.setAttribute("aria-expanded", "false");
257
+ this._triggerElement?.setAttribute("aria-expanded", "false");
353
258
  if (this._isZeroAnimationDuration()) {
354
259
  this._handleClosing();
355
260
  }
@@ -358,18 +263,17 @@ let SbbPopoverElement = (() => {
358
263
  return isZeroAnimationDuration(this, "--sbb-popover-animation-duration");
359
264
  }
360
265
  _handleClosing() {
361
- var _a2, _b, _c, _d;
362
266
  this.state = "closed";
363
- (_a2 = this.hidePopover) == null ? void 0 : _a2.call(this);
364
- (_c = (_b = this._overlay) == null ? void 0 : _b.firstElementChild) == null ? void 0 : _c.scrollTo(0, 0);
267
+ this.hidePopover?.();
268
+ this.overlay?.firstElementChild?.scrollTo(0, 0);
365
269
  this.removeAttribute("tabindex");
366
270
  if (!this._skipCloseFocus) {
367
271
  const elementToFocus = this._nextFocusedElement || this._triggerElement;
368
- elementToFocus == null ? void 0 : elementToFocus.focus();
272
+ elementToFocus?.focus();
369
273
  }
370
274
  this._escapableOverlayController.disconnect();
371
275
  this.didClose.emit({ closeTarget: this._popoverCloseElement });
372
- (_d = this._openStateController) == null ? void 0 : _d.abort();
276
+ this._openStateController?.abort();
373
277
  this._focusTrapController.enabled = false;
374
278
  }
375
279
  _handleOpening() {
@@ -384,7 +288,7 @@ let SbbPopoverElement = (() => {
384
288
  connectedCallback() {
385
289
  this.popover = "manual";
386
290
  super.connectedCallback();
387
- this.id || (this.id = `sbb-popover-${++nextId}`);
291
+ this.id ||= `sbb-popover-${++nextId}`;
388
292
  this.state = "closed";
389
293
  popoversRef.add(this);
390
294
  if (this.hasUpdated) {
@@ -400,56 +304,37 @@ let SbbPopoverElement = (() => {
400
304
  firstUpdated(changedProperties) {
401
305
  super.firstUpdated(changedProperties);
402
306
  this._configureTrigger();
403
- if (this._hoverTrigger) {
404
- this._overlay.addEventListener("mouseenter", () => this._onOverlayMouseEnter());
405
- this._overlay.addEventListener("mouseleave", () => this._onOverlayMouseLeave());
406
- }
407
307
  }
408
308
  disconnectedCallback() {
409
- var _a2, _b;
410
309
  super.disconnectedCallback();
411
310
  this._triggerElement = null;
412
- (_a2 = this._triggerAbortController) == null ? void 0 : _a2.abort();
413
- (_b = this._openStateController) == null ? void 0 : _b.abort();
311
+ this._triggerAbortController?.abort();
312
+ this._openStateController?.abort();
414
313
  popoversRef.delete(this);
415
314
  }
416
315
  // Check if the trigger is valid and attach click event listeners.
417
316
  _configureTrigger() {
418
- var _a2;
419
317
  if (isServer) {
420
318
  return;
421
319
  } else if (this.hydrationRequired) {
422
320
  this.hydrationComplete.then(() => this._configureTrigger());
423
321
  return;
424
322
  }
425
- const hoverTrigger = this.hoverTrigger && !pointerCoarse;
426
- if (this.trigger === this._triggerElement && hoverTrigger === this._hoverTrigger) {
427
- return;
428
- }
429
- (_a2 = this._triggerAbortController) == null ? void 0 : _a2.abort();
323
+ this.configureTrigger(this._triggerElement ?? null);
324
+ }
325
+ configureTrigger(_oldTrigger) {
326
+ this._triggerAbortController?.abort();
430
327
  removeAriaOverlayTriggerAttributes(this._triggerElement);
431
328
  this._triggerElement = this.trigger;
432
- this._hoverTrigger = hoverTrigger;
433
329
  if (!this._triggerElement) {
434
330
  return;
435
331
  }
436
332
  setAriaOverlayTriggerAttributes(this._triggerElement, "dialog", this.id, this.state);
437
- const { signal } = this._triggerAbortController = new AbortController();
438
- if (this._hoverTrigger) {
439
- this._triggerElement.addEventListener("mouseenter", this._onTriggerMouseEnter, { signal });
440
- this._triggerElement.addEventListener("mouseleave", this._onTriggerMouseLeave, { signal });
441
- this._triggerElement.addEventListener("keydown", (evt) => {
442
- if (evt.code === "Space" || evt.code === "Enter") {
443
- this.open();
444
- }
445
- }, { signal });
446
- } else {
447
- this._triggerElement.addEventListener("click", () => {
448
- if (this.state === "closed") {
449
- this.open();
450
- }
451
- }, { signal });
452
- }
333
+ this._triggerAbortController = new AbortController();
334
+ this.registerTriggerListeners(this._triggerAbortController.signal);
335
+ }
336
+ registerTriggerListeners(signal) {
337
+ this._triggerElement.addEventListener("click", () => this.open(), { signal });
453
338
  }
454
339
  _attachWindowEvents() {
455
340
  this._openStateController = new AbortController();
@@ -475,7 +360,7 @@ let SbbPopoverElement = (() => {
475
360
  _closeOnSbbPopoverCloseClick(event) {
476
361
  const closeElement = composedPathHasAttribute(event, "sbb-popover-close", this);
477
362
  if (closeElement && !closeElement.hasAttribute("disabled")) {
478
- clearTimeout(this._closeTimeout);
363
+ clearTimeout(this.closeTimeout);
479
364
  this.close(closeElement);
480
365
  }
481
366
  }
@@ -512,10 +397,10 @@ let SbbPopoverElement = (() => {
512
397
  }
513
398
  }
514
399
  _setPopoverPosition() {
515
- if (!this._overlay || !this._triggerElement) {
400
+ if (!this.overlay || !this._triggerElement) {
516
401
  return;
517
402
  }
518
- const popoverPosition = getElementPosition(this._overlay, this._triggerElement, this.shadowRoot.querySelector(".sbb-popover__container"), {
403
+ const popoverPosition = getElementPosition(this.overlay, this._triggerElement, this.shadowRoot.querySelector(".sbb-popover__container"), {
519
404
  verticalOffset: VERTICAL_OFFSET,
520
405
  horizontalOffset: HORIZONTAL_OFFSET,
521
406
  centered: true,
@@ -528,49 +413,205 @@ let SbbPopoverElement = (() => {
528
413
  this.style.setProperty("--sbb-popover-arrow-position-x", `${arrowXPosition}px`);
529
414
  }
530
415
  render() {
531
- const closeButton = html`
532
- <span class="sbb-popover__close">
533
- <sbb-secondary-button
534
- aria-label=${this.accessibilityCloseLabel || i18nClosePopover[this._language.current]}
535
- size="s"
536
- type="button"
537
- icon-name="cross-small"
538
- sbb-popover-close
539
- ></sbb-secondary-button>
540
- </span>
541
- `;
542
416
  return html`
543
417
  <div class="sbb-popover__container">
544
418
  <div
545
419
  @animationend=${this._onPopoverAnimationEnd}
546
420
  class="sbb-popover"
547
421
  role="tooltip"
548
- ${ref((el) => this._overlay = el)}
422
+ ${ref((el) => this.overlay = el)}
549
423
  >
550
424
  <div
551
425
  @click=${(event) => this._closeOnSbbPopoverCloseClick(event)}
552
426
  class="sbb-popover__content"
553
427
  >
554
- ${!this.hideCloseButton && !this._hoverTrigger ? closeButton : nothing}
555
- <span>
556
- <slot>No content</slot>
557
- </span>
428
+ ${this.renderContent()}
558
429
  </div>
559
430
  </div>
560
431
  </div>
561
432
  `;
562
433
  }
563
- }, _trigger_accessor_storage = new WeakMap(), _hideCloseButton_accessor_storage = new WeakMap(), _hoverTrigger_accessor_storage = new WeakMap(), _openDelay_accessor_storage = new WeakMap(), _closeDelay_accessor_storage = new WeakMap(), _accessibilityCloseLabel_accessor_storage = new WeakMap(), _classThis = _a, (() => {
434
+ }, _trigger_accessor_storage = new WeakMap(), (() => {
564
435
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
565
436
  _trigger_decorators = [idReference(), property()];
437
+ __esDecorate(_a, null, _trigger_decorators, { kind: "accessor", name: "trigger", static: false, private: false, access: { has: (obj) => "trigger" in obj, get: (obj) => obj.trigger, set: (obj, value) => {
438
+ obj.trigger = value;
439
+ } }, metadata: _metadata }, _trigger_initializers, _trigger_extraInitializers);
440
+ if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
441
+ })(), _a.styles = style, _a;
442
+ })();
443
+ let SbbPopoverElement = (() => {
444
+ var _hideCloseButton_accessor_storage, _hoverTrigger_accessor_storage, _openDelay_accessor_storage, _closeDelay_accessor_storage, _accessibilityCloseLabel_accessor_storage, _a;
445
+ let _classDecorators = [customElement("sbb-popover")];
446
+ let _classDescriptor;
447
+ let _classExtraInitializers = [];
448
+ let _classThis;
449
+ let _classSuper = SbbPopoverBaseElement;
450
+ let _hideCloseButton_decorators;
451
+ let _hideCloseButton_initializers = [];
452
+ let _hideCloseButton_extraInitializers = [];
453
+ let _hoverTrigger_decorators;
454
+ let _hoverTrigger_initializers = [];
455
+ let _hoverTrigger_extraInitializers = [];
456
+ let _openDelay_decorators;
457
+ let _openDelay_initializers = [];
458
+ let _openDelay_extraInitializers = [];
459
+ let _closeDelay_decorators;
460
+ let _closeDelay_initializers = [];
461
+ let _closeDelay_extraInitializers = [];
462
+ let _accessibilityCloseLabel_decorators;
463
+ let _accessibilityCloseLabel_initializers = [];
464
+ let _accessibilityCloseLabel_extraInitializers = [];
465
+ _a = class extends _classSuper {
466
+ constructor() {
467
+ super(...arguments);
468
+ __privateAdd(this, _hideCloseButton_accessor_storage);
469
+ __privateAdd(this, _hoverTrigger_accessor_storage);
470
+ __privateAdd(this, _openDelay_accessor_storage);
471
+ __privateAdd(this, _closeDelay_accessor_storage);
472
+ __privateAdd(this, _accessibilityCloseLabel_accessor_storage);
473
+ __privateSet(this, _hideCloseButton_accessor_storage, __runInitializers(this, _hideCloseButton_initializers, false));
474
+ __privateSet(this, _hoverTrigger_accessor_storage, (__runInitializers(this, _hideCloseButton_extraInitializers), __runInitializers(this, _hoverTrigger_initializers, false)));
475
+ __privateSet(this, _openDelay_accessor_storage, (__runInitializers(this, _hoverTrigger_extraInitializers), __runInitializers(this, _openDelay_initializers, 0)));
476
+ __privateSet(this, _closeDelay_accessor_storage, (__runInitializers(this, _openDelay_extraInitializers), __runInitializers(this, _closeDelay_initializers, 0)));
477
+ __privateSet(this, _accessibilityCloseLabel_accessor_storage, (__runInitializers(this, _closeDelay_extraInitializers), __runInitializers(this, _accessibilityCloseLabel_initializers, "")));
478
+ this._hoverTrigger = (__runInitializers(this, _accessibilityCloseLabel_extraInitializers), false);
479
+ this._language = new SbbLanguageController(this);
480
+ this._overlayAbortController = null;
481
+ this._onTriggerMouseEnter = () => {
482
+ if (this.state === "closed" || this.state === "closing") {
483
+ this._openTimeout = setTimeout(() => {
484
+ sbbInputModalityDetector.reset();
485
+ this.open();
486
+ }, this.openDelay);
487
+ } else {
488
+ clearTimeout(this.closeTimeout);
489
+ }
490
+ };
491
+ this._onTriggerMouseLeave = () => {
492
+ if (this.state === "opened" || this.state === "opening") {
493
+ this.closeTimeout = setTimeout(() => this.close(), this.closeDelay);
494
+ } else {
495
+ clearTimeout(this._openTimeout);
496
+ }
497
+ };
498
+ this._onOverlayMouseEnter = () => {
499
+ if (this.state !== "opening") {
500
+ clearTimeout(this.closeTimeout);
501
+ }
502
+ };
503
+ this._onOverlayMouseLeave = () => {
504
+ if (this.state !== "opening") {
505
+ this.closeTimeout = setTimeout(() => this.close(), this.closeDelay);
506
+ }
507
+ };
508
+ }
509
+ /** Whether the close button should be hidden. */
510
+ get hideCloseButton() {
511
+ return __privateGet(this, _hideCloseButton_accessor_storage);
512
+ }
513
+ set hideCloseButton(value) {
514
+ __privateSet(this, _hideCloseButton_accessor_storage, value);
515
+ }
516
+ /** Whether the popover should be triggered on hover. */
517
+ get hoverTrigger() {
518
+ return __privateGet(this, _hoverTrigger_accessor_storage);
519
+ }
520
+ set hoverTrigger(value) {
521
+ __privateSet(this, _hoverTrigger_accessor_storage, value);
522
+ }
523
+ /** Open the popover after a certain delay. */
524
+ get openDelay() {
525
+ return __privateGet(this, _openDelay_accessor_storage);
526
+ }
527
+ set openDelay(value) {
528
+ __privateSet(this, _openDelay_accessor_storage, value);
529
+ }
530
+ /** Close the popover after a certain delay. */
531
+ get closeDelay() {
532
+ return __privateGet(this, _closeDelay_accessor_storage);
533
+ }
534
+ set closeDelay(value) {
535
+ __privateSet(this, _closeDelay_accessor_storage, value);
536
+ }
537
+ /** This will be forwarded as aria-label to the close button element. */
538
+ get accessibilityCloseLabel() {
539
+ return __privateGet(this, _accessibilityCloseLabel_accessor_storage);
540
+ }
541
+ set accessibilityCloseLabel(value) {
542
+ __privateSet(this, _accessibilityCloseLabel_accessor_storage, value);
543
+ }
544
+ configureTrigger(oldTrigger) {
545
+ const hoverTrigger = this.hoverTrigger && !pointerCoarse;
546
+ if (this.trigger === oldTrigger && hoverTrigger === this._hoverTrigger) {
547
+ return;
548
+ }
549
+ if (this._hoverTrigger !== hoverTrigger) {
550
+ this._hoverTrigger = hoverTrigger;
551
+ this._registerOverlayListeners();
552
+ }
553
+ super.configureTrigger(oldTrigger);
554
+ }
555
+ _registerOverlayListeners() {
556
+ this._overlayAbortController?.abort();
557
+ if (this._hoverTrigger) {
558
+ this._overlayAbortController = new AbortController();
559
+ this.overlay?.addEventListener("mouseenter", () => this._onOverlayMouseEnter(), {
560
+ signal: this._overlayAbortController.signal
561
+ });
562
+ this.overlay?.addEventListener("mouseleave", () => this._onOverlayMouseLeave(), {
563
+ signal: this._overlayAbortController.signal
564
+ });
565
+ }
566
+ }
567
+ registerTriggerListeners(signal) {
568
+ if (this._hoverTrigger && this.trigger) {
569
+ this.trigger.addEventListener("mouseenter", this._onTriggerMouseEnter, { signal });
570
+ this.trigger.addEventListener("mouseleave", this._onTriggerMouseLeave, { signal });
571
+ this.trigger.addEventListener("keydown", (evt) => {
572
+ if (evt.code === "Space" || evt.code === "Enter") {
573
+ this.open();
574
+ }
575
+ }, { signal });
576
+ this.trigger.addEventListener("mousedown", (evt) => {
577
+ if (isFakeMousedownFromScreenReader(evt)) {
578
+ this.open();
579
+ }
580
+ }, { signal });
581
+ } else {
582
+ super.registerTriggerListeners(signal);
583
+ }
584
+ }
585
+ firstUpdated(changedProperties) {
586
+ super.firstUpdated(changedProperties);
587
+ this._registerOverlayListeners();
588
+ }
589
+ renderContent() {
590
+ const closeButton = html`
591
+ <span class="sbb-popover__close">
592
+ <sbb-secondary-button
593
+ aria-label=${this.accessibilityCloseLabel || i18nClosePopover[this._language.current]}
594
+ size="s"
595
+ type="button"
596
+ icon-name="cross-small"
597
+ sbb-popover-close
598
+ ></sbb-secondary-button>
599
+ </span>
600
+ `;
601
+ return html`
602
+ ${!this.hideCloseButton && !this._hoverTrigger ? closeButton : nothing}
603
+ <span>
604
+ <slot>No content</slot>
605
+ </span>
606
+ `;
607
+ }
608
+ }, _hideCloseButton_accessor_storage = new WeakMap(), _hoverTrigger_accessor_storage = new WeakMap(), _openDelay_accessor_storage = new WeakMap(), _closeDelay_accessor_storage = new WeakMap(), _accessibilityCloseLabel_accessor_storage = new WeakMap(), _classThis = _a, (() => {
609
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
566
610
  _hideCloseButton_decorators = [forceType(), property({ attribute: "hide-close-button", type: Boolean })];
567
611
  _hoverTrigger_decorators = [forceType(), property({ attribute: "hover-trigger", type: Boolean })];
568
612
  _openDelay_decorators = [forceType(), property({ attribute: "open-delay", type: Number })];
569
613
  _closeDelay_decorators = [forceType(), property({ attribute: "close-delay", type: Number })];
570
614
  _accessibilityCloseLabel_decorators = [forceType(), property({ attribute: "accessibility-close-label" })];
571
- __esDecorate(_a, null, _trigger_decorators, { kind: "accessor", name: "trigger", static: false, private: false, access: { has: (obj) => "trigger" in obj, get: (obj) => obj.trigger, set: (obj, value) => {
572
- obj.trigger = value;
573
- } }, metadata: _metadata }, _trigger_initializers, _trigger_extraInitializers);
574
615
  __esDecorate(_a, null, _hideCloseButton_decorators, { kind: "accessor", name: "hideCloseButton", static: false, private: false, access: { has: (obj) => "hideCloseButton" in obj, get: (obj) => obj.hideCloseButton, set: (obj, value) => {
575
616
  obj.hideCloseButton = value;
576
617
  } }, metadata: _metadata }, _hideCloseButton_initializers, _hideCloseButton_extraInitializers);
@@ -587,12 +628,14 @@ let SbbPopoverElement = (() => {
587
628
  obj.accessibilityCloseLabel = value;
588
629
  } }, metadata: _metadata }, _accessibilityCloseLabel_initializers, _accessibilityCloseLabel_extraInitializers);
589
630
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
590
- SbbPopoverElement2 = _classThis = _classDescriptor.value;
631
+ _classThis = _classDescriptor.value;
591
632
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
592
- })(), _a.styles = style, __runInitializers(_classThis, _classExtraInitializers), _a);
593
- return SbbPopoverElement2 = _classThis;
633
+ __runInitializers(_classThis, _classExtraInitializers);
634
+ })(), _a;
635
+ return _classThis;
594
636
  })();
595
637
  export {
638
+ SbbPopoverBaseElement,
596
639
  SbbPopoverElement
597
640
  };
598
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9wb3BvdmVyL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlEZWNsYXJhdGlvbiwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIGlzU2VydmVyLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcblxuaW1wb3J0IHtcbiAgSVNfRk9DVVNBQkxFX1FVRVJZLFxuICBTYmJGb2N1c1RyYXBDb250cm9sbGVyLFxuICBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IsXG59IGZyb20gJy4uLy4uL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS1lbGVtZW50cy5qcyc7XG5pbXBvcnQge1xuICBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcixcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBTYmJNZWRpYVF1ZXJ5UG9pbnRlckNvYXJzZSxcbn0gZnJvbSAnLi4vLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUsIGlkUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9kb20uanMnO1xuaW1wb3J0IHsgY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7IGkxOG5DbG9zZVBvcG92ZXIgfSBmcm9tICcuLi8uLi9jb3JlL2kxOG4uanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJPcGVuZWRDbG9zZWRTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvaW50ZXJmYWNlcy5qcyc7XG5pbXBvcnQgeyBTYmJIeWRyYXRpb25NaXhpbiB9IGZyb20gJy4uLy4uL2NvcmUvbWl4aW5zLmpzJztcbmltcG9ydCB7XG4gIGdldEVsZW1lbnRQb3NpdGlvbixcbiAgaXNFdmVudE9uRWxlbWVudCxcbiAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbiAgc2V0QXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbn0gZnJvbSAnLi4vLi4vY29yZS9vdmVybGF5LmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vcG9wb3Zlci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uLy4uL2J1dHRvbi9zZWNvbmRhcnktYnV0dG9uLmpzJztcblxuY29uc3QgVkVSVElDQUxfT0ZGU0VUID0gMTY7XG5jb25zdCBIT1JJWk9OVEFMX09GRlNFVCA9IDMyO1xuXG5sZXQgbmV4dElkID0gMDtcblxuY29uc3QgcG9wb3ZlcnNSZWYgPSBuZXcgU2V0PFNiYlBvcG92ZXJFbGVtZW50PigpO1xuY29uc3QgcG9pbnRlckNvYXJzZSA9IGlzU2VydmVyID8gZmFsc2UgOiBtYXRjaE1lZGlhKFNiYk1lZGlhUXVlcnlQb2ludGVyQ29hcnNlKS5tYXRjaGVzO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gd2l0aGluIGEgcG9wb3Zlci5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBjb250ZW50IGludG8gdGhlIHBvcG92ZXIuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSB3aWxsT3BlbiAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXBvcG92ZXJgIHN0YXJ0cyB0aGUgb3BlbmluZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRPcGVuIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItcG9wb3ZlcmAgaXMgb3BlbmVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx7IGNsb3NlVGFyZ2V0OiBIVE1MRWxlbWVudCB9Pn0gd2lsbENsb3NlIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItcG9wb3ZlcmAgYmVnaW5zIHRoZSBjbG9zaW5nXG4gKiB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHsgY2xvc2VUYXJnZXQ6IEhUTUxFbGVtZW50IH0+fSBkaWRDbG9zZSAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXBvcG92ZXJgIGlzIGNsb3NlZC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1wb3BvdmVyLXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqL1xuZXhwb3J0XG5AY3VzdG9tRWxlbWVudCgnc2JiLXBvcG92ZXInKVxuY2xhc3MgU2JiUG9wb3ZlckVsZW1lbnQgZXh0ZW5kcyBTYmJIeWRyYXRpb25NaXhpbihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHBvcG92ZXIgb3ZlcmxheS5cbiAgICpcbiAgICogRm9yIGF0dHJpYnV0ZSB1c2FnZSwgcHJvdmlkZSBhbiBpZCByZWZlcmVuY2UuXG4gICAqL1xuICBAaWRSZWZlcmVuY2UoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvKiogV2hldGhlciB0aGUgY2xvc2UgYnV0dG9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoaWRlLWNsb3NlLWJ1dHRvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhpZGVDbG9zZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBiZSB0cmlnZ2VyZWQgb24gaG92ZXIuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdob3Zlci10cmlnZ2VyJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaG92ZXJUcmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIE9wZW4gdGhlIHBvcG92ZXIgYWZ0ZXIgYSBjZXJ0YWluIGRlbGF5LiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnb3Blbi1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3Igb3BlbkRlbGF5OiBudW1iZXIgPSAwO1xuXG4gIC8qKiBDbG9zZSB0aGUgcG9wb3ZlciBhZnRlciBhIGNlcnRhaW4gZGVsYXkuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdjbG9zZS1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgY2xvc2VEZWxheTogbnVtYmVyID0gMDtcblxuICAvKiogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCBhcyBhcmlhLWxhYmVsIHRvIHRoZSBjbG9zZSBidXR0b24gZWxlbWVudC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FjY2Vzc2liaWxpdHktY2xvc2UtbGFiZWwnIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhY2Nlc3NpYmlsaXR5Q2xvc2VMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXBvcG92ZXJgIGJlZ2lucyB0aGUgY2xvc2luZyB0cmFuc2l0aW9uLiAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbENsb3NlOiBFdmVudEVtaXR0ZXI8eyBjbG9zZVRhcmdldD86IEhUTUxFbGVtZW50IH0+ID0gbmV3IEV2ZW50RW1pdHRlcihcbiAgICB0aGlzLFxuICAgIFNiYlBvcG92ZXJFbGVtZW50LmV2ZW50cy53aWxsQ2xvc2UsXG4gICAgeyBjYW5jZWxhYmxlOiB0cnVlIH0sXG4gICk7XG5cbiAgLyoqIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXBvcG92ZXJgIGlzIGNsb3NlZC4gKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRpZENsb3NlOiBFdmVudEVtaXR0ZXI8eyBjbG9zZVRhcmdldD86IEhUTUxFbGVtZW50IH0+ID0gbmV3IEV2ZW50RW1pdHRlcihcbiAgICB0aGlzLFxuICAgIFNiYlBvcG92ZXJFbGVtZW50LmV2ZW50cy5kaWRDbG9zZSxcbiAgICB7IGNhbmNlbGFibGU6IHRydWUgfSxcbiAgKTtcblxuICBwcml2YXRlIF9vdmVybGF5ITogSFRNTERpdkVsZW1lbnQ7XG4gIC8vIFRoZSBlbGVtZW50IHdoaWNoIHNob3VsZCByZWNlaXZlIGZvY3VzIGFmdGVyIGNsb3NpbmcgYmFzZWQgb24gd2hlcmUgaW4gdGhlIGJhY2tkcm9wIHRoZSB1c2VyIGNsaWNrcy5cbiAgcHJpdmF0ZSBfbmV4dEZvY3VzZWRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3NraXBDbG9zZUZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3BvcG92ZXJDbG9zZUVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25Qb3BvdmVyPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaG92ZXJUcmlnZ2VyID0gZmFsc2U7XG4gIHByaXZhdGUgX3RyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIF90cmlnZ2VyQWJvcnRDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9vcGVuU3RhdGVDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfZm9jdXNUcmFwQ29udHJvbGxlciA9IG5ldyBTYmJGb2N1c1RyYXBDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9vcGVuVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIF9jbG9zZVRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuXG4gIC8qKiBPcGVucyB0aGUgcG9wb3ZlciBvbiB0cmlnZ2VyIGNsaWNrLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAodGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgJiYgdGhpcy5zdGF0ZSAhPT0gJ2Nsb3NpbmcnKSB8fFxuICAgICAgIXRoaXMuX292ZXJsYXkgfHxcbiAgICAgICF0aGlzLndpbGxPcGVuLmVtaXQoKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBvdGhlciBwb3BvdmVyc1xuICAgIGZvciAoY29uc3QgcG9wb3ZlciBvZiBwb3BvdmVyc1JlZikge1xuICAgICAgY29uc3Qgc3RhdGUgPSBwb3BvdmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScpIGFzIFNiYk9wZW5lZENsb3NlZFN0YXRlO1xuICAgICAgaWYgKHN0YXRlICYmIChzdGF0ZSA9PT0gJ29wZW5lZCcgfHwgc3RhdGUgPT09ICdvcGVuaW5nJykpIHtcbiAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2hvd1BvcG92ZXI/LigpO1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5pbmVydCA9IHRydWU7XG4gICAgdGhpcy5fc2V0UG9wb3ZlclBvc2l0aW9uKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgdGhpcy5fbmV4dEZvY3VzZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NraXBDbG9zZUZvY3VzID0gZmFsc2U7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZXMgdGhlIHBvcG92ZXIuICovXG4gIHB1YmxpYyBjbG9zZSh0YXJnZXQ/OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmVkJyAmJiB0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BvdmVyQ2xvc2VFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghdGhpcy53aWxsQ2xvc2UuZW1pdCh7IGNsb3NlVGFyZ2V0OiB0YXJnZXQgfSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMuaW5lcnQgPSB0cnVlO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi1wb3BvdmVyLWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgdGhpcy5oaWRlUG9wb3Zlcj8uKCk7XG5cbiAgICB0aGlzLl9vdmVybGF5Py5maXJzdEVsZW1lbnRDaGlsZD8uc2Nyb2xsVG8oMCwgMCk7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBDbG9zZUZvY3VzKSB7XG4gICAgICBjb25zdCBlbGVtZW50VG9Gb2N1cyA9IHRoaXMuX25leHRGb2N1c2VkRWxlbWVudCB8fCB0aGlzLl90cmlnZ2VyRWxlbWVudDtcblxuICAgICAgLy8gVG8gZW5hYmxlIGZvY3VzaW5nIG90aGVyIGVsZW1lbnQgdGhhbiB0aGUgdHJpZ2dlciwgd2UgbmVlZCB0byBjYWxsIGZvY3VzKCkgYSBzZWNvbmQgdGltZS5cbiAgICAgIGVsZW1lbnRUb0ZvY3VzPy5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmRpZENsb3NlLmVtaXQoeyBjbG9zZVRhcmdldDogdGhpcy5fcG9wb3ZlckNsb3NlRWxlbWVudCB9KTtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX2ZvY3VzVHJhcENvbnRyb2xsZXIuZW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3BlbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG4gICAgdGhpcy5pbmVydCA9IGZhbHNlO1xuICAgIHRoaXMuX2F0dGFjaFdpbmRvd0V2ZW50cygpO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmNvbm5lY3QoKTtcbiAgICB0aGlzLl9zZXRQb3BvdmVyRm9jdXMoKTtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlkT3Blbi5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlkIHx8PSBgc2JiLXBvcG92ZXItJHsrK25leHRJZH1gO1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICBwb3BvdmVyc1JlZi5hZGQodGhpcyBhcyBTYmJQb3BvdmVyRWxlbWVudCk7XG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAoIW5hbWUgfHwgbmFtZSA9PT0gJ3RyaWdnZXInIHx8IG5hbWUgPT09ICdob3ZlclRyaWdnZXInKSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuXG4gICAgaWYgKHRoaXMuX2hvdmVyVHJpZ2dlcikge1xuICAgICAgdGhpcy5fb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5fb25PdmVybGF5TW91c2VFbnRlcigpKTtcbiAgICAgIHRoaXMuX292ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHRoaXMuX29uT3ZlcmxheU1vdXNlTGVhdmUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICBwb3BvdmVyc1JlZi5kZWxldGUodGhpcyBhcyBTYmJQb3BvdmVyRWxlbWVudCk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgdHJpZ2dlciBpcyB2YWxpZCBhbmQgYXR0YWNoIGNsaWNrIGV2ZW50IGxpc3RlbmVycy5cbiAgcHJpdmF0ZSBfY29uZmlndXJlVHJpZ2dlcigpOiB2b2lkIHtcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0aW9uQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLl9jb25maWd1cmVUcmlnZ2VyKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHRyaWdnZXIgY2FuIGJlIGhvdmVyZWQuIFNvbWUgZGV2aWNlcyBtaWdodCBpbnRlcnByZXQgdGhlIG1lZGlhIHF1ZXJ5IChob3ZlcjogaG92ZXIpIGRpZmZlcmVudGx5LFxuICAgIC8vIGFuZCBub3QgcmVzcGVjdCB0aGUgZmFsbGJhY2sgbWVjaGFuaXNtIG9uIHRoZSBjbGljay4gVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlzIHByZWZlcnJlZCB0byBpZGVudGlmeVxuICAgIC8vIGFsbCBub24tdG91Y2hzY3JlZW4gZGV2aWNlcy5cbiAgICBjb25zdCBob3ZlclRyaWdnZXIgPSB0aGlzLmhvdmVyVHJpZ2dlciAmJiAhcG9pbnRlckNvYXJzZTtcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSB0aGlzLl90cmlnZ2VyRWxlbWVudCAmJiBob3ZlclRyaWdnZXIgPT09IHRoaXMuX2hvdmVyVHJpZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyh0aGlzLl90cmlnZ2VyRWxlbWVudCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQgPSB0aGlzLnRyaWdnZXI7XG4gICAgdGhpcy5faG92ZXJUcmlnZ2VyID0gaG92ZXJUcmlnZ2VyO1xuXG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQsICdkaWFsb2cnLCB0aGlzLmlkLCB0aGlzLnN0YXRlKTtcblxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSAodGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKSk7XG4gICAgaWYgKHRoaXMuX2hvdmVyVHJpZ2dlcikge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuX29uVHJpZ2dlck1vdXNlRW50ZXIsIHsgc2lnbmFsIH0pO1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuX29uVHJpZ2dlck1vdXNlTGVhdmUsIHsgc2lnbmFsIH0pO1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2tleWRvd24nLFxuICAgICAgICAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2dC5jb2RlID09PSAnU3BhY2UnIHx8IGV2dC5jb2RlID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgc2lnbmFsIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnY2xpY2snLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgc2lnbmFsIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaFdpbmRvd0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldFBvcG92ZXJQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRQb3BvdmVyUG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgLy8gQ2xvc2UgcG9wb3ZlciBvbiBiYWNrZHJvcCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIsIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xvc2UgdGhlIHBvcG92ZXIgb24gY2xpY2sgb2YgYW55IGVsZW1lbnQgdGhhdCBoYXMgdGhlICdzYmItcG9wb3Zlci1jbG9zZScgYXR0cmlidXRlLlxuICBwcml2YXRlIF9jbG9zZU9uU2JiUG9wb3ZlckNsb3NlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2xvc2VFbGVtZW50ID0gY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlKGV2ZW50LCAnc2JiLXBvcG92ZXItY2xvc2UnLCB0aGlzKTtcblxuICAgIGlmIChjbG9zZUVsZW1lbnQgJiYgIWNsb3NlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICAgICAgdGhpcy5jbG9zZShjbG9zZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBwb2ludGVyZG93biBldmVudCB0YXJnZXQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBwb3BvdmVyLlxuICBwcml2YXRlIF9wb2ludGVyRG93bkxpc3RlbmVyID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICB0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPblBvcG92ZXIgPSBpc0V2ZW50T25FbGVtZW50KHRoaXMuX292ZXJsYXksIGV2ZW50KTtcbiAgfTtcblxuICAvLyBDbG9zZSBwb3BvdmVyIG9uIGJhY2tkcm9wIGNsaWNrLlxuICBwcml2YXRlIF9jbG9zZU9uQmFja2Ryb3BDbGljayA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPblBvcG92ZXIgJiYgIWlzRXZlbnRPbkVsZW1lbnQodGhpcy5fb3ZlcmxheSwgZXZlbnQpKSB7XG4gICAgICB0aGlzLl9uZXh0Rm9jdXNlZEVsZW1lbnQgPSBldmVudFxuICAgICAgICAuY29tcG9zZWRQYXRoKClcbiAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KVxuICAgICAgICAuZmluZCgoZWwpID0+IChlbCBhcyBIVE1MRWxlbWVudCkubWF0Y2hlcyhJU19GT0NVU0FCTEVfUVVFUlkpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vblRyaWdnZXJNb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2VkJyB8fCB0aGlzLnN0YXRlID09PSAnY2xvc2luZycpIHtcbiAgICAgIHRoaXMuX29wZW5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGlzIGZvY3VzZWQgYnkga2V5Ym9hcmQgYW5kIGhvdmVyZWQgd2l0aCB0aGUgbW91c2UsIHRoZSBvdXRsaW5lIHdvdWxkIGJlIHZpc2libGUuXG4gICAgICAgIC8vIFNvIHdlIHJlc2V0IHRoZSBpbnB1dCBtb2RhbGl0eSB0byBoaWRlIHRoZSBvdXRsaW5lLlxuICAgICAgICBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IucmVzZXQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICB9LCB0aGlzLm9wZW5EZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vblRyaWdnZXJNb3VzZUxlYXZlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnb3BlbmVkJyB8fCB0aGlzLnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2Nsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLmNsb3NlRGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vbk92ZXJsYXlNb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vbk92ZXJsYXlNb3VzZUxlYXZlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2Nsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLmNsb3NlRGVsYXkpO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgcG9wb3ZlciBwb3NpdGlvbiAoeCwgeSkgdG8gJzAnIG9uY2UgdGhlIHBvcG92ZXIgaXMgY2xvc2VkIGFuZCB0aGUgdHJhbnNpdGlvbiBlbmRlZCB0byBwcmV2ZW50IHRoZVxuICAvLyB2aWV3cG9ydCBmcm9tIG92ZXJmbG93aW5nLiBBbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgb25jZSB0aGUgcG9wb3ZlciBpcyBvcGVuLlxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uUG9wb3ZlckFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJyAmJiB0aGlzLnN0YXRlID09PSAnY2xvc2luZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgZm9jdXMgb24gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50LlxuICBwcml2YXRlIF9zZXRQb3BvdmVyRm9jdXMoKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuX2ZvY3VzVHJhcENvbnRyb2xsZXIuZm9jdXNJbml0aWFsRWxlbWVudCgpO1xuXG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAvLyBXaGVuIGEgYmx1ciBvY2N1cnMsIHdlIGtub3cgdGhhdCB0aGUgcG9wb3ZlciBoYXMgdG8gYmUgY2xvc2VkLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW50ZXJhY3RpdmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3BvdmVyLlxuICAgICAgLy8gV2hlbiBhIHdpbmRvdy90YWIgY2hhbmdlIG9jY3VycywgYSBibHVyIGV2ZW50IGlzIGFsc28gZmlyZWQuIEhvd2V2ZXIsIHdoZW4gdGhlIGN1cnJlbnQgd2luZG93L3RhYlxuICAgICAgLy8gYmVjb21lcyBhY3RpdmUgYWdhaW4sIGl0IGZvY3VzZXMgb25jZSBhZ2FpbiB0aGUgcG9wb3Zlci5cbiAgICAgIC8vIFRoZXJlZm9yZSwgd2UgY2Fubm90IGxpc3RlbiB0byB0aGUgYmx1ciBldmVudCBvbmx5IG9uY2UuXG4gICAgICAvLyBUbyBwcmV2ZW50IGFjY2lkZW50YWxseSBjbG9zaW5nIHRoZSBwb3BvdmVyLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgd2luZG93L3RhYiBzdGF0ZS5cbiAgICAgIC8vIFdlIGNhbiBhY2hpZXZlIHRoaXMgYnkgdXNpbmcgdmlzaWJpbGl0eVN0YXRlLCB3aGljaCBvbmx5IHdvcmtzIHdpdGggc2V0VGltZW91dCgpLlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnYmx1cicsXG4gICAgICAgICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2tpcENsb3NlRm9jdXMgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFBvcG92ZXJQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX292ZXJsYXkgfHwgIXRoaXMuX3RyaWdnZXJFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9wb3ZlclBvc2l0aW9uID0gZ2V0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgdGhpcy5fb3ZlcmxheSxcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLXBvcG92ZXJfX2NvbnRhaW5lcicpISxcbiAgICAgIHtcbiAgICAgICAgdmVydGljYWxPZmZzZXQ6IFZFUlRJQ0FMX09GRlNFVCxcbiAgICAgICAgaG9yaXpvbnRhbE9mZnNldDogSE9SSVpPTlRBTF9PRkZTRVQsXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICByZXNwb25zaXZlSGVpZ2h0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLXBvc2l0aW9uJywgcG9wb3ZlclBvc2l0aW9uLmFsaWdubWVudC52ZXJ0aWNhbCk7XG5cbiAgICBjb25zdCBhcnJvd1hQb3NpdGlvbiA9XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cbiAgICAgIHBvcG92ZXJQb3NpdGlvbi5sZWZ0ICtcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmNsaWVudFdpZHRoIC8gMiAtXG4gICAgICA4OyAvLyBoYWxmIHRoZSBzaXplIG9mIHRoZSBwb3BvdmVyIGFycm93XG5cbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1wb3BvdmVyLXBvc2l0aW9uLXgnLCBgJHtwb3BvdmVyUG9zaXRpb24ubGVmdH1weGApO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2JiLXBvcG92ZXItcG9zaXRpb24teScsIGAke3BvcG92ZXJQb3NpdGlvbi50b3B9cHhgKTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1wb3BvdmVyLWFycm93LXBvc2l0aW9uLXgnLCBgJHthcnJvd1hQb3NpdGlvbn1weGApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2xvc2VCdXR0b24gPSBodG1sYFxuICAgICAgPHNwYW4gY2xhc3M9XCJzYmItcG9wb3Zlcl9fY2xvc2VcIj5cbiAgICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgICAgYXJpYS1sYWJlbD0ke3RoaXMuYWNjZXNzaWJpbGl0eUNsb3NlTGFiZWwgfHwgaTE4bkNsb3NlUG9wb3Zlclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgaWNvbi1uYW1lPVwiY3Jvc3Mtc21hbGxcIlxuICAgICAgICAgIHNiYi1wb3BvdmVyLWNsb3NlXG4gICAgICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIGA7XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItcG9wb3Zlcl9fY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25Qb3BvdmVyQW5pbWF0aW9uRW5kfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXBvcG92ZXJcIlxuICAgICAgICAgIHJvbGU9XCJ0b29sdGlwXCJcbiAgICAgICAgICAke3JlZigoZWw/OiBFbGVtZW50KSA9PiAodGhpcy5fb3ZlcmxheSA9IGVsIGFzIEhUTUxEaXZFbGVtZW50KSl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBAY2xpY2s9JHsoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLl9jbG9zZU9uU2JiUG9wb3ZlckNsb3NlQ2xpY2soZXZlbnQpfVxuICAgICAgICAgICAgY2xhc3M9XCJzYmItcG9wb3Zlcl9fY29udGVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgJHshdGhpcy5oaWRlQ2xvc2VCdXR0b24gJiYgIXRoaXMuX2hvdmVyVHJpZ2dlciA/IGNsb3NlQnV0dG9uIDogbm90aGluZ31cbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICA8c2xvdD5ObyBjb250ZW50PC9zbG90PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1wb3BvdmVyJzogU2JiUG9wb3ZlckVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTYmJQb3BvdmVyRWxlbWVudCIsIl9hIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0EsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxvQkFBb0I7QUFFMUIsSUFBSSxTQUFTO0FBRWIsTUFBTSxrQ0FBa0I7QUFDeEIsTUFBTSxnQkFBZ0IsV0FBVyxRQUFRLFdBQVcsMEJBQTBCLEVBQUU7SUFpQjFFLHFCQUFpQixNQUFBOzswQkFEdEIsY0FBYyxhQUFhLENBQUM7Ozs7b0JBQ0csa0JBQWtCLHVCQUF1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFqREEsTUFBQUEsc0JBQUEsbUJBQVEsWUFBMEM7QUFBQTs7QUFVeEU7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBekJnQix5QkFBQSwyQkFBQSxrQkFBQSxN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
641
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9wb3BvdmVyL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlEZWNsYXJhdGlvbiwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIGlzU2VydmVyLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcblxuaW1wb3J0IHtcbiAgSVNfRk9DVVNBQkxFX1FVRVJZLFxuICBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyLFxuICBTYmJGb2N1c1RyYXBDb250cm9sbGVyLFxuICBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IsXG59IGZyb20gJy4uLy4uL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS1lbGVtZW50cy5qcyc7XG5pbXBvcnQge1xuICBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcixcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBTYmJNZWRpYVF1ZXJ5UG9pbnRlckNvYXJzZSxcbn0gZnJvbSAnLi4vLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUsIGlkUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9kb20uanMnO1xuaW1wb3J0IHsgY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7IGkxOG5DbG9zZVBvcG92ZXIgfSBmcm9tICcuLi8uLi9jb3JlL2kxOG4uanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJPcGVuZWRDbG9zZWRTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvaW50ZXJmYWNlcy5qcyc7XG5pbXBvcnQgeyBTYmJIeWRyYXRpb25NaXhpbiB9IGZyb20gJy4uLy4uL2NvcmUvbWl4aW5zLmpzJztcbmltcG9ydCB7XG4gIGdldEVsZW1lbnRQb3NpdGlvbixcbiAgaXNFdmVudE9uRWxlbWVudCxcbiAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbiAgc2V0QXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbn0gZnJvbSAnLi4vLi4vY29yZS9vdmVybGF5LmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vcG9wb3Zlci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uLy4uL2J1dHRvbi9zZWNvbmRhcnktYnV0dG9uLmpzJztcblxuY29uc3QgVkVSVElDQUxfT0ZGU0VUID0gMTY7XG5jb25zdCBIT1JJWk9OVEFMX09GRlNFVCA9IDMyO1xuXG5sZXQgbmV4dElkID0gMDtcblxuY29uc3QgcG9wb3ZlcnNSZWYgPSBuZXcgU2V0PFNiYlBvcG92ZXJCYXNlRWxlbWVudD4oKTtcbmNvbnN0IHBvaW50ZXJDb2Fyc2UgPSBpc1NlcnZlciA/IGZhbHNlIDogbWF0Y2hNZWRpYShTYmJNZWRpYVF1ZXJ5UG9pbnRlckNvYXJzZSkubWF0Y2hlcztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNiYlBvcG92ZXJCYXNlRWxlbWVudCBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluKFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50KSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgcG9wb3ZlciBvdmVybGF5LlxuICAgKlxuICAgKiBGb3IgYXR0cmlidXRlIHVzYWdlLCBwcm92aWRlIGFuIGlkIHJlZmVyZW5jZS5cbiAgICovXG4gIEBpZFJlZmVyZW5jZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciB0cmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1wb3BvdmVyYCBiZWdpbnMgdGhlIGNsb3NpbmcgdHJhbnNpdGlvbi4gKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxDbG9zZTogRXZlbnRFbWl0dGVyPHsgY2xvc2VUYXJnZXQ/OiBIVE1MRWxlbWVudCB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudC5ldmVudHMud2lsbENsb3NlLFxuICAgIHsgY2FuY2VsYWJsZTogdHJ1ZSB9LFxuICApO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1wb3BvdmVyYCBpcyBjbG9zZWQuICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkaWRDbG9zZTogRXZlbnRFbWl0dGVyPHsgY2xvc2VUYXJnZXQ/OiBIVE1MRWxlbWVudCB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudC5ldmVudHMuZGlkQ2xvc2UsXG4gICAgeyBjYW5jZWxhYmxlOiB0cnVlIH0sXG4gICk7XG5cbiAgLy8gVGhlIGVsZW1lbnQgd2hpY2ggc2hvdWxkIHJlY2VpdmUgZm9jdXMgYWZ0ZXIgY2xvc2luZyBiYXNlZCBvbiB3aGVyZSBpbiB0aGUgYmFja2Ryb3AgdGhlIHVzZXIgY2xpY2tzLlxuICBwcml2YXRlIF9uZXh0Rm9jdXNlZEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfc2tpcENsb3NlRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcG9wb3ZlckNsb3NlRWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9pc1BvaW50ZXJEb3duRXZlbnRPblBvcG92ZXI/OiBib29sZWFuO1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudD86IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckFib3J0Q29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfb3BlblN0YXRlQ29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIgPSBuZXcgU2JiRXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2ZvY3VzVHJhcENvbnRyb2xsZXIgPSBuZXcgU2JiRm9jdXNUcmFwQ29udHJvbGxlcih0aGlzKTtcbiAgcHJvdGVjdGVkIGNsb3NlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcm90ZWN0ZWQgb3ZlcmxheT86IEhUTUxEaXZFbGVtZW50O1xuXG4gIC8qKiBPcGVucyB0aGUgcG9wb3ZlciBvbiB0cmlnZ2VyIGNsaWNrLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAodGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgJiYgdGhpcy5zdGF0ZSAhPT0gJ2Nsb3NpbmcnKSB8fFxuICAgICAgIXRoaXMub3ZlcmxheSB8fFxuICAgICAgIXRoaXMud2lsbE9wZW4uZW1pdCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIG90aGVyIHBvcG92ZXJzXG4gICAgZm9yIChjb25zdCBwb3BvdmVyIG9mIHBvcG92ZXJzUmVmKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHBvcG92ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXN0YXRlJykgYXMgU2JiT3BlbmVkQ2xvc2VkU3RhdGU7XG4gICAgICBpZiAoc3RhdGUgJiYgKHN0YXRlID09PSAnb3BlbmVkJyB8fCBzdGF0ZSA9PT0gJ29wZW5pbmcnKSkge1xuICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLmluZXJ0ID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRQb3BvdmVyUG9zaXRpb24oKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB0aGlzLl9uZXh0Rm9jdXNlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2tpcENsb3NlRm9jdXMgPSBmYWxzZTtcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBvcGVuZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgcG9wb3Zlci4gKi9cbiAgcHVibGljIGNsb3NlKHRhcmdldD86IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICdvcGVuZWQnICYmIHRoaXMuc3RhdGUgIT09ICdvcGVuaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BvcG92ZXJDbG9zZUVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgaWYgKCF0aGlzLndpbGxDbG9zZS5lbWl0KHsgY2xvc2VUYXJnZXQ6IHRhcmdldCB9KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy5pbmVydCA9IHRydWU7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLXBvcG92ZXItYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDbG9zaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLmhpZGVQb3BvdmVyPy4oKTtcblxuICAgIHRoaXMub3ZlcmxheT8uZmlyc3RFbGVtZW50Q2hpbGQ/LnNjcm9sbFRvKDAsIDApO1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuXG4gICAgaWYgKCF0aGlzLl9za2lwQ2xvc2VGb2N1cykge1xuICAgICAgY29uc3QgZWxlbWVudFRvRm9jdXMgPSB0aGlzLl9uZXh0Rm9jdXNlZEVsZW1lbnQgfHwgdGhpcy5fdHJpZ2dlckVsZW1lbnQ7XG5cbiAgICAgIC8vIFRvIGVuYWJsZSBmb2N1c2luZyBvdGhlciBlbGVtZW50IHRoYW4gdGhlIHRyaWdnZXIsIHdlIG5lZWQgdG8gY2FsbCBmb2N1cygpIGEgc2Vjb25kIHRpbWUuXG4gICAgICBlbGVtZW50VG9Gb2N1cz8uZm9jdXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kaWRDbG9zZS5lbWl0KHsgY2xvc2VUYXJnZXQ6IHRoaXMuX3BvcG92ZXJDbG9zZUVsZW1lbnQgfSk7XG4gICAgdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuaW5lcnQgPSBmYWxzZTtcbiAgICB0aGlzLl9hdHRhY2hXaW5kb3dFdmVudHMoKTtcbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5jb25uZWN0KCk7XG4gICAgdGhpcy5fc2V0UG9wb3ZlckZvY3VzKCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRpZE9wZW4uZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMucG9wb3ZlciA9ICdtYW51YWwnO1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5pZCB8fD0gYHNiYi1wb3BvdmVyLSR7KytuZXh0SWR9YDtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgcG9wb3ZlcnNSZWYuYWRkKHRoaXMpO1xuICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICApOiB2b2lkIHtcbiAgICBzdXBlci5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcblxuICAgIC8vIENoZWNraW5nIGZvciBob3ZlclRyaWdnZXIgaXMgYSBzcGVjaWFsIGNhc2UsIGFzIG9ubHkgdGhlIFNiYlBvcG92ZXJFbGVtZW50XG4gICAgLy8gc3ViY2xhc3MgaGFzIHRoaXMgcHJvcGVydHkuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAoIW5hbWUgfHwgbmFtZSA9PT0gJ3RyaWdnZXInIHx8IG5hbWUgPT09ICdob3ZlclRyaWdnZXInKSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICBwb3BvdmVyc1JlZi5kZWxldGUodGhpcyk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgdHJpZ2dlciBpcyB2YWxpZCBhbmQgYXR0YWNoIGNsaWNrIGV2ZW50IGxpc3RlbmVycy5cbiAgcHJpdmF0ZSBfY29uZmlndXJlVHJpZ2dlcigpOiB2b2lkIHtcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0aW9uQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLl9jb25maWd1cmVUcmlnZ2VyKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlndXJlVHJpZ2dlcih0aGlzLl90cmlnZ2VyRWxlbWVudCA/PyBudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmlnZ2VyKF9vbGRUcmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHJlbW92ZUFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gdGhpcy50cmlnZ2VyO1xuXG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQsICdkaWFsb2cnLCB0aGlzLmlkLCB0aGlzLnN0YXRlKTtcblxuICAgIHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5yZWdpc3RlclRyaWdnZXJMaXN0ZW5lcnModGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyVHJpZ2dlckxpc3RlbmVycyhzaWduYWw6IEFib3J0U2lnbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuKCksIHsgc2lnbmFsIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoV2luZG93RXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4gdGhpcy5fc2V0UG9wb3ZlclBvc2l0aW9uKCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5TdGF0ZUNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgLy8gV2l0aG91dCBjYXB0dXJlLCBvdGhlciBzY3JvbGwgY29udGV4dHMgd291bGQgbm90IGJ1YmJsZSB0byB0aGlzIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgLy8gQ2FwdHVyZSBhbGxvd3MgdXMgdG8gcmVhY3QgdG8gYWxsIHNjcm9sbCBjb250ZXh0cyBpbiB0aGlzIERPTS5cbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3NldFBvcG92ZXJQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICAvLyBDbG9zZSBwb3BvdmVyIG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fcG9pbnRlckRvd25MaXN0ZW5lciwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5fY2xvc2VPbkJhY2tkcm9wQ2xpY2ssIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICAvLyBDbG9zZSB0aGUgcG9wb3ZlciBvbiBjbGljayBvZiBhbnkgZWxlbWVudCB0aGF0IGhhcyB0aGUgJ3NiYi1wb3BvdmVyLWNsb3NlJyBhdHRyaWJ1dGUuXG4gIHByaXZhdGUgX2Nsb3NlT25TYmJQb3BvdmVyQ2xvc2VDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjbG9zZUVsZW1lbnQgPSBjb21wb3NlZFBhdGhIYXNBdHRyaWJ1dGUoZXZlbnQsICdzYmItcG9wb3Zlci1jbG9zZScsIHRoaXMpO1xuXG4gICAgaWYgKGNsb3NlRWxlbWVudCAmJiAhY2xvc2VFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICAgIHRoaXMuY2xvc2UoY2xvc2VFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcG9pbnRlcmRvd24gZXZlbnQgdGFyZ2V0IGlzIHRyaWdnZXJlZCBvbiB0aGUgcG9wb3Zlci5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25MaXN0ZW5lciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25Qb3BvdmVyID0gaXNFdmVudE9uRWxlbWVudCh0aGlzLm92ZXJsYXkhLCBldmVudCk7XG4gIH07XG5cbiAgLy8gQ2xvc2UgcG9wb3ZlciBvbiBiYWNrZHJvcCBjbGljay5cbiAgcHJpdmF0ZSBfY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25Qb3BvdmVyICYmICFpc0V2ZW50T25FbGVtZW50KHRoaXMub3ZlcmxheSEsIGV2ZW50KSkge1xuICAgICAgdGhpcy5fbmV4dEZvY3VzZWRFbGVtZW50ID0gZXZlbnRcbiAgICAgICAgLmNvbXBvc2VkUGF0aCgpXG4gICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudClcbiAgICAgICAgLmZpbmQoKGVsKSA9PiAoZWwgYXMgSFRNTEVsZW1lbnQpLm1hdGNoZXMoSVNfRk9DVVNBQkxFX1FVRVJZKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVRpbWVvdXQpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgcG9wb3ZlciBwb3NpdGlvbiAoeCwgeSkgdG8gJzAnIG9uY2UgdGhlIHBvcG92ZXIgaXMgY2xvc2VkIGFuZCB0aGUgdHJhbnNpdGlvbiBlbmRlZCB0byBwcmV2ZW50IHRoZVxuICAvLyB2aWV3cG9ydCBmcm9tIG92ZXJmbG93aW5nLiBBbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgb25jZSB0aGUgcG9wb3ZlciBpcyBvcGVuLlxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uUG9wb3ZlckFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJyAmJiB0aGlzLnN0YXRlID09PSAnY2xvc2luZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgZm9jdXMgb24gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50LlxuICBwcml2YXRlIF9zZXRQb3BvdmVyRm9jdXMoKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuX2ZvY3VzVHJhcENvbnRyb2xsZXIuZm9jdXNJbml0aWFsRWxlbWVudCgpO1xuXG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAvLyBXaGVuIGEgYmx1ciBvY2N1cnMsIHdlIGtub3cgdGhhdCB0aGUgcG9wb3ZlciBoYXMgdG8gYmUgY2xvc2VkLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW50ZXJhY3RpdmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3BvdmVyLlxuICAgICAgLy8gV2hlbiBhIHdpbmRvdy90YWIgY2hhbmdlIG9jY3VycywgYSBibHVyIGV2ZW50IGlzIGFsc28gZmlyZWQuIEhvd2V2ZXIsIHdoZW4gdGhlIGN1cnJlbnQgd2luZG93L3RhYlxuICAgICAgLy8gYmVjb21lcyBhY3RpdmUgYWdhaW4sIGl0IGZvY3VzZXMgb25jZSBhZ2FpbiB0aGUgcG9wb3Zlci5cbiAgICAgIC8vIFRoZXJlZm9yZSwgd2UgY2Fubm90IGxpc3RlbiB0byB0aGUgYmx1ciBldmVudCBvbmx5IG9uY2UuXG4gICAgICAvLyBUbyBwcmV2ZW50IGFjY2lkZW50YWxseSBjbG9zaW5nIHRoZSBwb3BvdmVyLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgd2luZG93L3RhYiBzdGF0ZS5cbiAgICAgIC8vIFdlIGNhbiBhY2hpZXZlIHRoaXMgYnkgdXNpbmcgdmlzaWJpbGl0eVN0YXRlLCB3aGljaCBvbmx5IHdvcmtzIHdpdGggc2V0VGltZW91dCgpLlxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnYmx1cicsXG4gICAgICAgICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2tpcENsb3NlRm9jdXMgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNpZ25hbDogdGhpcy5fb3BlblN0YXRlQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFBvcG92ZXJQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheSB8fCAhdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3BvdmVyUG9zaXRpb24gPSBnZXRFbGVtZW50UG9zaXRpb24oXG4gICAgICB0aGlzLm92ZXJsYXksXG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCxcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1wb3BvdmVyX19jb250YWluZXInKSEsXG4gICAgICB7XG4gICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBWRVJUSUNBTF9PRkZTRVQsXG4gICAgICAgIGhvcml6b250YWxPZmZzZXQ6IEhPUklaT05UQUxfT0ZGU0VULFxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2l2ZUhlaWdodDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wb3NpdGlvbicsIHBvcG92ZXJQb3NpdGlvbi5hbGlnbm1lbnQudmVydGljYWwpO1xuXG4gICAgY29uc3QgYXJyb3dYUG9zaXRpb24gPVxuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG4gICAgICBwb3BvdmVyUG9zaXRpb24ubGVmdCArXG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5jbGllbnRXaWR0aCAvIDIgLVxuICAgICAgODsgLy8gaGFsZiB0aGUgc2l6ZSBvZiB0aGUgcG9wb3ZlciBhcnJvd1xuXG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zYmItcG9wb3Zlci1wb3NpdGlvbi14JywgYCR7cG9wb3ZlclBvc2l0aW9uLmxlZnR9cHhgKTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1wb3BvdmVyLXBvc2l0aW9uLXknLCBgJHtwb3BvdmVyUG9zaXRpb24udG9wfXB4YCk7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zYmItcG9wb3Zlci1hcnJvdy1wb3NpdGlvbi14JywgYCR7YXJyb3dYUG9zaXRpb259cHhgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZW5kZXJDb250ZW50KCk6IFRlbXBsYXRlUmVzdWx0O1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1wb3BvdmVyX19jb250YWluZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIEBhbmltYXRpb25lbmQ9JHt0aGlzLl9vblBvcG92ZXJBbmltYXRpb25FbmR9XG4gICAgICAgICAgY2xhc3M9XCJzYmItcG9wb3ZlclwiXG4gICAgICAgICAgcm9sZT1cInRvb2x0aXBcIlxuICAgICAgICAgICR7cmVmKChlbD86IEVsZW1lbnQpID0+ICh0aGlzLm92ZXJsYXkgPSBlbCBhcyBIVE1MRGl2RWxlbWVudCkpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgQGNsaWNrPSR7KGV2ZW50OiBFdmVudCkgPT4gdGhpcy5fY2xvc2VPblNiYlBvcG92ZXJDbG9zZUNsaWNrKGV2ZW50KX1cbiAgICAgICAgICAgIGNsYXNzPVwic2JiLXBvcG92ZXJfX2NvbnRlbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7dGhpcy5yZW5kZXJDb250ZW50KCl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gd2l0aGluIGEgcG9wb3Zlci5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBjb250ZW50IGludG8gdGhlIHBvcG92ZXIuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSB3aWxsT3BlbiAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXBvcG92ZXJgIHN0YXJ0cyB0aGUgb3BlbmluZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRPcGVuIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItcG9wb3ZlcmAgaXMgb3BlbmVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx7IGNsb3NlVGFyZ2V0OiBIVE1MRWxlbWVudCB9Pn0gd2lsbENsb3NlIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItcG9wb3ZlcmAgYmVnaW5zIHRoZSBjbG9zaW5nXG4gKiB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHsgY2xvc2VUYXJnZXQ6IEhUTUxFbGVtZW50IH0+fSBkaWRDbG9zZSAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXBvcG92ZXJgIGlzIGNsb3NlZC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1wb3BvdmVyLXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqL1xuZXhwb3J0XG5AY3VzdG9tRWxlbWVudCgnc2JiLXBvcG92ZXInKVxuY2xhc3MgU2JiUG9wb3ZlckVsZW1lbnQgZXh0ZW5kcyBTYmJQb3BvdmVyQmFzZUVsZW1lbnQge1xuICAvKiogV2hldGhlciB0aGUgY2xvc2UgYnV0dG9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoaWRlLWNsb3NlLWJ1dHRvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhpZGVDbG9zZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBiZSB0cmlnZ2VyZWQgb24gaG92ZXIuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdob3Zlci10cmlnZ2VyJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaG92ZXJUcmlnZ2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIE9wZW4gdGhlIHBvcG92ZXIgYWZ0ZXIgYSBjZXJ0YWluIGRlbGF5LiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnb3Blbi1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3Igb3BlbkRlbGF5OiBudW1iZXIgPSAwO1xuXG4gIC8qKiBDbG9zZSB0aGUgcG9wb3ZlciBhZnRlciBhIGNlcnRhaW4gZGVsYXkuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdjbG9zZS1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgY2xvc2VEZWxheTogbnVtYmVyID0gMDtcblxuICAvKiogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCBhcyBhcmlhLWxhYmVsIHRvIHRoZSBjbG9zZSBidXR0b24gZWxlbWVudC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FjY2Vzc2liaWxpdHktY2xvc2UtbGFiZWwnIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhY2Nlc3NpYmlsaXR5Q2xvc2VMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfaG92ZXJUcmlnZ2VyID0gZmFsc2U7XG4gIHByaXZhdGUgX29wZW5UaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfb3ZlcmxheUFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNvbmZpZ3VyZVRyaWdnZXIob2xkVHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgdHJpZ2dlciBjYW4gYmUgaG92ZXJlZC4gU29tZSBkZXZpY2VzIG1pZ2h0IGludGVycHJldCB0aGUgbWVkaWEgcXVlcnkgKGhvdmVyOiBob3ZlcikgZGlmZmVyZW50bHksXG4gICAgLy8gYW5kIG5vdCByZXNwZWN0IHRoZSBmYWxsYmFjayBtZWNoYW5pc20gb24gdGhlIGNsaWNrLiBUaGVyZWZvcmUsIHRoZSBmb2xsb3dpbmcgaXMgcHJlZmVycmVkIHRvIGlkZW50aWZ5XG4gICAgLy8gYWxsIG5vbi10b3VjaHNjcmVlbiBkZXZpY2VzLlxuICAgIGNvbnN0IGhvdmVyVHJpZ2dlciA9IHRoaXMuaG92ZXJUcmlnZ2VyICYmICFwb2ludGVyQ29hcnNlO1xuXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gb2xkVHJpZ2dlciAmJiBob3ZlclRyaWdnZXIgPT09IHRoaXMuX2hvdmVyVHJpZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ob3ZlclRyaWdnZXIgIT09IGhvdmVyVHJpZ2dlcikge1xuICAgICAgdGhpcy5faG92ZXJUcmlnZ2VyID0gaG92ZXJUcmlnZ2VyO1xuICAgICAgdGhpcy5fcmVnaXN0ZXJPdmVybGF5TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgc3VwZXIuY29uZmlndXJlVHJpZ2dlcihvbGRUcmlnZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyT3ZlcmxheUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLl9vdmVybGF5QWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuXG4gICAgaWYgKHRoaXMuX2hvdmVyVHJpZ2dlcikge1xuICAgICAgdGhpcy5fb3ZlcmxheUFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHRoaXMub3ZlcmxheT8uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHRoaXMuX29uT3ZlcmxheU1vdXNlRW50ZXIoKSwge1xuICAgICAgICBzaWduYWw6IHRoaXMuX292ZXJsYXlBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLl9vbk92ZXJsYXlNb3VzZUxlYXZlKCksIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLl9vdmVybGF5QWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZWdpc3RlclRyaWdnZXJMaXN0ZW5lcnMoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ob3ZlclRyaWdnZXIgJiYgdGhpcy50cmlnZ2VyKSB7XG4gICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuX29uVHJpZ2dlck1vdXNlRW50ZXIsIHsgc2lnbmFsIH0pO1xuICAgICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLl9vblRyaWdnZXJNb3VzZUxlYXZlLCB7IHNpZ25hbCB9KTtcbiAgICAgIHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAna2V5ZG93bicsXG4gICAgICAgIChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZ0LmNvZGUgPT09ICdTcGFjZScgfHwgZXZ0LmNvZGUgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyBzaWduYWwgfSxcbiAgICAgICk7XG4gICAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ21vdXNlZG93bicsXG4gICAgICAgIChldnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgY2hlY2ssIE5WREEgY2FuJ3Qgb3BlbiB0aGUgcG9wb3ZlciBvbiBrZXlib2FyZCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICBpZiAoaXNGYWtlTW91c2Vkb3duRnJvbVNjcmVlblJlYWRlcihldnQpKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgc2lnbmFsIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5yZWdpc3RlclRyaWdnZXJMaXN0ZW5lcnMoc2lnbmFsKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICB0aGlzLl9yZWdpc3Rlck92ZXJsYXlMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVHJpZ2dlck1vdXNlRW50ZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5fb3BlblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gSWYgdGhlIHRyaWdnZXIgaXMgZm9jdXNlZCBieSBrZXlib2FyZCBhbmQgaG92ZXJlZCB3aXRoIHRoZSBtb3VzZSwgdGhlIG91dGxpbmUgd291bGQgYmUgdmlzaWJsZS5cbiAgICAgICAgLy8gU28gd2UgcmVzZXQgdGhlIGlucHV0IG1vZGFsaXR5IHRvIGhpZGUgdGhlIG91dGxpbmUuXG4gICAgICAgIHNiYklucHV0TW9kYWxpdHlEZXRlY3Rvci5yZXNldCgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0sIHRoaXMub3BlbkRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfb25UcmlnZ2VyTW91c2VMZWF2ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLmNsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLmNsb3NlRGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9vbk92ZXJsYXlNb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSAnb3BlbmluZycpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX29uT3ZlcmxheU1vdXNlTGVhdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5jbG9zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2xvc2UoKSwgdGhpcy5jbG9zZURlbGF5KTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlckNvbnRlbnQoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gaHRtbGBcbiAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXBvcG92ZXJfX2Nsb3NlXCI+XG4gICAgICAgIDxzYmItc2Vjb25kYXJ5LWJ1dHRvblxuICAgICAgICAgIGFyaWEtbGFiZWw9JHt0aGlzLmFjY2Vzc2liaWxpdHlDbG9zZUxhYmVsIHx8IGkxOG5DbG9zZVBvcG92ZXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19XG4gICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGljb24tbmFtZT1cImNyb3NzLXNtYWxsXCJcbiAgICAgICAgICBzYmItcG9wb3Zlci1jbG9zZVxuICAgICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICAkeyF0aGlzLmhpZGVDbG9zZUJ1dHRvbiAmJiAhdGhpcy5faG92ZXJUcmlnZ2VyID8gY2xvc2VCdXR0b24gOiBub3RoaW5nfVxuICAgICAgPHNwYW4+XG4gICAgICAgIDxzbG90Pk5vIGNvbnRlbnQ8L3Nsb3Q+XG4gICAgICA8L3NwYW4+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXBvcG92ZXInOiBTYmJQb3BvdmVyRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtDQSxNQUFNLGtCQUFrQjtBQUN4QixNQUFNLG9CQUFvQjtBQUUxQixJQUFJLFNBQVM7QUFFYixNQUFNLGtDQUFrQixJQUFBO0FBQ3hCLE1BQU0sZ0JBQWdCLFdBQVcsUUFBUSxXQUFXLDBCQUEwQixFQUFFO0lBRTFELHlCQUFxQixNQUFBOztvQkFBUyxrQkFBa0IsdUJBQXVCOzs7O0FBQXZFLFNBQUEsbUJBQThCLFlBQTBDO0FBQUE7O0FBVTVGO0FBQWdCLHlCQUFBLDJCQUFBLGtCQUFBLE1BQUEsdUJBQThCLElBQUk7QUFHL0IsV0FBQSxrRUFBeUQsSUFBSSxhQUM5RSxNQUNBLHdCQUF3QixPQUFPLFdBQy9CLEVBQUUsWUFBWSxNQUFNO0FBSUgsV0FBQSxXQUF3RCxJQUFJLGFBQzdFLE1BQ0Esd0JBQXdCLE9BQU8sVUFDL0IsRUFBRSxZQUFZLE1BQU07QUFLZCxXQUFBLGtCQUEyQjtBQU0zQixXQUFBLDhCQUE4QixJQUFJLDhCQUE4QixJQUFJ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