@sbb-esta/lyne-elements 1.16.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. package/accordion/accordion.d.ts +4 -1
  2. package/accordion/accordion.d.ts.map +1 -1
  3. package/accordion.js +31 -22
  4. package/action-group/action-group.d.ts +6 -4
  5. package/action-group/action-group.d.ts.map +1 -1
  6. package/action-group.js +20 -17
  7. package/alert/alert/alert.d.ts +7 -23
  8. package/alert/alert/alert.d.ts.map +1 -1
  9. package/alert/alert-group/alert-group.d.ts +0 -4
  10. package/alert/alert-group/alert-group.d.ts.map +1 -1
  11. package/alert/alert-group.js +46 -47
  12. package/alert/alert.js +74 -132
  13. package/animation.css +4 -8
  14. package/autocomplete/autocomplete-base-element.d.ts +7 -6
  15. package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  16. package/autocomplete/autocomplete.d.ts +0 -1
  17. package/autocomplete/autocomplete.d.ts.map +1 -1
  18. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts +0 -1
  19. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  20. package/autocomplete-grid/autocomplete-grid-button.js +11 -11
  21. package/autocomplete-grid/autocomplete-grid.js +0 -3
  22. package/autocomplete.js +68 -67
  23. package/button/accent-button/accent-button.d.ts +19 -0
  24. package/button/accent-button/accent-button.d.ts.map +1 -0
  25. package/button/accent-button-link/accent-button-link.d.ts +19 -0
  26. package/button/accent-button-link/accent-button-link.d.ts.map +1 -0
  27. package/button/accent-button-link.d.ts +2 -0
  28. package/button/accent-button-link.d.ts.map +1 -0
  29. package/button/accent-button-link.js +17 -0
  30. package/button/accent-button-static/accent-button-static.d.ts +19 -0
  31. package/button/accent-button-static/accent-button-static.d.ts.map +1 -0
  32. package/button/accent-button-static.d.ts +2 -0
  33. package/button/accent-button-static.d.ts.map +1 -0
  34. package/button/accent-button-static.js +17 -0
  35. package/button/accent-button.d.ts +2 -0
  36. package/button/accent-button.d.ts.map +1 -0
  37. package/button/accent-button.js +17 -0
  38. package/button/common/button-common.d.ts.map +1 -1
  39. package/button/common.d.ts.map +1 -1
  40. package/button/common.js +20 -16
  41. package/button/mini-button/mini-button.d.ts +4 -3
  42. package/button/mini-button/mini-button.d.ts.map +1 -1
  43. package/button/mini-button-group/mini-button-group.d.ts +4 -1
  44. package/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  45. package/button/mini-button-group.js +12 -8
  46. package/button/mini-button.d.ts +0 -1
  47. package/button/mini-button.d.ts.map +1 -1
  48. package/button/mini-button.js +10 -20
  49. package/button.d.ts +3 -3
  50. package/button.d.ts.map +1 -1
  51. package/button.js +3 -3
  52. package/calendar.js +25 -25
  53. package/card/card/card.d.ts +4 -1
  54. package/card/card/card.d.ts.map +1 -1
  55. package/card/card.js +10 -6
  56. package/checkbox/checkbox/checkbox.d.ts +4 -6
  57. package/checkbox/checkbox/checkbox.d.ts.map +1 -1
  58. package/checkbox/checkbox-group/checkbox-group.d.ts +4 -1
  59. package/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  60. package/checkbox/checkbox-group.js +14 -10
  61. package/checkbox/checkbox-panel/checkbox-panel.d.ts +4 -4
  62. package/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  63. package/checkbox/checkbox-panel.js +21 -18
  64. package/checkbox/checkbox.js +28 -26
  65. package/{chip/chip.d.ts → chip-label/chip-label.d.ts} +4 -4
  66. package/chip-label/chip-label.d.ts.map +1 -0
  67. package/chip-label.d.ts +2 -0
  68. package/chip-label.d.ts.map +1 -0
  69. package/chip-label.js +54 -0
  70. package/clock.js +1 -1
  71. package/container/container.js +21 -21
  72. package/container/sticky-bar/sticky-bar.d.ts +1 -0
  73. package/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  74. package/container/sticky-bar.js +20 -12
  75. package/core/base-elements/button-base-element.d.ts +27 -18
  76. package/core/base-elements/button-base-element.d.ts.map +1 -1
  77. package/core/base-elements/open-close-base-element.d.ts.map +1 -1
  78. package/core/base-elements.js +135 -138
  79. package/core/datetime/date-adapter.d.ts +2 -1
  80. package/core/datetime/date-adapter.d.ts.map +1 -1
  81. package/core/datetime/native-date-adapter.d.ts +1 -1
  82. package/core/datetime/native-date-adapter.d.ts.map +1 -1
  83. package/core/datetime.js +29 -28
  84. package/core/dom/animation.d.ts +2 -0
  85. package/core/dom/animation.d.ts.map +1 -0
  86. package/core/dom/lean-context.d.ts +5 -0
  87. package/core/dom/lean-context.d.ts.map +1 -0
  88. package/core/dom.d.ts +2 -2
  89. package/core/dom.d.ts.map +1 -1
  90. package/core/dom.js +50 -55
  91. package/core/eventing/form-element-handlers.d.ts +0 -7
  92. package/core/eventing/form-element-handlers.d.ts.map +1 -1
  93. package/core/eventing.d.ts +0 -1
  94. package/core/eventing.d.ts.map +1 -1
  95. package/core/eventing.js +28 -49
  96. package/core/i18n/i18n.d.ts +4 -2
  97. package/core/i18n/i18n.d.ts.map +1 -1
  98. package/core/i18n.js +147 -140
  99. package/core/mixins/disabled-mixin.d.ts +2 -7
  100. package/core/mixins/disabled-mixin.d.ts.map +1 -1
  101. package/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  102. package/core/mixins/form-associated-radio-button-mixin.d.ts +35 -0
  103. package/core/mixins/form-associated-radio-button-mixin.d.ts.map +1 -0
  104. package/core/mixins.d.ts +1 -0
  105. package/core/mixins.d.ts.map +1 -1
  106. package/core/mixins.js +347 -220
  107. package/core/styles/_index.scss +1 -0
  108. package/core/styles/core.scss +150 -0
  109. package/core/styles/image.scss +66 -0
  110. package/core/styles/mixins/animation.scss +2 -4
  111. package/core/styles/mixins/buttons.scss +7 -4
  112. package/core/styles/mixins/card.scss +1 -1
  113. package/core/styles/mixins/chip.scss +35 -35
  114. package/core/styles/mixins/image.scss +34 -0
  115. package/core/styles/mixins/overlay.scss +1 -1
  116. package/core/styles/mixins/panel.scss +1 -1
  117. package/core/styles/standard-theme.scss +1 -0
  118. package/core/styles/table.scss +4 -0
  119. package/core/testing/event-spy.d.ts +2 -1
  120. package/core/testing/event-spy.d.ts.map +1 -1
  121. package/core/testing.d.ts +0 -1
  122. package/core/testing.d.ts.map +1 -1
  123. package/core/testing.js +48 -57
  124. package/core.css +113 -0
  125. package/custom-elements.json +25946 -21671
  126. package/datepicker/common/datepicker-button.d.ts +3 -5
  127. package/datepicker/common/datepicker-button.d.ts.map +1 -1
  128. package/datepicker/common.js +30 -29
  129. package/datepicker/datepicker/datepicker.d.ts +25 -72
  130. package/datepicker/datepicker/datepicker.d.ts.map +1 -1
  131. package/datepicker/datepicker-next-day/datepicker-next-day.d.ts +1 -3
  132. package/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  133. package/datepicker/datepicker-next-day.js +10 -12
  134. package/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts +1 -3
  135. package/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  136. package/datepicker/datepicker-previous-day.js +11 -13
  137. package/datepicker/datepicker.js +129 -157
  138. package/development/accordion/accordion.d.ts +4 -1
  139. package/development/accordion/accordion.d.ts.map +1 -1
  140. package/development/accordion.js +16 -5
  141. package/development/action-group/action-group.d.ts +6 -4
  142. package/development/action-group/action-group.d.ts.map +1 -1
  143. package/development/action-group.js +10 -7
  144. package/development/alert/alert/alert.d.ts +7 -23
  145. package/development/alert/alert/alert.d.ts.map +1 -1
  146. package/development/alert/alert-group/alert-group.d.ts +0 -4
  147. package/development/alert/alert-group/alert-group.d.ts.map +1 -1
  148. package/development/alert/alert-group.js +10 -12
  149. package/development/alert/alert.js +38 -122
  150. package/development/autocomplete/autocomplete-base-element.d.ts +7 -6
  151. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  152. package/development/autocomplete/autocomplete.d.ts +0 -1
  153. package/development/autocomplete/autocomplete.d.ts.map +1 -1
  154. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts +0 -1
  155. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  156. package/development/autocomplete-grid/autocomplete-grid-button.js +6 -6
  157. package/development/autocomplete-grid/autocomplete-grid.js +1 -7
  158. package/development/autocomplete.js +23 -19
  159. package/development/button/accent-button/accent-button.d.ts +19 -0
  160. package/development/button/accent-button/accent-button.d.ts.map +1 -0
  161. package/development/button/accent-button-link/accent-button-link.d.ts +19 -0
  162. package/development/button/accent-button-link/accent-button-link.d.ts.map +1 -0
  163. package/development/button/accent-button-link.d.ts +2 -0
  164. package/development/button/accent-button-link.d.ts.map +1 -0
  165. package/development/button/accent-button-link.js +25 -0
  166. package/development/button/accent-button-static/accent-button-static.d.ts +19 -0
  167. package/development/button/accent-button-static/accent-button-static.d.ts.map +1 -0
  168. package/development/button/accent-button-static.d.ts +2 -0
  169. package/development/button/accent-button-static.d.ts.map +1 -0
  170. package/development/button/accent-button-static.js +25 -0
  171. package/development/button/accent-button.d.ts +2 -0
  172. package/development/button/accent-button.d.ts.map +1 -0
  173. package/development/button/accent-button.js +25 -0
  174. package/development/button/common/button-common.d.ts.map +1 -1
  175. package/development/button/common.d.ts.map +1 -1
  176. package/development/button/common.js +20 -16
  177. package/development/button/mini-button/mini-button.d.ts +4 -3
  178. package/development/button/mini-button/mini-button.d.ts.map +1 -1
  179. package/development/button/mini-button-group/mini-button-group.d.ts +4 -1
  180. package/development/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  181. package/development/button/mini-button-group.js +7 -3
  182. package/development/button/mini-button.d.ts +0 -1
  183. package/development/button/mini-button.d.ts.map +1 -1
  184. package/development/button/mini-button.js +14 -32
  185. package/development/button.d.ts +3 -3
  186. package/development/button.d.ts.map +1 -1
  187. package/development/button.js +3 -3
  188. package/development/calendar.js +1 -1
  189. package/development/card/card/card.d.ts +4 -1
  190. package/development/card/card/card.d.ts.map +1 -1
  191. package/development/card/card.js +8 -4
  192. package/development/checkbox/checkbox/checkbox.d.ts +4 -6
  193. package/development/checkbox/checkbox/checkbox.d.ts.map +1 -1
  194. package/development/checkbox/checkbox-group/checkbox-group.d.ts +4 -1
  195. package/development/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  196. package/development/checkbox/checkbox-group.js +7 -3
  197. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts +4 -4
  198. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  199. package/development/checkbox/checkbox-panel.js +7 -4
  200. package/development/checkbox/checkbox.js +8 -6
  201. package/development/{chip/chip.d.ts → chip-label/chip-label.d.ts} +4 -4
  202. package/development/chip-label/chip-label.d.ts.map +1 -0
  203. package/development/chip-label.d.ts +2 -0
  204. package/development/chip-label.d.ts.map +1 -0
  205. package/development/{chip.js → chip-label.js} +26 -26
  206. package/development/clock.js +1 -1
  207. package/development/container/container.js +8 -12
  208. package/development/container/sticky-bar/sticky-bar.d.ts +1 -0
  209. package/development/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  210. package/development/container/sticky-bar.js +18 -10
  211. package/development/core/base-elements/button-base-element.d.ts +27 -18
  212. package/development/core/base-elements/button-base-element.d.ts.map +1 -1
  213. package/development/core/base-elements/open-close-base-element.d.ts.map +1 -1
  214. package/development/core/base-elements.js +66 -74
  215. package/development/core/datetime/date-adapter.d.ts +2 -1
  216. package/development/core/datetime/date-adapter.d.ts.map +1 -1
  217. package/development/core/datetime/native-date-adapter.d.ts +1 -1
  218. package/development/core/datetime/native-date-adapter.d.ts.map +1 -1
  219. package/development/core/datetime.js +4 -3
  220. package/development/core/dom/animation.d.ts +2 -0
  221. package/development/core/dom/animation.d.ts.map +1 -0
  222. package/development/core/dom/lean-context.d.ts +5 -0
  223. package/development/core/dom/lean-context.d.ts.map +1 -0
  224. package/development/core/dom.d.ts +2 -2
  225. package/development/core/dom.d.ts.map +1 -1
  226. package/development/core/dom.js +13 -21
  227. package/development/core/eventing/form-element-handlers.d.ts +0 -7
  228. package/development/core/eventing/form-element-handlers.d.ts.map +1 -1
  229. package/development/core/eventing.d.ts +0 -1
  230. package/development/core/eventing.d.ts.map +1 -1
  231. package/development/core/eventing.js +1 -25
  232. package/development/core/i18n/i18n.d.ts +4 -2
  233. package/development/core/i18n/i18n.d.ts.map +1 -1
  234. package/development/core/i18n.js +27 -23
  235. package/development/core/mixins/disabled-mixin.d.ts +2 -7
  236. package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
  237. package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  238. package/development/core/mixins/form-associated-radio-button-mixin.d.ts +35 -0
  239. package/development/core/mixins/form-associated-radio-button-mixin.d.ts.map +1 -0
  240. package/development/core/mixins.d.ts +1 -0
  241. package/development/core/mixins.d.ts.map +1 -1
  242. package/development/core/mixins.js +221 -30
  243. package/development/core/testing/event-spy.d.ts +2 -1
  244. package/development/core/testing/event-spy.d.ts.map +1 -1
  245. package/development/core/testing.d.ts +0 -1
  246. package/development/core/testing.d.ts.map +1 -1
  247. package/development/core/testing.js +4 -15
  248. package/development/datepicker/common/datepicker-button.d.ts +3 -5
  249. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  250. package/development/datepicker/common.js +13 -12
  251. package/development/datepicker/datepicker/datepicker.d.ts +25 -72
  252. package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
  253. package/development/datepicker/datepicker-next-day/datepicker-next-day.d.ts +1 -3
  254. package/development/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  255. package/development/datepicker/datepicker-next-day.js +9 -15
  256. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts +1 -3
  257. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  258. package/development/datepicker/datepicker-previous-day.js +9 -15
  259. package/development/datepicker/datepicker.js +74 -115
  260. package/development/dialog/dialog/dialog.d.ts +3 -0
  261. package/development/dialog/dialog/dialog.d.ts.map +1 -1
  262. package/development/dialog/dialog-title.js +2 -1
  263. package/development/dialog/dialog.js +46 -39
  264. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts +7 -1
  265. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  266. package/development/expansion-panel/expansion-panel-header.js +3 -3
  267. package/development/expansion-panel/expansion-panel.js +32 -17
  268. package/development/file-selector/common/file-selector-common.d.ts +23 -0
  269. package/development/file-selector/common/file-selector-common.d.ts.map +1 -0
  270. package/development/file-selector/common.d.ts +2 -0
  271. package/development/file-selector/common.d.ts.map +1 -0
  272. package/development/file-selector/common.js +382 -0
  273. package/development/file-selector/file-selector/file-selector.d.ts +24 -0
  274. package/development/file-selector/file-selector/file-selector.d.ts.map +1 -0
  275. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.d.ts +33 -0
  276. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.d.ts.map +1 -0
  277. package/development/file-selector/file-selector-dropzone.d.ts +2 -0
  278. package/development/file-selector/file-selector-dropzone.d.ts.map +1 -0
  279. package/development/file-selector/file-selector-dropzone.js +181 -0
  280. package/development/file-selector/file-selector.d.ts +1 -87
  281. package/development/file-selector/file-selector.d.ts.map +1 -1
  282. package/development/file-selector/file-selector.js +52 -0
  283. package/development/file-selector.d.ts +2 -0
  284. package/development/file-selector.d.ts.map +1 -1
  285. package/development/file-selector.js +4 -552
  286. package/development/flip-card/flip-card-details.js +1 -1
  287. package/development/flip-card/flip-card-summary.js +3 -11
  288. package/development/flip-card/flip-card.js +6 -6
  289. package/development/form-field/form-field/form-field.d.ts +5 -10
  290. package/development/form-field/form-field/form-field.d.ts.map +1 -1
  291. package/development/form-field/form-field-clear.js +6 -6
  292. package/development/form-field/form-field.js +32 -40
  293. package/development/header/common.js +2 -2
  294. package/development/header/header/header.d.ts +5 -3
  295. package/development/header/header/header.d.ts.map +1 -1
  296. package/development/header/header.js +15 -20
  297. package/development/image/image.d.ts +0 -30
  298. package/development/image/image.d.ts.map +1 -1
  299. package/development/image.js +62 -273
  300. package/development/journey-header/journey-header.d.ts +4 -1
  301. package/development/journey-header/journey-header.d.ts.map +1 -1
  302. package/development/journey-header.js +7 -3
  303. package/development/lead-container.js +2 -10
  304. package/development/link/common/link-common.d.ts.map +1 -1
  305. package/development/link/common.js +9 -8
  306. package/development/link-list/common/link-list-base.d.ts +1 -0
  307. package/development/link-list/common/link-list-base.d.ts.map +1 -1
  308. package/development/link-list/common.js +4 -2
  309. package/development/link-list/link-list-anchor.js +4 -4
  310. package/development/loading-indicator/loading-indicator.d.ts +1 -3
  311. package/development/loading-indicator/loading-indicator.d.ts.map +1 -1
  312. package/development/loading-indicator-circle/loading-indicator-circle.d.ts +16 -0
  313. package/development/loading-indicator-circle/loading-indicator-circle.d.ts.map +1 -0
  314. package/development/loading-indicator-circle.d.ts +2 -0
  315. package/development/loading-indicator-circle.d.ts.map +1 -0
  316. package/development/loading-indicator-circle.js +146 -0
  317. package/development/loading-indicator.js +81 -182
  318. package/development/map-container/map-container.d.ts.map +1 -1
  319. package/development/map-container.js +5 -5
  320. package/development/menu/common.js +5 -5
  321. package/development/menu/menu/menu.d.ts +3 -0
  322. package/development/menu/menu/menu.d.ts.map +1 -1
  323. package/development/menu/menu.js +39 -24
  324. package/development/message.js +4 -2
  325. package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
  326. package/development/navigation/common.js +9 -5
  327. package/development/navigation/navigation/navigation.d.ts +3 -0
  328. package/development/navigation/navigation/navigation.d.ts.map +1 -1
  329. package/development/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  330. package/development/navigation/navigation-list.js +3 -2
  331. package/development/navigation/navigation-marker/navigation-marker.d.ts +2 -1
  332. package/development/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  333. package/development/navigation/navigation-marker.js +6 -4
  334. package/development/navigation/navigation-section/navigation-section.d.ts +3 -0
  335. package/development/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  336. package/development/navigation/navigation-section.js +38 -22
  337. package/development/navigation/navigation.js +42 -27
  338. package/development/notification/notification.d.ts +6 -2
  339. package/development/notification/notification.d.ts.map +1 -1
  340. package/development/notification.js +27 -21
  341. package/development/option/option/option-base-element.d.ts +0 -7
  342. package/development/option/option/option-base-element.d.ts.map +1 -1
  343. package/development/option/option.js +5 -26
  344. package/development/overlay/overlay-base-element.d.ts +2 -0
  345. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  346. package/development/overlay/overlay.d.ts +3 -0
  347. package/development/overlay/overlay.d.ts.map +1 -1
  348. package/development/overlay.js +43 -31
  349. package/development/paginator/common/paginator-common.d.ts.map +1 -1
  350. package/development/paginator/common.js +7 -3
  351. package/development/paginator/paginator.js +1 -1
  352. package/development/popover/popover/popover.d.ts +3 -0
  353. package/development/popover/popover/popover.d.ts.map +1 -1
  354. package/development/popover/popover-trigger.js +9 -9
  355. package/development/popover/popover.js +41 -26
  356. package/development/radio-button/common/radio-button-common.d.ts +3 -10
  357. package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
  358. package/development/radio-button/common.js +44 -121
  359. package/development/radio-button/radio-button/radio-button.d.ts +9 -1
  360. package/development/radio-button/radio-button/radio-button.d.ts.map +1 -1
  361. package/development/radio-button/radio-button-group/radio-button-group.d.ts +19 -26
  362. package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  363. package/development/radio-button/radio-button-group.js +87 -123
  364. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts +19 -1
  365. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  366. package/development/radio-button/radio-button-panel.js +35 -15
  367. package/development/radio-button/radio-button.js +11 -15
  368. package/development/select/select.d.ts +3 -9
  369. package/development/select/select.d.ts.map +1 -1
  370. package/development/select.js +27 -25
  371. package/development/selection-expansion-panel/selection-expansion-panel.d.ts +4 -1
  372. package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  373. package/development/selection-expansion-panel.js +28 -16
  374. package/development/skiplink-list/skiplink-list.d.ts.map +1 -1
  375. package/development/skiplink-list.js +3 -2
  376. package/development/slider/slider.d.ts +0 -1
  377. package/development/slider/slider.d.ts.map +1 -1
  378. package/development/slider.js +2 -2
  379. package/development/stepper/step-label/step-label.d.ts +0 -2
  380. package/development/stepper/step-label/step-label.d.ts.map +1 -1
  381. package/development/stepper/step-label.js +10 -11
  382. package/development/stepper/step.js +1 -1
  383. package/development/stepper/stepper/stepper.d.ts +4 -1
  384. package/development/stepper/stepper/stepper.d.ts.map +1 -1
  385. package/development/stepper/stepper.js +9 -7
  386. package/development/tabs/tab-group/tab-group.d.ts +4 -1
  387. package/development/tabs/tab-group/tab-group.d.ts.map +1 -1
  388. package/development/tabs/tab-group.js +8 -4
  389. package/development/tabs/tab-label.js +1 -1
  390. package/development/tag/tag/tag.d.ts +4 -1
  391. package/development/tag/tag/tag.d.ts.map +1 -1
  392. package/development/tag/tag-group/tag-group.d.ts +5 -2
  393. package/development/tag/tag-group/tag-group.d.ts.map +1 -1
  394. package/development/tag/tag-group.js +7 -4
  395. package/development/tag/tag.js +16 -12
  396. package/development/teaser/teaser.d.ts +2 -2
  397. package/development/teaser/teaser.d.ts.map +1 -1
  398. package/development/teaser-hero/teaser-hero.d.ts +2 -6
  399. package/development/teaser-hero/teaser-hero.d.ts.map +1 -1
  400. package/development/teaser-hero.js +9 -60
  401. package/development/teaser-product/common.js +7 -14
  402. package/development/teaser-product/teaser-product.js +1 -21
  403. package/development/teaser.js +14 -32
  404. package/development/time-input/time-input.d.ts +3 -6
  405. package/development/time-input/time-input.d.ts.map +1 -1
  406. package/development/time-input.js +33 -27
  407. package/development/toast/toast.d.ts +3 -0
  408. package/development/toast/toast.d.ts.map +1 -1
  409. package/development/toast.js +27 -13
  410. package/development/toggle/toggle/toggle.d.ts +4 -8
  411. package/development/toggle/toggle/toggle.d.ts.map +1 -1
  412. package/development/toggle/toggle.js +9 -12
  413. package/development/toggle-check/toggle-check.d.ts +4 -6
  414. package/development/toggle-check/toggle-check.d.ts.map +1 -1
  415. package/development/toggle-check.js +9 -7
  416. package/development/train/train/train.d.ts.map +1 -1
  417. package/development/train/train-blocked-passage.js +2 -2
  418. package/development/train/train-formation/train-formation.d.ts +3 -11
  419. package/development/train/train-formation/train-formation.d.ts.map +1 -1
  420. package/development/train/train-formation.js +43 -74
  421. package/development/train/train-wagon/train-wagon.d.ts +11 -8
  422. package/development/train/train-wagon/train-wagon.d.ts.map +1 -1
  423. package/development/train/train-wagon.js +149 -124
  424. package/development/train/train.js +35 -112
  425. package/development/visual-checkbox/visual-checkbox.d.ts +4 -1
  426. package/development/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  427. package/development/visual-checkbox.js +7 -3
  428. package/dialog/dialog/dialog.d.ts +3 -0
  429. package/dialog/dialog/dialog.d.ts.map +1 -1
  430. package/dialog/dialog-title.js +9 -9
  431. package/dialog/dialog.js +56 -51
  432. package/expansion-panel/expansion-panel/expansion-panel.d.ts +7 -1
  433. package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  434. package/expansion-panel/expansion-panel-header.js +1 -1
  435. package/expansion-panel/expansion-panel.js +41 -28
  436. package/file-selector/common/file-selector-common.d.ts +23 -0
  437. package/file-selector/common/file-selector-common.d.ts.map +1 -0
  438. package/file-selector/common.d.ts +2 -0
  439. package/file-selector/common.d.ts.map +1 -0
  440. package/file-selector/common.js +210 -0
  441. package/file-selector/file-selector/file-selector.d.ts +24 -0
  442. package/file-selector/file-selector/file-selector.d.ts.map +1 -0
  443. package/file-selector/file-selector-dropzone/file-selector-dropzone.d.ts +33 -0
  444. package/file-selector/file-selector-dropzone/file-selector-dropzone.d.ts.map +1 -0
  445. package/file-selector/file-selector-dropzone.d.ts +2 -0
  446. package/file-selector/file-selector-dropzone.d.ts.map +1 -0
  447. package/file-selector/file-selector-dropzone.js +97 -0
  448. package/file-selector/file-selector.d.ts +1 -87
  449. package/file-selector/file-selector.d.ts.map +1 -1
  450. package/file-selector/file-selector.js +44 -0
  451. package/file-selector.d.ts +2 -0
  452. package/file-selector.d.ts.map +1 -1
  453. package/file-selector.js +3 -301
  454. package/flip-card/flip-card-details.js +5 -5
  455. package/flip-card/flip-card-summary.js +7 -7
  456. package/flip-card/flip-card.js +9 -9
  457. package/form-field/form-field/form-field.d.ts +5 -10
  458. package/form-field/form-field/form-field.d.ts.map +1 -1
  459. package/form-field/form-field-clear.js +12 -12
  460. package/form-field/form-field.js +143 -141
  461. package/header/common.js +10 -10
  462. package/header/header/header.d.ts +5 -3
  463. package/header/header/header.d.ts.map +1 -1
  464. package/header/header.js +28 -31
  465. package/image/image.d.ts +0 -30
  466. package/image/image.d.ts.map +1 -1
  467. package/image.js +187 -281
  468. package/index.d.ts +13 -9
  469. package/index.js +13 -9
  470. package/journey-header/journey-header.d.ts +4 -1
  471. package/journey-header/journey-header.d.ts.map +1 -1
  472. package/journey-header.js +29 -25
  473. package/lead-container.js +5 -5
  474. package/link/common/link-common.d.ts.map +1 -1
  475. package/link/common.js +18 -16
  476. package/link-list/common/link-list-base.d.ts +1 -0
  477. package/link-list/common/link-list-base.d.ts.map +1 -1
  478. package/link-list/common.js +11 -9
  479. package/link-list/link-list-anchor.js +8 -8
  480. package/loading-indicator/loading-indicator.d.ts +1 -3
  481. package/loading-indicator/loading-indicator.d.ts.map +1 -1
  482. package/loading-indicator-circle/loading-indicator-circle.d.ts +16 -0
  483. package/loading-indicator-circle/loading-indicator-circle.d.ts.map +1 -0
  484. package/loading-indicator-circle.d.ts +2 -0
  485. package/loading-indicator-circle.d.ts.map +1 -0
  486. package/loading-indicator-circle.js +46 -0
  487. package/loading-indicator.js +41 -51
  488. package/map-container/map-container.d.ts.map +1 -1
  489. package/map-container.js +7 -7
  490. package/menu/common.js +8 -8
  491. package/menu/menu/menu.d.ts +3 -0
  492. package/menu/menu/menu.d.ts.map +1 -1
  493. package/menu/menu.js +52 -43
  494. package/message.js +12 -12
  495. package/navigation/common/navigation-action-common.d.ts.map +1 -1
  496. package/navigation/common.js +10 -6
  497. package/navigation/navigation/navigation.d.ts +3 -0
  498. package/navigation/navigation/navigation.d.ts.map +1 -1
  499. package/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  500. package/navigation/navigation-list.js +17 -16
  501. package/navigation/navigation-marker/navigation-marker.d.ts +2 -1
  502. package/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  503. package/navigation/navigation-marker.js +12 -10
  504. package/navigation/navigation-section/navigation-section.d.ts +3 -0
  505. package/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  506. package/navigation/navigation-section.js +46 -37
  507. package/navigation/navigation.js +30 -21
  508. package/notification/notification.d.ts +6 -2
  509. package/notification/notification.d.ts.map +1 -1
  510. package/notification.js +55 -51
  511. package/option/option/option-base-element.d.ts +0 -7
  512. package/option/option/option-base-element.d.ts.map +1 -1
  513. package/option/option.js +110 -125
  514. package/overlay/overlay-base-element.d.ts +2 -0
  515. package/overlay/overlay-base-element.d.ts.map +1 -1
  516. package/overlay/overlay.d.ts +3 -0
  517. package/overlay/overlay.d.ts.map +1 -1
  518. package/overlay.js +83 -77
  519. package/package.json +40 -25
  520. package/paginator/common/paginator-common.d.ts.map +1 -1
  521. package/paginator/common.js +21 -17
  522. package/paginator/paginator.js +1 -1
  523. package/popover/popover/popover.d.ts +3 -0
  524. package/popover/popover/popover.d.ts.map +1 -1
  525. package/popover/popover-trigger.js +6 -6
  526. package/popover/popover.js +114 -109
  527. package/radio-button/common/radio-button-common.d.ts +3 -10
  528. package/radio-button/common/radio-button-common.d.ts.map +1 -1
  529. package/radio-button/common.js +43 -90
  530. package/radio-button/radio-button/radio-button.d.ts +9 -1
  531. package/radio-button/radio-button/radio-button.d.ts.map +1 -1
  532. package/radio-button/radio-button-group/radio-button-group.d.ts +19 -26
  533. package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  534. package/radio-button/radio-button-group.js +112 -131
  535. package/radio-button/radio-button-panel/radio-button-panel.d.ts +19 -1
  536. package/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  537. package/radio-button/radio-button-panel.js +56 -44
  538. package/radio-button/radio-button.js +34 -38
  539. package/select/select.d.ts +3 -9
  540. package/select/select.d.ts.map +1 -1
  541. package/select.js +65 -66
  542. package/selection-expansion-panel/selection-expansion-panel.d.ts +4 -1
  543. package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  544. package/selection-expansion-panel.js +41 -31
  545. package/skiplink-list/skiplink-list.d.ts.map +1 -1
  546. package/skiplink-list.js +14 -13
  547. package/slider/slider.d.ts +0 -1
  548. package/slider/slider.d.ts.map +1 -1
  549. package/slider.js +1 -1
  550. package/standard-theme.css +238 -8
  551. package/stepper/step-label/step-label.d.ts +0 -2
  552. package/stepper/step-label/step-label.d.ts.map +1 -1
  553. package/stepper/step-label.js +6 -6
  554. package/stepper/step.js +4 -4
  555. package/stepper/stepper/stepper.d.ts +4 -1
  556. package/stepper/stepper/stepper.d.ts.map +1 -1
  557. package/stepper/stepper.js +22 -19
  558. package/table.css +15 -0
  559. package/tabs/tab-group/tab-group.d.ts +4 -1
  560. package/tabs/tab-group/tab-group.d.ts.map +1 -1
  561. package/tabs/tab-group.js +24 -20
  562. package/tabs/tab-label.js +1 -1
  563. package/tag/tag/tag.d.ts +4 -1
  564. package/tag/tag/tag.d.ts.map +1 -1
  565. package/tag/tag-group/tag-group.d.ts +5 -2
  566. package/tag/tag-group/tag-group.d.ts.map +1 -1
  567. package/tag/tag-group.js +13 -10
  568. package/tag/tag.js +25 -21
  569. package/teaser/teaser.d.ts +2 -2
  570. package/teaser/teaser.d.ts.map +1 -1
  571. package/teaser-hero/teaser-hero.d.ts +2 -6
  572. package/teaser-hero/teaser-hero.d.ts.map +1 -1
  573. package/teaser-hero.js +32 -57
  574. package/teaser-product/common.js +1 -1
  575. package/teaser-product/teaser-product.js +13 -13
  576. package/teaser.js +28 -28
  577. package/time-input/time-input.d.ts +3 -6
  578. package/time-input/time-input.d.ts.map +1 -1
  579. package/time-input.js +56 -55
  580. package/toast/toast.d.ts +3 -0
  581. package/toast/toast.d.ts.map +1 -1
  582. package/toast.js +51 -42
  583. package/toggle/toggle/toggle.d.ts +4 -8
  584. package/toggle/toggle/toggle.d.ts.map +1 -1
  585. package/toggle/toggle.js +48 -48
  586. package/toggle-check/toggle-check.d.ts +4 -6
  587. package/toggle-check/toggle-check.d.ts.map +1 -1
  588. package/toggle-check.js +23 -21
  589. package/train/train/train.d.ts.map +1 -1
  590. package/train/train-blocked-passage.js +1 -1
  591. package/train/train-formation/train-formation.d.ts +3 -11
  592. package/train/train-formation/train-formation.d.ts.map +1 -1
  593. package/train/train-formation.js +47 -65
  594. package/train/train-wagon/train-wagon.d.ts +11 -8
  595. package/train/train-wagon/train-wagon.d.ts.map +1 -1
  596. package/train/train-wagon.js +123 -134
  597. package/train/train.js +74 -78
  598. package/visual-checkbox/visual-checkbox.d.ts +4 -1
  599. package/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  600. package/visual-checkbox.js +21 -17
  601. package/button/mini-button/mini-button-base-element.d.ts +0 -8
  602. package/button/mini-button/mini-button-base-element.d.ts.map +0 -1
  603. package/button/tertiary-button/tertiary-button.d.ts +0 -19
  604. package/button/tertiary-button/tertiary-button.d.ts.map +0 -1
  605. package/button/tertiary-button-link/tertiary-button-link.d.ts +0 -19
  606. package/button/tertiary-button-link/tertiary-button-link.d.ts.map +0 -1
  607. package/button/tertiary-button-link.d.ts +0 -2
  608. package/button/tertiary-button-link.d.ts.map +0 -1
  609. package/button/tertiary-button-link.js +0 -17
  610. package/button/tertiary-button-static/tertiary-button-static.d.ts +0 -19
  611. package/button/tertiary-button-static/tertiary-button-static.d.ts.map +0 -1
  612. package/button/tertiary-button-static.d.ts +0 -2
  613. package/button/tertiary-button-static.d.ts.map +0 -1
  614. package/button/tertiary-button-static.js +0 -17
  615. package/button/tertiary-button.d.ts +0 -2
  616. package/button/tertiary-button.d.ts.map +0 -1
  617. package/button/tertiary-button.js +0 -17
  618. package/chip/chip.d.ts.map +0 -1
  619. package/chip.d.ts +0 -2
  620. package/chip.d.ts.map +0 -1
  621. package/chip.js +0 -54
  622. package/core/dom/get-document-writing-mode.d.ts +0 -5
  623. package/core/dom/get-document-writing-mode.d.ts.map +0 -1
  624. package/core/dom/ssr.d.ts +0 -13
  625. package/core/dom/ssr.d.ts.map +0 -1
  626. package/core/eventing/handler-repository.d.ts +0 -28
  627. package/core/eventing/handler-repository.d.ts.map +0 -1
  628. package/core/observers/intersection-observer.d.ts +0 -20
  629. package/core/observers/intersection-observer.d.ts.map +0 -1
  630. package/core/observers/mutation-observer.d.ts +0 -13
  631. package/core/observers/mutation-observer.d.ts.map +0 -1
  632. package/core/observers/resize-observer.d.ts +0 -16
  633. package/core/observers/resize-observer.d.ts.map +0 -1
  634. package/core/observers.d.ts +0 -4
  635. package/core/observers.d.ts.map +0 -1
  636. package/core/observers.js +0 -38
  637. package/core/testing/wait-for-event.d.ts +0 -2
  638. package/core/testing/wait-for-event.d.ts.map +0 -1
  639. package/development/button/mini-button/mini-button-base-element.d.ts +0 -8
  640. package/development/button/mini-button/mini-button-base-element.d.ts.map +0 -1
  641. package/development/button/tertiary-button/tertiary-button.d.ts +0 -19
  642. package/development/button/tertiary-button/tertiary-button.d.ts.map +0 -1
  643. package/development/button/tertiary-button-link/tertiary-button-link.d.ts +0 -19
  644. package/development/button/tertiary-button-link/tertiary-button-link.d.ts.map +0 -1
  645. package/development/button/tertiary-button-link.d.ts +0 -2
  646. package/development/button/tertiary-button-link.d.ts.map +0 -1
  647. package/development/button/tertiary-button-link.js +0 -25
  648. package/development/button/tertiary-button-static/tertiary-button-static.d.ts +0 -19
  649. package/development/button/tertiary-button-static/tertiary-button-static.d.ts.map +0 -1
  650. package/development/button/tertiary-button-static.d.ts +0 -2
  651. package/development/button/tertiary-button-static.d.ts.map +0 -1
  652. package/development/button/tertiary-button-static.js +0 -25
  653. package/development/button/tertiary-button.d.ts +0 -2
  654. package/development/button/tertiary-button.d.ts.map +0 -1
  655. package/development/button/tertiary-button.js +0 -25
  656. package/development/chip/chip.d.ts.map +0 -1
  657. package/development/chip.d.ts +0 -2
  658. package/development/chip.d.ts.map +0 -1
  659. package/development/core/dom/get-document-writing-mode.d.ts +0 -5
  660. package/development/core/dom/get-document-writing-mode.d.ts.map +0 -1
  661. package/development/core/dom/ssr.d.ts +0 -13
  662. package/development/core/dom/ssr.d.ts.map +0 -1
  663. package/development/core/eventing/handler-repository.d.ts +0 -28
  664. package/development/core/eventing/handler-repository.d.ts.map +0 -1
  665. package/development/core/observers/intersection-observer.d.ts +0 -20
  666. package/development/core/observers/intersection-observer.d.ts.map +0 -1
  667. package/development/core/observers/mutation-observer.d.ts +0 -13
  668. package/development/core/observers/mutation-observer.d.ts.map +0 -1
  669. package/development/core/observers/resize-observer.d.ts +0 -16
  670. package/development/core/observers/resize-observer.d.ts.map +0 -1
  671. package/development/core/observers.d.ts +0 -4
  672. package/development/core/observers.d.ts.map +0 -1
  673. package/development/core/observers.js +0 -39
  674. package/development/core/testing/wait-for-event.d.ts +0 -2
  675. package/development/core/testing/wait-for-event.d.ts.map +0 -1
@@ -10,6 +10,8 @@ import { property, state } from "lit/decorators.js";
10
10
  import { forceType, getOverride, hostAttributes } from "./decorators.js";
11
11
  import { defaultConverter, html, nothing, css } from "lit";
12
12
  import { preventScrollOnSpacebarPress, EventEmitter } from "./eventing.js";
13
+ import { interactivityChecker, isArrowKeyPressed, getNextElementIndex } from "./a11y.js";
14
+ import { SbbConnectedAbortController } from "./controllers.js";
13
15
  import "../screen-reader-only.js";
14
16
  const SbbDisabledMixin = (superClass) => {
15
17
  let SbbDisabledElement = (() => {
@@ -62,7 +64,7 @@ const SbbDisabledInteractiveMixin = (superClass) => {
62
64
  __privateAdd(this, _disabledInteractive_accessor_storage, __runInitializers(this, _disabledInteractive_initializers, false));
63
65
  __runInitializers(this, _disabledInteractive_extraInitializers);
64
66
  }
65
- /** Whether disabled buttons should be interactive. */
67
+ /** Whether the button should be aria-disabled but stay interactive. */
66
68
  get disabledInteractive() {
67
69
  return __privateGet(this, _disabledInteractive_accessor_storage);
68
70
  }
@@ -71,7 +73,7 @@ const SbbDisabledInteractiveMixin = (superClass) => {
71
73
  }
72
74
  }, _disabledInteractive_accessor_storage = new WeakMap(), (() => {
73
75
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
74
- _disabledInteractive_decorators = [forceType(), property({ attribute: "disabled-interactive", type: Boolean })];
76
+ _disabledInteractive_decorators = [forceType(), property({ attribute: "disabled-interactive", type: Boolean, reflect: true })];
75
77
  __esDecorate(_a, null, _disabledInteractive_decorators, { kind: "accessor", name: "disabledInteractive", static: false, private: false, access: { has: (obj) => "disabledInteractive" in obj, get: (obj) => obj.disabledInteractive, set: (obj, value) => {
76
78
  obj.disabledInteractive = value;
77
79
  } }, metadata: _metadata }, _disabledInteractive_initializers, _disabledInteractive_extraInitializers);
@@ -84,39 +86,21 @@ const SbbDisabledTabIndexActionMixin = (superClass) => {
84
86
  class SbbDisabledTabIndexAction extends SbbDisabledInteractiveMixin(SbbDisabledMixin(superClass)) {
85
87
  willUpdate(changedProperties) {
86
88
  super.willUpdate(changedProperties);
87
- if (!changedProperties.has("disabled") && !changedProperties.has("disabledInteractive")) {
89
+ if (changedProperties.has("disabledInteractive")) {
90
+ this.internals.ariaDisabled = this.disabledInteractive ? "true" : null;
91
+ }
92
+ if (!changedProperties.has("disabled")) {
88
93
  return;
89
94
  }
90
- if (!this.disabled || this.disabledInteractive) {
95
+ if (!this.disabled) {
91
96
  this.setAttribute("tabindex", "0");
92
97
  } else {
93
98
  this.removeAttribute("tabindex");
94
99
  }
95
- if (this.disabled) {
96
- this.setAttribute("aria-disabled", "true");
97
- } else {
98
- this.removeAttribute("aria-disabled");
99
- }
100
100
  }
101
101
  }
102
102
  return SbbDisabledTabIndexAction;
103
103
  };
104
- const SbbFocusableDisabledActionMixin = (superClass) => {
105
- class SbbFocusableDisabledAction extends SbbDisabledMixin(superClass) {
106
- willUpdate(changedProperties) {
107
- super.willUpdate(changedProperties);
108
- if (!changedProperties.has("disabled")) {
109
- return;
110
- }
111
- if (this.disabled) {
112
- this.setAttribute("aria-disabled", "true");
113
- } else {
114
- this.removeAttribute("aria-disabled");
115
- }
116
- }
117
- }
118
- return SbbFocusableDisabledAction;
119
- };
120
104
  const SbbFormAssociatedMixin = (superClass) => {
121
105
  let SbbFormAssociatedElement = (() => {
122
106
  var _formDisabled_accessor_storage, _a;
@@ -350,7 +334,6 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
350
334
  this._attributeMutationBlocked = true;
351
335
  this.dispatchEvent(new InputEvent("input", { composed: true, bubbles: true }));
352
336
  this.dispatchEvent(new Event("change", { bubbles: true }));
353
- this.dispatchEvent(new CustomEvent("didChange", { bubbles: true }));
354
337
  };
355
338
  this.internals.role = "checkbox";
356
339
  }
@@ -427,6 +410,213 @@ const SbbFormAssociatedCheckboxMixin = (superClass) => {
427
410
  })();
428
411
  return SbbFormAssociatedCheckboxElement;
429
412
  };
413
+ const radioButtonRegistry = /* @__PURE__ */ new WeakMap();
414
+ const SbbFormAssociatedRadioButtonMixin = (superClass) => {
415
+ let SbbFormAssociatedRadioButtonElement = (() => {
416
+ var _checked_accessor_storage, _a;
417
+ let _classSuper = SbbDisabledMixin(SbbRequiredMixin(SbbFormAssociatedMixin(superClass)));
418
+ let _checked_decorators;
419
+ let _checked_initializers = [];
420
+ let _checked_extraInitializers = [];
421
+ return _a = class extends _classSuper {
422
+ constructor() {
423
+ super();
424
+ __privateAdd(this, _checked_accessor_storage);
425
+ __privateSet(this, _checked_accessor_storage, __runInitializers(this, _checked_initializers, false));
426
+ this.abort = (__runInitializers(this, _checked_extraInitializers), new SbbConnectedAbortController(this));
427
+ this._didLoad = false;
428
+ this.internals.role = "radio";
429
+ }
430
+ /**
431
+ * Whether the radio button is checked.
432
+ */
433
+ get checked() {
434
+ return __privateGet(this, _checked_accessor_storage);
435
+ }
436
+ set checked(value) {
437
+ __privateSet(this, _checked_accessor_storage, value);
438
+ }
439
+ /**
440
+ * Form type of element.
441
+ * @default 'radio'
442
+ */
443
+ get type() {
444
+ return "radio";
445
+ }
446
+ connectedCallback() {
447
+ super.connectedCallback();
448
+ this._connectToRegistry();
449
+ this.addEventListener("keydown", (e) => this._handleArrowKeyDown(e), {
450
+ signal: this.abort.signal
451
+ });
452
+ }
453
+ disconnectedCallback() {
454
+ super.disconnectedCallback();
455
+ this._disconnectFromRegistry();
456
+ }
457
+ /**
458
+ * Is called whenever the form is being reset.
459
+ * @internal
460
+ */
461
+ formResetCallback() {
462
+ this.checked = this.hasAttribute("checked");
463
+ }
464
+ /**
465
+ * Called when the browser is trying to restore element’s state to state in which case
466
+ * reason is “restore”, or when the browser is trying to fulfill autofill on behalf of
467
+ * user in which case reason is “autocomplete”.
468
+ * @internal
469
+ */
470
+ formStateRestoreCallback(state2, _reason) {
471
+ if (state2) {
472
+ this.checked = state2 === this.value;
473
+ }
474
+ }
475
+ willUpdate(changedProperties) {
476
+ super.willUpdate(changedProperties);
477
+ if (changedProperties.has("name")) {
478
+ this._disconnectFromRegistry();
479
+ this._connectToRegistry();
480
+ if (this.checked) {
481
+ this._deselectGroupedRadios();
482
+ }
483
+ this.updateFocusableRadios();
484
+ }
485
+ if (changedProperties.has("checked")) {
486
+ this.toggleAttribute("data-checked", this.checked);
487
+ this.internals.ariaChecked = this.checked.toString();
488
+ this.updateFormValueOnCheckedChange();
489
+ if (this.checked) {
490
+ this._deselectGroupedRadios();
491
+ }
492
+ this.updateFocusableRadios();
493
+ }
494
+ if (changedProperties.has("disabled")) {
495
+ this.updateFocusableRadios();
496
+ }
497
+ }
498
+ firstUpdated(changedProperties) {
499
+ super.firstUpdated(changedProperties);
500
+ this._didLoad = true;
501
+ this.updateFocusableRadios();
502
+ }
503
+ /**
504
+ * Called on `value` change
505
+ * If 'checked', update the value. Otherwise, do nothing.
506
+ */
507
+ updateFormValue() {
508
+ if (this.checked) {
509
+ this.internals.setFormValue(this.value);
510
+ }
511
+ }
512
+ /**
513
+ * Called on `checked` change
514
+ * If 'checked', update the value. Otherwise, reset it.
515
+ */
516
+ updateFormValueOnCheckedChange() {
517
+ this.internals.setFormValue(this.checked ? this.value : null);
518
+ }
519
+ /**
520
+ * Only a single radio should be focusable in the group. Defined as:
521
+ * - the checked radio;
522
+ * - the first non-disabled radio in DOM order;
523
+ */
524
+ updateFocusableRadios() {
525
+ if (!this._didLoad) {
526
+ return;
527
+ }
528
+ const radios = this._interactableGroupedRadios();
529
+ const checkedIndex = radios.findIndex((r) => r.checked && !r.disabled && !r.formDisabled);
530
+ const focusableIndex = checkedIndex !== -1 ? checkedIndex : radios.findIndex((r) => !r.disabled && !r.formDisabled);
531
+ if (focusableIndex !== -1) {
532
+ radios[focusableIndex].tabIndex = 0;
533
+ radios.splice(focusableIndex, 1);
534
+ }
535
+ radios.forEach((r) => r.removeAttribute("tabindex"));
536
+ }
537
+ async navigateByKeyboard(next) {
538
+ next.checked = true;
539
+ this.emitChangeEvents();
540
+ await next.updateComplete;
541
+ next.focus();
542
+ }
543
+ emitChangeEvents() {
544
+ this.dispatchEvent(new InputEvent("input", { bubbles: true, cancelable: true, composed: true }));
545
+ this.dispatchEvent(new Event("change", { bubbles: true }));
546
+ }
547
+ /**
548
+ * Add `this` to the radioButton registry
549
+ */
550
+ _connectToRegistry() {
551
+ if (!this.name) {
552
+ return;
553
+ }
554
+ const root = this.form ?? this.getRootNode();
555
+ this._radioButtonGroupsMap = radioButtonRegistry.get(root);
556
+ if (!this._radioButtonGroupsMap) {
557
+ this._radioButtonGroupsMap = /* @__PURE__ */ new Map();
558
+ radioButtonRegistry.set(root, this._radioButtonGroupsMap);
559
+ }
560
+ this.associatedRadioButtons = this._radioButtonGroupsMap.get(this.name);
561
+ if (!this.associatedRadioButtons) {
562
+ this.associatedRadioButtons = /* @__PURE__ */ new Set();
563
+ this._radioButtonGroupsMap.set(this.name, this.associatedRadioButtons);
564
+ }
565
+ const entries = Array.from(this.associatedRadioButtons);
566
+ this.associatedRadioButtons.clear();
567
+ const index = entries.findIndex((r) => this.compareDocumentPosition(r) & Node.DOCUMENT_POSITION_FOLLOWING);
568
+ if (index !== -1) {
569
+ entries.splice(index, 0, this);
570
+ } else {
571
+ entries.push(this);
572
+ }
573
+ entries.forEach((r) => this.associatedRadioButtons.add(r));
574
+ }
575
+ /**
576
+ * Remove `this` from the radioButton registry and, if the group is empty, delete the entry from the groups Map
577
+ */
578
+ _disconnectFromRegistry() {
579
+ var _a2, _b, _c;
580
+ (_a2 = this.associatedRadioButtons) == null ? void 0 : _a2.delete(this);
581
+ if (((_b = this.associatedRadioButtons) == null ? void 0 : _b.size) === 0) {
582
+ (_c = this._radioButtonGroupsMap) == null ? void 0 : _c.delete(this.name);
583
+ }
584
+ this.associatedRadioButtons = void 0;
585
+ this._radioButtonGroupsMap = void 0;
586
+ }
587
+ /**
588
+ * Return a list of 'interactable' grouped radios, ordered in DOM order
589
+ */
590
+ _interactableGroupedRadios() {
591
+ return Array.from(this.associatedRadioButtons ?? []).filter((el) => interactivityChecker.isVisible(el));
592
+ }
593
+ /**
594
+ * Deselect other radio of the same group
595
+ */
596
+ _deselectGroupedRadios() {
597
+ Array.from(this.associatedRadioButtons ?? []).filter((r) => r !== this).forEach((r) => r.checked = false);
598
+ }
599
+ async _handleArrowKeyDown(evt) {
600
+ if (!isArrowKeyPressed(evt)) {
601
+ return;
602
+ }
603
+ evt.preventDefault();
604
+ const enabledRadios = this._interactableGroupedRadios().filter((r) => !r.disabled && !r.formDisabled);
605
+ const current = enabledRadios.indexOf(this);
606
+ const nextIndex = getNextElementIndex(evt, current, enabledRadios.length);
607
+ await this.navigateByKeyboard(enabledRadios[nextIndex]);
608
+ }
609
+ }, _checked_accessor_storage = new WeakMap(), (() => {
610
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
611
+ _checked_decorators = [forceType(), property({ type: Boolean })];
612
+ __esDecorate(_a, null, _checked_decorators, { kind: "accessor", name: "checked", static: false, private: false, access: { has: (obj) => "checked" in obj, get: (obj) => obj.checked, set: (obj, value) => {
613
+ obj.checked = value;
614
+ } }, metadata: _metadata }, _checked_initializers, _checked_extraInitializers);
615
+ if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
616
+ })(), _a;
617
+ })();
618
+ return SbbFormAssociatedRadioButtonElement;
619
+ };
430
620
  const SbbHydrationMixin = (base) => {
431
621
  class SbbHydrationMixinClass extends base {
432
622
  /**
@@ -740,7 +930,7 @@ const panelCommon = css`:host {
740
930
  --sbb-selection-panel-input-padding: var(--sbb-spacing-responsive-xs)
741
931
  var(--sbb-spacing-responsive-xxs);
742
932
  --sbb-selection-panel-animation-duration: var(
743
- --sbb-disable-animation-zero-time,
933
+ --sbb-disable-animation-duration,
744
934
  var(--sbb-animation-duration-4x)
745
935
  );
746
936
  --sbb-selection-panel-cursor: pointer;
@@ -831,15 +1021,16 @@ export {
831
1021
  SbbDisabledInteractiveMixin,
832
1022
  SbbDisabledMixin,
833
1023
  SbbDisabledTabIndexActionMixin,
834
- SbbFocusableDisabledActionMixin,
835
1024
  SbbFormAssociatedCheckboxMixin,
836
1025
  SbbFormAssociatedMixin,
1026
+ SbbFormAssociatedRadioButtonMixin,
837
1027
  SbbHydrationMixin,
838
1028
  SbbNamedSlotListMixin,
839
1029
  SbbNegativeMixin,
840
1030
  SbbPanelMixin,
841
1031
  SbbRequiredMixin,
842
1032
  SbbUpdateSchedulerMixin,
843
- panelCommon as panelCommonStyle
1033
+ panelCommon as panelCommonStyle,
1034
+ radioButtonRegistry
844
1035
  };
845
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZGlzYWJsZWQtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3JlcXVpcmVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1jaGVja2JveC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9oeWRyYXRpb24tbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvbmFtZWQtc2xvdC1saXN0LW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL25lZ2F0aXZlLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3BhbmVsLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3VwZGF0ZS1zY2hlZHVsZXItbWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgZm9yY2VUeXBlLCBnZXRPdmVycmlkZSB9IGZyb20gJy4uL2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRGlzYWJsZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgZGlzYWJsZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJEaXNhYmxlZE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgQGdldE92ZXJyaWRlKChlLCB2KSA9PiB2IHx8IGUuaXNEaXNhYmxlZEV4dGVybmFsbHkoKSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBhcyAnb3InIGNoZWNrIHRvIHRoZSBjdXJyZW50IGRpc2FibGVkIHN0YXRlLlxuICAgICAqIENhbiBlLmcuIGJlIHVzZWQgdG8gcmVhZCBkaXNhYmxlZCBzdGF0ZSBvZiBhIGdyb3VwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiRGlzYWJsZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJEaXNhYmxlZE1peGluVHlwZT4gJiBUO1xufTtcblxuLyoqXG4gKiBFbmhhbmNlIHlvdXIgY29tcG9uZW50IHdpdGggYSBkaXNhYmxlZCBpbnRlcmFjdGl2ZSBwcm9wZXJ0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkRpc2FibGVkTWl4aW5UeXBlPixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+XG4gIHtcbiAgICAvKiogV2hldGhlciBkaXNhYmxlZCBidXR0b25zIHNob3VsZCBiZSBpbnRlcmFjdGl2ZS4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkaXNhYmxlZC1pbnRlcmFjdGl2ZScsIHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWRJbnRlcmFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJEaXNhYmxlZFRhYkluZGV4QWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJEaXNhYmxlZE1peGluVHlwZSAmIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkVGFiSW5kZXhBY3Rpb25cbiAgICBleHRlbmRzIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpbihTYmJEaXNhYmxlZE1peGluKHN1cGVyQ2xhc3MpKVxuICAgIGltcGxlbWVudHMgU2JiRGlzYWJsZWRNaXhpblR5cGUsIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGVcbiAge1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAgIGlmICghY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpICYmICFjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkSW50ZXJhY3RpdmUnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkSW50ZXJhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFxuICAgIFNiYkRpc2FibGVkTWl4aW5UeXBlICYgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZVxuICA+ICZcbiAgICBUO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIGBTYmJEaXNhYmxlZE1peGluYCB3aXRoIHRoZSBgYXJpYS1kaXNhYmxlZGAgYXR0cmlidXRlLlxuICogRm9yIGExMXkgcHVycG9zZXMsIGtlZXBzIHRoZSBlbGVtZW50IGZvY3VzYWJsZSBldmVuIHdoZW4gZGlzYWJsZWQuXG4gKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgd2l0aCBuZXh0IG1ham9yIHZlcnNpb25cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvY3VzYWJsZURpc2FibGVkQWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJEaXNhYmxlZE1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRm9jdXNhYmxlRGlzYWJsZWRBY3Rpb25cbiAgICBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oc3VwZXJDbGFzcylcbiAgICBpbXBsZW1lbnRzIFNiYkRpc2FibGVkTWl4aW5UeXBlXG4gIHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoIWNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZGlzYWJsZWQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBTYmJGb2N1c2FibGVEaXNhYmxlZEFjdGlvbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFYgPSBzdHJpbmc+IHtcbiAgcHVibGljIGdldCBmb3JtKCk6IEhUTUxGb3JtRWxlbWVudCB8IG51bGw7XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmc7XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKTtcbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZztcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBWIHwgbnVsbDtcbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogViB8IG51bGwpO1xuXG4gIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZTtcbiAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGZvcm1EaXNhYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgZm9ybUFzc29jaWF0ZWRDYWxsYmFjaz8oZm9ybTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtRGlzYWJsZWRDYWxsYmFjayhkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQ7XG4gIHB1YmxpYyBhYnN0cmFjdCBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgYWJzdHJhY3QgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICApOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgRm9ybUFzc29jaWF0ZWRNaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIGN1c3RvbSBjb250cm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4sIFYgPSBzdHJpbmc+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PlxuICB7XG4gICAgcHVibGljIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmb3JtIG93bmVyIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZm9ybSgpOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5mb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZvcm0gZWxlbWVudC4gV2lsbCBiZSByZWFkIGZyb20gbmFtZSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb24gRGV2ZWxvcGVyIG5vdGU6IEluIHRoaXMgY2FzZSB1cGRhdGluZyB0aGUgYXR0cmlidXRlIG11c3QgYmUgc3luY2hyb25vdXMuXG4gICAgICogRHVlIHRvIHRoaXMgaXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBnZXR0ZXIvc2V0dGVyIGFuZCB0aGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgaGFuZGxlcyB0aGUgZGlmZiBjaGVjay5cbiAgICAgKi9cbiAgICBAcHJvcGVydHkoKVxuICAgIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCduYW1lJywgYCR7bmFtZX1gKTtcblxuICAgICAgLy8gRm9yIGBGb3JtRGF0YWAgdmFsdWVzLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHVwZGF0ZSB0aGUgZmllbGROYW1lIGtleVxuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA/PyAnJztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7XG4gICAgfVxuXG4gICAgLyoqIFZhbHVlIG9mIHRoZSBmb3JtIGVsZW1lbnQuICovXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBWIHwgbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybVZhbHVlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogViB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBwcml2YXRlIF92YWx1ZTogViB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgVmFsaWRpdHlTdGF0ZSBvYmplY3QgZm9yIGludGVybmFscyB0YXJnZXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRpdHkoKTogVmFsaWRpdHlTdGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMudmFsaWRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IHdvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyXG4gICAgICogaWYgaW50ZXJuYWxzIHRhcmdldCBlbGVtZW50IHdhcyB0byBiZSBjaGVja2VkIGZvciB2YWxpZGl0eS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW50ZXJuYWxzIHRhcmdldCBlbGVtZW50IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAgICogd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lsbFZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLndpbGxWYWxpZGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsczogRWxlbWVudEludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG5cbiAgICAvKiogV2hlbmV2ZXIgYSBzdXJyb3VuZGluZyBmb3JtIG9yIGZpZWxkc2V0IGlzIGNoYW5naW5nIGl0cyBkaXNhYmxlZCBzdGF0ZS4gKi9cbiAgICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAobmFtZSAhPT0gJ25hbWUnIHx8IG9sZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpbnRlcm5hbHMgdGFyZ2V0IGVsZW1lbnQgaGFzIG5vIHZhbGlkaXR5IHByb2JsZW1zOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogRmlyZXMgYW4gaW52YWxpZCBldmVudCBhdCB0aGUgZWxlbWVudCBpbiB0aGUgbGF0dGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGludGVybmFscyB0YXJnZXQgZWxlbWVudCBoYXMgbm8gdmFsaWRpdHkgcHJvYmxlbXM7IG90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIGZhbHNlLCBmaXJlcyBhbiBpbnZhbGlkIGV2ZW50IGF0IHRoZSBlbGVtZW50LFxuICAgICAqIGFuZCAoaWYgdGhlIGV2ZW50IGlzbid0IGNhbmNlbGVkKSByZXBvcnRzIHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgZm9ybSBlbGVtZW50IGNoYW5nZXMuXG4gICAgICogRWxlbWVudEludGVybmFscy5mb3JtIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgZnJvbSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZvcm1Bc3NvY2lhdGVkQ2FsbGJhY2s/KGZvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIGEgc3Vycm91bmRpbmcgZm9ybSAvIGZpZWxkc2V0IGNoYW5nZXMgZGlzYWJsZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybURpc2FibGVkQ2FsbGJhY2soZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIGlmIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eSBjaGFuZ2VzIG9yIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgb2YgYSBmaWVsZHNldCBvciBmb3JtIGNoYW5nZXMuXG4gICAgICAvLyBXZSBuZWVkIHRvIHBvc3Rwb25lIHRoZSBhc3NpZ25tZW50LCBvdGhlcndpc2UgaXQgaW50ZXJmZXJlcyB3aXRoIGRpc2FibGVkIHN0YXR1cyBzZXR0aW5nXG4gICAgICAvLyBhbmQgbGVhZHMgdG8gYSB3cm9uZyBzdGF0ZSAoZS5nLiBlbWJlZGRlZCBzYmItdmlzdWFsLWNoZWNrYm94KS5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1EaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMg4oCccmVzdG9yZeKAnSwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyDigJxhdXRvY29tcGxldGXigJ0uXG4gICAgICogIEluIHRoZSBjYXNlIG9mIOKAnHJlc3RvcmXigJ0sIHN0YXRlIGlzIGEgc3RyaW5nLCBGaWxlLCBvciBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiAgcHJldmlvdXNseSBzZXQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRGb3JtVmFsdWUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGZvcm0gdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBBZGFwdHMgYW5kIHNldHMgdGhlIGZvcm1WYWx1ZSBpbiB0aGUgc3VwcG9ydGVkIGZvcm1hdCAoc3RyaW5nIHwgRm9ybURhdGEgfCBGaWxlIHwgbnVsbClcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9zZXRGb3JtVmFsdWVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG4gIH1cbiAgcmV0dXJuIFNiYkZvcm1Bc3NvY2lhdGVkRWxlbWVudCBhcyB1bmtub3duIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+ICZcbiAgICBUO1xufTtcblxuLyoqXG4gKiBBIHZhbHVlIHRvIGJlIHJlc3RvcmVkIGZvciBhIGNvbXBvbmVudCdzIGZvcm0gdmFsdWUuIElmIGEgY29tcG9uZW50J3MgZm9ybVxuICogc3RhdGUgaXMgYSBgRm9ybURhdGFgIG9iamVjdCwgaXRzIGVudHJ5IGxpc3Qgb2YgbmFtZSBhbmQgdmFsdWVzIHdpbGwgYmVcbiAqIHByb3ZpZGVkLlxuICovXG5leHBvcnQgdHlwZSBGb3JtUmVzdG9yZVN0YXRlID0gRmlsZSB8IHN0cmluZyB8IFtzdHJpbmcsIEZvcm1EYXRhRW50cnlWYWx1ZV1bXTtcblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgZm9ybSBjb21wb25lbnQgaXMgYmVpbmcgcmVzdG9yZWQgZm9yLCBlaXRoZXIgYCdyZXN0b3JlJ2AgZm9yXG4gKiBicm93c2VyIHJlc3RvcmF0aW9uIG9yIGAnYXV0b2NvbXBsZXRlJ2AgZm9yIHJlc3RvcmluZyB1c2VyIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVJlc3RvcmVSZWFzb24gPSAncmVzdG9yZScgfCAnYXV0b2NvbXBsZXRlJztcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiUmVxdWlyZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIHJlcXVpcmVkIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiUmVxdWlyZWRNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PixcbiAgVixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJSZXF1aXJlZEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT4ge1xuICAgIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIC8vIFRvIHByb3ZpZGUgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIG5hdGl2ZSByZXF1aXJlZCBzdGF0ZSxcbiAgICAgIC8vIGFueSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLlxuICAgICAgdGhpcy5fcmVxdWlyZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCB8fCB0aGlzLmlzUmVxdWlyZWRFeHRlcm5hbGx5KCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgIC8vIEZpcmVmb3ggbmVlZHMgZXhwbGljaXRseSBzZXQgYXJpYS1yZXF1aXJlZCB2YWx1ZS5cbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYVJlcXVpcmVkID0gYCR7dGhpcy5yZXF1aXJlZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBhcyAnb3InIGNoZWNrIHRvIHRoZSBjdXJyZW50IHJlcXVpcmVkIHN0YXRlLlxuICAgICAqIENhbiBlLmcuIGJlIHVzZWQgdG8gcmVhZCByZXF1aXJlZCBzdGF0ZSBvZiBhIGdyb3VwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiUmVxdWlyZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJSZXF1aXJlZE1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB7IGRlZmF1bHRDb252ZXJ0ZXIsIHR5cGUgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHByZXZlbnRTY3JvbGxPblNwYWNlYmFyUHJlc3MgfSBmcm9tICcuLi9ldmVudGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcbmltcG9ydCB7IFNiYkRpc2FibGVkTWl4aW4sIHR5cGUgU2JiRGlzYWJsZWRNaXhpblR5cGUgfSBmcm9tICcuL2Rpc2FibGVkLW1peGluLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgdHlwZSBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSxcbn0gZnJvbSAnLi9mb3JtLWFzc29jaWF0ZWQtbWl4aW4uanMnO1xuaW1wb3J0IHsgU2JiUmVxdWlyZWRNaXhpbiwgdHlwZSBTYmJSZXF1aXJlZE1peGluVHlwZSB9IGZyb20gJy4vcmVxdWlyZWQtbWl4aW4uanMnO1xuXG50eXBlIENoZWNrZWRTZXR0ZXJWYWx1ZSA9IHsgdmFsdWU6IGJvb2xlYW47IGF0dHJpYnV0ZTogYm9vbGVhbiB9O1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlXG4gIGV4dGVuZHMgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGVcbiAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiwgUGFydGlhbDxTYmJSZXF1aXJlZE1peGluVHlwZT5cbntcbiAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbik7XG5cbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbik7XG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKTtcbiAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCwgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcbiAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW4gZW5hYmxlcyBuYXRpdmUgZm9ybSBzdXBwb3J0IGZvciBjaGVja2JveCBjb250cm9scy5cbiAqXG4gKiBJbmhlcml0ZWQgY2xhc3NlcyBNVVNUIGltcGxlbWVudCB0aGUgYXJpYUNoZWNrZWQgc3RhdGUgKEVsZW1lbnRJbnRlcm5hbHMpIHRoZW1zZWx2ZXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGU+ICYgVCA9PiB7XG4gIEBob3N0QXR0cmlidXRlcyh7XG4gICAgdGFiaW5kZXg6ICcwJyxcbiAgfSlcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveEVsZW1lbnRcbiAgICBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oU2JiUmVxdWlyZWRNaXhpbihTYmJGb3JtQXNzb2NpYXRlZE1peGluKHN1cGVyQ2xhc3MpKSlcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZT5cbiAge1xuICAgIHByaXZhdGUgX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuICovXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBjb252ZXJ0ZXI6IHtcbiAgICAgICAgLi4uZGVmYXVsdENvbnZlcnRlcixcbiAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXR0ZXIgc28gdGhhdCB3ZSBrbm93IGl0IHdhcyBjYWxsZWQgYnkgYXR0cmlidXRlIGNoYW5nZS5cbiAgICAgICAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bik6IENoZWNrZWRTZXR0ZXJWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmYXVsdENvbnZlcnRlci5mcm9tQXR0cmlidXRlPy4odmFsdWUsIHR5cGUpO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQsIGF0dHJpYnV0ZTogdHJ1ZSB9IGFzIENoZWNrZWRTZXR0ZXJWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBwdWJsaWMgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNldHRlciA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAodmFsdWUgYXMgdW5rbm93biBhcyBDaGVja2VkU2V0dGVyVmFsdWUpLmF0dHJpYnV0ZSA6IGZhbHNlO1xuICAgICAgaWYgKGF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIENoZWNrZWRTZXR0ZXJWYWx1ZSkudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzIHNvb24gYXMgbXV0YXRpb24gd2FzIGRvbmUgbm90IGJ5IHNldHRpbmcgYXR0cmlidXRlLFxuICAgICAgLy8gd2UgbmVlZCB0byBibG9jayBzeW5jaW5nIGF0dHJpYnV0ZS5cbiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQgJiYgIWF0dHJpYnV0ZVNldHRlcikge1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICAgfVxuICAgIHByaXZhdGUgX2NoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgICAqIEBkZWZhdWx0ICdjaGVja2JveCdcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnY2hlY2tib3gnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmludGVybmFscy5yb2xlID0gJ2NoZWNrYm94JztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5faGFuZGxlVXNlckludGVyYWN0aW9uKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHByZXZlbnRTY3JvbGxPblNwYWNlYmFyUHJlc3MpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2hhbmRsZUtleWJvYXJkSW50ZXJhY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9oYW5kbGVVc2VySW50ZXJhY3Rpb24pO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgcHJldmVudFNjcm9sbE9uU3BhY2ViYXJQcmVzcyk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5faGFuZGxlS2V5Ym9hcmRJbnRlcmFjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIG9sZDogc3RyaW5nIHwgbnVsbCxcbiAgICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICk6IHZvaWQge1xuICAgICAgLy8gQXR0cmlidXRlIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYWZ0ZXIgcHJvZ3JhbW1hdGljIG9yIG1hbnVhbCBzdGF0ZSBjaGFuZ2UuXG4gICAgICBpZiAobmFtZSAhPT0gJ2NoZWNrZWQnIHx8ICF0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQpIHtcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuZXZlciB0aGUgZm9ybSBpcyBiZWluZyByZXNldC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMuaGFzQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQ2FsbGVkIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIHJlc3RvcmUgZWxlbWVudOKAmXMgc3RhdGUgdG8gc3RhdGUgaW4gd2hpY2ggY2FzZVxuICAgICAqICByZWFzb24gaXMg4oCccmVzdG9yZeKAnSwgb3Igd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gZnVsZmlsbCBhdXRvZmlsbCBvbiBiZWhhbGYgb2ZcbiAgICAgKiAgdXNlciBpbiB3aGljaCBjYXNlIHJlYXNvbiBpcyDigJxhdXRvY29tcGxldGXigJ0uXG4gICAgICogIEluIHRoZSBjYXNlIG9mIOKAnHJlc3RvcmXigJ0sIHN0YXRlIGlzIGEgc3RyaW5nLCBGaWxlLCBvciBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiAgcHJldmlvdXNseSBzZXQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRGb3JtVmFsdWUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5jaGVja2VkID0gc3RhdGUgPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGxvZ2ljIHdoaWNoIGlzIGJlaW5nIGV4ZWN1dGVkIHdoZW4gdXNlclxuICAgICAqIGludGVyYWN0aW9uIGhhcHBlbnMgYW5kIHN0YXRlIGlzIG5vdCBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlLCBgJHt0aGlzLmNoZWNrZWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0cmlnZ2VyZWQgb24ga2V5Ym9hcmQgdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNoZWNrYm94LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUtleWJvYXJkSW50ZXJhY3Rpb24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICB0aGlzLl9oYW5kbGVVc2VySW50ZXJhY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIE1ldGhvZCB0cmlnZ2VyZWQgb24gdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNoZWNrYm94LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZVVzZXJJbnRlcmFjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMud2l0aFVzZXJJbnRlcmFjdGlvbj8uKCk7XG4gICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgICAgdGhpcy5fYXR0cmlidXRlTXV0YXRpb25CbG9ja2VkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgY29tcG9zZWQ6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RpZENoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94RWxlbWVudCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuLy8gRGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtaXhpblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBoYXMgY29tcGxldGVkIGh5ZHJhdGlvbi5cbiAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVkIGh5ZHJhdGlvblxuICAgKiBhbmQgYGZhbHNlYCBpZiBub3QuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgb25jZSB0aGUgaHlkcmF0aW9uIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaHlkcmF0aW9uQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKiogUmV0dXJucyB3aGV0aGVyIGh5ZHJhdGlvbiBpcyByZXF1aXJlZCBhbmQgbm90IGNvbXBsZXRlZC4gKi9cbiAgcHJvdGVjdGVkIGdldCBoeWRyYXRpb25SZXF1aXJlZCgpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoaXMgbWl4aW4gZXh0ZW5kcyBhIGJhc2UgY2xhc3Mgd2l0aCBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIGlmIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZWQuXG4gKiBJdCBhbHNvIGRlbGF5cyBzbG90Y2hhbmdlIGV2ZW50cyB1bnRpbCBoeWRyYXRpb24gaXMgY29tcGxldGUuXG4gKlxuICogQHBhcmFtIGJhc2UgVGhlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEByZXR1cm5zIEEgY2xhc3MgZXh0ZW5kZWQgd2l0aCB0aGUgaHlkcmF0aW9uIGNoZWNrIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJIeWRyYXRpb25NaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIGJhc2U6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiSHlkcmF0aW9uTWl4aW5DbGFzcyBleHRlbmRzIGJhc2UgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4ge1xuICAgIHByaXZhdGUgX2h5ZHJhdGlvblJlcXVpcmVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2h5ZHJhdGlvbkNvbXBsZXRlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oXG4gICAgICAocmVzb2x2ZSkgPT4gKHRoaXMuX3Jlc29sdmVIeWRyYXRpb24gPSByZXNvbHZlKSxcbiAgICApO1xuICAgIHByaXZhdGUgX3Jlc29sdmVIeWRyYXRpb24hOiAoaHlkcmF0aW9uUmVxdWlyZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGNvbXBsZXRlZCBoeWRyYXRpb24uXG4gICAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVkIGh5ZHJhdGlvblxuICAgICAqIGFuZCBgZmFsc2VgIGlmIG5vdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgb25jZSB0aGUgaHlkcmF0aW9uIGNvbXBsZXRlZC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGh5ZHJhdGlvbkNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2h5ZHJhdGlvbkNvbXBsZXRlO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgaHlkcmF0aW9uIGlzIHJlcXVpcmVkIGFuZCBub3QgY29tcGxldGVkLiAqL1xuICAgIHByb3RlY3RlZCBnZXQgaHlkcmF0aW9uUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgaHlkcmF0aW9uIGlzIG5lZWRlZCBieSBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGFkb3cgcm9vdFxuICAgICAgLy8gaXMgYXZhaWxhYmxlIGR1cmluZyBjb25zdHJ1Y3Rpb24vdXBncmFkZSBwaGFzZS5cbiAgICAgIHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkID0gISF0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoIXRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVIeWRyYXRpb24oZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiBwaGFzZSwgd2Ugd2FudCB0byBzdXBwcmVzcyBzbG90Y2hhbmdlIGV2ZW50cyBhcyB0aGV5XG4gICAgICAgIC8vIGNhbiBjYXVzZSByZW5kZXIgZGlmZmVyZW5jZXMsIHdoaWNoIHdvdWxkIGJyZWFrIGh5ZHJhdGlvbi4gQWZ0ZXJcbiAgICAgICAgLy8gaHlkcmF0aW9uIGlzIGNvbXBsZXRlLCB3ZSBkaXNwYXRjaCBhIG1hbnVhbCBzbG90Y2hhbmdlIGV2ZW50LCBpZiB0aGVyZVxuICAgICAgICAvLyBhcmUgZWxlbWVudHMgYXNzaWduZWQgdG8gYSBzbG90LlxuICAgICAgICBjb25zdCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXZlbnRPcHRpb25zOiBFdmVudExpc3RlbmVyT3B0aW9ucyA9IHsgY2FwdHVyZTogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBzbG90cyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgnc2xvdCcpO1xuICAgICAgICBpZiAoc2xvdHM/Lmxlbmd0aCkge1xuICAgICAgICAgIHNsb3RzLmZvckVhY2goKHNsb3QpID0+XG4gICAgICAgICAgICBzbG90LmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCwgZXZlbnRPcHRpb25zKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaHlkcmF0aW9uQ29tcGxldGUudGhlbigoKSA9PlxuICAgICAgICAgICAgc2xvdHMuZm9yRWFjaCgoc2xvdCkgPT4ge1xuICAgICAgICAgICAgICBzbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCwgZXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgICAgaWYgKHNsb3QuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNsb3QuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Nsb3RjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIC8vIFdoZW4gaHlkcmF0aW9uIGlzIG5lZWRlZCwgd2Ugd2FpdCB0aGUgaHlkcmF0aW9uIHByb2Nlc3MgdG8gZmluaXNoLCB3aGljaCBpcyBwYXRjaGVkXG4gICAgICAvLyBpbnRvIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBMaXRFbGVtZW50IGJhc2UgY2xhc3MuXG4gICAgICBzdXBlci51cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAodGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUh5ZHJhdGlvbih0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkh5ZHJhdGlvbk1peGluQ2xhc3MgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB7IGh0bWwsIHR5cGUgTGl0RWxlbWVudCwgbm90aGluZywgdHlwZSBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJIeWRyYXRpb25NaXhpbiwgdHlwZSBTYmJIeWRyYXRpb25NaXhpblR5cGUgfSBmcm9tICcuL2h5ZHJhdGlvbi1taXhpbi5qcyc7XG5cbmltcG9ydCAnLi4vLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuY29uc3QgU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSA9ICdkYXRhLXNzci1jaGlsZC1jb3VudCc7XG5jb25zdCBTTE9UTkFNRV9QUkVGSVggPSAnbGknO1xuXG5leHBvcnQgdHlwZSBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFyaWFIaWRkZW46IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB3aWxsVXBkYXRlIG9yIHNpbWlsYXIgY2hlY2tzLlxuICogQWxsb3dzIHRoZSB1c2FnZSBvZiB0aGUgc3RyaW5nIGxpdGVyYWwgJ2xpc3RDaGlsZHJlbicuXG4gKlxuICogQGV4YW1wbGVcbiAqIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczxXaXRoTGlzdENoaWxkcmVuPHRoaXM+Pik6IHZvaWQge1xuICogICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsaXN0Q2hpbGRyZW4nKSkge1xuICogICAgIC4uLlxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCB0eXBlIFdpdGhMaXN0Q2hpbGRyZW48XG4gIFQgZXh0ZW5kcyBTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+LFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQgPSBIVE1MRWxlbWVudCxcbj4gPSBUICYgeyBsaXN0Q2hpbGRyZW46IENbXSB9O1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQsXG4+IGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgYWNjZXNzb3IgbGlzdENoaWxkcmVuOiBDW107XG4gIHByb3RlY3RlZCByZW5kZXJMaXN0KFxuICAgIGF0dHJpYnV0ZXM/OiB7XG4gICAgICBjbGFzcz86IHN0cmluZztcbiAgICAgIGFyaWFMYWJlbD86IHN0cmluZztcbiAgICAgIGFyaWFMYWJlbGxlZGJ5Pzogc3RyaW5nO1xuICAgIH0sXG4gICAgbGlzdEl0ZW1BdHRyaWJ1dGVzPzoge1xuICAgICAgbG9jYWxOYW1lVmlzdWFsT25seT86IHN0cmluZ1tdO1xuICAgIH0sXG4gICk6IFRlbXBsYXRlUmVzdWx0O1xuICBwcm90ZWN0ZWQgbGlzdFNsb3RFbnRyaWVzKCk6IFNiYk5hbWVkU2xvdFByb3BlcnRpZXNbXTtcbiAgcHJvdGVjdGVkIHJlbmRlckhpZGRlblNsb3QoKTogVGVtcGxhdGVSZXN1bHQ7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJOYW1lZFNsb3RMaXN0TWl4aW4gPSA8XG4gIEMgZXh0ZW5kcyBIVE1MRWxlbWVudCxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4sXG4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PiAmIFQgPT4ge1xuICAvKipcbiAgICogVGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIG5hbWVkIHNsb3QgbGlzdCBvYnNlcnZlciBmdW5jdGlvbmFsaXR5LlxuICAgKiBUaGlzIGFsbG93cyB1c2luZyB0aGUgcGF0dGVybiBvZiByZW5kZXJpbmcgYSBuYW1lZCBzbG90IGZvciBlYWNoIGNoaWxkLCB3aGljaCBhbGxvd3NcbiAgICogd3JhcHBpbmcgY2hpbGRyZW4gaW4gYW4gdWwvbGkgbGlzdC5cbiAgICovXG4gIGFic3RyYWN0IGNsYXNzIE5hbWVkU2xvdExpc3RFbGVtZW50PEMgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PlxuICAgIGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW4oc3VwZXJDbGFzcylcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxDPj5cbiAge1xuICAgIC8qKiBBIGxpc3Qgb2YgbG93ZXItY2FzZWQgdGFnIG5hbWVzIHRvIG1hdGNoIGFnYWluc3QuIChlLmcuIGBzYmItbGlua2ApICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGRlZmluZWQgdGFnIG5hbWVzLlxuICAgICAqIFRoaXMgYXJyYXkgaXMgb25seSB1cGRhdGVkIGlmIHRoZXJlIGlzIGFuIGFjdHVhbCBjaGFuZ2VcbiAgICAgKiB0byB0aGUgY2hpbGQgZWxlbWVudHMuXG4gICAgICovXG4gICAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGxpc3RDaGlsZHJlbjogQ1tdID0gW107XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgdGhpcy5faGFuZGxlU2xvdGNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3Q/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9oYW5kbGVTbG90Y2hhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVTbG90Y2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbGlzdENoaWxkcmVuID0gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuID8/IFtdKS5maWx0ZXIoKGUpOiBlIGlzIEMgPT5cbiAgICAgICAgdGhpcy5saXN0Q2hpbGRMb2NhbE5hbWVzLmluY2x1ZGVzKGUubG9jYWxOYW1lKSxcbiAgICAgICk7XG4gICAgICAvLyBJZiB0aGUgc2xvdHRlZCBjaGlsZCBpbnN0YW5jZXMgaGF2ZSBub3QgY2hhbmdlZCwgd2UgY2FuIHNraXAgc3luY2luZyBhbmQgdXBkYXRpbmdcbiAgICAgIC8vIHRoZSBsaW5rIHJlZmVyZW5jZSBsaXN0LlxuICAgICAgaWYgKFxuICAgICAgICBsaXN0Q2hpbGRyZW4ubGVuZ3RoID09PSB0aGlzLmxpc3RDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZXZlcnkoKGUsIGkpID0+IGxpc3RDaGlsZHJlbltpXSA9PT0gZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdENoaWxkcmVuXG4gICAgICAgIC5maWx0ZXIoKGMpID0+ICFsaXN0Q2hpbGRyZW4uaW5jbHVkZXMoYykpXG4gICAgICAgIC5mb3JFYWNoKChjKSA9PiBjLnJlbW92ZUF0dHJpYnV0ZSgnc2xvdCcpKTtcbiAgICAgIHRoaXMubGlzdENoaWxkcmVuID0gbGlzdENoaWxkcmVuO1xuICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZm9yRWFjaCgoYywgaW5kZXgpID0+XG4gICAgICAgIGMuc2V0QXR0cmlidXRlKCdzbG90JywgYCR7U0xPVE5BTUVfUFJFRklYfS0ke2luZGV4fWApLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBzc3IgYXR0cmlidXRlLCBvbmNlIHdlIGhhdmUgYWN0dWFsbHkgaW5pdGlhbGl6ZWQgdGhlIGNoaWxkcmVuIGVsZW1lbnRzLlxuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgbGlzdCBhbmQgbGlzdCBzbG90cyBmb3Igc2xvdHRlZCBjaGlsZHJlbiBvciBhIG51bWJlciBvZiBsaXN0IHNsb3RzXG4gICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgcG9zc2libGUgb3B0aW1pemF0aW9uIGZvciBTU1IsIGFzIGluIGFuIFNTUiBMaXQgZW52aXJvbm1lbnRcbiAgICAgKiBvdGhlciBlbGVtZW50cyBhcmUgbm90IGF2YWlsYWJsZSwgYnV0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbWV0YVxuICAgICAqIGZyYW1ld29yayB3cmFwcGVyIChsaWtlIGUuZy4gUmVhY3QpLiBUaGlzIGFsbG93cyB0byBwcm92aWRlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBjaGlsZHJlbiB0byBiZSBwYXNzZWQgdmlhIHRoZSBgZGF0YS1zc3ItY2hpbGQtY291bnRgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVuZGVyTGlzdChcbiAgICAgIGF0dHJpYnV0ZXM6IHsgY2xhc3M/OiBzdHJpbmc7IGFyaWFMYWJlbD86IHN0cmluZzsgYXJpYUxhYmVsbGVkYnk/OiBzdHJpbmcgfSA9IHt9LFxuICAgICAgbGlzdEl0ZW1BdHRyaWJ1dGVzOiB7IGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXSB9ID0ge30sXG4gICAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgICAgY29uc3QgbGlzdFNsb3ROYW1lczogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdID0gdGhpcy5saXN0U2xvdEVudHJpZXMobGlzdEl0ZW1BdHRyaWJ1dGVzKTtcblxuICAgICAgaWYgKGxpc3RTbG90TmFtZXMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzcz0ke2F0dHJpYnV0ZXMuY2xhc3MgfHwgdGhpcy5sb2NhbE5hbWV9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPSR7YXR0cmlidXRlcy5hcmlhTGFiZWwgfHwgbm90aGluZ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsbGVkYnkgfHwgbm90aGluZ31cbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2xpc3RTbG90TmFtZXMubWFwKFxuICAgICAgICAgICAgICAoc2xvdCkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgICA8bGkgYXJpYS1oaWRkZW49JHtzbG90LmFyaWFIaWRkZW4gfHwgbm90aGluZ30+XG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPSR7c2xvdC5uYW1lfT48L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgYCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICAke3RoaXMucmVuZGVySGlkZGVuU2xvdCgpfVxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChsaXN0U2xvdE5hbWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gaHRtbGA8c2JiLXNjcmVlbi1yZWFkZXItb25seT4ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0ke2F0dHJpYnV0ZXMuY2xhc3MgfHwgdGhpcy5sb2NhbE5hbWV9PlxuICAgICAgICAgICAgPHNwYW4+PHNsb3QgbmFtZT0ke2xpc3RTbG90TmFtZXNbMF0ubmFtZX0+PC9zbG90Pjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgJHt0aGlzLnJlbmRlckhpZGRlblNsb3QoKX0gYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckhpZGRlblNsb3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNiYk5hbWVkU2xvdFByb3BlcnRpZXMsIHdoaWNoIGhvbGRzIHRoZSBsaXN0IHNsb3QgbmFtZXMgYW5kIHRoZSBoaWRkZW4gcHJvcGVydHk7XG4gICAgICogaXRzIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgY2hpbGRyZW4gb3IgdGhlIGBkYXRhLXNzci1jaGlsZC1jb3VudGAgYXR0cmlidXRlIHZhbHVlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhIHBvc3NpYmxlIG9wdGltaXphdGlvbiBmb3IgU1NSLCBhcyBpbiBhbiBTU1IgTGl0IGVudmlyb25tZW50XG4gICAgICogb3RoZXIgZWxlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUsIGJ1dCBtaWdodCBiZSBhdmFpbGFibGUgaW4gdGhlIG1ldGFcbiAgICAgKiBmcmFtZXdvcmsgd3JhcHBlciAobGlrZSBlLmcuIFJlYWN0KS4gVGhpcyBhbGxvd3MgdG8gcHJvdmlkZSB0aGUgbnVtYmVyIG9mXG4gICAgICogY2hpbGRyZW4gdG8gYmUgcGFzc2VkIHZpYSB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxpc3RTbG90RW50cmllcyhsaXN0SXRlbUF0dHJpYnV0ZXM6IHtcbiAgICAgIGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXTtcbiAgICB9KTogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdIHtcbiAgICAgIGNvbnN0IGxpc3RDaGlsZHJlbiA9IHRoaXMubGlzdENoaWxkcmVuLmxlbmd0aFxuICAgICAgICA/IHRoaXMubGlzdENoaWxkcmVuXG4gICAgICAgIDogQXJyYXkuZnJvbSh7IGxlbmd0aDogKyh0aGlzLmdldEF0dHJpYnV0ZShTU1JfQ0hJTERfQ09VTlRfQVRUUklCVVRFKSA/PyAwKSB9KTtcbiAgICAgIHJldHVybiBsaXN0Q2hpbGRyZW4ubWFwKChlLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogYCR7U0xPVE5BTUVfUFJFRklYfS0ke2l9YCxcbiAgICAgICAgICBhcmlhSGlkZGVuOlxuICAgICAgICAgICAgbGlzdEl0ZW1BdHRyaWJ1dGVzPy5sb2NhbE5hbWVWaXN1YWxPbmx5Py5pbmNsdWRlcygoZSBhcyBIVE1MRWxlbWVudCkubG9jYWxOYW1lKSA/P1xuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaGlkZGVuIHNsb3QsIHdoaWNoIGlzIGludGVuZGVkIGFzIHRoZSBjaGlsZHJlbiBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAqIFdoZW4gYW4gZWxlbWVudCB3aXRob3V0IGEgc2xvdCBhdHRyaWJ1dGUgaXMgc2xvdHRlZCB0byB0aGUgZWxlbWVudCwgaXQgdHJpZ2dlcnNcbiAgICAgKiB0aGUgc2xvdGNoYW5nZSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXNzaWduIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lZCBzbG90LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJIaWRkZW5TbG90KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIHJldHVybiBodG1sYDxzcGFuIGhpZGRlbj48c2xvdD48L3Nsb3Q+PC9zcGFuPmA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE5hbWVkU2xvdExpc3RFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYk5lZ2F0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIG5lZ2F0aXZlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIG5lZ2F0aXZlIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiTmVnYXRpdmVNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5lZ2F0aXZlTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJOZWdhdGl2ZUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgU2JiTmVnYXRpdmVNaXhpblR5cGUge1xuICAgIC8qKiBOZWdhdGl2ZSBjb2xvcmluZyB2YXJpYW50IGZsYWcuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBuZWdhdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIFNiYk5lZ2F0aXZlRWxlbWVudCBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5lZ2F0aXZlTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2V2ZW50aW5nLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYlBhbmVsTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnO1xuICBwdWJsaWMgYWNjZXNzb3IgYm9yZGVybGVzczogYm9vbGVhbjtcbiAgcHVibGljIGFjY2Vzc29yIGV4cGFuc2lvblN0YXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNiYlBhbmVsU2l6ZSA9ICdzJyB8ICdtJztcblxuLyoqXG4gKiBNaXhpbiBmb3IgY29tbW9uIHBhbmVsIGJlaGF2aW9yc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiUGFuZWxNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlBhbmVsTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJQYW5lbEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgU2JiUGFuZWxNaXhpblR5cGUge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgICAgcGFuZWxDb25uZWN0ZWQ6ICdwYW5lbENvbm5lY3RlZCcsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIC8qKiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgcGFuZWwuICovXG4gICAgQHByb3BlcnR5KCkgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnID0gJ3doaXRlJztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSB1bnNlbGVjdGVkIHBhbmVsIGhhcyBhIGJvcmRlci4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGJvcmRlcmxlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAaW50ZXJuYWwgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSBsYWJlbCB3aGVuIGluIGV4cGFuc2lvbiBwYW5lbCAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSgpXG4gICAgcHVibGljIGFjY2Vzc29yIGV4cGFuc2lvblN0YXRlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEludGVybmFsIGV2ZW50IHRoYXQgZW1pdHMgd2hlbiB0aGUgY2hlY2tib3ggaXMgbG9hZGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3BhbmVsQ29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgICAgdGhpcyxcbiAgICAgIFNiYlBhbmVsRWxlbWVudC5ldmVudHMucGFuZWxDb25uZWN0ZWQsXG4gICAgICB7IGJ1YmJsZXM6IHRydWUgfSxcbiAgICApO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5fcGFuZWxDb25uZWN0ZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJQYW5lbEVsZW1lbnQgYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJQYW5lbE1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG4vLyBEZWZpbmUgdGhlIGludGVyZmFjZSBmb3IgdGhlIG1peGluXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGUge1xuICBwcm90ZWN0ZWQgc3RhcnRVcGRhdGUoKTogdm9pZDtcbiAgcHJvdGVjdGVkIGNvbXBsZXRlVXBkYXRlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhpcyBtaXhpbiBhbGxvd3Mgc2NoZWR1bGluZyBtYW51YWwgdXBkYXRlcywgd2hpY2ggYWZmZWN0IHVwZGF0ZUNvbXBsZXRlLlxuICogQHBhcmFtIGJhc2UgVGhlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEByZXR1cm5zIEEgY2xhc3MgZXh0ZW5kZWQgd2l0aCB0aGUgc2xvdCBjaGlsZCBvYnNlcnZlciBmdW5jdGlvbmFsaXR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBiYXNlOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYlVwZGF0ZVNjaGVkdWxlckVsZW1lbnRcbiAgICBleHRlbmRzIGJhc2VcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlPlxuICB7XG4gICAgcHJpdmF0ZSBfdXBkYXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHByaXZhdGUgX3VwZGF0ZVJlc29sdmUgPSAoKTogdm9pZCA9PiB7fTtcblxuICAgIHByb3RlY3RlZCBzdGFydFVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gKHRoaXMuX3VwZGF0ZVJlc29sdmUgPSByKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbXBsZXRlVXBkYXRlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fdXBkYXRlUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgICBhd2FpdCB0aGlzLl91cGRhdGVQcm9taXNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYlVwZGF0ZVNjaGVkdWxlckVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuIl0sIm5hbWVzIjpbIl9hIiwic3RhdGUiLCJTYmJQYW5lbEVsZW1lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFvQmEsTUFBQSxtQkFBbUIsQ0FDOUIsZUFDaUQ7TUFDbEMsc0JBQWtCLE1BQUE7O3NCQUFTOzs7O0FBQTNCLFdBQUEsbUJBQTJCLFlBQVU7QUFBQTs7QUFLbEQsdURBQUEsa0JBQUEsTUFBQSx3QkFBb0MsS0FBSzs7OztNQUF6QyxJQUFnQixXQUEwQjtBQUFBLGVBQUEsbUJBQUE7QUFBQSxNQUFBO0FBQUEsTUFBMUMsSUFBZ0IsU0FBMEIsT0FBQTtBQUFBLDJCQUFBLDRCQUFBO0FBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFNaEMsdUJBQW9CO0FBQ3JCLGVBQUE7QUFBQSxNQUFBO0FBQUEsT0FQ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
1036
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZGlzYWJsZWQtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvZm9ybS1hc3NvY2lhdGVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL3JlcXVpcmVkLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2Zvcm0tYXNzb2NpYXRlZC1jaGVja2JveC1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9mb3JtLWFzc29jaWF0ZWQtcmFkaW8tYnV0dG9uLW1peGluLnRzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvbWl4aW5zL2h5ZHJhdGlvbi1taXhpbi50cyIsIi4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9jb3JlL21peGlucy9uYW1lZC1zbG90LWxpc3QtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvbmVnYXRpdmUtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvcGFuZWwtbWl4aW4udHMiLCIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9taXhpbnMvdXBkYXRlLXNjaGVkdWxlci1taXhpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUsIGdldE92ZXJyaWRlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZSB9IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiRGlzYWJsZWRNaXhpblR5cGUge1xuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJEaXNhYmxlZEludGVyYWN0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGRpc2FibGVkSW50ZXJhY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgZGlzYWJsZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJEaXNhYmxlZE1peGluID0gPFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRGlzYWJsZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgQGdldE92ZXJyaWRlKChlLCB2KSA9PiB2IHx8IGUuaXNEaXNhYmxlZEV4dGVybmFsbHkoKSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBhcyAnb3InIGNoZWNrIHRvIHRoZSBjdXJyZW50IGRpc2FibGVkIHN0YXRlLlxuICAgICAqIENhbiBlLmcuIGJlIHVzZWQgdG8gcmVhZCBkaXNhYmxlZCBzdGF0ZSBvZiBhIGdyb3VwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0Rpc2FibGVkRXh0ZXJuYWxseSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU2JiRGlzYWJsZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJEaXNhYmxlZE1peGluVHlwZT4gJiBUO1xufTtcblxuLyoqXG4gKiBFbmhhbmNlIHlvdXIgY29tcG9uZW50IHdpdGggYSBkaXNhYmxlZCBpbnRlcmFjdGl2ZSBwcm9wZXJ0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkRpc2FibGVkTWl4aW5UeXBlPixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVFbGVtZW50XG4gICAgZXh0ZW5kcyBzdXBlckNsYXNzXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+XG4gIHtcbiAgICAvKiogV2hldGhlciB0aGUgYnV0dG9uIHNob3VsZCBiZSBhcmlhLWRpc2FibGVkIGJ1dCBzdGF5IGludGVyYWN0aXZlLiAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Rpc2FibGVkLWludGVyYWN0aXZlJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlZEludGVyYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkRpc2FibGVkVGFiSW5kZXhBY3Rpb25NaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudCAmIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkRpc2FibGVkTWl4aW5UeXBlICYgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiRGlzYWJsZWRUYWJJbmRleEFjdGlvblxuICAgIGV4dGVuZHMgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluKFNiYkRpc2FibGVkTWl4aW4oc3VwZXJDbGFzcykpXG4gICAgaW1wbGVtZW50cyBTYmJEaXNhYmxlZE1peGluVHlwZSwgU2JiRGlzYWJsZWRJbnRlcmFjdGl2ZU1peGluVHlwZVxuICB7XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZGlzYWJsZWRJbnRlcmFjdGl2ZScpKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFEaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZSA/ICd0cnVlJyA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkRpc2FibGVkVGFiSW5kZXhBY3Rpb24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxcbiAgICBTYmJEaXNhYmxlZE1peGluVHlwZSAmIFNiYkRpc2FibGVkSW50ZXJhY3RpdmVNaXhpblR5cGVcbiAgPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8ViA9IHN0cmluZz4ge1xuICBwdWJsaWMgZ2V0IGZvcm0oKTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbDtcbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZztcbiAgcHVibGljIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpO1xuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFYgfCBudWxsO1xuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBWIHwgbnVsbCk7XG5cbiAgcHVibGljIGdldCB2YWxpZGl0eSgpOiBWYWxpZGl0eVN0YXRlO1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCk6IHN0cmluZztcbiAgcHVibGljIGdldCB3aWxsVmFsaWRhdGUoKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgZm9ybURpc2FibGVkOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIHB1YmxpYyBjaGVja1ZhbGlkaXR5KCk6IGJvb2xlYW47XG4gIHB1YmxpYyByZXBvcnRWYWxpZGl0eSgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBmb3JtQXNzb2NpYXRlZENhbGxiYWNrPyhmb3JtOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsKTogdm9pZDtcbiAgcHVibGljIGZvcm1EaXNhYmxlZENhbGxiYWNrKGRpc2FibGVkOiBib29sZWFuKTogdm9pZDtcbiAgcHVibGljIGFic3RyYWN0IGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBhYnN0cmFjdCBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBGb3JtQXNzb2NpYXRlZE1peGluIGVuYWJsZXMgbmF0aXZlIGZvcm0gc3VwcG9ydCBmb3IgY3VzdG9tIGNvbnRyb2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50PiwgViA9IHN0cmluZz4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlPFY+PiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZEVsZW1lbnRcbiAgICBleHRlbmRzIHN1cGVyQ2xhc3NcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+XG4gIHtcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1Bc3NvY2lhdGVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZvcm0gb3duZXIgb2YgdGhlIGludGVybmFscyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBmb3JtKCk6IEhUTUxGb3JtRWxlbWVudCB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLmZvcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZm9ybSBlbGVtZW50LiBXaWxsIGJlIHJlYWQgZnJvbSBuYW1lIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXZlbG9wZXIgbm90ZTogSW4gdGhpcyBjYXNlIHVwZGF0aW5nIHRoZSBhdHRyaWJ1dGUgbXVzdCBiZSBzeW5jaHJvbm91cy5cbiAgICAgKiBEdWUgdG8gdGhpcyBpdCBpcyBpbXBsZW1lbnRlZCBhcyBhIGdldHRlci9zZXR0ZXIgYW5kIHRoZSBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSBoYW5kbGVzIHRoZSBkaWZmIGNoZWNrLlxuICAgICAqL1xuICAgIEBwcm9wZXJ0eSgpXG4gICAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBgJHtuYW1lfWApO1xuXG4gICAgICAvLyBGb3IgYEZvcm1EYXRhYCB2YWx1ZXMsIHdlIGhhdmUgdG8gbWFudWFsbHkgdXBkYXRlIHRoZSBmaWVsZE5hbWUga2V5XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbmFtZScpID8/ICcnO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsTmFtZTtcbiAgICB9XG5cbiAgICAvKiogVmFsdWUgb2YgdGhlIGZvcm0gZWxlbWVudC4gKi9cbiAgICBAcHJvcGVydHkoKVxuICAgIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFYgfCBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBWIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgX3ZhbHVlOiBWIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBWYWxpZGl0eVN0YXRlIG9iamVjdCBmb3IgaW50ZXJuYWxzIHRhcmdldCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZGl0eSgpOiBWYWxpZGl0eVN0YXRlIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFscy52YWxpZGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQgd291bGQgYmUgc2hvd24gdG8gdGhlIHVzZXJcbiAgICAgKiBpZiBpbnRlcm5hbHMgdGFyZ2V0IGVsZW1lbnQgd2FzIHRvIGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpbnRlcm5hbHMgdGFyZ2V0IGVsZW1lbnQgd2lsbCBiZSB2YWxpZGF0ZWRcbiAgICAgKiB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZDsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWxsVmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMud2lsbFZhbGlkYXRlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcblxuICAgIC8qKiBXaGVuZXZlciBhIHN1cnJvdW5kaW5nIGZvcm0gb3IgZmllbGRzZXQgaXMgY2hhbmdpbmcgaXRzIGRpc2FibGVkIHN0YXRlLiAqL1xuICAgIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBmb3JtRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBvbGQ6IHN0cmluZyB8IG51bGwsXG4gICAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChuYW1lICE9PSAnbmFtZScgfHwgb2xkICE9PSB2YWx1ZSkge1xuICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGludGVybmFscyB0YXJnZXQgZWxlbWVudCBoYXMgbm8gdmFsaWRpdHkgcHJvYmxlbXM7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiBGaXJlcyBhbiBpbnZhbGlkIGV2ZW50IGF0IHRoZSBlbGVtZW50IGluIHRoZSBsYXR0ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVja1ZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxzLmNoZWNrVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW50ZXJuYWxzIHRhcmdldCBlbGVtZW50IGhhcyBubyB2YWxpZGl0eSBwcm9ibGVtczsgb3RoZXJ3aXNlLFxuICAgICAqIHJldHVybnMgZmFsc2UsIGZpcmVzIGFuIGludmFsaWQgZXZlbnQgYXQgdGhlIGVsZW1lbnQsXG4gICAgICogYW5kIChpZiB0aGUgZXZlbnQgaXNuJ3QgY2FuY2VsZWQpIHJlcG9ydHMgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBmb3JtIGVsZW1lbnQgY2hhbmdlcy5cbiAgICAgKiBFbGVtZW50SW50ZXJuYWxzLmZvcm0gcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBmcm9tIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybUFzc29jaWF0ZWRDYWxsYmFjaz8oZm9ybTogSFRNTEZvcm1FbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbmV2ZXIgYSBzdXJyb3VuZGluZyBmb3JtIC8gZmllbGRzZXQgY2hhbmdlcyBkaXNhYmxlZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWRcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmb3JtRGlzYWJsZWRDYWxsYmFjayhkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgLy8gVGhpcyBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgaWYgdGhlIGRpc2FibGVkIHByb3BlcnR5IGNoYW5nZXMgb3IgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBvZiBhIGZpZWxkc2V0IG9yIGZvcm0gY2hhbmdlcy5cbiAgICAgIC8vIFdlIG5lZWQgdG8gcG9zdHBvbmUgdGhlIGFzc2lnbm1lbnQsIG90aGVyd2lzZSBpdCBpbnRlcmZlcmVzIHdpdGggZGlzYWJsZWQgc3RhdHVzIHNldHRpbmdcbiAgICAgIC8vIGFuZCBsZWFkcyB0byBhIHdyb25nIHN0YXRlIChlLmcuIGVtYmVkZGVkIHNiYi12aXN1YWwtY2hlY2tib3gpLlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybURpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZvcm0gaXMgYmVpbmcgcmVzZXQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyDigJxyZXN0b3Jl4oCdLCBvciB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBmdWxmaWxsIGF1dG9maWxsIG9uIGJlaGFsZiBvZlxuICAgICAqICB1c2VyIGluIHdoaWNoIGNhc2UgcmVhc29uIGlzIOKAnGF1dG9jb21wbGV0ZeKAnS5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2Yg4oCccmVzdG9yZeKAnSwgc3RhdGUgaXMgYSBzdHJpbmcsIEZpbGUsIG9yIEZvcm1EYXRhIG9iamVjdFxuICAgICAqICBwcmV2aW91c2x5IHNldCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldEZvcm1WYWx1ZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICAgICk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gZm9ybSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEFkYXB0cyBhbmQgc2V0cyB0aGUgZm9ybVZhbHVlIGluIHRoZSBzdXBwb3J0ZWQgZm9ybWF0IChzdHJpbmcgfCBGb3JtRGF0YSB8IEZpbGUgfCBudWxsKVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3NldEZvcm1WYWx1ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZDtcbiAgfVxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZTxWPj4gJlxuICAgIFQ7XG59O1xuXG4vKipcbiAqIEEgdmFsdWUgdG8gYmUgcmVzdG9yZWQgZm9yIGEgY29tcG9uZW50J3MgZm9ybSB2YWx1ZS4gSWYgYSBjb21wb25lbnQncyBmb3JtXG4gKiBzdGF0ZSBpcyBhIGBGb3JtRGF0YWAgb2JqZWN0LCBpdHMgZW50cnkgbGlzdCBvZiBuYW1lIGFuZCB2YWx1ZXMgd2lsbCBiZVxuICogcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1SZXN0b3JlU3RhdGUgPSBGaWxlIHwgc3RyaW5nIHwgW3N0cmluZywgRm9ybURhdGFFbnRyeVZhbHVlXVtdO1xuXG4vKipcbiAqIFRoZSByZWFzb24gYSBmb3JtIGNvbXBvbmVudCBpcyBiZWluZyByZXN0b3JlZCBmb3IsIGVpdGhlciBgJ3Jlc3RvcmUnYCBmb3JcbiAqIGJyb3dzZXIgcmVzdG9yYXRpb24gb3IgYCdhdXRvY29tcGxldGUnYCBmb3IgcmVzdG9yaW5nIHVzZXIgdmFsdWVzLlxuICovXG5leHBvcnQgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbiA9ICdyZXN0b3JlJyB8ICdhdXRvY29tcGxldGUnO1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlIH0gZnJvbSAnLi9mb3JtLWFzc29jaWF0ZWQtbWl4aW4uanMnO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJSZXF1aXJlZE1peGluVHlwZSB7XG4gIHB1YmxpYyBhY2Nlc3NvciByZXF1aXJlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZSB5b3VyIGNvbXBvbmVudCB3aXRoIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJSZXF1aXJlZE1peGluID0gPFxuICBUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50ICYgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGU8Vj4+LFxuICBWLFxuPihcbiAgc3VwZXJDbGFzczogVCxcbik6IEFic3RyYWN0Q29uc3RydWN0b3I8U2JiUmVxdWlyZWRNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYlJlcXVpcmVkRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZC4gKi9cbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgLy8gVG8gcHJvdmlkZSB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgbmF0aXZlIHJlcXVpcmVkIHN0YXRlLFxuICAgICAgLy8gYW55IHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uXG4gICAgICB0aGlzLl9yZXF1aXJlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkIHx8IHRoaXMuaXNSZXF1aXJlZEV4dGVybmFsbHkoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgLy8gRmlyZWZveCBuZWVkcyBleHBsaWNpdGx5IHNldCBhcmlhLXJlcXVpcmVkIHZhbHVlLlxuICAgICAgICB0aGlzLmludGVybmFscy5hcmlhUmVxdWlyZWQgPSBgJHt0aGlzLnJlcXVpcmVkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGFzICdvcicgY2hlY2sgdG8gdGhlIGN1cnJlbnQgcmVxdWlyZWQgc3RhdGUuXG4gICAgICogQ2FuIGUuZy4gYmUgdXNlZCB0byByZWFkIHJlcXVpcmVkIHN0YXRlIG9mIGEgZ3JvdXAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJSZXF1aXJlZEVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlJlcXVpcmVkTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHsgZGVmYXVsdENvbnZlcnRlciwgdHlwZSBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBob3N0QXR0cmlidXRlcyB9IGZyb20gJy4uL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcHJldmVudFNjcm9sbE9uU3BhY2ViYXJQcmVzcyB9IGZyb20gJy4uL2V2ZW50aW5nLmpzJztcblxuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuaW1wb3J0IHsgU2JiRGlzYWJsZWRNaXhpbiwgdHlwZSBTYmJEaXNhYmxlZE1peGluVHlwZSB9IGZyb20gJy4vZGlzYWJsZWQtbWl4aW4uanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICB0eXBlIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW5UeXBlLFxufSBmcm9tICcuL2Zvcm0tYXNzb2NpYXRlZC1taXhpbi5qcyc7XG5pbXBvcnQgeyBTYmJSZXF1aXJlZE1peGluLCB0eXBlIFNiYlJlcXVpcmVkTWl4aW5UeXBlIH0gZnJvbSAnLi9yZXF1aXJlZC1taXhpbi5qcyc7XG5cbnR5cGUgQ2hlY2tlZFNldHRlclZhbHVlID0geyB2YWx1ZTogYm9vbGVhbjsgYXR0cmlidXRlOiBib29sZWFuIH07XG5cbmV4cG9ydCBkZWNsYXJlIGFic3RyYWN0IGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpblR5cGVcbiAgZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZVxuICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRNaXhpblR5cGU+LCBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPlxue1xuICBwdWJsaWMgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbjtcbiAgcHVibGljIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKTtcblxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKTtcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pO1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLCByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZEV4dGVybmFsbHkoKTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGlzUmVxdWlyZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIEZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpbiBlbmFibGVzIG5hdGl2ZSBmb3JtIHN1cHBvcnQgZm9yIGNoZWNrYm94IGNvbnRyb2xzLlxuICpcbiAqIEluaGVyaXRlZCBjbGFzc2VzIE1VU1QgaW1wbGVtZW50IHRoZSBhcmlhQ2hlY2tlZCBzdGF0ZSAoRWxlbWVudEludGVybmFscykgdGhlbXNlbHZlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkQ2hlY2tib3hNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveE1peGluVHlwZT4gJiBUID0+IHtcbiAgQGhvc3RBdHRyaWJ1dGVzKHtcbiAgICB0YWJpbmRleDogJzAnLFxuICB9KVxuICBhYnN0cmFjdCBjbGFzcyBTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94RWxlbWVudFxuICAgIGV4dGVuZHMgU2JiRGlzYWJsZWRNaXhpbihTYmJSZXF1aXJlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oc3VwZXJDbGFzcykpKVxuICAgIGltcGxlbWVudHMgUGFydGlhbDxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPlxuICB7XG4gICAgcHJpdmF0ZSBfYXR0cmlidXRlTXV0YXRpb25CbG9ja2VkID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZC4gKi9cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGNvbnZlcnRlcjoge1xuICAgICAgICAuLi5kZWZhdWx0Q29udmVydGVyLFxuICAgICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHNldHRlciBzbyB0aGF0IHdlIGtub3cgaXQgd2FzIGNhbGxlZCBieSBhdHRyaWJ1dGUgY2hhbmdlLlxuICAgICAgICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiB1bmtub3duKTogQ2hlY2tlZFNldHRlclZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWZhdWx0Q29udmVydGVyLmZyb21BdHRyaWJ1dGU/Lih2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgYXR0cmlidXRlOiB0cnVlIH0gYXMgQ2hlY2tlZFNldHRlclZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KVxuICAgIHB1YmxpYyBzZXQgY2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgY29uc3QgYXR0cmlidXRlU2V0dGVyID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/ICh2YWx1ZSBhcyB1bmtub3duIGFzIENoZWNrZWRTZXR0ZXJWYWx1ZSkuYXR0cmlidXRlIDogZmFsc2U7XG4gICAgICBpZiAoYXR0cmlidXRlU2V0dGVyKSB7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIGFzIHVua25vd24gYXMgQ2hlY2tlZFNldHRlclZhbHVlKS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXMgc29vbiBhcyBtdXRhdGlvbiB3YXMgZG9uZSBub3QgYnkgc2V0dGluZyBhdHRyaWJ1dGUsXG4gICAgICAvLyB3ZSBuZWVkIHRvIGJsb2NrIHN5bmNpbmcgYXR0cmlidXRlLlxuICAgICAgaWYgKHRoaXMuaGFzVXBkYXRlZCAmJiAhYXR0cmlidXRlU2V0dGVyKSB7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tlZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAgICogQGRlZmF1bHQgJ2NoZWNrYm94J1xuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdjaGVja2JveCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgIHRoaXMuaW50ZXJuYWxzLnJvbGUgPSAnY2hlY2tib3gnO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9oYW5kbGVVc2VySW50ZXJhY3Rpb24pO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgcHJldmVudFNjcm9sbE9uU3BhY2ViYXJQcmVzcyk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5faGFuZGxlS2V5Ym9hcmRJbnRlcmFjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2hhbmRsZVVzZXJJbnRlcmFjdGlvbik7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBwcmV2ZW50U2Nyb2xsT25TcGFjZWJhclByZXNzKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9oYW5kbGVLZXlib2FyZEludGVyYWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb2xkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgKTogdm9pZCB7XG4gICAgICAvLyBBdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhZnRlciBwcm9ncmFtbWF0aWMgb3IgbWFudWFsIHN0YXRlIGNoYW5nZS5cbiAgICAgIGlmIChuYW1lICE9PSAnY2hlY2tlZCcgfHwgIXRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCkge1xuICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICAgIHRoaXMuX2F0dHJpYnV0ZU11dGF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBDYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyB0cnlpbmcgdG8gcmVzdG9yZSBlbGVtZW504oCZcyBzdGF0ZSB0byBzdGF0ZSBpbiB3aGljaCBjYXNlXG4gICAgICogIHJlYXNvbiBpcyDigJxyZXN0b3Jl4oCdLCBvciB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBmdWxmaWxsIGF1dG9maWxsIG9uIGJlaGFsZiBvZlxuICAgICAqICB1c2VyIGluIHdoaWNoIGNhc2UgcmVhc29uIGlzIOKAnGF1dG9jb21wbGV0ZeKAnS5cbiAgICAgKiAgSW4gdGhlIGNhc2Ugb2Yg4oCccmVzdG9yZeKAnSwgc3RhdGUgaXMgYSBzdHJpbmcsIEZpbGUsIG9yIEZvcm1EYXRhIG9iamVjdFxuICAgICAqICBwcmV2aW91c2x5IHNldCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldEZvcm1WYWx1ZS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgbG9naWMgd2hpY2ggaXMgYmVpbmcgZXhlY3V0ZWQgd2hlbiB1c2VyXG4gICAgICogaW50ZXJhY3Rpb24gaGFwcGVucyBhbmQgc3RhdGUgaXMgbm90IGRpc2FibGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB3aXRoVXNlckludGVyYWN0aW9uPygpOiB2b2lkO1xuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUsIGAke3RoaXMuY2hlY2tlZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRyaWdnZXJlZCBvbiBrZXlib2FyZCB1c2VyIGludGVyYWN0aW9uIHdpdGggY2hlY2tib3guICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZVVzZXJJbnRlcmFjdGlvbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogTWV0aG9kIHRyaWdnZXJlZCBvbiB1c2VyIGludGVyYWN0aW9uIHdpdGggY2hlY2tib3guICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlVXNlckludGVyYWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy53aXRoVXNlckludGVyYWN0aW9uPy4oKTtcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgICB0aGlzLl9hdHRyaWJ1dGVNdXRhdGlvbkJsb2NrZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IElucHV0RXZlbnQoJ2lucHV0JywgeyBjb21wb3NlZDogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gU2JiRm9ybUFzc29jaWF0ZWRDaGVja2JveEVsZW1lbnQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxTYmJGb3JtQXNzb2NpYXRlZENoZWNrYm94TWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iLCJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4LCBpbnRlcmFjdGl2aXR5Q2hlY2tlciwgaXNBcnJvd0tleVByZXNzZWQgfSBmcm9tICcuLi9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJy4uL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uL2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJEaXNhYmxlZE1peGluLCB0eXBlIFNiYkRpc2FibGVkTWl4aW5UeXBlIH0gZnJvbSAnLi9kaXNhYmxlZC1taXhpbi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIHR5cGUgU2JiRm9ybUFzc29jaWF0ZWRNaXhpblR5cGUsXG59IGZyb20gJy4vZm9ybS1hc3NvY2lhdGVkLW1peGluLmpzJztcbmltcG9ydCB7IFNiYlJlcXVpcmVkTWl4aW4sIHR5cGUgU2JiUmVxdWlyZWRNaXhpblR5cGUgfSBmcm9tICcuL3JlcXVpcmVkLW1peGluLmpzJztcblxuLyoqXG4gKiBBIHN0YXRpYyByZWdpc3RyeSB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBncm91cGVkIGByYWRpby1idXR0b25zYC5cbiAqIEdyb3VwcyBvZiByYWRpbyBidXR0b25zIGFyZSBsb2NhbCB0byB0aGUgZm9ybSB0aGV5IGJlbG9uZyAob3IgdGhlIGByZW5kZXJSb290YCBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIGFueSBmb3JtKVxuICogTXVsdGlwbGUgZ3JvdXBzIG9mIHJhZGlvIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gY29leGlzdCAoYXMgbG9uZyBhcyB0aGV5IGJlbG9uZyB0byBhIGRpZmZlcmVudCBmb3JtIC8gcmVuZGVyUm9vdClcbiAqIEl0IGlzIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIHN0YW5kYWxvbmUgZ3JvdXBzIG9mIHJhZGlvcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcmFkaW9CdXR0b25SZWdpc3RyeSA9IG5ldyBXZWFrTWFwPFxuICBOb2RlLFxuICBNYXA8c3RyaW5nLCBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4+XG4+KCk7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGVcbiAgZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZE1peGluVHlwZVxuICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRGlzYWJsZWRNaXhpblR5cGU+LCBQYXJ0aWFsPFNiYlJlcXVpcmVkTWl4aW5UeXBlPlxue1xuICBwdWJsaWMgY2hlY2tlZDogYm9vbGVhbjtcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuICBwdWJsaWMgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFzc29jaWF0ZWRSYWRpb0J1dHRvbnM/OiBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT47XG4gIHByb3RlY3RlZCBhYm9ydDogU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyO1xuXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkO1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCwgcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGlzRGlzYWJsZWRFeHRlcm5hbGx5KCk6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBpc1JlcXVpcmVkRXh0ZXJuYWxseSgpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgd2l0aFVzZXJJbnRlcmFjdGlvbj8oKTogdm9pZDtcbiAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1WYWx1ZSgpOiB2b2lkO1xuICBwcm90ZWN0ZWQgdXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBlbWl0Q2hhbmdlRXZlbnRzKCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5S2V5Ym9hcmQocmFkaW86IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGUpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFRoZSBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW4gZW5hYmxlcyBuYXRpdmUgZm9ybSBzdXBwb3J0IGZvciByYWRpbyBjb250cm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQ29uc3RydWN0b3I8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4gJiBUID0+IHtcbiAgY2xhc3MgU2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbkVsZW1lbnRcbiAgICBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oU2JiUmVxdWlyZWRNaXhpbihTYmJGb3JtQXNzb2NpYXRlZE1peGluKHN1cGVyQ2xhc3MpKSlcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT5cbiAge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHJhZGlvIGJ1dHRvbiBpcyBjaGVja2VkLlxuICAgICAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgICBwdWJsaWMgYWNjZXNzb3IgY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAgICogQGRlZmF1bHQgJ3JhZGlvJ1xuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdyYWRpbyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFib3J0ID0gbmV3IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlcih0aGlzKTtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiByYWRpbyBidXR0b25zIHRoYXQgYmVsb25ncyB0byB0aGUgc2FtZSBncm91cCBvZiBgdGhpc2AuXG4gICAgICogQXNzdW1lIHRoZW0gb3JkZXJlZCBpbiBET00gb3JkZXJcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz86IFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudD47XG4gICAgcHJpdmF0ZSBfcmFkaW9CdXR0b25Hcm91cHNNYXA/OiBNYXA8c3RyaW5nLCBTZXQ8U2JiRm9ybUFzc29jaWF0ZWRSYWRpb0J1dHRvbk1peGluVHlwZT4+O1xuICAgIHByaXZhdGUgX2RpZExvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmludGVybmFscy5yb2xlID0gJ3JhZGlvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5fY29ubmVjdFRvUmVnaXN0cnkoKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB0aGlzLl9oYW5kbGVBcnJvd0tleURvd24oZSksIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLmFib3J0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLl9kaXNjb25uZWN0RnJvbVJlZ2lzdHJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBmb3JtIGlzIGJlaW5nIHJlc2V0LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMuaGFzQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIENhbGxlZCB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byByZXN0b3JlIGVsZW1lbnTigJlzIHN0YXRlIHRvIHN0YXRlIGluIHdoaWNoIGNhc2VcbiAgICAgKiAgcmVhc29uIGlzIOKAnHJlc3RvcmXigJ0sIG9yIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGZ1bGZpbGwgYXV0b2ZpbGwgb24gYmVoYWxmIG9mXG4gICAgICogIHVzZXIgaW4gd2hpY2ggY2FzZSByZWFzb24gaXMg4oCcYXV0b2NvbXBsZXRl4oCdLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBzdGF0ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICAvLyBPbiAnbmFtZScgY2hhbmdlLCBtb3ZlICd0aGlzJyB0byB0aGUgbmV3IHJlZ2lzdHJ5XG4gICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCduYW1lJykpIHtcbiAgICAgICAgdGhpcy5fZGlzY29ubmVjdEZyb21SZWdpc3RyeSgpO1xuICAgICAgICB0aGlzLl9jb25uZWN0VG9SZWdpc3RyeSgpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5fZGVzZWxlY3RHcm91cGVkUmFkaW9zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnY2hlY2tlZCcpKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWNoZWNrZWQnLCB0aGlzLmNoZWNrZWQpO1xuICAgICAgICB0aGlzLmludGVybmFscy5hcmlhQ2hlY2tlZCA9IHRoaXMuY2hlY2tlZC50b1N0cmluZygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZU9uQ2hlY2tlZENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5fZGVzZWxlY3RHcm91cGVkUmFkaW9zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2FibGVSYWRpb3MoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZGlzYWJsZWQnKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzYWJsZVJhZGlvcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgdGhpcy5fZGlkTG9hZCA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZUZvY3VzYWJsZVJhZGlvcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBvbiBgdmFsdWVgIGNoYW5nZVxuICAgICAqIElmICdjaGVja2VkJywgdXBkYXRlIHRoZSB2YWx1ZS4gT3RoZXJ3aXNlLCBkbyBub3RoaW5nLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGNoZWNrZWRgIGNoYW5nZVxuICAgICAqIElmICdjaGVja2VkJywgdXBkYXRlIHRoZSB2YWx1ZS4gT3RoZXJ3aXNlLCByZXNldCBpdC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlRm9ybVZhbHVlT25DaGVja2VkQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMuY2hlY2tlZCA/IHRoaXMudmFsdWUgOiBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmx5IGEgc2luZ2xlIHJhZGlvIHNob3VsZCBiZSBmb2N1c2FibGUgaW4gdGhlIGdyb3VwLiBEZWZpbmVkIGFzOlxuICAgICAqIC0gdGhlIGNoZWNrZWQgcmFkaW87XG4gICAgICogLSB0aGUgZmlyc3Qgbm9uLWRpc2FibGVkIHJhZGlvIGluIERPTSBvcmRlcjtcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlRm9jdXNhYmxlUmFkaW9zKCk6IHZvaWQge1xuICAgICAgaWYgKCF0aGlzLl9kaWRMb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhZGlvcyA9IHRoaXMuX2ludGVyYWN0YWJsZUdyb3VwZWRSYWRpb3MoKTtcbiAgICAgIGNvbnN0IGNoZWNrZWRJbmRleCA9IHJhZGlvcy5maW5kSW5kZXgoKHIpID0+IHIuY2hlY2tlZCAmJiAhci5kaXNhYmxlZCAmJiAhci5mb3JtRGlzYWJsZWQpO1xuICAgICAgY29uc3QgZm9jdXNhYmxlSW5kZXggPVxuICAgICAgICBjaGVja2VkSW5kZXggIT09IC0xXG4gICAgICAgICAgPyBjaGVja2VkSW5kZXhcbiAgICAgICAgICA6IHJhZGlvcy5maW5kSW5kZXgoKHIpID0+ICFyLmRpc2FibGVkICYmICFyLmZvcm1EaXNhYmxlZCk7IC8vIEdldCB0aGUgZmlyc3QgZm9jdXNhYmxlIHJhZGlvXG5cbiAgICAgIGlmIChmb2N1c2FibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmFkaW9zW2ZvY3VzYWJsZUluZGV4XS50YWJJbmRleCA9IDA7XG4gICAgICAgIHJhZGlvcy5zcGxpY2UoZm9jdXNhYmxlSW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCB0YWJJbmRleCBvbiBvdGhlciByYWRpb3NcbiAgICAgIHJhZGlvcy5mb3JFYWNoKChyKSA9PiByLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIG5hdmlnYXRlQnlLZXlib2FyZChuZXh0OiBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgbmV4dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50cygpO1xuXG4gICAgICBhd2FpdCBuZXh0LnVwZGF0ZUNvbXBsZXRlO1xuICAgICAgbmV4dC5mb2N1cygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBlbWl0Q2hhbmdlRXZlbnRzKCk6IHZvaWQge1xuICAgICAgLy8gTWFudWFsbHkgZGlzcGF0Y2ggZXZlbnRzIHRvIHNpbXVsYXRlIGEgdXNlciBpbnRlcmFjdGlvblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGB0aGlzYCB0byB0aGUgcmFkaW9CdXR0b24gcmVnaXN0cnlcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jb25uZWN0VG9SZWdpc3RyeSgpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuZm9ybSA/PyB0aGlzLmdldFJvb3ROb2RlKCk7XG4gICAgICB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcCA9IHJhZGlvQnV0dG9uUmVnaXN0cnkuZ2V0KHJvb3QpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSAncm9vdCcgbWFwIGVudHJ5XG4gICAgICBpZiAoIXRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICByYWRpb0J1dHRvblJlZ2lzdHJ5LnNldChyb290LCB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA9IHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwLmdldChcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgKSBhcyB1bmtub3duIGFzIFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudD47XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGdyb3VwIHNldFxuICAgICAgaWYgKCF0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnMpIHtcbiAgICAgICAgdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcC5zZXQoXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyBhcyB1bmtub3duIGFzIFNldDxTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uTWl4aW5UeXBlPixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgcmFkaW8gaW50byB0aGUgc2V0IGFuZCBzb3J0IGZvbGxvd2luZyB0aGUgRE9NIG9yZGVyLlxuICAgICAgLy8gU2luY2UgdGhlIG9yZGVyIG9mIGEgJ1NldCcgaXMgdGhlIGluc2VydCBvcmRlciwgd2UgaGF2ZSB0byBlbXB0eSBpdCBhbmQgcmUtaW5zZXJ0IHJhZGlvcyBpbiBvcmRlclxuICAgICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zKTtcbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucy5jbGVhcigpO1xuXG4gICAgICAvLyBGaW5kIGB0aGlzYCBwb3NpdGlvbiBhbmQgaW5zZXJ0IGl0XG4gICAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KFxuICAgICAgICAocikgPT4gdGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HLFxuICAgICAgKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDAsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXBvcHVsYXRlIHRoZSBTZXRcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgocikgPT4gdGhpcy5hc3NvY2lhdGVkUmFkaW9CdXR0b25zIS5hZGQocikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgdGhpc2AgZnJvbSB0aGUgcmFkaW9CdXR0b24gcmVnaXN0cnkgYW5kLCBpZiB0aGUgZ3JvdXAgaXMgZW1wdHksIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgZ3JvdXBzIE1hcFxuICAgICAqL1xuICAgIHByaXZhdGUgX2Rpc2Nvbm5lY3RGcm9tUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgICB0aGlzLmFzc29jaWF0ZWRSYWRpb0J1dHRvbnM/LmRlbGV0ZSh0aGlzKTtcblxuICAgICAgaWYgKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucz8uc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9yYWRpb0J1dHRvbkdyb3Vwc01hcD8uZGVsZXRlKHRoaXMubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JhZGlvQnV0dG9uR3JvdXBzTWFwID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGxpc3Qgb2YgJ2ludGVyYWN0YWJsZScgZ3JvdXBlZCByYWRpb3MsIG9yZGVyZWQgaW4gRE9NIG9yZGVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfaW50ZXJhY3RhYmxlR3JvdXBlZFJhZGlvcygpOiBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA/PyBbXSkuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgaW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNWaXNpYmxlKGVsKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgb3RoZXIgcmFkaW8gb2YgdGhlIHNhbWUgZ3JvdXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kZXNlbGVjdEdyb3VwZWRSYWRpb3MoKTogdm9pZCB7XG4gICAgICBBcnJheS5mcm9tKHRoaXMuYXNzb2NpYXRlZFJhZGlvQnV0dG9ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigocikgPT4gciAhPT0gdGhpcylcbiAgICAgICAgLmZvckVhY2goKHIpID0+IChyLmNoZWNrZWQgPSBmYWxzZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2hhbmRsZUFycm93S2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghaXNBcnJvd0tleVByZXNzZWQoZXZ0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZW5hYmxlZFJhZGlvcyA9IHRoaXMuX2ludGVyYWN0YWJsZUdyb3VwZWRSYWRpb3MoKS5maWx0ZXIoXG4gICAgICAgIChyKSA9PiAhci5kaXNhYmxlZCAmJiAhci5mb3JtRGlzYWJsZWQsXG4gICAgICApO1xuICAgICAgY29uc3QgY3VycmVudDogbnVtYmVyID0gZW5hYmxlZFJhZGlvcy5pbmRleE9mKHRoaXMpO1xuICAgICAgY29uc3QgbmV4dEluZGV4OiBudW1iZXIgPSBnZXROZXh0RWxlbWVudEluZGV4KGV2dCwgY3VycmVudCwgZW5hYmxlZFJhZGlvcy5sZW5ndGgpO1xuXG4gICAgICBhd2FpdCB0aGlzLm5hdmlnYXRlQnlLZXlib2FyZChlbmFibGVkUmFkaW9zW25leHRJbmRleF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJGb3JtQXNzb2NpYXRlZFJhZGlvQnV0dG9uRWxlbWVudCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFNiYkZvcm1Bc3NvY2lhdGVkUmFkaW9CdXR0b25NaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0Q29uc3RydWN0b3IgfSBmcm9tICcuL2NvbnN0cnVjdG9yLmpzJztcblxuLy8gRGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtaXhpblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBoYXMgY29tcGxldGVkIGh5ZHJhdGlvbi5cbiAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVkIGh5ZHJhdGlvblxuICAgKiBhbmQgYGZhbHNlYCBpZiBub3QuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgb25jZSB0aGUgaHlkcmF0aW9uIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaHlkcmF0aW9uQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKiogUmV0dXJucyB3aGV0aGVyIGh5ZHJhdGlvbiBpcyByZXF1aXJlZCBhbmQgbm90IGNvbXBsZXRlZC4gKi9cbiAgcHJvdGVjdGVkIGdldCBoeWRyYXRpb25SZXF1aXJlZCgpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoaXMgbWl4aW4gZXh0ZW5kcyBhIGJhc2UgY2xhc3Mgd2l0aCBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIGlmIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZWQuXG4gKiBJdCBhbHNvIGRlbGF5cyBzbG90Y2hhbmdlIGV2ZW50cyB1bnRpbCBoeWRyYXRpb24gaXMgY29tcGxldGUuXG4gKlxuICogQHBhcmFtIGJhc2UgVGhlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEByZXR1cm5zIEEgY2xhc3MgZXh0ZW5kZWQgd2l0aCB0aGUgaHlkcmF0aW9uIGNoZWNrIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJIeWRyYXRpb25NaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIGJhc2U6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4gJiBUID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2JiSHlkcmF0aW9uTWl4aW5DbGFzcyBleHRlbmRzIGJhc2UgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4ge1xuICAgIHByaXZhdGUgX2h5ZHJhdGlvblJlcXVpcmVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2h5ZHJhdGlvbkNvbXBsZXRlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oXG4gICAgICAocmVzb2x2ZSkgPT4gKHRoaXMuX3Jlc29sdmVIeWRyYXRpb24gPSByZXNvbHZlKSxcbiAgICApO1xuICAgIHByaXZhdGUgX3Jlc29sdmVIeWRyYXRpb24hOiAoaHlkcmF0aW9uUmVxdWlyZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGNvbXBsZXRlZCBoeWRyYXRpb24uXG4gICAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVkIGh5ZHJhdGlvblxuICAgICAqIGFuZCBgZmFsc2VgIGlmIG5vdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgb25jZSB0aGUgaHlkcmF0aW9uIGNvbXBsZXRlZC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGh5ZHJhdGlvbkNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2h5ZHJhdGlvbkNvbXBsZXRlO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgaHlkcmF0aW9uIGlzIHJlcXVpcmVkIGFuZCBub3QgY29tcGxldGVkLiAqL1xuICAgIHByb3RlY3RlZCBnZXQgaHlkcmF0aW9uUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgaHlkcmF0aW9uIGlzIG5lZWRlZCBieSBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGFkb3cgcm9vdFxuICAgICAgLy8gaXMgYXZhaWxhYmxlIGR1cmluZyBjb25zdHJ1Y3Rpb24vdXBncmFkZSBwaGFzZS5cbiAgICAgIHRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkID0gISF0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoIXRoaXMuX2h5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVIeWRyYXRpb24oZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiBwaGFzZSwgd2Ugd2FudCB0byBzdXBwcmVzcyBzbG90Y2hhbmdlIGV2ZW50cyBhcyB0aGV5XG4gICAgICAgIC8vIGNhbiBjYXVzZSByZW5kZXIgZGlmZmVyZW5jZXMsIHdoaWNoIHdvdWxkIGJyZWFrIGh5ZHJhdGlvbi4gQWZ0ZXJcbiAgICAgICAgLy8gaHlkcmF0aW9uIGlzIGNvbXBsZXRlLCB3ZSBkaXNwYXRjaCBhIG1hbnVhbCBzbG90Y2hhbmdlIGV2ZW50LCBpZiB0aGVyZVxuICAgICAgICAvLyBhcmUgZWxlbWVudHMgYXNzaWduZWQgdG8gYSBzbG90LlxuICAgICAgICBjb25zdCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXZlbnRPcHRpb25zOiBFdmVudExpc3RlbmVyT3B0aW9ucyA9IHsgY2FwdHVyZTogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBzbG90cyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgnc2xvdCcpO1xuICAgICAgICBpZiAoc2xvdHM/Lmxlbmd0aCkge1xuICAgICAgICAgIHNsb3RzLmZvckVhY2goKHNsb3QpID0+XG4gICAgICAgICAgICBzbG90LmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCwgZXZlbnRPcHRpb25zKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaHlkcmF0aW9uQ29tcGxldGUudGhlbigoKSA9PlxuICAgICAgICAgICAgc2xvdHMuZm9yRWFjaCgoc2xvdCkgPT4ge1xuICAgICAgICAgICAgICBzbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCBzdXBwcmVzc1Nsb3RjaGFuZ2VFdmVudCwgZXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgICAgaWYgKHNsb3QuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNsb3QuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Nsb3RjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICAgIC8vIFdoZW4gaHlkcmF0aW9uIGlzIG5lZWRlZCwgd2Ugd2FpdCB0aGUgaHlkcmF0aW9uIHByb2Nlc3MgdG8gZmluaXNoLCB3aGljaCBpcyBwYXRjaGVkXG4gICAgICAvLyBpbnRvIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBMaXRFbGVtZW50IGJhc2UgY2xhc3MuXG4gICAgICBzdXBlci51cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgICBpZiAodGhpcy5faHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5faHlkcmF0aW9uUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUh5ZHJhdGlvbih0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkh5ZHJhdGlvbk1peGluQ2xhc3MgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkh5ZHJhdGlvbk1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB7IGh0bWwsIHR5cGUgTGl0RWxlbWVudCwgbm90aGluZywgdHlwZSBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5pbXBvcnQgeyBTYmJIeWRyYXRpb25NaXhpbiwgdHlwZSBTYmJIeWRyYXRpb25NaXhpblR5cGUgfSBmcm9tICcuL2h5ZHJhdGlvbi1taXhpbi5qcyc7XG5cbmltcG9ydCAnLi4vLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuY29uc3QgU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSA9ICdkYXRhLXNzci1jaGlsZC1jb3VudCc7XG5jb25zdCBTTE9UTkFNRV9QUkVGSVggPSAnbGknO1xuXG5leHBvcnQgdHlwZSBTYmJOYW1lZFNsb3RQcm9wZXJ0aWVzID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFyaWFIaWRkZW46IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB3aWxsVXBkYXRlIG9yIHNpbWlsYXIgY2hlY2tzLlxuICogQWxsb3dzIHRoZSB1c2FnZSBvZiB0aGUgc3RyaW5nIGxpdGVyYWwgJ2xpc3RDaGlsZHJlbicuXG4gKlxuICogQGV4YW1wbGVcbiAqIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczxXaXRoTGlzdENoaWxkcmVuPHRoaXM+Pik6IHZvaWQge1xuICogICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsaXN0Q2hpbGRyZW4nKSkge1xuICogICAgIC4uLlxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCB0eXBlIFdpdGhMaXN0Q2hpbGRyZW48XG4gIFQgZXh0ZW5kcyBTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+LFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQgPSBIVE1MRWxlbWVudCxcbj4gPSBUICYgeyBsaXN0Q2hpbGRyZW46IENbXSB9O1xuXG5leHBvcnQgZGVjbGFyZSBhYnN0cmFjdCBjbGFzcyBTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPFxuICBDIGV4dGVuZHMgSFRNTEVsZW1lbnQsXG4+IGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW5UeXBlIHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgYWNjZXNzb3IgbGlzdENoaWxkcmVuOiBDW107XG4gIHByb3RlY3RlZCByZW5kZXJMaXN0KFxuICAgIGF0dHJpYnV0ZXM/OiB7XG4gICAgICBjbGFzcz86IHN0cmluZztcbiAgICAgIGFyaWFMYWJlbD86IHN0cmluZztcbiAgICAgIGFyaWFMYWJlbGxlZGJ5Pzogc3RyaW5nO1xuICAgIH0sXG4gICAgbGlzdEl0ZW1BdHRyaWJ1dGVzPzoge1xuICAgICAgbG9jYWxOYW1lVmlzdWFsT25seT86IHN0cmluZ1tdO1xuICAgIH0sXG4gICk6IFRlbXBsYXRlUmVzdWx0O1xuICBwcm90ZWN0ZWQgbGlzdFNsb3RFbnRyaWVzKCk6IFNiYk5hbWVkU2xvdFByb3BlcnRpZXNbXTtcbiAgcHJvdGVjdGVkIHJlbmRlckhpZGRlblNsb3QoKTogVGVtcGxhdGVSZXN1bHQ7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBTYmJOYW1lZFNsb3RMaXN0TWl4aW4gPSA8XG4gIEMgZXh0ZW5kcyBIVE1MRWxlbWVudCxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4sXG4+KFxuICBzdXBlckNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PiAmIFQgPT4ge1xuICAvKipcbiAgICogVGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIG5hbWVkIHNsb3QgbGlzdCBvYnNlcnZlciBmdW5jdGlvbmFsaXR5LlxuICAgKiBUaGlzIGFsbG93cyB1c2luZyB0aGUgcGF0dGVybiBvZiByZW5kZXJpbmcgYSBuYW1lZCBzbG90IGZvciBlYWNoIGNoaWxkLCB3aGljaCBhbGxvd3NcbiAgICogd3JhcHBpbmcgY2hpbGRyZW4gaW4gYW4gdWwvbGkgbGlzdC5cbiAgICovXG4gIGFic3RyYWN0IGNsYXNzIE5hbWVkU2xvdExpc3RFbGVtZW50PEMgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PlxuICAgIGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW4oc3VwZXJDbGFzcylcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiTmFtZWRTbG90TGlzdE1peGluVHlwZTxDPj5cbiAge1xuICAgIC8qKiBBIGxpc3Qgb2YgbG93ZXItY2FzZWQgdGFnIG5hbWVzIHRvIG1hdGNoIGFnYWluc3QuIChlLmcuIGBzYmItbGlua2ApICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxpc3RDaGlsZExvY2FsTmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGRlZmluZWQgdGFnIG5hbWVzLlxuICAgICAqIFRoaXMgYXJyYXkgaXMgb25seSB1cGRhdGVkIGlmIHRoZXJlIGlzIGFuIGFjdHVhbCBjaGFuZ2VcbiAgICAgKiB0byB0aGUgY2hpbGQgZWxlbWVudHMuXG4gICAgICovXG4gICAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGxpc3RDaGlsZHJlbjogQ1tdID0gW107XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgdGhpcy5faGFuZGxlU2xvdGNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3Q/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9oYW5kbGVTbG90Y2hhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVTbG90Y2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbGlzdENoaWxkcmVuID0gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuID8/IFtdKS5maWx0ZXIoKGUpOiBlIGlzIEMgPT5cbiAgICAgICAgdGhpcy5saXN0Q2hpbGRMb2NhbE5hbWVzLmluY2x1ZGVzKGUubG9jYWxOYW1lKSxcbiAgICAgICk7XG4gICAgICAvLyBJZiB0aGUgc2xvdHRlZCBjaGlsZCBpbnN0YW5jZXMgaGF2ZSBub3QgY2hhbmdlZCwgd2UgY2FuIHNraXAgc3luY2luZyBhbmQgdXBkYXRpbmdcbiAgICAgIC8vIHRoZSBsaW5rIHJlZmVyZW5jZSBsaXN0LlxuICAgICAgaWYgKFxuICAgICAgICBsaXN0Q2hpbGRyZW4ubGVuZ3RoID09PSB0aGlzLmxpc3RDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZXZlcnkoKGUsIGkpID0+IGxpc3RDaGlsZHJlbltpXSA9PT0gZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdENoaWxkcmVuXG4gICAgICAgIC5maWx0ZXIoKGMpID0+ICFsaXN0Q2hpbGRyZW4uaW5jbHVkZXMoYykpXG4gICAgICAgIC5mb3JFYWNoKChjKSA9PiBjLnJlbW92ZUF0dHJpYnV0ZSgnc2xvdCcpKTtcbiAgICAgIHRoaXMubGlzdENoaWxkcmVuID0gbGlzdENoaWxkcmVuO1xuICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZm9yRWFjaCgoYywgaW5kZXgpID0+XG4gICAgICAgIGMuc2V0QXR0cmlidXRlKCdzbG90JywgYCR7U0xPVE5BTUVfUFJFRklYfS0ke2luZGV4fWApLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBzc3IgYXR0cmlidXRlLCBvbmNlIHdlIGhhdmUgYWN0dWFsbHkgaW5pdGlhbGl6ZWQgdGhlIGNoaWxkcmVuIGVsZW1lbnRzLlxuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoU1NSX0NISUxEX0NPVU5UX0FUVFJJQlVURSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgbGlzdCBhbmQgbGlzdCBzbG90cyBmb3Igc2xvdHRlZCBjaGlsZHJlbiBvciBhIG51bWJlciBvZiBsaXN0IHNsb3RzXG4gICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgcG9zc2libGUgb3B0aW1pemF0aW9uIGZvciBTU1IsIGFzIGluIGFuIFNTUiBMaXQgZW52aXJvbm1lbnRcbiAgICAgKiBvdGhlciBlbGVtZW50cyBhcmUgbm90IGF2YWlsYWJsZSwgYnV0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbWV0YVxuICAgICAqIGZyYW1ld29yayB3cmFwcGVyIChsaWtlIGUuZy4gUmVhY3QpLiBUaGlzIGFsbG93cyB0byBwcm92aWRlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBjaGlsZHJlbiB0byBiZSBwYXNzZWQgdmlhIHRoZSBgZGF0YS1zc3ItY2hpbGQtY291bnRgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVuZGVyTGlzdChcbiAgICAgIGF0dHJpYnV0ZXM6IHsgY2xhc3M/OiBzdHJpbmc7IGFyaWFMYWJlbD86IHN0cmluZzsgYXJpYUxhYmVsbGVkYnk/OiBzdHJpbmcgfSA9IHt9LFxuICAgICAgbGlzdEl0ZW1BdHRyaWJ1dGVzOiB7IGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXSB9ID0ge30sXG4gICAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgICAgY29uc3QgbGlzdFNsb3ROYW1lczogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdID0gdGhpcy5saXN0U2xvdEVudHJpZXMobGlzdEl0ZW1BdHRyaWJ1dGVzKTtcblxuICAgICAgaWYgKGxpc3RTbG90TmFtZXMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzcz0ke2F0dHJpYnV0ZXMuY2xhc3MgfHwgdGhpcy5sb2NhbE5hbWV9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPSR7YXR0cmlidXRlcy5hcmlhTGFiZWwgfHwgbm90aGluZ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsbGVkYnkgfHwgbm90aGluZ31cbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2xpc3RTbG90TmFtZXMubWFwKFxuICAgICAgICAgICAgICAoc2xvdCkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgICA8bGkgYXJpYS1oaWRkZW49JHtzbG90LmFyaWFIaWRkZW4gfHwgbm90aGluZ30+XG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPSR7c2xvdC5uYW1lfT48L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgYCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICAke3RoaXMucmVuZGVySGlkZGVuU2xvdCgpfVxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChsaXN0U2xvdE5hbWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gaHRtbGA8c2JiLXNjcmVlbi1yZWFkZXItb25seT4ke2F0dHJpYnV0ZXMuYXJpYUxhYmVsfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0ke2F0dHJpYnV0ZXMuY2xhc3MgfHwgdGhpcy5sb2NhbE5hbWV9PlxuICAgICAgICAgICAgPHNwYW4+PHNsb3QgbmFtZT0ke2xpc3RTbG90TmFtZXNbMF0ubmFtZX0+PC9zbG90Pjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgJHt0aGlzLnJlbmRlckhpZGRlblNsb3QoKX0gYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckhpZGRlblNsb3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNiYk5hbWVkU2xvdFByb3BlcnRpZXMsIHdoaWNoIGhvbGRzIHRoZSBsaXN0IHNsb3QgbmFtZXMgYW5kIHRoZSBoaWRkZW4gcHJvcGVydHk7XG4gICAgICogaXRzIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgY2hpbGRyZW4gb3IgdGhlIGBkYXRhLXNzci1jaGlsZC1jb3VudGAgYXR0cmlidXRlIHZhbHVlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhIHBvc3NpYmxlIG9wdGltaXphdGlvbiBmb3IgU1NSLCBhcyBpbiBhbiBTU1IgTGl0IGVudmlyb25tZW50XG4gICAgICogb3RoZXIgZWxlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUsIGJ1dCBtaWdodCBiZSBhdmFpbGFibGUgaW4gdGhlIG1ldGFcbiAgICAgKiBmcmFtZXdvcmsgd3JhcHBlciAobGlrZSBlLmcuIFJlYWN0KS4gVGhpcyBhbGxvd3MgdG8gcHJvdmlkZSB0aGUgbnVtYmVyIG9mXG4gICAgICogY2hpbGRyZW4gdG8gYmUgcGFzc2VkIHZpYSB0aGUgYGRhdGEtc3NyLWNoaWxkLWNvdW50YCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxpc3RTbG90RW50cmllcyhsaXN0SXRlbUF0dHJpYnV0ZXM6IHtcbiAgICAgIGxvY2FsTmFtZVZpc3VhbE9ubHk/OiBzdHJpbmdbXTtcbiAgICB9KTogU2JiTmFtZWRTbG90UHJvcGVydGllc1tdIHtcbiAgICAgIGNvbnN0IGxpc3RDaGlsZHJlbiA9IHRoaXMubGlzdENoaWxkcmVuLmxlbmd0aFxuICAgICAgICA/IHRoaXMubGlzdENoaWxkcmVuXG4gICAgICAgIDogQXJyYXkuZnJvbSh7IGxlbmd0aDogKyh0aGlzLmdldEF0dHJpYnV0ZShTU1JfQ0hJTERfQ09VTlRfQVRUUklCVVRFKSA/PyAwKSB9KTtcbiAgICAgIHJldHVybiBsaXN0Q2hpbGRyZW4ubWFwKChlLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogYCR7U0xPVE5BTUVfUFJFRklYfS0ke2l9YCxcbiAgICAgICAgICBhcmlhSGlkZGVuOlxuICAgICAgICAgICAgbGlzdEl0ZW1BdHRyaWJ1dGVzPy5sb2NhbE5hbWVWaXN1YWxPbmx5Py5pbmNsdWRlcygoZSBhcyBIVE1MRWxlbWVudCkubG9jYWxOYW1lKSA/P1xuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgaGlkZGVuIHNsb3QsIHdoaWNoIGlzIGludGVuZGVkIGFzIHRoZSBjaGlsZHJlbiBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAqIFdoZW4gYW4gZWxlbWVudCB3aXRob3V0IGEgc2xvdCBhdHRyaWJ1dGUgaXMgc2xvdHRlZCB0byB0aGUgZWxlbWVudCwgaXQgdHJpZ2dlcnNcbiAgICAgKiB0aGUgc2xvdGNoYW5nZSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXNzaWduIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lZCBzbG90LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJIaWRkZW5TbG90KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIHJldHVybiBodG1sYDxzcGFuIGhpZGRlbj48c2xvdD48L3Nsb3Q+PC9zcGFuPmA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE5hbWVkU2xvdExpc3RFbGVtZW50IGFzIHVua25vd24gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJOYW1lZFNsb3RMaXN0TWl4aW5UeXBlPEM+PiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYk5lZ2F0aXZlTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIG5lZ2F0aXZlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuaGFuY2UgeW91ciBjb21wb25lbnQgd2l0aCBhIG5lZ2F0aXZlIHByb3BlcnR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiTmVnYXRpdmVNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5lZ2F0aXZlTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJOZWdhdGl2ZUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgU2JiTmVnYXRpdmVNaXhpblR5cGUge1xuICAgIC8qKiBOZWdhdGl2ZSBjb2xvcmluZyB2YXJpYW50IGZsYWcuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBuZWdhdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIFNiYk5lZ2F0aXZlRWxlbWVudCBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk5lZ2F0aXZlTWl4aW5UeXBlPiAmIFQ7XG59O1xuIiwiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2V2ZW50aW5nLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdENvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25zdHJ1Y3Rvci5qcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFNiYlBhbmVsTWl4aW5UeXBlIHtcbiAgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnO1xuICBwdWJsaWMgYWNjZXNzb3IgYm9yZGVybGVzczogYm9vbGVhbjtcbiAgcHVibGljIGFjY2Vzc29yIGV4cGFuc2lvblN0YXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNiYlBhbmVsU2l6ZSA9ICdzJyB8ICdtJztcblxuLyoqXG4gKiBNaXhpbiBmb3IgY29tbW9uIHBhbmVsIGJlaGF2aW9yc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiUGFuZWxNaXhpbiA9IDxUIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlBhbmVsTWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJQYW5lbEVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgU2JiUGFuZWxNaXhpblR5cGUge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgICAgcGFuZWxDb25uZWN0ZWQ6ICdwYW5lbENvbm5lY3RlZCcsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIC8qKiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgcGFuZWwuICovXG4gICAgQHByb3BlcnR5KCkgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnID0gJ3doaXRlJztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSB1bnNlbGVjdGVkIHBhbmVsIGhhcyBhIGJvcmRlci4gKi9cbiAgICBAZm9yY2VUeXBlKClcbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGJvcmRlcmxlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAaW50ZXJuYWwgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSBsYWJlbCB3aGVuIGluIGV4cGFuc2lvbiBwYW5lbCAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSgpXG4gICAgcHVibGljIGFjY2Vzc29yIGV4cGFuc2lvblN0YXRlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEludGVybmFsIGV2ZW50IHRoYXQgZW1pdHMgd2hlbiB0aGUgY2hlY2tib3ggaXMgbG9hZGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3BhbmVsQ29ubmVjdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgICAgdGhpcyxcbiAgICAgIFNiYlBhbmVsRWxlbWVudC5ldmVudHMucGFuZWxDb25uZWN0ZWQsXG4gICAgICB7IGJ1YmJsZXM6IHRydWUgfSxcbiAgICApO1xuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5fcGFuZWxDb25uZWN0ZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTYmJQYW5lbEVsZW1lbnQgYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJQYW5lbE1peGluVHlwZT4gJiBUO1xufTtcbiIsImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb25zdHJ1Y3RvciB9IGZyb20gJy4vY29uc3RydWN0b3IuanMnO1xuXG4vLyBEZWZpbmUgdGhlIGludGVyZmFjZSBmb3IgdGhlIG1peGluXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGUge1xuICBwcm90ZWN0ZWQgc3RhcnRVcGRhdGUoKTogdm9pZDtcbiAgcHJvdGVjdGVkIGNvbXBsZXRlVXBkYXRlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhpcyBtaXhpbiBhbGxvd3Mgc2NoZWR1bGluZyBtYW51YWwgdXBkYXRlcywgd2hpY2ggYWZmZWN0IHVwZGF0ZUNvbXBsZXRlLlxuICogQHBhcmFtIGJhc2UgVGhlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEByZXR1cm5zIEEgY2xhc3MgZXh0ZW5kZWQgd2l0aCB0aGUgc2xvdCBjaGlsZCBvYnNlcnZlciBmdW5jdGlvbmFsaXR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW4gPSA8VCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8TGl0RWxlbWVudD4+KFxuICBiYXNlOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJVcGRhdGVTY2hlZHVsZXJNaXhpblR5cGU+ICYgVCA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNiYlVwZGF0ZVNjaGVkdWxlckVsZW1lbnRcbiAgICBleHRlbmRzIGJhc2VcbiAgICBpbXBsZW1lbnRzIFBhcnRpYWw8U2JiVXBkYXRlU2NoZWR1bGVyTWl4aW5UeXBlPlxuICB7XG4gICAgcHJpdmF0ZSBfdXBkYXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHByaXZhdGUgX3VwZGF0ZVJlc29sdmUgPSAoKTogdm9pZCA9PiB7fTtcblxuICAgIHByb3RlY3RlZCBzdGFydFVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gKHRoaXMuX3VwZGF0ZVJlc29sdmUgPSByKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbXBsZXRlVXBkYXRlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fdXBkYXRlUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgICBhd2FpdCB0aGlzLl91cGRhdGVQcm9taXNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYlVwZGF0ZVNjaGVkdWxlckVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYlVwZGF0ZVNjaGVkdWxlck1peGluVHlwZT4gJlxuICAgIFQ7XG59O1xuIl0sIm5hbWVzIjpbIl9hIiwic3RhdGUiLCJTYmJQYW5lbEVsZW1lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQXFCYSxNQUFBLG1CQUFtQixDQUM5QixlQUNpRDtNQUNsQyxzQkFBa0IsTUFBQTs7c0JBQVM7Ozs7QUFBM0IsV0FBQSxtQkFBMkIsWUFBVTtBQUFBOztBQUtsRCx1REFBQSxrQkFBQSxNQUFBLHdCQUFvQyxLQUFLOzs7O01BQXpDLElBQWdCLFdBQTBCO0FBQUEsZUFBQSxtQkFBQTtBQUFBLE1BQUE7QUFBQSxNQUExQyxJQUFnQixTQUEwQixPQUFBO0FBQUEs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