@sbb-esta/lyne-elements 1.12.1 → 1.14.0

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 (936) hide show
  1. package/accordion/accordion.d.ts +4 -8
  2. package/accordion/accordion.d.ts.map +1 -1
  3. package/accordion.js +90 -81
  4. package/action-group/action-group.d.ts +5 -5
  5. package/action-group/action-group.d.ts.map +1 -1
  6. package/action-group.js +100 -50
  7. package/alert/alert/alert.d.ts +11 -11
  8. package/alert/alert/alert.d.ts.map +1 -1
  9. package/alert/alert-group/alert-group.d.ts +4 -4
  10. package/alert/alert-group/alert-group.d.ts.map +1 -1
  11. package/alert/alert-group.js +101 -69
  12. package/alert/alert.js +191 -104
  13. package/autocomplete/autocomplete-base-element.d.ts +3 -7
  14. package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  15. package/autocomplete/autocomplete.d.ts.map +1 -1
  16. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  17. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
  18. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
  19. package/autocomplete-grid/autocomplete-grid-button.js +53 -60
  20. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
  21. package/autocomplete-grid/autocomplete-grid-cell.js +20 -22
  22. package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
  23. package/autocomplete-grid/autocomplete-grid-optgroup.js +31 -35
  24. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
  25. package/autocomplete-grid/autocomplete-grid-option.js +45 -63
  26. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
  27. package/autocomplete-grid/autocomplete-grid-row.js +23 -25
  28. package/autocomplete-grid/autocomplete-grid.js +112 -133
  29. package/autocomplete.js +283 -295
  30. package/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
  31. package/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
  32. package/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
  33. package/breadcrumb/breadcrumb-group.js +107 -114
  34. package/breadcrumb/breadcrumb.js +44 -35
  35. package/button/button/button.d.ts.map +1 -1
  36. package/button/button-link/button-link.d.ts.map +1 -1
  37. package/button/button-link.js +15 -18
  38. package/button/button-static/button-static.d.ts.map +1 -1
  39. package/button/button-static.js +15 -18
  40. package/button/button.js +15 -18
  41. package/button/common/button-common.d.ts +4 -4
  42. package/button/common/button-common.d.ts.map +1 -1
  43. package/button/common.js +41 -30
  44. package/button/mini-button/mini-button-base-element.d.ts.map +1 -1
  45. package/button/mini-button/mini-button.d.ts.map +1 -1
  46. package/button/mini-button-group/mini-button-group.d.ts +2 -2
  47. package/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  48. package/button/mini-button-group.js +55 -43
  49. package/button/mini-button.js +28 -32
  50. package/button/secondary-button/secondary-button.d.ts.map +1 -1
  51. package/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
  52. package/button/secondary-button-link.js +15 -18
  53. package/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
  54. package/button/secondary-button-static.js +15 -18
  55. package/button/secondary-button.js +15 -18
  56. package/button/tertiary-button/tertiary-button.d.ts.map +1 -1
  57. package/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
  58. package/button/tertiary-button-link.js +15 -18
  59. package/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
  60. package/button/tertiary-button-static.js +15 -18
  61. package/button/tertiary-button.js +15 -18
  62. package/button/transparent-button/transparent-button.d.ts.map +1 -1
  63. package/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
  64. package/button/transparent-button-link.js +15 -18
  65. package/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
  66. package/button/transparent-button-static.js +15 -18
  67. package/button/transparent-button.js +15 -18
  68. package/calendar/calendar.d.ts +7 -7
  69. package/calendar/calendar.d.ts.map +1 -1
  70. package/calendar.js +638 -692
  71. package/card/card/card.d.ts +2 -2
  72. package/card/card/card.d.ts.map +1 -1
  73. package/card/card-badge/card-badge.d.ts +1 -1
  74. package/card/card-badge/card-badge.d.ts.map +1 -1
  75. package/card/card-badge.js +45 -34
  76. package/card/card-button/card-button.d.ts.map +1 -1
  77. package/card/card-button.js +16 -16
  78. package/card/card-link/card-link.d.ts.map +1 -1
  79. package/card/card-link.js +17 -17
  80. package/card/card.js +55 -36
  81. package/card/common/card-action-common.d.ts +1 -1
  82. package/card/common/card-action-common.d.ts.map +1 -1
  83. package/card/common.js +27 -33
  84. package/checkbox/checkbox/checkbox.d.ts +3 -4
  85. package/checkbox/checkbox/checkbox.d.ts.map +1 -1
  86. package/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
  87. package/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  88. package/checkbox/checkbox-group.js +99 -76
  89. package/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
  90. package/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  91. package/checkbox/checkbox-panel.js +51 -50
  92. package/checkbox/checkbox.js +54 -43
  93. package/checkbox/common/checkbox-common.d.ts +1 -1
  94. package/checkbox/common/checkbox-common.d.ts.map +1 -1
  95. package/checkbox/common.js +39 -24
  96. package/chip/chip.d.ts +2 -2
  97. package/chip/chip.d.ts.map +1 -1
  98. package/chip.js +45 -26
  99. package/clock/clock.d.ts +1 -1
  100. package/clock/clock.d.ts.map +1 -1
  101. package/clock.js +136 -144
  102. package/container/container/container.d.ts +3 -3
  103. package/container/container/container.d.ts.map +1 -1
  104. package/container/container.js +60 -35
  105. package/container/sticky-bar/sticky-bar.d.ts +1 -1
  106. package/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  107. package/container/sticky-bar.js +55 -47
  108. package/core/a11y.js +29 -51
  109. package/core/base-elements/action-base-element.d.ts.map +1 -1
  110. package/core/base-elements/button-base-element.d.ts +2 -2
  111. package/core/base-elements/button-base-element.d.ts.map +1 -1
  112. package/core/base-elements/link-base-element.d.ts +5 -5
  113. package/core/base-elements/link-base-element.d.ts.map +1 -1
  114. package/core/base-elements.js +243 -196
  115. package/core/controllers.js +8 -13
  116. package/core/decorators/base.d.ts +14 -0
  117. package/core/decorators/base.d.ts.map +1 -0
  118. package/core/decorators/force-type.d.ts +8 -0
  119. package/core/decorators/force-type.d.ts.map +1 -0
  120. package/core/decorators/get-override.d.ts +7 -0
  121. package/core/decorators/get-override.d.ts.map +1 -0
  122. package/core/decorators/handle-distinct-change.d.ts +8 -0
  123. package/core/decorators/handle-distinct-change.d.ts.map +1 -0
  124. package/core/decorators/omit-empty-converter.d.ts +8 -0
  125. package/core/decorators/omit-empty-converter.d.ts.map +1 -0
  126. package/core/decorators.d.ts +4 -0
  127. package/core/decorators.d.ts.map +1 -1
  128. package/core/decorators.js +59 -15
  129. package/core/dom.js +1 -5
  130. package/core/eventing.js +1 -4
  131. package/core/interfaces/paginator-page.d.ts +7 -0
  132. package/core/interfaces/paginator-page.d.ts.map +1 -0
  133. package/core/interfaces.d.ts +1 -0
  134. package/core/interfaces.d.ts.map +1 -1
  135. package/core/mixins/disabled-mixin.d.ts +2 -3
  136. package/core/mixins/disabled-mixin.d.ts.map +1 -1
  137. package/core/mixins/form-associated-checkbox-mixin.d.ts +1 -0
  138. package/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  139. package/core/mixins/form-associated-mixin.d.ts +6 -6
  140. package/core/mixins/form-associated-mixin.d.ts.map +1 -1
  141. package/core/mixins/named-slot-list-mixin.d.ts +1 -1
  142. package/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  143. package/core/mixins/negative-mixin.d.ts +1 -1
  144. package/core/mixins/negative-mixin.d.ts.map +1 -1
  145. package/core/mixins/panel-mixin.d.ts +3 -3
  146. package/core/mixins/panel-mixin.d.ts.map +1 -1
  147. package/core/mixins/required-mixin.d.ts +2 -3
  148. package/core/mixins/required-mixin.d.ts.map +1 -1
  149. package/core/mixins.js +291 -242
  150. package/core/styles/mixins/buttons.scss +1 -1
  151. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +4 -0
  152. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss +5 -1
  153. package/core/testing/private.d.ts +1 -0
  154. package/core/testing/private.d.ts.map +1 -1
  155. package/core/testing.js +7 -13
  156. package/core.css +5 -1
  157. package/custom-elements.json +14515 -13465
  158. package/datepicker/common/datepicker-button.d.ts +2 -2
  159. package/datepicker/common/datepicker-button.d.ts.map +1 -1
  160. package/datepicker/common.js +110 -116
  161. package/datepicker/datepicker/datepicker.d.ts +6 -6
  162. package/datepicker/datepicker/datepicker.d.ts.map +1 -1
  163. package/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  164. package/datepicker/datepicker-next-day.js +24 -26
  165. package/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  166. package/datepicker/datepicker-previous-day.js +25 -27
  167. package/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
  168. package/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
  169. package/datepicker/datepicker-toggle.js +154 -136
  170. package/datepicker/datepicker.js +248 -213
  171. package/development/accordion/accordion.d.ts +4 -8
  172. package/development/accordion/accordion.d.ts.map +1 -1
  173. package/development/accordion.js +118 -93
  174. package/development/action-group/action-group.d.ts +5 -5
  175. package/development/action-group/action-group.d.ts.map +1 -1
  176. package/development/action-group.js +138 -64
  177. package/development/alert/alert/alert.d.ts +11 -11
  178. package/development/alert/alert/alert.d.ts.map +1 -1
  179. package/development/alert/alert-group/alert-group.d.ts +4 -4
  180. package/development/alert/alert-group/alert-group.d.ts.map +1 -1
  181. package/development/alert/alert-group.js +135 -79
  182. package/development/alert/alert.js +259 -109
  183. package/development/autocomplete/autocomplete-base-element.d.ts +3 -7
  184. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  185. package/development/autocomplete/autocomplete.d.ts.map +1 -1
  186. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  187. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
  188. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
  189. package/development/autocomplete-grid/autocomplete-grid-button.js +75 -76
  190. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
  191. package/development/autocomplete-grid/autocomplete-grid-cell.js +24 -24
  192. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
  193. package/development/autocomplete-grid/autocomplete-grid-optgroup.js +38 -39
  194. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
  195. package/development/autocomplete-grid/autocomplete-grid-option.js +57 -73
  196. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
  197. package/development/autocomplete-grid/autocomplete-grid-row.js +28 -28
  198. package/development/autocomplete-grid/autocomplete-grid.js +142 -160
  199. package/development/autocomplete.js +394 -393
  200. package/development/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
  201. package/development/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
  202. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
  203. package/development/breadcrumb/breadcrumb-group.js +130 -130
  204. package/development/breadcrumb/breadcrumb.js +53 -36
  205. package/development/button/button/button.d.ts.map +1 -1
  206. package/development/button/button-link/button-link.d.ts.map +1 -1
  207. package/development/button/button-link.js +18 -19
  208. package/development/button/button-static/button-static.d.ts.map +1 -1
  209. package/development/button/button-static.js +18 -19
  210. package/development/button/button.js +18 -19
  211. package/development/button/common/button-common.d.ts +4 -4
  212. package/development/button/common/button-common.d.ts.map +1 -1
  213. package/development/button/common.js +51 -30
  214. package/development/button/mini-button/mini-button-base-element.d.ts.map +1 -1
  215. package/development/button/mini-button/mini-button.d.ts.map +1 -1
  216. package/development/button/mini-button-group/mini-button-group.d.ts +2 -2
  217. package/development/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  218. package/development/button/mini-button-group.js +77 -50
  219. package/development/button/mini-button.js +39 -38
  220. package/development/button/secondary-button/secondary-button.d.ts.map +1 -1
  221. package/development/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
  222. package/development/button/secondary-button-link.js +18 -19
  223. package/development/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
  224. package/development/button/secondary-button-static.js +18 -19
  225. package/development/button/secondary-button.js +18 -19
  226. package/development/button/tertiary-button/tertiary-button.d.ts.map +1 -1
  227. package/development/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
  228. package/development/button/tertiary-button-link.js +18 -19
  229. package/development/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
  230. package/development/button/tertiary-button-static.js +18 -19
  231. package/development/button/tertiary-button.js +18 -19
  232. package/development/button/transparent-button/transparent-button.d.ts.map +1 -1
  233. package/development/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
  234. package/development/button/transparent-button-link.js +18 -19
  235. package/development/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
  236. package/development/button/transparent-button-static.js +18 -19
  237. package/development/button/transparent-button.js +18 -19
  238. package/development/calendar/calendar.d.ts +7 -7
  239. package/development/calendar/calendar.d.ts.map +1 -1
  240. package/development/calendar.js +768 -766
  241. package/development/card/card/card.d.ts +2 -2
  242. package/development/card/card/card.d.ts.map +1 -1
  243. package/development/card/card-badge/card-badge.d.ts +1 -1
  244. package/development/card/card-badge/card-badge.d.ts.map +1 -1
  245. package/development/card/card-badge.js +65 -45
  246. package/development/card/card-button/card-button.d.ts.map +1 -1
  247. package/development/card/card-button.js +23 -20
  248. package/development/card/card-link/card-link.d.ts.map +1 -1
  249. package/development/card/card-link.js +23 -20
  250. package/development/card/card.js +72 -41
  251. package/development/card/common/card-action-common.d.ts +1 -1
  252. package/development/card/common/card-action-common.d.ts.map +1 -1
  253. package/development/card/common.js +74 -73
  254. package/development/checkbox/checkbox/checkbox.d.ts +3 -4
  255. package/development/checkbox/checkbox/checkbox.d.ts.map +1 -1
  256. package/development/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
  257. package/development/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  258. package/development/checkbox/checkbox-group.js +139 -92
  259. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
  260. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  261. package/development/checkbox/checkbox-panel.js +68 -60
  262. package/development/checkbox/checkbox.js +69 -46
  263. package/development/checkbox/common/checkbox-common.d.ts +1 -1
  264. package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
  265. package/development/checkbox/common.js +65 -46
  266. package/development/chip/chip.d.ts +2 -2
  267. package/development/chip/chip.d.ts.map +1 -1
  268. package/development/chip.js +64 -33
  269. package/development/clock/clock.d.ts +1 -1
  270. package/development/clock/clock.d.ts.map +1 -1
  271. package/development/clock.js +203 -201
  272. package/development/container/container/container.d.ts +3 -3
  273. package/development/container/container/container.d.ts.map +1 -1
  274. package/development/container/container.js +86 -45
  275. package/development/container/sticky-bar/sticky-bar.d.ts +1 -1
  276. package/development/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  277. package/development/container/sticky-bar.js +76 -58
  278. package/development/core/a11y.js +40 -62
  279. package/development/core/base-elements/action-base-element.d.ts.map +1 -1
  280. package/development/core/base-elements/button-base-element.d.ts +2 -2
  281. package/development/core/base-elements/button-base-element.d.ts.map +1 -1
  282. package/development/core/base-elements/link-base-element.d.ts +5 -5
  283. package/development/core/base-elements/link-base-element.d.ts.map +1 -1
  284. package/development/core/base-elements.js +329 -226
  285. package/development/core/config.js +1 -1
  286. package/development/core/controllers.js +13 -21
  287. package/development/core/datetime.js +1 -1
  288. package/development/core/decorators/base.d.ts +14 -0
  289. package/development/core/decorators/base.d.ts.map +1 -0
  290. package/development/core/decorators/force-type.d.ts +8 -0
  291. package/development/core/decorators/force-type.d.ts.map +1 -0
  292. package/development/core/decorators/get-override.d.ts +7 -0
  293. package/development/core/decorators/get-override.d.ts.map +1 -0
  294. package/development/core/decorators/handle-distinct-change.d.ts +8 -0
  295. package/development/core/decorators/handle-distinct-change.d.ts.map +1 -0
  296. package/development/core/decorators/omit-empty-converter.d.ts +8 -0
  297. package/development/core/decorators/omit-empty-converter.d.ts.map +1 -0
  298. package/development/core/decorators.d.ts +4 -0
  299. package/development/core/decorators.d.ts.map +1 -1
  300. package/development/core/decorators.js +69 -5
  301. package/development/core/dom.js +2 -6
  302. package/development/core/eventing.js +2 -5
  303. package/development/core/i18n.js +1 -1
  304. package/development/core/interfaces/paginator-page.d.ts +7 -0
  305. package/development/core/interfaces/paginator-page.d.ts.map +1 -0
  306. package/development/core/interfaces.d.ts +1 -0
  307. package/development/core/interfaces.d.ts.map +1 -1
  308. package/development/core/mixins/disabled-mixin.d.ts +2 -3
  309. package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
  310. package/development/core/mixins/form-associated-checkbox-mixin.d.ts +1 -0
  311. package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  312. package/development/core/mixins/form-associated-mixin.d.ts +6 -6
  313. package/development/core/mixins/form-associated-mixin.d.ts.map +1 -1
  314. package/development/core/mixins/named-slot-list-mixin.d.ts +1 -1
  315. package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  316. package/development/core/mixins/negative-mixin.d.ts +1 -1
  317. package/development/core/mixins/negative-mixin.d.ts.map +1 -1
  318. package/development/core/mixins/panel-mixin.d.ts +3 -3
  319. package/development/core/mixins/panel-mixin.d.ts.map +1 -1
  320. package/development/core/mixins/required-mixin.d.ts +2 -3
  321. package/development/core/mixins/required-mixin.d.ts.map +1 -1
  322. package/development/core/mixins.js +573 -478
  323. package/development/core/observers.js +1 -1
  324. package/development/core/overlay.js +1 -1
  325. package/development/core/testing/private.d.ts +1 -0
  326. package/development/core/testing/private.d.ts.map +1 -1
  327. package/development/core/testing.js +16 -22
  328. package/development/datepicker/common/datepicker-button.d.ts +2 -2
  329. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  330. package/development/datepicker/common.js +144 -142
  331. package/development/datepicker/datepicker/datepicker.d.ts +6 -6
  332. package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
  333. package/development/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  334. package/development/datepicker/datepicker-next-day.js +33 -33
  335. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  336. package/development/datepicker/datepicker-previous-day.js +33 -33
  337. package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
  338. package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
  339. package/development/datepicker/datepicker-toggle.js +227 -174
  340. package/development/datepicker/datepicker.js +327 -249
  341. package/development/dialog/dialog/dialog.d.ts +1 -1
  342. package/development/dialog/dialog/dialog.d.ts.map +1 -1
  343. package/development/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
  344. package/development/dialog/dialog-actions.js +21 -20
  345. package/development/dialog/dialog-content/dialog-content.d.ts.map +1 -1
  346. package/development/dialog/dialog-content.js +22 -21
  347. package/development/dialog/dialog-title/dialog-title.d.ts +3 -3
  348. package/development/dialog/dialog-title/dialog-title.d.ts.map +1 -1
  349. package/development/dialog/dialog-title.js +121 -66
  350. package/development/dialog/dialog.js +205 -191
  351. package/development/divider/divider.d.ts +1 -1
  352. package/development/divider/divider.d.ts.map +1 -1
  353. package/development/divider.js +55 -36
  354. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
  355. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  356. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
  357. package/development/expansion-panel/expansion-panel-content.js +25 -25
  358. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
  359. package/development/expansion-panel/expansion-panel-header.js +56 -63
  360. package/development/expansion-panel/expansion-panel.js +227 -182
  361. package/development/file-selector/file-selector.d.ts +26 -15
  362. package/development/file-selector/file-selector.d.ts.map +1 -1
  363. package/development/file-selector.js +305 -172
  364. package/development/flip-card/flip-card/flip-card.d.ts +2 -2
  365. package/development/flip-card/flip-card/flip-card.d.ts.map +1 -1
  366. package/development/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
  367. package/development/flip-card/flip-card-details.js +39 -39
  368. package/development/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
  369. package/development/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
  370. package/development/flip-card/flip-card-summary.js +57 -38
  371. package/development/flip-card/flip-card.js +110 -78
  372. package/development/footer/footer.d.ts +4 -4
  373. package/development/footer/footer.d.ts.map +1 -1
  374. package/development/footer.js +103 -41
  375. package/development/form-error/form-error.d.ts.map +1 -1
  376. package/development/form-error.js +29 -28
  377. package/development/form-field/form-field/form-field.d.ts +10 -10
  378. package/development/form-field/form-field/form-field.d.ts.map +1 -1
  379. package/development/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
  380. package/development/form-field/form-field-clear.js +51 -51
  381. package/development/form-field/form-field.js +439 -328
  382. package/development/header/common/header-action-common.d.ts +2 -2
  383. package/development/header/common/header-action-common.d.ts.map +1 -1
  384. package/development/header/common.js +95 -28
  385. package/development/header/header/header.d.ts +4 -4
  386. package/development/header/header/header.d.ts.map +1 -1
  387. package/development/header/header-button/header-button.d.ts.map +1 -1
  388. package/development/header/header-button.js +19 -18
  389. package/development/header/header-link/header-link.d.ts.map +1 -1
  390. package/development/header/header-link.js +19 -16
  391. package/development/header/header.js +198 -140
  392. package/development/icon/icon-base.d.ts +3 -4
  393. package/development/icon/icon-base.d.ts.map +1 -1
  394. package/development/icon/icon-name-mixin.d.ts +1 -1
  395. package/development/icon/icon-name-mixin.d.ts.map +1 -1
  396. package/development/icon/icon.d.ts +2 -2
  397. package/development/icon/icon.d.ts.map +1 -1
  398. package/development/icon.js +258 -157
  399. package/development/image/image.d.ts +17 -17
  400. package/development/image/image.d.ts.map +1 -1
  401. package/development/image.js +584 -216
  402. package/development/journey-header/journey-header.d.ts +5 -5
  403. package/development/journey-header/journey-header.d.ts.map +1 -1
  404. package/development/journey-header.js +115 -43
  405. package/development/lead-container/lead-container.d.ts.map +1 -1
  406. package/development/lead-container.js +22 -21
  407. package/development/link/block-link/block-link.d.ts.map +1 -1
  408. package/development/link/block-link-button/block-link-button.d.ts.map +1 -1
  409. package/development/link/block-link-button.js +19 -18
  410. package/development/link/block-link-static/block-link-static.d.ts.map +1 -1
  411. package/development/link/block-link-static.js +19 -18
  412. package/development/link/block-link.js +19 -18
  413. package/development/link/common/block-link-common.d.ts +4 -3
  414. package/development/link/common/block-link-common.d.ts.map +1 -1
  415. package/development/link/common/link-common.d.ts +1 -1
  416. package/development/link/common/link-common.d.ts.map +1 -1
  417. package/development/link/common.js +81 -51
  418. package/development/link/link/link.d.ts.map +1 -1
  419. package/development/link/link-button/link-button.d.ts.map +1 -1
  420. package/development/link/link-button.js +19 -18
  421. package/development/link/link-static/link-static.d.ts.map +1 -1
  422. package/development/link/link-static.js +19 -18
  423. package/development/link/link.js +19 -18
  424. package/development/link-list/common/link-list-base.d.ts +3 -3
  425. package/development/link-list/common/link-list-base.d.ts.map +1 -1
  426. package/development/link-list/common.js +97 -48
  427. package/development/link-list/link-list/link-list.d.ts +2 -2
  428. package/development/link-list/link-list/link-list.d.ts.map +1 -1
  429. package/development/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
  430. package/development/link-list/link-list-anchor.js +18 -17
  431. package/development/link-list/link-list.js +60 -28
  432. package/development/loading-indicator/loading-indicator.d.ts +3 -3
  433. package/development/loading-indicator/loading-indicator.d.ts.map +1 -1
  434. package/development/loading-indicator.js +83 -45
  435. package/development/logo/logo.d.ts +2 -2
  436. package/development/logo/logo.d.ts.map +1 -1
  437. package/development/logo.js +64 -32
  438. package/development/map-container/map-container.d.ts +2 -2
  439. package/development/map-container/map-container.d.ts.map +1 -1
  440. package/development/map-container.js +107 -75
  441. package/development/menu/common/menu-action-common.d.ts +2 -2
  442. package/development/menu/common/menu-action-common.d.ts.map +1 -1
  443. package/development/menu/common.js +41 -20
  444. package/development/menu/menu/menu.d.ts +1 -1
  445. package/development/menu/menu/menu.d.ts.map +1 -1
  446. package/development/menu/menu-button/menu-button.d.ts.map +1 -1
  447. package/development/menu/menu-button.js +19 -18
  448. package/development/menu/menu-link/menu-link.d.ts.map +1 -1
  449. package/development/menu/menu-link.js +19 -18
  450. package/development/menu/menu.js +261 -241
  451. package/development/message/message.d.ts +2 -2
  452. package/development/message/message.d.ts.map +1 -1
  453. package/development/message.js +65 -32
  454. package/development/navigation/common/navigation-action-common.d.ts +1 -1
  455. package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
  456. package/development/navigation/common.js +63 -52
  457. package/development/navigation/navigation/navigation.d.ts +2 -2
  458. package/development/navigation/navigation/navigation.d.ts.map +1 -1
  459. package/development/navigation/navigation-button/navigation-button.d.ts.map +1 -1
  460. package/development/navigation/navigation-button.js +19 -18
  461. package/development/navigation/navigation-link/navigation-link.d.ts.map +1 -1
  462. package/development/navigation/navigation-link.js +19 -18
  463. package/development/navigation/navigation-list/navigation-list.d.ts +1 -1
  464. package/development/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  465. package/development/navigation/navigation-list.js +64 -41
  466. package/development/navigation/navigation-marker/navigation-marker.d.ts +1 -1
  467. package/development/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  468. package/development/navigation/navigation-marker.js +108 -91
  469. package/development/navigation/navigation-section/navigation-section.d.ts +3 -3
  470. package/development/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  471. package/development/navigation/navigation-section.js +282 -236
  472. package/development/navigation/navigation.js +278 -254
  473. package/development/notification/notification.d.ts +6 -6
  474. package/development/notification/notification.d.ts.map +1 -1
  475. package/development/notification.js +212 -146
  476. package/development/option/optgroup/optgroup-base-element.d.ts +3 -3
  477. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  478. package/development/option/optgroup/optgroup.d.ts.map +1 -1
  479. package/development/option/optgroup.js +187 -142
  480. package/development/option/option/option-base-element.d.ts +7 -7
  481. package/development/option/option/option-base-element.d.ts.map +1 -1
  482. package/development/option/option/option.d.ts.map +1 -1
  483. package/development/option/option.js +392 -296
  484. package/development/overlay/overlay-base-element.d.ts +1 -1
  485. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  486. package/development/overlay/overlay.d.ts +4 -4
  487. package/development/overlay/overlay.d.ts.map +1 -1
  488. package/development/overlay.js +260 -207
  489. package/development/paginator/common/paginator-common.d.ts +26 -0
  490. package/development/paginator/common/paginator-common.d.ts.map +1 -0
  491. package/development/paginator/common.d.ts +2 -0
  492. package/development/paginator/common.d.ts.map +1 -0
  493. package/development/paginator/common.js +189 -0
  494. package/development/paginator/compact-paginator/compact-paginator.d.ts +20 -0
  495. package/development/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
  496. package/development/paginator/compact-paginator.d.ts +2 -0
  497. package/development/paginator/compact-paginator.d.ts.map +1 -0
  498. package/development/paginator/compact-paginator.js +96 -0
  499. package/development/paginator/paginator/paginator.d.ts +51 -0
  500. package/development/paginator/paginator/paginator.d.ts.map +1 -0
  501. package/development/paginator/paginator.d.ts +1 -90
  502. package/development/paginator/paginator.d.ts.map +1 -1
  503. package/development/paginator/paginator.js +449 -0
  504. package/development/paginator.d.ts +2 -0
  505. package/development/paginator.d.ts.map +1 -1
  506. package/development/paginator.js +4 -519
  507. package/development/popover/popover/popover.d.ts +6 -7
  508. package/development/popover/popover/popover.d.ts.map +1 -1
  509. package/development/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
  510. package/development/popover/popover-trigger.js +29 -30
  511. package/development/popover/popover.js +358 -303
  512. package/development/radio-button/common/radio-button-common.d.ts +1 -1
  513. package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
  514. package/development/radio-button/common.js +170 -127
  515. package/development/radio-button/radio-button/radio-button.d.ts +2 -6
  516. package/development/radio-button/radio-button/radio-button.d.ts.map +1 -1
  517. package/development/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
  518. package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  519. package/development/radio-button/radio-button-group.js +269 -199
  520. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
  521. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  522. package/development/radio-button/radio-button-panel.js +60 -48
  523. package/development/radio-button/radio-button.js +54 -40
  524. package/development/screen-reader-only/screen-reader-only.d.ts.map +1 -1
  525. package/development/screen-reader-only.js +22 -21
  526. package/development/select/select.d.ts +17 -9
  527. package/development/select/select.d.ts.map +1 -1
  528. package/development/select.js +557 -524
  529. package/development/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
  530. package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  531. package/development/selection-expansion-panel.js +223 -193
  532. package/development/signet/signet.d.ts +2 -2
  533. package/development/signet/signet.d.ts.map +1 -1
  534. package/development/signet.js +65 -33
  535. package/development/skiplink-list/skiplink-list.d.ts +2 -2
  536. package/development/skiplink-list/skiplink-list.d.ts.map +1 -1
  537. package/development/skiplink-list.js +74 -41
  538. package/development/slider/slider.d.ts +7 -5
  539. package/development/slider/slider.d.ts.map +1 -1
  540. package/development/slider.js +260 -181
  541. package/development/status/status.d.ts +3 -3
  542. package/development/status/status.d.ts.map +1 -1
  543. package/development/status.js +96 -51
  544. package/development/stepper/step/step.d.ts.map +1 -1
  545. package/development/stepper/step-label/step-label.d.ts.map +1 -1
  546. package/development/stepper/step-label.js +86 -90
  547. package/development/stepper/step.js +122 -126
  548. package/development/stepper/stepper/stepper.d.ts +3 -3
  549. package/development/stepper/stepper/stepper.d.ts.map +1 -1
  550. package/development/stepper/stepper.js +291 -241
  551. package/development/table/table-wrapper/table-wrapper.d.ts.map +1 -1
  552. package/development/table/table-wrapper.js +37 -39
  553. package/development/tabs/tab/tab.d.ts.map +1 -1
  554. package/development/tabs/tab-group/tab-group.d.ts +2 -2
  555. package/development/tabs/tab-group/tab-group.d.ts.map +1 -1
  556. package/development/tabs/tab-group.js +296 -279
  557. package/development/tabs/tab-label/tab-label.d.ts +3 -3
  558. package/development/tabs/tab-label/tab-label.d.ts.map +1 -1
  559. package/development/tabs/tab-label.js +83 -37
  560. package/development/tabs/tab.js +40 -39
  561. package/development/tag/tag/tag.d.ts +3 -5
  562. package/development/tag/tag/tag.d.ts.map +1 -1
  563. package/development/tag/tag-group/tag-group.d.ts +3 -3
  564. package/development/tag/tag-group/tag-group.d.ts.map +1 -1
  565. package/development/tag/tag-group.js +143 -88
  566. package/development/tag/tag.js +126 -89
  567. package/development/teaser/teaser.d.ts +4 -4
  568. package/development/teaser/teaser.d.ts.map +1 -1
  569. package/development/teaser-hero/teaser-hero.d.ts +3 -3
  570. package/development/teaser-hero/teaser-hero.d.ts.map +1 -1
  571. package/development/teaser-hero.js +83 -36
  572. package/development/teaser-product/common/teaser-product-common.d.ts +1 -1
  573. package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  574. package/development/teaser-product/common.js +51 -26
  575. package/development/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
  576. package/development/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
  577. package/development/teaser-product/teaser-product-static.js +18 -19
  578. package/development/teaser-product/teaser-product.js +18 -19
  579. package/development/teaser.js +94 -40
  580. package/development/time-input/time-input.d.ts +1 -1
  581. package/development/time-input/time-input.d.ts.map +1 -1
  582. package/development/time-input.js +225 -219
  583. package/development/timetable-occupancy/timetable-occupancy.d.ts +2 -2
  584. package/development/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
  585. package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
  586. package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
  587. package/development/timetable-occupancy-icon.js +78 -57
  588. package/development/timetable-occupancy.js +67 -35
  589. package/development/title/title-base.d.ts +3 -3
  590. package/development/title/title-base.d.ts.map +1 -1
  591. package/development/title/title.d.ts.map +1 -1
  592. package/development/title.js +106 -58
  593. package/development/toast/toast.d.ts +4 -4
  594. package/development/toast/toast.d.ts.map +1 -1
  595. package/development/toast.js +204 -146
  596. package/development/toggle/toggle/toggle.d.ts +3 -5
  597. package/development/toggle/toggle/toggle.d.ts.map +1 -1
  598. package/development/toggle/toggle-option/toggle-option.d.ts +2 -2
  599. package/development/toggle/toggle-option/toggle-option.d.ts.map +1 -1
  600. package/development/toggle/toggle-option.js +127 -93
  601. package/development/toggle/toggle.js +200 -163
  602. package/development/toggle-check/toggle-check.d.ts +4 -3
  603. package/development/toggle-check/toggle-check.d.ts.map +1 -1
  604. package/development/toggle-check.js +87 -49
  605. package/development/train/train/train.d.ts +5 -5
  606. package/development/train/train/train.d.ts.map +1 -1
  607. package/development/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
  608. package/development/train/train-blocked-passage.js +22 -21
  609. package/development/train/train-formation/train-formation.d.ts +2 -2
  610. package/development/train/train-formation/train-formation.d.ts.map +1 -1
  611. package/development/train/train-formation.js +113 -90
  612. package/development/train/train-wagon/train-wagon.d.ts +7 -9
  613. package/development/train/train-wagon/train-wagon.d.ts.map +1 -1
  614. package/development/train/train-wagon.js +166 -87
  615. package/development/train/train.js +142 -75
  616. package/development/visual-checkbox/visual-checkbox.d.ts +3 -3
  617. package/development/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  618. package/development/visual-checkbox.js +79 -36
  619. package/dialog/dialog/dialog.d.ts +1 -1
  620. package/dialog/dialog/dialog.d.ts.map +1 -1
  621. package/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
  622. package/dialog/dialog-actions.js +18 -19
  623. package/dialog/dialog-content/dialog-content.d.ts.map +1 -1
  624. package/dialog/dialog-content.js +17 -18
  625. package/dialog/dialog-title/dialog-title.d.ts +3 -3
  626. package/dialog/dialog-title/dialog-title.d.ts.map +1 -1
  627. package/dialog/dialog-title.js +98 -66
  628. package/dialog/dialog.js +120 -114
  629. package/divider/divider.d.ts +1 -1
  630. package/divider/divider.d.ts.map +1 -1
  631. package/divider.js +41 -30
  632. package/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
  633. package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  634. package/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
  635. package/expansion-panel/expansion-panel-content.js +20 -22
  636. package/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
  637. package/expansion-panel/expansion-panel-header.js +53 -61
  638. package/expansion-panel/expansion-panel.js +145 -130
  639. package/file-selector/file-selector.d.ts +26 -15
  640. package/file-selector/file-selector.d.ts.map +1 -1
  641. package/file-selector.js +227 -153
  642. package/flip-card/flip-card/flip-card.d.ts +2 -2
  643. package/flip-card/flip-card/flip-card.d.ts.map +1 -1
  644. package/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
  645. package/flip-card/flip-card-details.js +36 -38
  646. package/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
  647. package/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
  648. package/flip-card/flip-card-summary.js +42 -31
  649. package/flip-card/flip-card.js +88 -69
  650. package/footer/footer.d.ts +4 -4
  651. package/footer/footer.d.ts.map +1 -1
  652. package/footer.js +78 -37
  653. package/form-error/form-error.d.ts.map +1 -1
  654. package/form-error.js +24 -25
  655. package/form-field/form-field/form-field.d.ts +10 -10
  656. package/form-field/form-field/form-field.d.ts.map +1 -1
  657. package/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
  658. package/form-field/form-field-clear.js +39 -41
  659. package/form-field/form-field.js +295 -239
  660. package/header/common/header-action-common.d.ts +2 -2
  661. package/header/common/header-action-common.d.ts.map +1 -1
  662. package/header/common.js +36 -21
  663. package/header/header/header.d.ts +4 -4
  664. package/header/header/header.d.ts.map +1 -1
  665. package/header/header-button/header-button.d.ts.map +1 -1
  666. package/header/header-button.js +14 -16
  667. package/header/header-link/header-link.d.ts.map +1 -1
  668. package/header/header-link.js +14 -14
  669. package/header/header.js +138 -109
  670. package/icon/icon-base.d.ts +3 -4
  671. package/icon/icon-base.d.ts.map +1 -1
  672. package/icon/icon-name-mixin.d.ts +1 -1
  673. package/icon/icon-name-mixin.d.ts.map +1 -1
  674. package/icon/icon.d.ts +2 -2
  675. package/icon/icon.d.ts.map +1 -1
  676. package/icon.js +230 -165
  677. package/image/image.d.ts +17 -17
  678. package/image/image.d.ts.map +1 -1
  679. package/image.js +465 -195
  680. package/index.d.ts +3 -1
  681. package/index.js +3 -1
  682. package/journey-header/journey-header.d.ts +5 -5
  683. package/journey-header/journey-header.d.ts.map +1 -1
  684. package/journey-header.js +89 -49
  685. package/lead-container/lead-container.d.ts.map +1 -1
  686. package/lead-container.js +17 -18
  687. package/link/block-link/block-link.d.ts.map +1 -1
  688. package/link/block-link-button/block-link-button.d.ts.map +1 -1
  689. package/link/block-link-button.js +15 -17
  690. package/link/block-link-static/block-link-static.d.ts.map +1 -1
  691. package/link/block-link-static.js +14 -16
  692. package/link/block-link.js +15 -17
  693. package/link/common/block-link-common.d.ts +4 -3
  694. package/link/common/block-link-common.d.ts.map +1 -1
  695. package/link/common/link-common.d.ts +1 -1
  696. package/link/common/link-common.d.ts.map +1 -1
  697. package/link/common.js +64 -46
  698. package/link/link/link.d.ts.map +1 -1
  699. package/link/link-button/link-button.d.ts.map +1 -1
  700. package/link/link-button.js +15 -17
  701. package/link/link-static/link-static.d.ts.map +1 -1
  702. package/link/link-static.js +15 -17
  703. package/link/link.js +15 -17
  704. package/link-list/common/link-list-base.d.ts +3 -3
  705. package/link-list/common/link-list-base.d.ts.map +1 -1
  706. package/link-list/common.js +72 -44
  707. package/link-list/link-list/link-list.d.ts +2 -2
  708. package/link-list/link-list/link-list.d.ts.map +1 -1
  709. package/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
  710. package/link-list/link-list-anchor.js +15 -16
  711. package/link-list/link-list.js +43 -24
  712. package/loading-indicator/loading-indicator.d.ts +3 -3
  713. package/loading-indicator/loading-indicator.d.ts.map +1 -1
  714. package/loading-indicator.js +61 -36
  715. package/logo/logo.d.ts +2 -2
  716. package/logo/logo.d.ts.map +1 -1
  717. package/logo.js +47 -27
  718. package/map-container/map-container.d.ts +2 -2
  719. package/map-container/map-container.d.ts.map +1 -1
  720. package/map-container.js +84 -65
  721. package/menu/common/menu-action-common.d.ts +2 -2
  722. package/menu/common/menu-action-common.d.ts.map +1 -1
  723. package/menu/common.js +37 -22
  724. package/menu/menu/menu.d.ts +1 -1
  725. package/menu/menu/menu.d.ts.map +1 -1
  726. package/menu/menu-button/menu-button.d.ts.map +1 -1
  727. package/menu/menu-button.js +14 -16
  728. package/menu/menu-link/menu-link.d.ts.map +1 -1
  729. package/menu/menu-link.js +15 -17
  730. package/menu/menu.js +175 -170
  731. package/message/message.d.ts +2 -2
  732. package/message/message.d.ts.map +1 -1
  733. package/message.js +47 -27
  734. package/navigation/common/navigation-action-common.d.ts +1 -1
  735. package/navigation/common/navigation-action-common.d.ts.map +1 -1
  736. package/navigation/common.js +38 -33
  737. package/navigation/navigation/navigation.d.ts +2 -2
  738. package/navigation/navigation/navigation.d.ts.map +1 -1
  739. package/navigation/navigation-button/navigation-button.d.ts.map +1 -1
  740. package/navigation/navigation-button.js +14 -16
  741. package/navigation/navigation-link/navigation-link.d.ts.map +1 -1
  742. package/navigation/navigation-link.js +14 -16
  743. package/navigation/navigation-list/navigation-list.d.ts +1 -1
  744. package/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  745. package/navigation/navigation-list.js +48 -35
  746. package/navigation/navigation-marker/navigation-marker.d.ts +1 -1
  747. package/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  748. package/navigation/navigation-marker.js +77 -69
  749. package/navigation/navigation-section/navigation-section.d.ts +3 -3
  750. package/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  751. package/navigation/navigation-section.js +192 -171
  752. package/navigation/navigation.js +185 -181
  753. package/notification/notification.d.ts +6 -6
  754. package/notification/notification.d.ts.map +1 -1
  755. package/notification.js +147 -116
  756. package/option/optgroup/optgroup-base-element.d.ts +3 -3
  757. package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  758. package/option/optgroup/optgroup.d.ts.map +1 -1
  759. package/option/optgroup.js +131 -112
  760. package/option/option/option-base-element.d.ts +7 -7
  761. package/option/option/option-base-element.d.ts.map +1 -1
  762. package/option/option/option.d.ts.map +1 -1
  763. package/option/option.js +295 -252
  764. package/overlay/overlay-base-element.d.ts +1 -1
  765. package/overlay/overlay-base-element.d.ts.map +1 -1
  766. package/overlay/overlay.d.ts +4 -4
  767. package/overlay/overlay.d.ts.map +1 -1
  768. package/overlay.js +194 -165
  769. package/package.json +19 -3
  770. package/paginator/common/paginator-common.d.ts +26 -0
  771. package/paginator/common/paginator-common.d.ts.map +1 -0
  772. package/paginator/common.d.ts +2 -0
  773. package/paginator/common.d.ts.map +1 -0
  774. package/paginator/common.js +145 -0
  775. package/paginator/compact-paginator/compact-paginator.d.ts +20 -0
  776. package/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
  777. package/paginator/compact-paginator.d.ts +2 -0
  778. package/paginator/compact-paginator.d.ts.map +1 -0
  779. package/paginator/compact-paginator.js +40 -0
  780. package/paginator/paginator/paginator.d.ts +51 -0
  781. package/paginator/paginator/paginator.d.ts.map +1 -0
  782. package/paginator/paginator.d.ts +1 -90
  783. package/paginator/paginator.d.ts.map +1 -1
  784. package/paginator/paginator.js +171 -0
  785. package/paginator.d.ts +2 -0
  786. package/paginator.d.ts.map +1 -1
  787. package/paginator.js +3 -263
  788. package/popover/popover/popover.d.ts +6 -7
  789. package/popover/popover/popover.d.ts.map +1 -1
  790. package/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
  791. package/popover/popover-trigger.js +26 -29
  792. package/popover/popover.js +230 -208
  793. package/radio-button/common/radio-button-common.d.ts +1 -1
  794. package/radio-button/common/radio-button-common.d.ts.map +1 -1
  795. package/radio-button/common.js +67 -43
  796. package/radio-button/radio-button/radio-button.d.ts +2 -6
  797. package/radio-button/radio-button/radio-button.d.ts.map +1 -1
  798. package/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
  799. package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  800. package/radio-button/radio-button-group.js +192 -156
  801. package/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
  802. package/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  803. package/radio-button/radio-button-panel.js +49 -45
  804. package/radio-button/radio-button.js +43 -37
  805. package/screen-reader-only/screen-reader-only.d.ts.map +1 -1
  806. package/screen-reader-only.js +17 -18
  807. package/select/select.d.ts +17 -9
  808. package/select/select.d.ts.map +1 -1
  809. package/select.js +377 -373
  810. package/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
  811. package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  812. package/selection-expansion-panel.js +157 -148
  813. package/signet/signet.d.ts +2 -2
  814. package/signet/signet.d.ts.map +1 -1
  815. package/signet.js +48 -28
  816. package/skiplink-list/skiplink-list.d.ts +2 -2
  817. package/skiplink-list/skiplink-list.d.ts.map +1 -1
  818. package/skiplink-list.js +54 -36
  819. package/slider/slider.d.ts +7 -5
  820. package/slider/slider.d.ts.map +1 -1
  821. package/slider.js +197 -155
  822. package/standard-theme.css +5 -1
  823. package/status/status.d.ts +3 -3
  824. package/status/status.d.ts.map +1 -1
  825. package/status.js +71 -46
  826. package/stepper/step/step.d.ts.map +1 -1
  827. package/stepper/step-label/step-label.d.ts.map +1 -1
  828. package/stepper/step-label.js +69 -75
  829. package/stepper/step.js +99 -104
  830. package/stepper/stepper/stepper.d.ts +3 -3
  831. package/stepper/stepper/stepper.d.ts.map +1 -1
  832. package/stepper/stepper.js +208 -188
  833. package/table/table-wrapper/table-wrapper.d.ts.map +1 -1
  834. package/table/table-wrapper.js +32 -36
  835. package/tabs/tab/tab.d.ts.map +1 -1
  836. package/tabs/tab-group/tab-group.d.ts +2 -2
  837. package/tabs/tab-group/tab-group.d.ts.map +1 -1
  838. package/tabs/tab-group.js +200 -193
  839. package/tabs/tab-label/tab-label.d.ts +3 -3
  840. package/tabs/tab-label/tab-label.d.ts.map +1 -1
  841. package/tabs/tab-label.js +65 -37
  842. package/tabs/tab.js +34 -35
  843. package/tag/tag/tag.d.ts +3 -5
  844. package/tag/tag/tag.d.ts.map +1 -1
  845. package/tag/tag-group/tag-group.d.ts +3 -3
  846. package/tag/tag-group/tag-group.d.ts.map +1 -1
  847. package/tag/tag-group.js +107 -75
  848. package/tag/tag.js +92 -73
  849. package/teaser/teaser.d.ts +4 -4
  850. package/teaser/teaser.d.ts.map +1 -1
  851. package/teaser-hero/teaser-hero.d.ts +3 -3
  852. package/teaser-hero/teaser-hero.d.ts.map +1 -1
  853. package/teaser-hero.js +66 -38
  854. package/teaser-product/common/teaser-product-common.d.ts +1 -1
  855. package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  856. package/teaser-product/common.js +36 -21
  857. package/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
  858. package/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
  859. package/teaser-product/teaser-product-static.js +14 -17
  860. package/teaser-product/teaser-product.js +14 -17
  861. package/teaser.js +69 -37
  862. package/time-input/time-input.d.ts +1 -1
  863. package/time-input/time-input.d.ts.map +1 -1
  864. package/time-input.js +160 -166
  865. package/timetable-occupancy/timetable-occupancy.d.ts +2 -2
  866. package/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
  867. package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
  868. package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
  869. package/timetable-occupancy-icon.js +60 -48
  870. package/timetable-occupancy.js +55 -38
  871. package/title/title-base.d.ts +3 -3
  872. package/title/title-base.d.ts.map +1 -1
  873. package/title/title.d.ts.map +1 -1
  874. package/title.js +81 -53
  875. package/toast/toast.d.ts +4 -4
  876. package/toast/toast.d.ts.map +1 -1
  877. package/toast.js +156 -123
  878. package/toggle/toggle/toggle.d.ts +3 -5
  879. package/toggle/toggle/toggle.d.ts.map +1 -1
  880. package/toggle/toggle-option/toggle-option.d.ts +2 -2
  881. package/toggle/toggle-option/toggle-option.d.ts.map +1 -1
  882. package/toggle/toggle-option.js +89 -72
  883. package/toggle/toggle.js +139 -122
  884. package/toggle-check/toggle-check.d.ts +4 -3
  885. package/toggle-check/toggle-check.d.ts.map +1 -1
  886. package/toggle-check.js +63 -41
  887. package/train/train/train.d.ts +5 -5
  888. package/train/train/train.d.ts.map +1 -1
  889. package/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
  890. package/train/train-blocked-passage.js +17 -18
  891. package/train/train-formation/train-formation.d.ts +2 -2
  892. package/train/train-formation/train-formation.d.ts.map +1 -1
  893. package/train/train-formation.js +96 -87
  894. package/train/train-wagon/train-wagon.d.ts +7 -9
  895. package/train/train-wagon/train-wagon.d.ts.map +1 -1
  896. package/train/train-wagon.js +150 -110
  897. package/train/train.js +108 -71
  898. package/visual-checkbox/visual-checkbox.d.ts +3 -3
  899. package/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  900. package/visual-checkbox.js +59 -32
  901. package/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts +0 -2
  902. package/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts.map +0 -1
  903. package/button/mini-button-group/index.d.ts +0 -2
  904. package/button/mini-button-group/index.d.ts.map +0 -1
  905. package/development/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts +0 -2
  906. package/development/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts.map +0 -1
  907. package/development/button/mini-button-group/index.d.ts +0 -2
  908. package/development/button/mini-button-group/index.d.ts.map +0 -1
  909. package/development/flip-card/flip-card/index.d.ts +0 -2
  910. package/development/flip-card/flip-card/index.d.ts.map +0 -1
  911. package/development/flip-card/flip-card-details/index.d.ts +0 -2
  912. package/development/flip-card/flip-card-details/index.d.ts.map +0 -1
  913. package/development/flip-card/flip-card-summary/index.d.ts +0 -2
  914. package/development/flip-card/flip-card-summary/index.d.ts.map +0 -1
  915. package/development/link-list/link-list-anchor/index.d.ts +0 -2
  916. package/development/link-list/link-list-anchor/index.d.ts.map +0 -1
  917. package/development/paginator/index.d.ts +0 -2
  918. package/development/paginator/index.d.ts.map +0 -1
  919. package/development/radio-button/radio-button-panel/index.d.ts +0 -2
  920. package/development/radio-button/radio-button-panel/index.d.ts.map +0 -1
  921. package/development/tabs/tab/index.d.ts +0 -2
  922. package/development/tabs/tab/index.d.ts.map +0 -1
  923. package/flip-card/flip-card/index.d.ts +0 -2
  924. package/flip-card/flip-card/index.d.ts.map +0 -1
  925. package/flip-card/flip-card-details/index.d.ts +0 -2
  926. package/flip-card/flip-card-details/index.d.ts.map +0 -1
  927. package/flip-card/flip-card-summary/index.d.ts +0 -2
  928. package/flip-card/flip-card-summary/index.d.ts.map +0 -1
  929. package/link-list/link-list-anchor/index.d.ts +0 -2
  930. package/link-list/link-list-anchor/index.d.ts.map +0 -1
  931. package/paginator/index.d.ts +0 -2
  932. package/paginator/index.d.ts.map +0 -1
  933. package/radio-button/radio-button-panel/index.d.ts +0 -2
  934. package/radio-button/radio-button-panel/index.d.ts.map +0 -1
  935. package/tabs/tab/index.d.ts +0 -2
  936. package/tabs/tab/index.d.ts.map +0 -1
@@ -1,10 +1,19 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ import { __esDecorate, __runInitializers } from "tslib";
1
9
  import { css, LitElement, isServer, html, nothing } from "lit";
2
- import { property, state, customElement } from "lit/decorators.js";
10
+ import { customElement, property, state } from "lit/decorators.js";
3
11
  import { classMap } from "lit/directives/class-map.js";
4
12
  import { sbbInputModalityDetector, isArrowKeyOrPageKeysPressed } from "./core/a11y.js";
5
13
  import { readConfig } from "./core/config.js";
6
14
  import { SbbConnectedAbortController, SbbLanguageController } from "./core/controllers.js";
7
15
  import { defaultDateAdapter, YEARS_PER_PAGE, DAYS_PER_ROW, MONTHS_PER_ROW, YEARS_PER_ROW } from "./core/datetime.js";
16
+ import { forceType } from "./core/decorators.js";
8
17
  import { isBreakpoint } from "./core/dom.js";
9
18
  import { EventEmitter } from "./core/eventing.js";
10
19
  import { i18nPreviousMonth, i18nNextMonth, i18nYearMonthSelection, i18nPreviousYear, i18nNextYear, i18nCalendarDateSelection, i18nPreviousYearRange, i18nNextYearRange } from "./core/i18n.js";
@@ -322,573 +331,597 @@ const style = css`*,
322
331
  transform: translateY(var(--sbb-calendar-table-animation-shift));
323
332
  }
324
333
  }`;
325
- var __defProp = Object.defineProperty;
326
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
327
- var __decorateClass = (decorators, target, key, kind) => {
328
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
329
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
330
- if (decorator = decorators[i])
331
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
332
- if (kind && result) __defProp(target, key, result);
333
- return result;
334
- };
335
- let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
336
- constructor() {
337
- var _a;
338
- super();
339
- this.wide = false;
340
- this.view = "day";
341
- this._now = null;
342
- this._dateAdapter = ((_a = readConfig().datetime) == null ? void 0 : _a.dateAdapter) ?? defaultDateAdapter;
343
- this._dateSelected = new EventEmitter(
344
- this,
345
- SbbCalendarElement.events.dateSelected
346
- );
347
- this._activeDate = this.now;
348
- this._calendarView = "day";
349
- this._nextCalendarView = "day";
350
- this._weeks = [];
351
- this._monthNames = this._dateAdapter.getMonthNames("long");
352
- this._resetFocus = false;
353
- this._initialized = false;
354
- this._abort = new SbbConnectedAbortController(this);
355
- this._language = new SbbLanguageController(this).withHandler(() => {
334
+ let SbbCalendarElement = (() => {
335
+ var _wide_accessor_storage, _view_accessor_storage, _dateFilter_accessor_storage, __activeDate_accessor_storage, __selected_accessor_storage, __calendarView_accessor_storage, __initialized_accessor_storage, _a;
336
+ let _classDecorators = [customElement("sbb-calendar")];
337
+ let _classDescriptor;
338
+ let _classExtraInitializers = [];
339
+ let _classThis;
340
+ let _classSuper = SbbHydrationMixin(LitElement);
341
+ let _instanceExtraInitializers = [];
342
+ let _wide_decorators;
343
+ let _wide_initializers = [];
344
+ let _wide_extraInitializers = [];
345
+ let _view_decorators;
346
+ let _view_initializers = [];
347
+ let _view_extraInitializers = [];
348
+ let _set_min_decorators;
349
+ let _set_max_decorators;
350
+ let _set_now_decorators;
351
+ let _set_selected_decorators;
352
+ let _dateFilter_decorators;
353
+ let _dateFilter_initializers = [];
354
+ let _dateFilter_extraInitializers = [];
355
+ let __activeDate_decorators;
356
+ let __activeDate_initializers = [];
357
+ let __activeDate_extraInitializers = [];
358
+ let __selected_decorators;
359
+ let __selected_initializers = [];
360
+ let __selected_extraInitializers = [];
361
+ let _set__wide_decorators;
362
+ let __calendarView_decorators;
363
+ let __calendarView_initializers = [];
364
+ let __calendarView_extraInitializers = [];
365
+ let __initialized_decorators;
366
+ let __initialized_initializers = [];
367
+ let __initialized_extraInitializers = [];
368
+ var SbbCalendarElement2 = (_a = class extends _classSuper {
369
+ constructor() {
370
+ var _a2;
371
+ super();
372
+ __privateAdd(this, _wide_accessor_storage);
373
+ __privateAdd(this, _view_accessor_storage);
374
+ __privateAdd(this, _dateFilter_accessor_storage);
375
+ __privateAdd(this, __activeDate_accessor_storage);
376
+ __privateAdd(this, __selected_accessor_storage);
377
+ __privateAdd(this, __calendarView_accessor_storage);
378
+ __privateAdd(this, __initialized_accessor_storage);
379
+ __privateSet(this, _wide_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _wide_initializers, false)));
380
+ __privateSet(this, _view_accessor_storage, (__runInitializers(this, _wide_extraInitializers), __runInitializers(this, _view_initializers, "day")));
381
+ this._min = __runInitializers(this, _view_extraInitializers);
382
+ this._now = null;
383
+ __privateSet(this, _dateFilter_accessor_storage, __runInitializers(this, _dateFilter_initializers, null));
384
+ this._dateAdapter = (__runInitializers(this, _dateFilter_extraInitializers), ((_a2 = readConfig().datetime) == null ? void 0 : _a2.dateAdapter) ?? defaultDateAdapter);
385
+ this._dateSelected = new EventEmitter(this, SbbCalendarElement2.events.dateSelected);
386
+ __privateSet(this, __activeDate_accessor_storage, __runInitializers(this, __activeDate_initializers, this.now));
387
+ __privateSet(this, __selected_accessor_storage, (__runInitializers(this, __activeDate_extraInitializers), __runInitializers(this, __selected_initializers, void 0)));
388
+ __privateSet(this, __calendarView_accessor_storage, (__runInitializers(this, __selected_extraInitializers), __runInitializers(this, __calendarView_initializers, "day")));
389
+ this._nextCalendarView = (__runInitializers(this, __calendarView_extraInitializers), "day");
390
+ this._weeks = [];
356
391
  this._monthNames = this._dateAdapter.getMonthNames("long");
392
+ this._resetFocus = false;
393
+ __privateSet(this, __initialized_accessor_storage, __runInitializers(this, __initialized_initializers, false));
394
+ this._abort = (__runInitializers(this, __initialized_extraInitializers), new SbbConnectedAbortController(this));
395
+ this._language = new SbbLanguageController(this).withHandler(() => {
396
+ this._monthNames = this._dateAdapter.getMonthNames("long");
397
+ this._createMonthRows();
398
+ });
357
399
  this._createMonthRows();
358
- });
359
- this._createMonthRows();
360
- this._setWeekdays();
361
- }
362
- set min(value) {
363
- this._min = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
364
- }
365
- get min() {
366
- return this._min ?? null;
367
- }
368
- set max(value) {
369
- this._max = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
370
- }
371
- get max() {
372
- return this._max ?? null;
373
- }
374
- set now(value) {
375
- this._now = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
376
- }
377
- get now() {
378
- return this._now ?? this._dateAdapter.today();
379
- }
380
- set selected(value) {
381
- this._selectedDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
382
- if (!!this._selectedDate && (!this._isDayInRange(this._dateAdapter.toIso8601(this._selectedDate)) || this._dateFilter(this._selectedDate))) {
383
- this._selected = this._dateAdapter.toIso8601(this._selectedDate);
384
- } else {
385
- this._selected = void 0;
400
+ this._setWeekdays();
386
401
  }
387
- }
388
- get selected() {
389
- return this._selectedDate ?? null;
390
- }
391
- set _wide(wide) {
392
- this.toggleAttribute("data-wide", wide);
393
- }
394
- get _wide() {
395
- return this.hasAttribute("data-wide");
396
- }
397
- /** A list of buttons corresponding to days, months or years depending on the view. */
398
- get _cells() {
399
- return Array.from(
400
- this.shadowRoot.querySelectorAll(".sbb-calendar__cell") ?? []
401
- );
402
- }
403
- _dateFilter(date) {
404
- var _a;
405
- return ((_a = this.dateFilter) == null ? void 0 : _a.call(this, date)) ?? true;
406
- }
407
- /** Resets the active month according to the new state of the calendar. */
408
- resetPosition() {
409
- this._resetCalendarView();
410
- this._init();
411
- }
412
- connectedCallback() {
413
- var _a;
414
- super.connectedCallback();
415
- this.resetPosition();
416
- this.focus = () => {
417
- this._resetFocus = true;
418
- this._focusCell();
419
- };
420
- (_a = globalThis.window) == null ? void 0 : _a.addEventListener("resize", () => this._init(), {
421
- passive: true,
422
- signal: this._abort.signal
423
- });
424
- }
425
- willUpdate(changedProperties) {
426
- super.willUpdate(changedProperties);
427
- if (!this._initialized) {
428
- return;
402
+ /** If set to true, two months are displayed */
403
+ get wide() {
404
+ return __privateGet(this, _wide_accessor_storage);
429
405
  }
430
- if (changedProperties.has("wide")) {
431
- this.resetPosition();
406
+ set wide(value) {
407
+ __privateSet(this, _wide_accessor_storage, value);
432
408
  }
433
- if (changedProperties.has("view")) {
434
- this._setChosenYear();
435
- this._chosenMonth = void 0;
436
- this._nextCalendarView = this._calendarView = this.view;
409
+ /** The initial view of the calendar which should be displayed on opening. */
410
+ get view() {
411
+ return __privateGet(this, _view_accessor_storage);
437
412
  }
438
- }
439
- updated(changedProperties) {
440
- super.updated(changedProperties);
441
- this._setTabIndex();
442
- if (sbbInputModalityDetector.mostRecentModality === "keyboard") {
443
- this._focusCell();
413
+ set view(value) {
414
+ __privateSet(this, _view_accessor_storage, value);
444
415
  }
445
- }
446
- /** Initializes the component. */
447
- _init(activeDate) {
448
- if (isServer) {
449
- return;
450
- } else if (this.hydrationRequired) {
451
- this.hydrationComplete.then(() => this._init());
452
- return;
453
- }
454
- if (activeDate) {
455
- this._assignActiveDate(activeDate);
456
- }
457
- this._wide = isBreakpoint("medium") && this.wide;
458
- this._weeks = this._createWeekRows(this._activeDate);
459
- this._years = this._createYearRows();
460
- this._nextMonthWeeks = [[]];
461
- this._nextMonthYears = [[]];
462
- if (this._wide) {
463
- const nextMonthDate = this._dateAdapter.addCalendarMonths(this._activeDate, 1);
464
- this._nextMonthWeeks = this._createWeekRows(nextMonthDate);
465
- this._nextMonthYears = this._createYearRows(YEARS_PER_PAGE);
466
- }
467
- this._initialized = true;
468
- }
469
- /** Focuses on a day cell prioritizing the selected day, the current day, and lastly, the first selectable day. */
470
- _focusCell() {
471
- var _a;
472
- if (this._resetFocus) {
473
- (_a = this._getFirstFocusable()) == null ? void 0 : _a.focus();
474
- this._resetFocus = false;
416
+ /** The minimum valid date. Takes T Object, ISOString, and Unix Timestamp (number of seconds since Jan 1, 1970). */
417
+ set min(value) {
418
+ this._min = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
475
419
  }
476
- }
477
- /** Creates the array of weekdays. */
478
- _setWeekdays() {
479
- const narrowWeekdays = this._dateAdapter.getDayOfWeekNames("narrow");
480
- const longWeekdays = this._dateAdapter.getDayOfWeekNames("long");
481
- const weekdays = longWeekdays.map((long, i) => ({
482
- long,
483
- narrow: narrowWeekdays[i]
484
- }));
485
- const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();
486
- this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
487
- }
488
- /** Creates the rows for each week. */
489
- _createWeekRows(value) {
490
- const daysInMonth = this._dateAdapter.getNumDaysInMonth(value);
491
- const dateNames = this._dateAdapter.getDateNames();
492
- const weeks = [[]];
493
- const weekOffset = this._dateAdapter.getFirstWeekOffset(value);
494
- for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
495
- if (cell === DAYS_PER_ROW) {
496
- weeks.push([]);
497
- cell = 0;
420
+ get min() {
421
+ return this._min ?? null;
422
+ }
423
+ /** The maximum valid date. Takes T Object, ISOString, and Unix Timestamp (number of seconds since Jan 1, 1970). */
424
+ set max(value) {
425
+ this._max = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
426
+ }
427
+ get max() {
428
+ return this._max ?? null;
429
+ }
430
+ /** A configured date which acts as the current date instead of the real current date. Recommended for testing purposes. */
431
+ set now(value) {
432
+ this._now = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
433
+ }
434
+ get now() {
435
+ return this._now ?? this._dateAdapter.today();
436
+ }
437
+ /** The selected date. Takes T Object, ISOString, and Unix Timestamp (number of seconds since Jan 1, 1970). */
438
+ set selected(value) {
439
+ this._selectedDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
440
+ if (!!this._selectedDate && (!this._isDayInRange(this._dateAdapter.toIso8601(this._selectedDate)) || this._dateFilter(this._selectedDate))) {
441
+ this._selected = this._dateAdapter.toIso8601(this._selectedDate);
442
+ } else {
443
+ this._selected = void 0;
498
444
  }
499
- const date = this._dateAdapter.createDate(
500
- this._dateAdapter.getYear(value),
501
- this._dateAdapter.getMonth(value),
502
- i + 1
503
- );
504
- weeks[weeks.length - 1].push({
505
- value: this._dateAdapter.toIso8601(date),
506
- dayValue: dateNames[i],
507
- monthValue: String(this._dateAdapter.getMonth(date)),
508
- yearValue: String(this._dateAdapter.getYear(date))
445
+ }
446
+ get selected() {
447
+ return this._selectedDate ?? null;
448
+ }
449
+ /** A function used to filter out dates. */
450
+ get dateFilter() {
451
+ return __privateGet(this, _dateFilter_accessor_storage);
452
+ }
453
+ set dateFilter(value) {
454
+ __privateSet(this, _dateFilter_accessor_storage, value);
455
+ }
456
+ /** The currently active date. */
457
+ get _activeDate() {
458
+ return __privateGet(this, __activeDate_accessor_storage);
459
+ }
460
+ set _activeDate(value) {
461
+ __privateSet(this, __activeDate_accessor_storage, value);
462
+ }
463
+ /** The selected date as ISOString. */
464
+ get _selected() {
465
+ return __privateGet(this, __selected_accessor_storage);
466
+ }
467
+ set _selected(value) {
468
+ __privateSet(this, __selected_accessor_storage, value);
469
+ }
470
+ /** The current wide property considering property value and breakpoints. From zero to small `wide` has always to be false. */
471
+ set _wide(wide) {
472
+ this.toggleAttribute("data-wide", wide);
473
+ }
474
+ get _wide() {
475
+ return this.hasAttribute("data-wide");
476
+ }
477
+ get _calendarView() {
478
+ return __privateGet(this, __calendarView_accessor_storage);
479
+ }
480
+ set _calendarView(value) {
481
+ __privateSet(this, __calendarView_accessor_storage, value);
482
+ }
483
+ /** A list of buttons corresponding to days, months or years depending on the view. */
484
+ get _cells() {
485
+ return Array.from(this.shadowRoot.querySelectorAll(".sbb-calendar__cell") ?? []);
486
+ }
487
+ get _initialized() {
488
+ return __privateGet(this, __initialized_accessor_storage);
489
+ }
490
+ set _initialized(value) {
491
+ __privateSet(this, __initialized_accessor_storage, value);
492
+ }
493
+ _dateFilter(date) {
494
+ var _a2;
495
+ return ((_a2 = this.dateFilter) == null ? void 0 : _a2.call(this, date)) ?? true;
496
+ }
497
+ /** Resets the active month according to the new state of the calendar. */
498
+ resetPosition() {
499
+ this._resetCalendarView();
500
+ this._init();
501
+ }
502
+ connectedCallback() {
503
+ var _a2;
504
+ super.connectedCallback();
505
+ this.resetPosition();
506
+ this.focus = () => {
507
+ this._resetFocus = true;
508
+ this._focusCell();
509
+ };
510
+ (_a2 = globalThis.window) == null ? void 0 : _a2.addEventListener("resize", () => this._init(), {
511
+ passive: true,
512
+ signal: this._abort.signal
509
513
  });
510
514
  }
511
- return weeks;
512
- }
513
- /** Creates the rows for the month selection view. */
514
- _createMonthRows() {
515
- const shortNames = this._dateAdapter.getMonthNames("short");
516
- const months = new Array(12).fill(null).map(
517
- (_, i) => ({
515
+ willUpdate(changedProperties) {
516
+ super.willUpdate(changedProperties);
517
+ if (!this._initialized) {
518
+ return;
519
+ }
520
+ if (changedProperties.has("wide")) {
521
+ this.resetPosition();
522
+ }
523
+ if (changedProperties.has("view")) {
524
+ this._setChosenYear();
525
+ this._chosenMonth = void 0;
526
+ this._nextCalendarView = this._calendarView = this.view;
527
+ }
528
+ }
529
+ updated(changedProperties) {
530
+ super.updated(changedProperties);
531
+ this._setTabIndex();
532
+ if (sbbInputModalityDetector.mostRecentModality === "keyboard") {
533
+ this._focusCell();
534
+ }
535
+ }
536
+ /** Initializes the component. */
537
+ _init(activeDate) {
538
+ if (isServer) {
539
+ return;
540
+ } else if (this.hydrationRequired) {
541
+ this.hydrationComplete.then(() => this._init());
542
+ return;
543
+ }
544
+ if (activeDate) {
545
+ this._assignActiveDate(activeDate);
546
+ }
547
+ this._wide = isBreakpoint("medium") && this.wide;
548
+ this._weeks = this._createWeekRows(this._activeDate);
549
+ this._years = this._createYearRows();
550
+ this._nextMonthWeeks = [[]];
551
+ this._nextMonthYears = [[]];
552
+ if (this._wide) {
553
+ const nextMonthDate = this._dateAdapter.addCalendarMonths(this._activeDate, 1);
554
+ this._nextMonthWeeks = this._createWeekRows(nextMonthDate);
555
+ this._nextMonthYears = this._createYearRows(YEARS_PER_PAGE);
556
+ }
557
+ this._initialized = true;
558
+ }
559
+ /** Focuses on a day cell prioritizing the selected day, the current day, and lastly, the first selectable day. */
560
+ _focusCell() {
561
+ var _a2;
562
+ if (this._resetFocus) {
563
+ (_a2 = this._getFirstFocusable()) == null ? void 0 : _a2.focus();
564
+ this._resetFocus = false;
565
+ }
566
+ }
567
+ /** Creates the array of weekdays. */
568
+ _setWeekdays() {
569
+ const narrowWeekdays = this._dateAdapter.getDayOfWeekNames("narrow");
570
+ const longWeekdays = this._dateAdapter.getDayOfWeekNames("long");
571
+ const weekdays = longWeekdays.map((long, i) => ({
572
+ long,
573
+ narrow: narrowWeekdays[i]
574
+ }));
575
+ const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();
576
+ this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
577
+ }
578
+ /** Creates the rows for each week. */
579
+ _createWeekRows(value) {
580
+ const daysInMonth = this._dateAdapter.getNumDaysInMonth(value);
581
+ const dateNames = this._dateAdapter.getDateNames();
582
+ const weeks = [[]];
583
+ const weekOffset = this._dateAdapter.getFirstWeekOffset(value);
584
+ for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
585
+ if (cell === DAYS_PER_ROW) {
586
+ weeks.push([]);
587
+ cell = 0;
588
+ }
589
+ const date = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), i + 1);
590
+ weeks[weeks.length - 1].push({
591
+ value: this._dateAdapter.toIso8601(date),
592
+ dayValue: dateNames[i],
593
+ monthValue: String(this._dateAdapter.getMonth(date)),
594
+ yearValue: String(this._dateAdapter.getYear(date))
595
+ });
596
+ }
597
+ return weeks;
598
+ }
599
+ /** Creates the rows for the month selection view. */
600
+ _createMonthRows() {
601
+ const shortNames = this._dateAdapter.getMonthNames("short");
602
+ const months = new Array(12).fill(null).map((_, i) => ({
518
603
  value: shortNames[i],
519
604
  longValue: this._monthNames[i],
520
605
  monthValue: i + 1
521
- })
522
- );
523
- const rows = 12 / MONTHS_PER_ROW;
524
- const monthArray = [];
525
- for (let i = 0; i < rows; i++) {
526
- monthArray.push(months.slice(MONTHS_PER_ROW * i, MONTHS_PER_ROW * (i + 1)));
527
- }
528
- this._months = monthArray;
529
- }
530
- /** Creates the rows for the year selection view. */
531
- _createYearRows(offset = 0) {
532
- const startValueYearView = this._getStartValueYearView();
533
- const allYears = new Array(YEARS_PER_PAGE).fill(0).map((_, i) => startValueYearView + offset + i);
534
- const rows = YEARS_PER_PAGE / YEARS_PER_ROW;
535
- const yearArray = [];
536
- for (let i = 0; i < rows; i++) {
537
- yearArray.push(allYears.slice(YEARS_PER_ROW * i, YEARS_PER_ROW * (i + 1)));
538
- }
539
- return yearArray;
540
- }
541
- /**
542
- * Calculates the first year that will be shown in the year selection panel.
543
- * If `minDate` and `maxDate` are both null, the starting year is calculated as
544
- * the multiple of YEARS_PER_PAGE closest to and less than activeDate,
545
- * e.g., with `YEARS_PER_PAGE` = 24 and `activeDate` = 2020, the function will return 2016 (24 * 83),
546
- * while with `activeDate` = 2000, the function will return 1992 (24 * 82).
547
- * If `minDate` is not null, it returns the corresponding year; if `maxDate` is not null,
548
- * it returns the corresponding year minus `YEARS_PER_PAGE`, so that the `maxDate` is the last rendered year.
549
- * If both are not null, `maxDate` has priority over `minDate`.
550
- */
551
- _getStartValueYearView() {
552
- let startingYear = 0;
553
- if (this.max) {
554
- startingYear = this._dateAdapter.getYear(this.max) - YEARS_PER_PAGE + 1;
555
- } else if (this.min) {
556
- startingYear = this._dateAdapter.getYear(this.min);
557
- }
558
- const activeYear = this._dateAdapter.getYear(this._activeDate);
559
- return activeYear - ((activeYear - startingYear) % YEARS_PER_PAGE + YEARS_PER_PAGE) % YEARS_PER_PAGE;
560
- }
561
- /** Checks if date is within the min-max range. */
562
- _isDayInRange(date) {
563
- if (!this._min && !this._max) {
564
- return true;
565
- }
566
- const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.compareDate(this._min, this._dateAdapter.deserialize(date)) > 0;
567
- const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.compareDate(this._max, this._dateAdapter.deserialize(date)) < 0;
568
- return !(isBeforeMin || isAfterMax);
569
- }
570
- _isMonthInRange(month) {
571
- if (!this._min && !this._max) {
572
- return true;
606
+ }));
607
+ const rows = 12 / MONTHS_PER_ROW;
608
+ const monthArray = [];
609
+ for (let i = 0; i < rows; i++) {
610
+ monthArray.push(months.slice(MONTHS_PER_ROW * i, MONTHS_PER_ROW * (i + 1)));
611
+ }
612
+ this._months = monthArray;
573
613
  }
574
- const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.getYear(this._min) >= this._chosenYear && this._dateAdapter.getMonth(this._min) > month;
575
- const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.getYear(this._max) <= this._chosenYear && this._dateAdapter.getMonth(this._max) < month;
576
- return !(isBeforeMin || isAfterMax);
577
- }
578
- _isYearInRange(year) {
579
- if (!this._min && !this._max) {
580
- return true;
614
+ /** Creates the rows for the year selection view. */
615
+ _createYearRows(offset = 0) {
616
+ const startValueYearView = this._getStartValueYearView();
617
+ const allYears = new Array(YEARS_PER_PAGE).fill(0).map((_, i) => startValueYearView + offset + i);
618
+ const rows = YEARS_PER_PAGE / YEARS_PER_ROW;
619
+ const yearArray = [];
620
+ for (let i = 0; i < rows; i++) {
621
+ yearArray.push(allYears.slice(YEARS_PER_ROW * i, YEARS_PER_ROW * (i + 1)));
622
+ }
623
+ return yearArray;
581
624
  }
582
- const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.getYear(this._min) > year;
583
- const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.getYear(this._max) < year;
584
- return !(isBeforeMin || isAfterMax);
585
- }
586
- // Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/year-view.ts#L366
587
- _isMonthFilteredOut(month) {
588
- if (!this.dateFilter) {
589
- return true;
590
- }
591
- const firstOfMonth = this._dateAdapter.createDate(this._chosenYear, month, 1);
592
- for (let date = firstOfMonth; this._dateAdapter.getMonth(date) == month; date = this._dateAdapter.addCalendarDays(date, 1)) {
593
- if (this.dateFilter(date)) {
625
+ /**
626
+ * Calculates the first year that will be shown in the year selection panel.
627
+ * If `minDate` and `maxDate` are both null, the starting year is calculated as
628
+ * the multiple of YEARS_PER_PAGE closest to and less than activeDate,
629
+ * e.g., with `YEARS_PER_PAGE` = 24 and `activeDate` = 2020, the function will return 2016 (24 * 83),
630
+ * while with `activeDate` = 2000, the function will return 1992 (24 * 82).
631
+ * If `minDate` is not null, it returns the corresponding year; if `maxDate` is not null,
632
+ * it returns the corresponding year minus `YEARS_PER_PAGE`, so that the `maxDate` is the last rendered year.
633
+ * If both are not null, `maxDate` has priority over `minDate`.
634
+ */
635
+ _getStartValueYearView() {
636
+ let startingYear = 0;
637
+ if (this.max) {
638
+ startingYear = this._dateAdapter.getYear(this.max) - YEARS_PER_PAGE + 1;
639
+ } else if (this.min) {
640
+ startingYear = this._dateAdapter.getYear(this.min);
641
+ }
642
+ const activeYear = this._dateAdapter.getYear(this._activeDate);
643
+ return activeYear - ((activeYear - startingYear) % YEARS_PER_PAGE + YEARS_PER_PAGE) % YEARS_PER_PAGE;
644
+ }
645
+ /** Checks if date is within the min-max range. */
646
+ _isDayInRange(date) {
647
+ if (!this._min && !this._max) {
594
648
  return true;
595
649
  }
650
+ const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.compareDate(this._min, this._dateAdapter.deserialize(date)) > 0;
651
+ const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.compareDate(this._max, this._dateAdapter.deserialize(date)) < 0;
652
+ return !(isBeforeMin || isAfterMax);
596
653
  }
597
- return false;
598
- }
599
- // Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/multi-year-view.ts#L351
600
- _isYearFilteredOut(year) {
601
- if (!this.dateFilter) {
602
- return true;
603
- }
604
- const firstOfYear = this._dateAdapter.createDate(year, 1, 1);
605
- for (let date = firstOfYear; this._dateAdapter.getYear(date) == year; date = this._dateAdapter.addCalendarDays(date, 1)) {
606
- if (this.dateFilter(date)) {
654
+ _isMonthInRange(month) {
655
+ if (!this._min && !this._max) {
607
656
  return true;
608
657
  }
658
+ const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.getYear(this._min) >= this._chosenYear && this._dateAdapter.getMonth(this._min) > month;
659
+ const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.getYear(this._max) <= this._chosenYear && this._dateAdapter.getMonth(this._max) < month;
660
+ return !(isBeforeMin || isAfterMax);
609
661
  }
610
- return false;
611
- }
612
- /** Emits the selected date and sets it internally. */
613
- _selectDate(day) {
614
- this._chosenMonth = void 0;
615
- this._setChosenYear();
616
- if (this._selected !== day) {
617
- this._selected = day;
618
- this._dateSelected.emit(this._dateAdapter.deserialize(day));
662
+ _isYearInRange(year) {
663
+ if (!this._min && !this._max) {
664
+ return true;
665
+ }
666
+ const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.getYear(this._min) > year;
667
+ const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.getYear(this._max) < year;
668
+ return !(isBeforeMin || isAfterMax);
619
669
  }
620
- }
621
- _setChosenYear() {
622
- if (this.view === "month") {
623
- this._chosenYear = this._dateAdapter.getYear(
624
- this._dateAdapter.deserialize(this._selected) ?? this.selected ?? this.now
625
- );
626
- } else {
627
- this._chosenYear = void 0;
670
+ // Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/year-view.ts#L366
671
+ _isMonthFilteredOut(month) {
672
+ if (!this.dateFilter) {
673
+ return true;
674
+ }
675
+ const firstOfMonth = this._dateAdapter.createDate(this._chosenYear, month, 1);
676
+ for (let date = firstOfMonth; this._dateAdapter.getMonth(date) == month; date = this._dateAdapter.addCalendarDays(date, 1)) {
677
+ if (this.dateFilter(date)) {
678
+ return true;
679
+ }
680
+ }
681
+ return false;
628
682
  }
629
- }
630
- _assignActiveDate(date) {
631
- if (this._min && this._dateAdapter.compareDate(this._min, date) > 0) {
632
- this._activeDate = this._min;
633
- return;
683
+ // Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/multi-year-view.ts#L351
684
+ _isYearFilteredOut(year) {
685
+ if (!this.dateFilter) {
686
+ return true;
687
+ }
688
+ const firstOfYear = this._dateAdapter.createDate(year, 1, 1);
689
+ for (let date = firstOfYear; this._dateAdapter.getYear(date) == year; date = this._dateAdapter.addCalendarDays(date, 1)) {
690
+ if (this.dateFilter(date)) {
691
+ return true;
692
+ }
693
+ }
694
+ return false;
634
695
  }
635
- if (this._max && this._dateAdapter.compareDate(this._max, date) < 0) {
636
- this._activeDate = this._max;
637
- return;
696
+ /** Emits the selected date and sets it internally. */
697
+ _selectDate(day) {
698
+ this._chosenMonth = void 0;
699
+ this._setChosenYear();
700
+ if (this._selected !== day) {
701
+ this._selected = day;
702
+ this._dateSelected.emit(this._dateAdapter.deserialize(day));
703
+ }
638
704
  }
639
- this._activeDate = date;
640
- }
641
- /** Goes to the month identified by the shift. */
642
- _goToDifferentMonth(months) {
643
- this._init(this._dateAdapter.addCalendarMonths(this._activeDate, months));
644
- }
645
- _goToDifferentYear(years) {
646
- this._chosenYear += years;
647
- this._activeDate = this._dateAdapter.createDate(
648
- this._chosenYear,
649
- this._dateAdapter.getMonth(this._activeDate),
650
- this._dateAdapter.getDate(this._activeDate)
651
- );
652
- this._init();
653
- }
654
- _goToDifferentYearRange(years) {
655
- this._init(this._dateAdapter.addCalendarYears(this._activeDate, years));
656
- }
657
- _prevDisabled(prevDate) {
658
- if (!this._min) {
659
- return false;
705
+ _setChosenYear() {
706
+ if (this.view === "month") {
707
+ this._chosenYear = this._dateAdapter.getYear(this._dateAdapter.deserialize(this._selected) ?? this.selected ?? this.now);
708
+ } else {
709
+ this._chosenYear = void 0;
710
+ }
660
711
  }
661
- return this._dateAdapter.compareDate(prevDate, this._min) < 0;
662
- }
663
- _nextDisabled(nextDate) {
664
- if (!this._max) {
665
- return false;
712
+ _assignActiveDate(date) {
713
+ if (this._min && this._dateAdapter.compareDate(this._min, date) > 0) {
714
+ this._activeDate = this._min;
715
+ return;
716
+ }
717
+ if (this._max && this._dateAdapter.compareDate(this._max, date) < 0) {
718
+ this._activeDate = this._max;
719
+ return;
720
+ }
721
+ this._activeDate = date;
666
722
  }
667
- return this._dateAdapter.compareDate(nextDate, this._max) > 0;
668
- }
669
- /** Checks if the "previous month" button should be disabled. */
670
- _previousMonthDisabled() {
671
- const prevMonth = this._dateAdapter.addCalendarDays(
672
- this._activeDate,
673
- this._dateAdapter.getDate(this._activeDate) * -1
674
- );
675
- return this._prevDisabled(prevMonth);
676
- }
677
- /** Checks if the "next month" button should be disabled. */
678
- _nextMonthDisabled() {
679
- let nextMonth = this._dateAdapter.addCalendarMonths(this._activeDate, this._wide ? 2 : 1);
680
- nextMonth = this._dateAdapter.createDate(
681
- this._dateAdapter.getYear(nextMonth),
682
- this._dateAdapter.getMonth(nextMonth),
683
- 1
684
- );
685
- return this._nextDisabled(nextMonth);
686
- }
687
- _previousYearDisabled() {
688
- const prevYear = this._dateAdapter.createDate(
689
- this._dateAdapter.getYear(this._activeDate) - 1,
690
- 12,
691
- 31
692
- );
693
- return this._prevDisabled(prevYear);
694
- }
695
- _nextYearDisabled() {
696
- const nextYear = this._dateAdapter.createDate(
697
- this._dateAdapter.getYear(this._activeDate) + 1,
698
- 1,
699
- 1
700
- );
701
- return this._nextDisabled(nextYear);
702
- }
703
- _previousYearRangeDisabled() {
704
- const prevYear = this._dateAdapter.createDate(this._years[0][0] - 1, 12, 31);
705
- return this._prevDisabled(prevYear);
706
- }
707
- _nextYearRangeDisabled() {
708
- const years = isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years;
709
- const lastYearRange = years[years.length - 1];
710
- const lastYear = lastYearRange[lastYearRange.length - 1];
711
- const nextYear = this._dateAdapter.createDate(lastYear + 1, 1, 1);
712
- return this._nextDisabled(nextYear);
713
- }
714
- _handleTableBlur(eventTarget) {
715
- if ((eventTarget == null ? void 0 : eventTarget.localName) !== "button") {
716
- this._setTabIndex();
723
+ /** Goes to the month identified by the shift. */
724
+ _goToDifferentMonth(months) {
725
+ this._init(this._dateAdapter.addCalendarMonths(this._activeDate, months));
717
726
  }
718
- }
719
- _setTabIndex() {
720
- Array.from(
721
- this.shadowRoot.querySelectorAll('.sbb-calendar__cell[tabindex="0"]') ?? []
722
- ).forEach((day) => day.tabIndex = -1);
723
- const firstFocusable = this._getFirstFocusable();
724
- if (firstFocusable) {
725
- firstFocusable.tabIndex = 0;
727
+ _goToDifferentYear(years) {
728
+ this._chosenYear += years;
729
+ this._activeDate = this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate));
730
+ this._init();
726
731
  }
727
- }
728
- _getFirstFocusable() {
729
- const active = this._selected ? this._dateAdapter.deserialize(this._selected) : this.now;
730
- let firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__selected") ?? this.shadowRoot.querySelector(
731
- `[data-day="${this._dateAdapter.getDate(active)} ${this._dateAdapter.getMonth(
732
- active
733
- )} ${this._dateAdapter.getYear(active)}"]`
734
- ) ?? this.shadowRoot.querySelector(`[data-month="${this._dateAdapter.getMonth(active)}"]`) ?? this.shadowRoot.querySelector(`[data-year="${this._dateAdapter.getYear(active)}"]`);
735
- if (!firstFocusable || (firstFocusable == null ? void 0 : firstFocusable.disabled)) {
736
- firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__cell:not([disabled])");
737
- }
738
- return firstFocusable || null;
739
- }
740
- _handleKeyboardEvent(event, day) {
741
- if (isArrowKeyOrPageKeysPressed(event)) {
742
- event.preventDefault();
743
- }
744
- const cells = this._cells;
745
- const index = cells.findIndex((e) => e === event.target);
746
- const nextEl = this._navigateByKeyboard(event, index, cells, day);
747
- const activeEl = this.shadowRoot.activeElement;
748
- if (nextEl !== activeEl) {
749
- nextEl.tabIndex = 0;
750
- nextEl == null ? void 0 : nextEl.focus();
751
- activeEl.tabIndex = -1;
732
+ _goToDifferentYearRange(years) {
733
+ this._init(this._dateAdapter.addCalendarYears(this._activeDate, years));
752
734
  }
753
- }
754
- /**
755
- * Gets the index of the element to move to, based on a list of elements (which can be potentially disabled),
756
- * the keyboard input and the position of the current element in the list.
757
- * In the day view, the `day?: Day` parameter is mandatory for calculation,
758
- * while in month and year view it's not due to the fixed amount of rendered cells.
759
- */
760
- _navigateByKeyboard(evt, index, cells, day) {
761
- const {
762
- elementIndexForWideMode,
763
- offsetForWideMode,
764
- lastElementIndexForWideMode,
765
- verticalOffset
766
- } = this._calculateParametersForKeyboardNavigation(
767
- cells,
768
- index,
769
- day
770
- );
771
- switch (evt.key) {
772
- case "ArrowUp":
773
- return this._findNext(cells, index, -verticalOffset);
774
- case "ArrowDown":
775
- return this._findNext(cells, index, verticalOffset);
776
- case "ArrowLeft":
777
- return this._findNext(cells, index, -1);
778
- case "ArrowRight":
779
- return this._findNext(cells, index, 1);
780
- case "Home":
781
- return this._findFirst(cells, offsetForWideMode);
782
- case "PageUp":
783
- return this._findFirstOnColumn(
784
- cells,
785
- elementIndexForWideMode,
786
- offsetForWideMode,
787
- verticalOffset
788
- );
789
- case "PageDown":
790
- return this._findLastOnColumn(cells, index, lastElementIndexForWideMode, verticalOffset);
791
- case "End":
792
- return this._findLast(cells, lastElementIndexForWideMode - 1);
793
- default:
794
- return cells[index];
735
+ _prevDisabled(prevDate) {
736
+ if (!this._min) {
737
+ return false;
738
+ }
739
+ return this._dateAdapter.compareDate(prevDate, this._min) < 0;
795
740
  }
796
- }
797
- /**
798
- * Calculates the parameter needed in keyboard navigation.
799
- * Since three views are now available, the function creates and returns the correct parameters for each of them
800
- * by considering the number of cells per each row and the correction for the wide mode.
801
- * @param cells The array of rendered table cells; they are buttons that can represent days, months or years.
802
- * @param index The starting element's index in the cell array.
803
- * @param day (optional) Only in the day view, the day represented by the starting cell.
804
- */
805
- _calculateParametersForKeyboardNavigation(cells, index, day) {
806
- switch (this._calendarView) {
807
- case "day": {
808
- const indexInView = +day.dayValue - 1;
809
- return {
810
- verticalOffset: DAYS_PER_ROW,
811
- elementIndexForWideMode: indexInView,
812
- offsetForWideMode: index - indexInView,
813
- lastElementIndexForWideMode: index === indexInView ? this._dateAdapter.getNumDaysInMonth(
814
- this._dateAdapter.addCalendarMonths(
815
- this._dateAdapter.deserialize(day.value),
816
- -1
817
- )
818
- ) : cells.length
819
- };
741
+ _nextDisabled(nextDate) {
742
+ if (!this._max) {
743
+ return false;
820
744
  }
821
- case "month": {
822
- return {
823
- verticalOffset: MONTHS_PER_ROW,
824
- elementIndexForWideMode: index,
825
- offsetForWideMode: 0,
826
- lastElementIndexForWideMode: 12
827
- };
745
+ return this._dateAdapter.compareDate(nextDate, this._max) > 0;
746
+ }
747
+ /** Checks if the "previous month" button should be disabled. */
748
+ _previousMonthDisabled() {
749
+ const prevMonth = this._dateAdapter.addCalendarDays(this._activeDate, this._dateAdapter.getDate(this._activeDate) * -1);
750
+ return this._prevDisabled(prevMonth);
751
+ }
752
+ /** Checks if the "next month" button should be disabled. */
753
+ _nextMonthDisabled() {
754
+ let nextMonth = this._dateAdapter.addCalendarMonths(this._activeDate, this._wide ? 2 : 1);
755
+ nextMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(nextMonth), this._dateAdapter.getMonth(nextMonth), 1);
756
+ return this._nextDisabled(nextMonth);
757
+ }
758
+ _previousYearDisabled() {
759
+ const prevYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) - 1, 12, 31);
760
+ return this._prevDisabled(prevYear);
761
+ }
762
+ _nextYearDisabled() {
763
+ const nextYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) + 1, 1, 1);
764
+ return this._nextDisabled(nextYear);
765
+ }
766
+ _previousYearRangeDisabled() {
767
+ const prevYear = this._dateAdapter.createDate(this._years[0][0] - 1, 12, 31);
768
+ return this._prevDisabled(prevYear);
769
+ }
770
+ _nextYearRangeDisabled() {
771
+ const years = isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years;
772
+ const lastYearRange = years[years.length - 1];
773
+ const lastYear = lastYearRange[lastYearRange.length - 1];
774
+ const nextYear = this._dateAdapter.createDate(lastYear + 1, 1, 1);
775
+ return this._nextDisabled(nextYear);
776
+ }
777
+ _handleTableBlur(eventTarget) {
778
+ if ((eventTarget == null ? void 0 : eventTarget.localName) !== "button") {
779
+ this._setTabIndex();
828
780
  }
829
- case "year": {
830
- const offset = Math.trunc(index / YEARS_PER_PAGE) * YEARS_PER_PAGE;
831
- const indexInView = offset === 0 ? index : index - YEARS_PER_PAGE;
832
- return {
833
- verticalOffset: YEARS_PER_ROW,
834
- elementIndexForWideMode: indexInView,
835
- offsetForWideMode: index - indexInView,
836
- lastElementIndexForWideMode: offset === 0 ? YEARS_PER_PAGE : YEARS_PER_PAGE * 2
837
- };
781
+ }
782
+ _setTabIndex() {
783
+ Array.from(this.shadowRoot.querySelectorAll('.sbb-calendar__cell[tabindex="0"]') ?? []).forEach((day) => day.tabIndex = -1);
784
+ const firstFocusable = this._getFirstFocusable();
785
+ if (firstFocusable) {
786
+ firstFocusable.tabIndex = 0;
838
787
  }
839
788
  }
840
- }
841
- /**
842
- * Gets the next element of the provided array starting from `index` by adding `delta`.
843
- * If the found element is disabled, it continues adding `delta` until it finds an enabled one in the array bounds.
844
- */
845
- _findNext(days, index, delta) {
846
- var _a;
847
- let nextIndex = index + delta;
848
- while (nextIndex < days.length && ((_a = days[nextIndex]) == null ? void 0 : _a.disabled)) {
849
- nextIndex += delta;
850
- }
851
- return days[nextIndex] ?? days[index];
852
- }
853
- /** Find the first enabled element in the provided array. */
854
- _findFirst(days, firstOfCurrentMonth) {
855
- return !days[firstOfCurrentMonth].disabled ? days[firstOfCurrentMonth] : this._findNext(days, firstOfCurrentMonth, 1);
856
- }
857
- /** Find the last enabled element in the provided array. */
858
- _findLast(days, lastOfCurrentMonth) {
859
- return !days[lastOfCurrentMonth].disabled ? days[lastOfCurrentMonth] : this._findNext(days, lastOfCurrentMonth, -1);
860
- }
861
- /** Find the first enabled element in the same column of the provided array. */
862
- _findFirstOnColumn(days, index, offset, verticalOffset) {
863
- const nextIndex = index % verticalOffset + offset;
864
- return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, verticalOffset);
865
- }
866
- /** Find the last enabled element in the same column of the provided array. */
867
- _findLastOnColumn(days, index, offset, verticalOffset) {
868
- const nextIndex = index + Math.trunc((offset - index - 1) / verticalOffset) * verticalOffset;
869
- return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, -verticalOffset);
870
- }
871
- _resetCalendarView(initTransition = false) {
872
- this._resetFocus = true;
873
- this._activeDate = this.selected ?? this.now;
874
- this._setChosenYear();
875
- this._chosenMonth = void 0;
876
- this._nextCalendarView = this._calendarView = this.view;
877
- if (initTransition) {
878
- this._startTableTransition();
789
+ _getFirstFocusable() {
790
+ const active = this._selected ? this._dateAdapter.deserialize(this._selected) : this.now;
791
+ let firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__selected") ?? this.shadowRoot.querySelector(`[data-day="${this._dateAdapter.getDate(active)} ${this._dateAdapter.getMonth(active)} ${this._dateAdapter.getYear(active)}"]`) ?? this.shadowRoot.querySelector(`[data-month="${this._dateAdapter.getMonth(active)}"]`) ?? this.shadowRoot.querySelector(`[data-year="${this._dateAdapter.getYear(active)}"]`);
792
+ if (!firstFocusable || (firstFocusable == null ? void 0 : firstFocusable.disabled)) {
793
+ firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__cell:not([disabled])");
794
+ }
795
+ return firstFocusable || null;
879
796
  }
880
- }
881
- /** Render the view for the day selection. */
882
- _renderDayView() {
883
- const nextMonthActiveDate = this._wide ? this._dateAdapter.addCalendarMonths(this._activeDate, 1) : void 0;
884
- return html`
797
+ _handleKeyboardEvent(event, day) {
798
+ if (isArrowKeyOrPageKeysPressed(event)) {
799
+ event.preventDefault();
800
+ }
801
+ const cells = this._cells;
802
+ const index = cells.findIndex((e) => e === event.target);
803
+ const nextEl = this._navigateByKeyboard(event, index, cells, day);
804
+ const activeEl = this.shadowRoot.activeElement;
805
+ if (nextEl !== activeEl) {
806
+ nextEl.tabIndex = 0;
807
+ nextEl == null ? void 0 : nextEl.focus();
808
+ activeEl.tabIndex = -1;
809
+ }
810
+ }
811
+ /**
812
+ * Gets the index of the element to move to, based on a list of elements (which can be potentially disabled),
813
+ * the keyboard input and the position of the current element in the list.
814
+ * In the day view, the `day?: Day` parameter is mandatory for calculation,
815
+ * while in month and year view it's not due to the fixed amount of rendered cells.
816
+ */
817
+ _navigateByKeyboard(evt, index, cells, day) {
818
+ const { elementIndexForWideMode, offsetForWideMode, lastElementIndexForWideMode, verticalOffset } = this._calculateParametersForKeyboardNavigation(cells, index, day);
819
+ switch (evt.key) {
820
+ case "ArrowUp":
821
+ return this._findNext(cells, index, -verticalOffset);
822
+ case "ArrowDown":
823
+ return this._findNext(cells, index, verticalOffset);
824
+ case "ArrowLeft":
825
+ return this._findNext(cells, index, -1);
826
+ case "ArrowRight":
827
+ return this._findNext(cells, index, 1);
828
+ case "Home":
829
+ return this._findFirst(cells, offsetForWideMode);
830
+ case "PageUp":
831
+ return this._findFirstOnColumn(cells, elementIndexForWideMode, offsetForWideMode, verticalOffset);
832
+ case "PageDown":
833
+ return this._findLastOnColumn(cells, index, lastElementIndexForWideMode, verticalOffset);
834
+ case "End":
835
+ return this._findLast(cells, lastElementIndexForWideMode - 1);
836
+ default:
837
+ return cells[index];
838
+ }
839
+ }
840
+ /**
841
+ * Calculates the parameter needed in keyboard navigation.
842
+ * Since three views are now available, the function creates and returns the correct parameters for each of them
843
+ * by considering the number of cells per each row and the correction for the wide mode.
844
+ * @param cells The array of rendered table cells; they are buttons that can represent days, months or years.
845
+ * @param index The starting element's index in the cell array.
846
+ * @param day (optional) Only in the day view, the day represented by the starting cell.
847
+ */
848
+ _calculateParametersForKeyboardNavigation(cells, index, day) {
849
+ switch (this._calendarView) {
850
+ case "day": {
851
+ const indexInView = +day.dayValue - 1;
852
+ return {
853
+ verticalOffset: DAYS_PER_ROW,
854
+ elementIndexForWideMode: indexInView,
855
+ offsetForWideMode: index - indexInView,
856
+ lastElementIndexForWideMode: index === indexInView ? this._dateAdapter.getNumDaysInMonth(this._dateAdapter.addCalendarMonths(this._dateAdapter.deserialize(day.value), -1)) : cells.length
857
+ };
858
+ }
859
+ case "month": {
860
+ return {
861
+ verticalOffset: MONTHS_PER_ROW,
862
+ elementIndexForWideMode: index,
863
+ offsetForWideMode: 0,
864
+ lastElementIndexForWideMode: 12
865
+ };
866
+ }
867
+ case "year": {
868
+ const offset = Math.trunc(index / YEARS_PER_PAGE) * YEARS_PER_PAGE;
869
+ const indexInView = offset === 0 ? index : index - YEARS_PER_PAGE;
870
+ return {
871
+ verticalOffset: YEARS_PER_ROW,
872
+ elementIndexForWideMode: indexInView,
873
+ offsetForWideMode: index - indexInView,
874
+ lastElementIndexForWideMode: offset === 0 ? YEARS_PER_PAGE : YEARS_PER_PAGE * 2
875
+ };
876
+ }
877
+ }
878
+ }
879
+ /**
880
+ * Gets the next element of the provided array starting from `index` by adding `delta`.
881
+ * If the found element is disabled, it continues adding `delta` until it finds an enabled one in the array bounds.
882
+ */
883
+ _findNext(days, index, delta) {
884
+ var _a2;
885
+ let nextIndex = index + delta;
886
+ while (nextIndex < days.length && ((_a2 = days[nextIndex]) == null ? void 0 : _a2.disabled)) {
887
+ nextIndex += delta;
888
+ }
889
+ return days[nextIndex] ?? days[index];
890
+ }
891
+ /** Find the first enabled element in the provided array. */
892
+ _findFirst(days, firstOfCurrentMonth) {
893
+ return !days[firstOfCurrentMonth].disabled ? days[firstOfCurrentMonth] : this._findNext(days, firstOfCurrentMonth, 1);
894
+ }
895
+ /** Find the last enabled element in the provided array. */
896
+ _findLast(days, lastOfCurrentMonth) {
897
+ return !days[lastOfCurrentMonth].disabled ? days[lastOfCurrentMonth] : this._findNext(days, lastOfCurrentMonth, -1);
898
+ }
899
+ /** Find the first enabled element in the same column of the provided array. */
900
+ _findFirstOnColumn(days, index, offset, verticalOffset) {
901
+ const nextIndex = index % verticalOffset + offset;
902
+ return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, verticalOffset);
903
+ }
904
+ /** Find the last enabled element in the same column of the provided array. */
905
+ _findLastOnColumn(days, index, offset, verticalOffset) {
906
+ const nextIndex = index + Math.trunc((offset - index - 1) / verticalOffset) * verticalOffset;
907
+ return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, -verticalOffset);
908
+ }
909
+ _resetCalendarView(initTransition = false) {
910
+ this._resetFocus = true;
911
+ this._activeDate = this.selected ?? this.now;
912
+ this._setChosenYear();
913
+ this._chosenMonth = void 0;
914
+ this._nextCalendarView = this._calendarView = this.view;
915
+ if (initTransition) {
916
+ this._startTableTransition();
917
+ }
918
+ }
919
+ /** Render the view for the day selection. */
920
+ _renderDayView() {
921
+ const nextMonthActiveDate = this._wide ? this._dateAdapter.addCalendarMonths(this._activeDate, 1) : void 0;
922
+ return html`
885
923
  <div class="sbb-calendar__controls">
886
- ${this._getArrow(
887
- "left",
888
- () => this._goToDifferentMonth(-1),
889
- i18nPreviousMonth[this._language.current],
890
- this._previousMonthDisabled()
891
- )}
924
+ ${this._getArrow("left", () => this._goToDifferentMonth(-1), i18nPreviousMonth[this._language.current], this._previousMonthDisabled())}
892
925
  <div class="sbb-calendar__controls-month">
893
926
  ${this._createLabelForDayView(this._activeDate)}
894
927
  ${this._wide ? this._createLabelForDayView(nextMonthActiveDate) : nothing}
@@ -896,52 +929,47 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
896
929
  ${this._createAriaLabelForDayView(this._activeDate, nextMonthActiveDate)}
897
930
  </sbb-screen-reader-only>
898
931
  </div>
899
- ${this._getArrow(
900
- "right",
901
- () => this._goToDifferentMonth(1),
902
- i18nNextMonth[this._language.current],
903
- this._nextMonthDisabled()
904
- )}
932
+ ${this._getArrow("right", () => this._goToDifferentMonth(1), i18nNextMonth[this._language.current], this._nextMonthDisabled())}
905
933
  </div>
906
934
  <div class="sbb-calendar__table-container sbb-calendar__table-day-view">
907
935
  ${this._createDayTable(this._weeks)}
908
936
  ${this._wide ? this._createDayTable(this._nextMonthWeeks) : nothing}
909
937
  </div>
910
938
  `;
911
- }
912
- /** Creates the label with the month for the daily view. */
913
- _createLabelForDayView(d) {
914
- const monthLabel = `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)}`;
915
- return html`
939
+ }
940
+ /** Creates the label with the month for the daily view. */
941
+ _createLabelForDayView(d) {
942
+ const monthLabel = `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)}`;
943
+ return html`
916
944
  <button
917
945
  type="button"
918
946
  id="sbb-calendar__date-selection"
919
947
  class="sbb-calendar__controls-change-date"
920
948
  aria-label="${i18nYearMonthSelection[this._language.current]} ${monthLabel}"
921
949
  @click=${() => {
922
- this._resetFocus = true;
923
- this._nextCalendarView = "year";
924
- this._startTableTransition();
925
- }}
950
+ this._resetFocus = true;
951
+ this._nextCalendarView = "year";
952
+ this._startTableTransition();
953
+ }}
926
954
  >
927
955
  ${monthLabel}
928
956
  <sbb-icon name="chevron-small-down-small"></sbb-icon>
929
957
  </button>
930
958
  `;
931
- }
932
- /** Creates the aria-label for the daily view. */
933
- _createAriaLabelForDayView(...dates) {
934
- let monthLabel = "";
935
- for (const d of dates) {
936
- if (d) {
937
- monthLabel += `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)} `;
959
+ }
960
+ /** Creates the aria-label for the daily view. */
961
+ _createAriaLabelForDayView(...dates) {
962
+ let monthLabel = "";
963
+ for (const d of dates) {
964
+ if (d) {
965
+ monthLabel += `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)} `;
966
+ }
938
967
  }
968
+ return monthLabel;
939
969
  }
940
- return monthLabel;
941
- }
942
- /** Creates the calendar table for the daily view. */
943
- _createDayTable(weeks) {
944
- return html`
970
+ /** Creates the calendar table for the daily view. */
971
+ _createDayTable(weeks) {
972
+ return html`
945
973
  <table
946
974
  class="sbb-calendar__table"
947
975
  @focusout=${(event) => this._handleTableBlur(event.relatedTarget)}
@@ -957,64 +985,60 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
957
985
  </tbody>
958
986
  </table>
959
987
  `;
960
- }
961
- /** Creates the table header with the month header cells. */
962
- _createDayTableHeader() {
963
- return this._weekdays.map(
964
- (day) => html`
988
+ }
989
+ /** Creates the table header with the month header cells. */
990
+ _createDayTableHeader() {
991
+ return this._weekdays.map((day) => html`
965
992
  <th class="sbb-calendar__table-header">
966
993
  <sbb-screen-reader-only>${day.long}</sbb-screen-reader-only>
967
994
  <span aria-hidden="true">${day.narrow}</span>
968
995
  </th>
969
- `
970
- );
971
- }
972
- /** Creates the table body with the day cells. For the first row, it also considers the possible day's offset. */
973
- _createDayTableBody(weeks) {
974
- const today = this._dateAdapter.toIso8601(this.now);
975
- return weeks.map((week, rowIndex) => {
976
- const firstRowOffset = DAYS_PER_ROW - week.length;
977
- if (rowIndex === 0 && firstRowOffset) {
978
- return html`
996
+ `);
997
+ }
998
+ /** Creates the table body with the day cells. For the first row, it also considers the possible day's offset. */
999
+ _createDayTableBody(weeks) {
1000
+ const today = this._dateAdapter.toIso8601(this.now);
1001
+ return weeks.map((week, rowIndex) => {
1002
+ const firstRowOffset = DAYS_PER_ROW - week.length;
1003
+ if (rowIndex === 0 && firstRowOffset) {
1004
+ return html`
979
1005
  <tr>
980
- ${[...Array(firstRowOffset).keys()].map(
981
- () => html`<td
1006
+ ${[...Array(firstRowOffset).keys()].map(() => html`<td
982
1007
  class="sbb-calendar__table-data"
983
1008
  data-day=${`0 ${week[0].monthValue} ${week[0].yearValue}`}
984
- ></td>`
985
- )}
1009
+ ></td>`)}
986
1010
  ${this._createDayCells(week, today)}
987
1011
  </tr>
988
1012
  `;
989
- }
990
- return html`<tr>
1013
+ }
1014
+ return html`<tr>
991
1015
  ${this._createDayCells(week, today)}
992
1016
  </tr>`;
993
- });
994
- }
995
- /** Creates the cells for the daily view. */
996
- _createDayCells(week, today) {
997
- return week.map((day) => {
998
- const isOutOfRange = !this._isDayInRange(day.value);
999
- const isFilteredOut = !this._dateFilter(this._dateAdapter.deserialize(day.value));
1000
- const selected = !!this._selected && day.value === this._selected;
1001
- const dayValue = `${day.dayValue} ${day.monthValue} ${day.yearValue}`;
1002
- const isToday = day.value === today;
1003
- return html`
1017
+ });
1018
+ }
1019
+ /** Creates the cells for the daily view. */
1020
+ _createDayCells(week, today) {
1021
+ return week.map((day) => {
1022
+ const isOutOfRange = !this._isDayInRange(day.value);
1023
+ const isFilteredOut = !this._dateFilter(this._dateAdapter.deserialize(day.value));
1024
+ const selected = !!this._selected && day.value === this._selected;
1025
+ const dayValue = `${day.dayValue} ${day.monthValue} ${day.yearValue}`;
1026
+ const isToday = day.value === today;
1027
+ return html`
1004
1028
  <td
1005
1029
  class=${classMap({
1006
- "sbb-calendar__table-data": true,
1007
- "sbb-calendar__table-data-selected": selected
1008
- })}
1030
+ "sbb-calendar__table-data": true,
1031
+ "sbb-calendar__table-data-selected": selected
1032
+ })}
1009
1033
  >
1010
1034
  <button
1011
1035
  class=${classMap({
1012
- "sbb-calendar__cell": true,
1013
- "sbb-calendar__day": true,
1014
- "sbb-calendar__cell-current": isToday,
1015
- "sbb-calendar__selected": selected,
1016
- "sbb-calendar__crossed-out": !isOutOfRange && isFilteredOut
1017
- })}
1036
+ "sbb-calendar__cell": true,
1037
+ "sbb-calendar__day": true,
1038
+ "sbb-calendar__cell-current": isToday,
1039
+ "sbb-calendar__selected": selected,
1040
+ "sbb-calendar__crossed-out": !isOutOfRange && isFilteredOut
1041
+ })}
1018
1042
  @click=${() => this._selectDate(day.value)}
1019
1043
  ?disabled=${isOutOfRange || isFilteredOut}
1020
1044
  aria-label=${this._dateAdapter.getAccessibilityFormatDate(day.value)}
@@ -1030,35 +1054,25 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1030
1054
  </button>
1031
1055
  </td>
1032
1056
  `;
1033
- });
1034
- }
1035
- /** Render the view for the month selection. */
1036
- _renderMonthView() {
1037
- return html`
1057
+ });
1058
+ }
1059
+ /** Render the view for the month selection. */
1060
+ _renderMonthView() {
1061
+ return html`
1038
1062
  <div class="sbb-calendar__controls">
1039
- ${this._getArrow(
1040
- "left",
1041
- () => this._goToDifferentYear(-1),
1042
- i18nPreviousYear[this._language.current],
1043
- this._previousYearDisabled()
1044
- )}
1063
+ ${this._getArrow("left", () => this._goToDifferentYear(-1), i18nPreviousYear[this._language.current], this._previousYearDisabled())}
1045
1064
  <div class="sbb-calendar__controls-month">${this._createLabelForMonthView()}</div>
1046
- ${this._getArrow(
1047
- "right",
1048
- () => this._goToDifferentYear(1),
1049
- i18nNextYear[this._language.current],
1050
- this._nextYearDisabled()
1051
- )}
1065
+ ${this._getArrow("right", () => this._goToDifferentYear(1), i18nNextYear[this._language.current], this._nextYearDisabled())}
1052
1066
  </div>
1053
1067
  <div class="sbb-calendar__table-container sbb-calendar__table-month-view">
1054
1068
  ${this._createMonthTable(this._months, this._chosenYear)}
1055
1069
  ${this._wide ? this._createMonthTable(this._months, this._chosenYear + 1, true) : nothing}
1056
1070
  </div>
1057
1071
  `;
1058
- }
1059
- /** Creates the label with the year for the monthly view. */
1060
- _createLabelForMonthView() {
1061
- return html` <button
1072
+ }
1073
+ /** Creates the label with the year for the monthly view. */
1074
+ _createLabelForMonthView() {
1075
+ return html` <button
1062
1076
  type="button"
1063
1077
  id="sbb-calendar__month-selection"
1064
1078
  class="sbb-calendar__controls-change-date"
@@ -1069,10 +1083,10 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1069
1083
  <sbb-icon name="chevron-small-up-small"></sbb-icon>
1070
1084
  </button>
1071
1085
  <sbb-screen-reader-only role="status"> ${this._chosenYear} </sbb-screen-reader-only>`;
1072
- }
1073
- /** Creates the table for the month selection view. */
1074
- _createMonthTable(months, year, shiftRight = false) {
1075
- return html`
1086
+ }
1087
+ /** Creates the table for the month selection view. */
1088
+ _createMonthTable(months, year, shiftRight = false) {
1089
+ return html`
1076
1090
  <table
1077
1091
  class="sbb-calendar__table"
1078
1092
  @animationend=${(e) => this._tableAnimationEnd(e)}
@@ -1083,8 +1097,7 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1083
1097
  </tr>
1084
1098
  </thead>` : nothing}
1085
1099
  <tbody class="sbb-calendar__table-body">
1086
- ${months.map(
1087
- (row) => html`
1100
+ ${months.map((row) => html`
1088
1101
  <tr>
1089
1102
  ${row.map((month) => {
1090
1103
  const isOutOfRange = !this._isMonthInRange(month.monthValue);
@@ -1121,52 +1134,35 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1121
1134
  </td>`;
1122
1135
  })}
1123
1136
  </tr>
1124
- `
1125
- )}
1137
+ `)}
1126
1138
  </tbody>
1127
1139
  </table>
1128
1140
  `;
1129
- }
1130
- /** Select the month and change the view to day selection. */
1131
- _onMonthSelection(month, year, shiftRight) {
1132
- this._chosenMonth = shiftRight ? month + 1 : month;
1133
- this._nextCalendarView = "day";
1134
- this._init(
1135
- this._dateAdapter.createDate(
1136
- year,
1137
- this._chosenMonth,
1138
- this._dateAdapter.getDate(this._activeDate)
1139
- )
1140
- );
1141
- this._startTableTransition();
1142
- }
1143
- /** Render the view for the year selection. */
1144
- _renderYearView() {
1145
- return html`
1141
+ }
1142
+ /** Select the month and change the view to day selection. */
1143
+ _onMonthSelection(month, year, shiftRight) {
1144
+ this._chosenMonth = shiftRight ? month + 1 : month;
1145
+ this._nextCalendarView = "day";
1146
+ this._init(this._dateAdapter.createDate(year, this._chosenMonth, this._dateAdapter.getDate(this._activeDate)));
1147
+ this._startTableTransition();
1148
+ }
1149
+ /** Render the view for the year selection. */
1150
+ _renderYearView() {
1151
+ return html`
1146
1152
  <div class="sbb-calendar__controls">
1147
- ${this._getArrow(
1148
- "left",
1149
- () => this._goToDifferentYearRange(-YEARS_PER_PAGE),
1150
- i18nPreviousYearRange(YEARS_PER_PAGE)[this._language.current],
1151
- this._previousYearRangeDisabled()
1152
- )}
1153
+ ${this._getArrow("left", () => this._goToDifferentYearRange(-YEARS_PER_PAGE), i18nPreviousYearRange(YEARS_PER_PAGE)[this._language.current], this._previousYearRangeDisabled())}
1153
1154
  <div class="sbb-calendar__controls-month">${this._createLabelForYearView()}</div>
1154
- ${this._getArrow(
1155
- "right",
1156
- () => this._goToDifferentYearRange(YEARS_PER_PAGE),
1157
- i18nNextYearRange(YEARS_PER_PAGE)[this._language.current],
1158
- this._nextYearRangeDisabled()
1159
- )}
1155
+ ${this._getArrow("right", () => this._goToDifferentYearRange(YEARS_PER_PAGE), i18nNextYearRange(YEARS_PER_PAGE)[this._language.current], this._nextYearRangeDisabled())}
1160
1156
  </div>
1161
1157
  <div class="sbb-calendar__table-container sbb-calendar__table-year-view">
1162
1158
  ${this._createYearTable(this._years)}
1163
1159
  ${this._wide ? this._createYearTable(this._nextMonthYears, true) : nothing}
1164
1160
  </div>
1165
1161
  `;
1166
- }
1167
- /** Creates the button arrow for all the views. */
1168
- _getArrow(direction, click, ariaLabel, disabled) {
1169
- return html`<sbb-secondary-button
1162
+ }
1163
+ /** Creates the button arrow for all the views. */
1164
+ _getArrow(direction, click, ariaLabel, disabled) {
1165
+ return html`<sbb-secondary-button
1170
1166
  size="m"
1171
1167
  icon-name="chevron-small-${direction}-small"
1172
1168
  aria-label=${ariaLabel}
@@ -1174,14 +1170,14 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1174
1170
  ?disabled=${disabled}
1175
1171
  id="sbb-calendar__controls-${direction === "left" ? "previous" : "next"}"
1176
1172
  ></sbb-secondary-button>`;
1177
- }
1178
- /** Creates the label with the year range for the yearly view. */
1179
- _createLabelForYearView() {
1180
- const firstYear = this._years.flat()[0];
1181
- const lastYearArray = (isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years).flat();
1182
- const lastYear = lastYearArray[lastYearArray.length - 1];
1183
- const yearLabel = `${firstYear} - ${lastYear}`;
1184
- return html`
1173
+ }
1174
+ /** Creates the label with the year range for the yearly view. */
1175
+ _createLabelForYearView() {
1176
+ const firstYear = this._years.flat()[0];
1177
+ const lastYearArray = (isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years).flat();
1178
+ const lastYear = lastYearArray[lastYearArray.length - 1];
1179
+ const yearLabel = `${firstYear} - ${lastYear}`;
1180
+ return html`
1185
1181
  <button
1186
1182
  type="button"
1187
1183
  id="sbb-calendar__year-selection"
@@ -1194,17 +1190,16 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1194
1190
  </button>
1195
1191
  <sbb-screen-reader-only role="status"> ${yearLabel} </sbb-screen-reader-only>
1196
1192
  `;
1197
- }
1198
- /** Creates the table for the year selection view. */
1199
- _createYearTable(years, shiftRight = false) {
1200
- const now = this.now;
1201
- return html` <table
1193
+ }
1194
+ /** Creates the table for the year selection view. */
1195
+ _createYearTable(years, shiftRight = false) {
1196
+ const now = this.now;
1197
+ return html` <table
1202
1198
  class="sbb-calendar__table"
1203
1199
  @animationend=${(e) => this._tableAnimationEnd(e)}
1204
1200
  >
1205
1201
  <tbody class="sbb-calendar__table-body">
1206
- ${years.map(
1207
- (row) => html` <tr>
1202
+ ${years.map((row) => html` <tr>
1208
1203
  ${row.map((year) => {
1209
1204
  const isOutOfRange = !this._isYearInRange(year);
1210
1205
  const isFilteredOut = !this._isYearFilteredOut(year);
@@ -1233,101 +1228,108 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
1233
1228
  </button>
1234
1229
  </td>`;
1235
1230
  })}
1236
- </tr>`
1237
- )}
1231
+ </tr>`)}
1238
1232
  </tbody>
1239
1233
  </table>`;
1240
- }
1241
- /** Select the year and change the view to month selection. */
1242
- _onYearSelection(year, rightSide) {
1243
- this._chosenYear = rightSide ? year - 1 : year;
1244
- this._nextCalendarView = "month";
1245
- this._assignActiveDate(
1246
- this._dateAdapter.createDate(
1247
- this._chosenYear,
1248
- this._dateAdapter.getMonth(this._activeDate),
1249
- this._dateAdapter.getDate(this._activeDate)
1250
- )
1251
- );
1252
- this._startTableTransition();
1253
- }
1254
- _getView() {
1255
- if (isServer || this.hydrationRequired) {
1256
- return html`${nothing}`;
1257
- }
1258
- switch (this._calendarView) {
1259
- case "year":
1260
- return this._renderYearView();
1261
- case "month":
1262
- return this._renderMonthView();
1263
- case "day":
1264
- default:
1265
- return this._renderDayView();
1266
1234
  }
1267
- }
1268
- _tableAnimationEnd(event) {
1269
- const table = event.target;
1270
- if (event.animationName === "hide") {
1271
- table.classList.remove("sbb-calendar__table-hide");
1272
- this._resetFocus = true;
1273
- this._calendarView = this._nextCalendarView;
1274
- } else if (event.animationName === "show") {
1275
- this.removeAttribute("data-transition");
1235
+ /** Select the year and change the view to month selection. */
1236
+ _onYearSelection(year, rightSide) {
1237
+ this._chosenYear = rightSide ? year - 1 : year;
1238
+ this._nextCalendarView = "month";
1239
+ this._assignActiveDate(this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate)));
1240
+ this._startTableTransition();
1276
1241
  }
1277
- }
1278
- _startTableTransition() {
1279
- var _a, _b;
1280
- this.toggleAttribute("data-transition", true);
1281
- (_b = (_a = this.shadowRoot) == null ? void 0 : _a.querySelectorAll("table")) == null ? void 0 : _b.forEach((e) => e.classList.toggle("sbb-calendar__table-hide"));
1282
- }
1283
- render() {
1284
- return html`<div class="sbb-calendar__wrapper">${this._getView()}</div>`;
1285
- }
1286
- };
1287
- SbbCalendarElement.styles = style;
1288
- SbbCalendarElement.events = {
1289
- dateSelected: "dateSelected"
1290
- };
1291
- __decorateClass([
1292
- property({ type: Boolean })
1293
- ], SbbCalendarElement.prototype, "wide", 2);
1294
- __decorateClass([
1295
- property()
1296
- ], SbbCalendarElement.prototype, "view", 2);
1297
- __decorateClass([
1298
- property()
1299
- ], SbbCalendarElement.prototype, "min", 1);
1300
- __decorateClass([
1301
- property()
1302
- ], SbbCalendarElement.prototype, "max", 1);
1303
- __decorateClass([
1304
- property()
1305
- ], SbbCalendarElement.prototype, "now", 1);
1306
- __decorateClass([
1307
- property()
1308
- ], SbbCalendarElement.prototype, "selected", 1);
1309
- __decorateClass([
1310
- property({ attribute: "date-filter" })
1311
- ], SbbCalendarElement.prototype, "dateFilter", 2);
1312
- __decorateClass([
1313
- state()
1314
- ], SbbCalendarElement.prototype, "_activeDate", 2);
1315
- __decorateClass([
1316
- state()
1317
- ], SbbCalendarElement.prototype, "_selected", 2);
1318
- __decorateClass([
1319
- state()
1320
- ], SbbCalendarElement.prototype, "_wide", 1);
1321
- __decorateClass([
1322
- state()
1323
- ], SbbCalendarElement.prototype, "_calendarView", 2);
1324
- __decorateClass([
1325
- state()
1326
- ], SbbCalendarElement.prototype, "_initialized", 2);
1327
- SbbCalendarElement = __decorateClass([
1328
- customElement("sbb-calendar")
1329
- ], SbbCalendarElement);
1242
+ _getView() {
1243
+ if (isServer || this.hydrationRequired) {
1244
+ return html`${nothing}`;
1245
+ }
1246
+ switch (this._calendarView) {
1247
+ case "year":
1248
+ return this._renderYearView();
1249
+ case "month":
1250
+ return this._renderMonthView();
1251
+ case "day":
1252
+ default:
1253
+ return this._renderDayView();
1254
+ }
1255
+ }
1256
+ _tableAnimationEnd(event) {
1257
+ const table = event.target;
1258
+ if (event.animationName === "hide") {
1259
+ table.classList.remove("sbb-calendar__table-hide");
1260
+ this._resetFocus = true;
1261
+ this._calendarView = this._nextCalendarView;
1262
+ } else if (event.animationName === "show") {
1263
+ this.removeAttribute("data-transition");
1264
+ }
1265
+ }
1266
+ _startTableTransition() {
1267
+ var _a2, _b;
1268
+ this.toggleAttribute("data-transition", true);
1269
+ (_b = (_a2 = this.shadowRoot) == null ? void 0 : _a2.querySelectorAll("table")) == null ? void 0 : _b.forEach((e) => e.classList.toggle("sbb-calendar__table-hide"));
1270
+ }
1271
+ render() {
1272
+ return html`<div class="sbb-calendar__wrapper">${this._getView()}</div>`;
1273
+ }
1274
+ }, _wide_accessor_storage = new WeakMap(), _view_accessor_storage = new WeakMap(), _dateFilter_accessor_storage = new WeakMap(), __activeDate_accessor_storage = new WeakMap(), __selected_accessor_storage = new WeakMap(), __calendarView_accessor_storage = new WeakMap(), __initialized_accessor_storage = new WeakMap(), _classThis = _a, (() => {
1275
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1276
+ _wide_decorators = [forceType(), property({ type: Boolean })];
1277
+ _view_decorators = [property()];
1278
+ _set_min_decorators = [property()];
1279
+ _set_max_decorators = [property()];
1280
+ _set_now_decorators = [property()];
1281
+ _set_selected_decorators = [property()];
1282
+ _dateFilter_decorators = [property({ attribute: "date-filter" })];
1283
+ __activeDate_decorators = [state()];
1284
+ __selected_decorators = [state()];
1285
+ _set__wide_decorators = [state()];
1286
+ __calendarView_decorators = [state()];
1287
+ __initialized_decorators = [state()];
1288
+ __esDecorate(_a, null, _wide_decorators, { kind: "accessor", name: "wide", static: false, private: false, access: { has: (obj) => "wide" in obj, get: (obj) => obj.wide, set: (obj, value) => {
1289
+ obj.wide = value;
1290
+ } }, metadata: _metadata }, _wide_initializers, _wide_extraInitializers);
1291
+ __esDecorate(_a, null, _view_decorators, { kind: "accessor", name: "view", static: false, private: false, access: { has: (obj) => "view" in obj, get: (obj) => obj.view, set: (obj, value) => {
1292
+ obj.view = value;
1293
+ } }, metadata: _metadata }, _view_initializers, _view_extraInitializers);
1294
+ __esDecorate(_a, null, _set_min_decorators, { kind: "setter", name: "min", static: false, private: false, access: { has: (obj) => "min" in obj, set: (obj, value) => {
1295
+ obj.min = value;
1296
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1297
+ __esDecorate(_a, null, _set_max_decorators, { kind: "setter", name: "max", static: false, private: false, access: { has: (obj) => "max" in obj, set: (obj, value) => {
1298
+ obj.max = value;
1299
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1300
+ __esDecorate(_a, null, _set_now_decorators, { kind: "setter", name: "now", static: false, private: false, access: { has: (obj) => "now" in obj, set: (obj, value) => {
1301
+ obj.now = value;
1302
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1303
+ __esDecorate(_a, null, _set_selected_decorators, { kind: "setter", name: "selected", static: false, private: false, access: { has: (obj) => "selected" in obj, set: (obj, value) => {
1304
+ obj.selected = value;
1305
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1306
+ __esDecorate(_a, null, _dateFilter_decorators, { kind: "accessor", name: "dateFilter", static: false, private: false, access: { has: (obj) => "dateFilter" in obj, get: (obj) => obj.dateFilter, set: (obj, value) => {
1307
+ obj.dateFilter = value;
1308
+ } }, metadata: _metadata }, _dateFilter_initializers, _dateFilter_extraInitializers);
1309
+ __esDecorate(_a, null, __activeDate_decorators, { kind: "accessor", name: "_activeDate", static: false, private: false, access: { has: (obj) => "_activeDate" in obj, get: (obj) => obj._activeDate, set: (obj, value) => {
1310
+ obj._activeDate = value;
1311
+ } }, metadata: _metadata }, __activeDate_initializers, __activeDate_extraInitializers);
1312
+ __esDecorate(_a, null, __selected_decorators, { kind: "accessor", name: "_selected", static: false, private: false, access: { has: (obj) => "_selected" in obj, get: (obj) => obj._selected, set: (obj, value) => {
1313
+ obj._selected = value;
1314
+ } }, metadata: _metadata }, __selected_initializers, __selected_extraInitializers);
1315
+ __esDecorate(_a, null, _set__wide_decorators, { kind: "setter", name: "_wide", static: false, private: false, access: { has: (obj) => "_wide" in obj, set: (obj, value) => {
1316
+ obj._wide = value;
1317
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1318
+ __esDecorate(_a, null, __calendarView_decorators, { kind: "accessor", name: "_calendarView", static: false, private: false, access: { has: (obj) => "_calendarView" in obj, get: (obj) => obj._calendarView, set: (obj, value) => {
1319
+ obj._calendarView = value;
1320
+ } }, metadata: _metadata }, __calendarView_initializers, __calendarView_extraInitializers);
1321
+ __esDecorate(_a, null, __initialized_decorators, { kind: "accessor", name: "_initialized", static: false, private: false, access: { has: (obj) => "_initialized" in obj, get: (obj) => obj._initialized, set: (obj, value) => {
1322
+ obj._initialized = value;
1323
+ } }, metadata: _metadata }, __initialized_initializers, __initialized_extraInitializers);
1324
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1325
+ SbbCalendarElement2 = _classThis = _classDescriptor.value;
1326
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1327
+ })(), _a.styles = style, _a.events = {
1328
+ dateSelected: "dateSelected"
1329
+ }, __runInitializers(_classThis, _classExtraInitializers), _a);
1330
+ return SbbCalendarElement2 = _classThis;
1331
+ })();
1330
1332
  export {
1331
1333
  SbbCalendarElement
1332
1334
  };
1333
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLCBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9jb3JlL2ExMXkuanMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9ST1csXG4gIFlFQVJTX1BFUl9QQUdFLFxuICBZRUFSU19QRVJfUk9XLFxufSBmcm9tICcuLi9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGlzQnJlYWtwb2ludCB9IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvcmUvZXZlbnRpbmcuanMnO1xuaW1wb3J0IHtcbiAgaTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvbixcbiAgaTE4bk5leHRNb250aCxcbiAgaTE4bk5leHRZZWFyLFxuICBpMThuTmV4dFllYXJSYW5nZSxcbiAgaTE4blByZXZpb3VzTW9udGgsXG4gIGkxOG5QcmV2aW91c1llYXIsXG4gIGkxOG5QcmV2aW91c1llYXJSYW5nZSxcbiAgaTE4blllYXJNb250aFNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRGF0ZUxpa2UgfSBmcm9tICcuLi9jb3JlL2ludGVyZmFjZXMuanMnO1xuaW1wb3J0IHsgU2JiSHlkcmF0aW9uTWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2NhbGVuZGFyLnNjc3M/bGl0JmlubGluZSc7XG5cbmltcG9ydCAnLi4vYnV0dG9uL3NlY29uZGFyeS1idXR0b24uanMnO1xuaW1wb3J0ICcuLi9pY29uLmpzJztcbmltcG9ydCAnLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuLyoqXG4gKiBJbiBrZXlib2FyZCBuYXZpZ2F0aW9uLCB0aGUgY2VsbCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCdzIGluZGV4IGluIGl0cyBtb250aCAvIHllYXIgYmF0Y2ggbXVzdCBiZSBkaXN0aW5ndWlzaGVkO1xuICogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgbmF2aWdhdGlvbiBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uIHVzaW5nIHNvbWUga2V5cyBpcyByZXN0cmljdGVkIHRvIGEgc2luZ2xlIG1vbnRoIGZvciBkYXlzLFxuICogYW5kIHRvIGEgc2luZ2xlIHJhbmdlIG9mIDI0IHllYXJzIGZvciB5ZWFycy4gV2hpbGUgdGhlIGxhdHRlciBpcyBlYXN5IHRvIHVuZGVyc3RhbmQsIHRoZSBjZWxsJ3MgaW5kZXggaXMgdGhlIGluZGV4XG4gKiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXkgb2YgYWxsIHRoZSByZW5kZXJlZCBjZWxscy4gSW4gbm9uLXdpZGUgbW9kZSwgdGhlcmUncyBubyBpc3N1ZSBiZWNhdXNlIHRoZSBlbGVtZW50IGluZGV4XG4gKiBpcyBiYXNpY2FsbHkgdGhlIGNlbGwncyBpbmRleCBwbHVzIDEgKGVsZW1lbnQgd2l0aCBpbmRleCAwIGRpc3BsYXlzIHRoZSAxc3Qgb2YgbW9udGgsIGVsZW1lbnQgd2l0aCBpbmRleCAxIGRpc3BsYXlzIHRoZSAybmQgYW5kIHNvIG9uKS5cbiAqIEluIHdpZGUgbW9kZSwgdGhlIGNlbGwncyBpbmRleCBjYW4gZ28gZnJvbSAwIHRvIDQ3IGZvciB5ZWFycyAodHdvIGJhdGNoZXMgb2YgMjQgeWVhcnMpLCBhbmQgZnJvbSAwIHRvIGEgbWF4aW11bSBvZiA2MSBmb3IgZGF5c1xuICogKHR3byBjb25zZWN1dGl2ZSBtb250aHMgb2YgMzEgZGF5cywgYXMgSnVseS1BdWd1c3Qgb3IgRGVjZW1iZXItSmFudWFyeSksIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RocyBvZiB0aGUgcmVuZGVyZWQgbW9udGhzO1xuICogdGhlIGVsZW1lbnQgaW5kZXggaW5zdGVhZCBnb2VzIGZyb20gMCB0byBhIG1heCB2YWx1ZSBvZiAyNCBmb3IgeWVhcnMgYW5kIDMxIGZvciBkYXlzLlxuICogTW9yZW92ZXIsIGluIGRheSB2aWV3LCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgc2Vjb25kIHJlbmRlcmVkIG1vbnRoIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgcmVuZGVyZWQgZGF5XG4gKiBjYW4gYWxzbyB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaCBtb250aHMgYXJlIHJlbmRlcmVkOyBmb3IgSnVseS1BdWd1c3QgdGhleSBhcmUgZXF1YWxzIHRvIDMxIGFuZCA2MSwgd2hpbGUgZm9yIEZlYnJ1YXJ5LU1hcmNoIHRoZXkgYXJlIDI4IGFuZCA1OC5cbiAqIFNvLCBzb21lIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgbmVlZGVkLCBiZXNpZGUgdGhlIGNlbGwncyBpbmRleCwgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgZWxlbWVudCB0byBuYXZpZ2F0ZSB0by5cbiAqL1xuaW50ZXJmYWNlIENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyB7XG4gIC8qKiBUaGUgZWxlbWVudCBpbmRleCB3aXRoaW4gaXRzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIEluIHdpZGUgbW9kZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZWNvbmQgcGFuZWwsIG9yLCBhbHRlcm5hdGl2ZWx5LCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBwYW5lbC4gKi9cbiAgb2Zmc2V0Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IHdpdGhpbiB0aGUgZWxlbWVudCdzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIGNlbGxzIGRpc3BsYXllZCBpbiBhIHNpbmdsZSByb3csIGRlcGVuZGluZyBvbiB0aGUgcmVuZGVyZWQgdmlldy4gKi9cbiAgdmVydGljYWxPZmZzZXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXkge1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXlWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBzdHJpbmc7XG4gIHllYXJWYWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgbG9uZ1ZhbHVlOiBzdHJpbmc7XG4gIG1vbnRoVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrZGF5IHtcbiAgbG9uZzogc3RyaW5nO1xuICBuYXJyb3c6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ2FsZW5kYXJWaWV3ID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgY2FsZW5kYXIgd2hpY2ggYWxsb3dzIHRvIGNob29zZSBhIGRhdGUuXG4gKlxuICogQGV2ZW50IHtDdXN0b21FdmVudDxUPn0gZGF0ZVNlbGVjdGVkIC0gRXZlbnQgZW1pdHRlZCBvbiBkYXRlIHNlbGVjdGlvbi5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5leHBvcnQgY2xhc3MgU2JiQ2FsZW5kYXJFbGVtZW50PFQgPSBEYXRlPiBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluKExpdEVsZW1lbnQpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRhdGVTZWxlY3RlZDogJ2RhdGVTZWxlY3RlZCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIElmIHNldCB0byB0cnVlLCB0d28gbW9udGhzIGFyZSBkaXNwbGF5ZWQgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBwdWJsaWMgd2lkZSA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBTYmJEYXRlTGlrZTxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX21pbj86IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBUYWtlcyBUIE9iamVjdCwgSVNPU3RyaW5nLCBhbmQgVW5peCBUaW1lc3RhbXAgKG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwKS4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXggPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIF9tYXg/OiBUIHwgbnVsbDtcblxuICAvKiogQSBjb25maWd1cmVkIGRhdGUgd2hpY2ggYWN0cyBhcyB0aGUgY3VycmVudCBkYXRlIGluc3RlYWQgb2YgdGhlIHJlYWwgY3VycmVudCBkYXRlLiBSZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBub3codmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm93ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zZWxlY3RlZERhdGUgJiZcbiAgICAgICghdGhpcy5faXNEYXlJblJhbmdlKHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpKSB8fFxuICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX3NlbGVjdGVkRGF0ZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZT86IFQgfCBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pIHB1YmxpYyBkYXRlRmlsdGVyPzogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9kYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJDYWxlbmRhckVsZW1lbnQuZXZlbnRzLmRhdGVTZWxlY3RlZCxcbiAgKTtcblxuICAvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGF0ZS4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBfYWN0aXZlRGF0ZTogVCA9IHRoaXMubm93O1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZSBhcyBJU09TdHJpbmcuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgX3NlbGVjdGVkPzogc3RyaW5nO1xuXG4gIC8qKiBUaGUgY3VycmVudCB3aWRlIHByb3BlcnR5IGNvbnNpZGVyaW5nIHByb3BlcnR5IHZhbHVlIGFuZCBicmVha3BvaW50cy4gRnJvbSB6ZXJvIHRvIHNtYWxsIGB3aWRlYCBoYXMgYWx3YXlzIHRvIGJlIGZhbHNlLiAqL1xuICBAc3RhdGUoKVxuICBwcml2YXRlIHNldCBfd2lkZSh3aWRlOiBib29sZWFuKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtd2lkZScsIHdpZGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0IF93aWRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS13aWRlJyk7XG4gIH1cblxuICBAc3RhdGUoKSBwcml2YXRlIF9jYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIHByaXZhdGUgX25leHRDYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIC8qKiBBIGxpc3Qgb2YgZGF5cywgaW4gdHdvIGZvcm1hdHMgKGxvbmcgYW5kIHNpbmdsZSBjaGFyKS4gKi9cbiAgcHJpdmF0ZSBfd2Vla2RheXMhOiBXZWVrZGF5W107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHRoZSBkYXRlcyBvZiB0aGUgbW9udGguICovXG4gIHByaXZhdGUgX3dlZWtzOiBEYXlbXVtdID0gW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIG1vbnRocy4gKi9cbiAgcHJpdmF0ZSBfbW9udGhzITogTW9udGhbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycy4gKi9cbiAgcHJpdmF0ZSBfeWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycyBmb3IgdGhlIHdpZGUgdmlldy4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoWWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgbW9udGguICovXG4gIHByaXZhdGUgX25leHRNb250aFdlZWtzITogRGF5W11bXTtcblxuICAvKiogQW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG1vbnRoIG5hbWVzIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqL1xuICBwcml2YXRlIF9tb250aE5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKTtcblxuICAvKiogQSBsaXN0IG9mIGJ1dHRvbnMgY29ycmVzcG9uZGluZyB0byBkYXlzLCBtb250aHMgb3IgeWVhcnMgZGVwZW5kaW5nIG9uIHRoZSB2aWV3LiAqL1xuICBwcml2YXRlIGdldCBfY2VsbHMoKTogSFRNTEJ1dHRvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGwnKSA/PyBbXSxcbiAgICApIGFzIEhUTUxCdXR0b25FbGVtZW50W107XG4gIH1cblxuICAvKiogVGhlIGNob3NlbiB5ZWFyIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5ZZWFyPzogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY2hvc2VuIG1vbnRoIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5Nb250aD86IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgZm9jdXMgc2hvdWxkIGJlIHJlc2V0IG9uIGZvY3VzQ2VsbC4gKi9cbiAgcHJpdmF0ZSBfcmVzZXRGb2N1cyA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYWJvcnQgPSBuZXcgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcykud2l0aEhhbmRsZXIoKCkgPT4ge1xuICAgIHRoaXMuX21vbnRoTmFtZXMgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NyZWF0ZU1vbnRoUm93cygpO1xuICAgIHRoaXMuX3NldFdlZWtkYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRlRmlsdGVyKGRhdGU6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyPy4oZGF0ZSkgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGFjdGl2ZSBtb250aCBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY2FsZW5kYXIuICovXG4gIHB1YmxpYyByZXNldFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KCk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5mb2N1cyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5faW5pdCgpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9hYm9ydC5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd3aWRlJykpIHtcbiAgICAgIHRoaXMucmVzZXRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZpZXcnKSkge1xuICAgICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIC8vIFRoZSBjYWxlbmRhciBuZWVkcyB0byBjYWxjdWxhdGUgdGFiLWluZGV4ZXMgb24gZmlyc3QgcmVuZGVyLFxuICAgIC8vIGFuZCBldmVyeSB0aW1lIGEgZGF0ZSBpcyBzZWxlY3RlZCBvciB0aGUgbW9udGggdmlldyBjaGFuZ2VzLlxuICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgLy8gV2hlbiBjaGFuZ2luZyB2aWV3IHRvIHllYXIvbW9udGgsIHRoZSB0YWJpbmRleCBpcyBjaGFuZ2VkLCBidXQgdGhlIGZvY3VzZWQgZWxlbWVudCBpcyBub3QsXG4gICAgLy8gc28gaWYgdGhlIG5hdmlnYXRpb24gaXMgZG9uZSB2aWEga2V5Ym9hcmQsIHRoZXJlJ3MgdGhlIG5lZWRcbiAgICAvLyB0byBjYWxsIHRoZSBgX2ZvY3VzQ2VsbCgpYCBtZXRob2QgZXhwbGljaXRseSB0byBjb3JyZWN0bHkgc2V0IHRoZSBmb2N1cy5cbiAgICBpZiAoc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLm1vc3RSZWNlbnRNb2RhbGl0eSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2luaXQoYWN0aXZlRGF0ZT86IFQpOiB2b2lkIHtcbiAgICAvL0R1ZSB0byBpdHMgY29tcGxleGl0eSwgdGhlIGNhbGVkYXIgaXMgb25seSBpbml0aWFsaXplZCBvbiBjbGllbnQgc2lkZVxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgdGhpcy5oeWRyYXRpb25Db21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX2luaXQoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZURhdGUpIHtcbiAgICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoYWN0aXZlRGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuX3dpZGUgPSBpc0JyZWFrcG9pbnQoJ21lZGl1bScpICYmIHRoaXMud2lkZTtcbiAgICB0aGlzLl93ZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHRoaXMuX3llYXJzID0gdGhpcy5fY3JlYXRlWWVhclJvd3MoKTtcbiAgICB0aGlzLl9uZXh0TW9udGhXZWVrcyA9IFtbXV07XG4gICAgdGhpcy5fbmV4dE1vbnRoWWVhcnMgPSBbW11dO1xuICAgIGlmICh0aGlzLl93aWRlKSB7XG4gICAgICBjb25zdCBuZXh0TW9udGhEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgMSk7XG4gICAgICB0aGlzLl9uZXh0TW9udGhXZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKG5leHRNb250aERhdGUpO1xuICAgICAgdGhpcy5fbmV4dE1vbnRoWWVhcnMgPSB0aGlzLl9jcmVhdGVZZWFyUm93cyhZRUFSU19QRVJfUEFHRSk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIG9uIGEgZGF5IGNlbGwgcHJpb3JpdGl6aW5nIHRoZSBzZWxlY3RlZCBkYXksIHRoZSBjdXJyZW50IGRheSwgYW5kIGxhc3RseSwgdGhlIGZpcnN0IHNlbGVjdGFibGUgZGF5LiAqL1xuICBwcml2YXRlIF9mb2N1c0NlbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk/LmZvY3VzKCk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFycmF5IG9mIHdlZWtkYXlzLiAqL1xuICBwcml2YXRlIF9zZXRXZWVrZGF5cygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXJyb3dXZWVrZGF5czogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbmFycm93Jyk7XG4gICAgY29uc3QgbG9uZ1dlZWtkYXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdsb25nJyk7XG4gICAgY29uc3Qgd2Vla2RheXM6IFdlZWtkYXlbXSA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmc6IHN0cmluZywgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgbG9uZyxcbiAgICAgIG5hcnJvdzogbmFycm93V2Vla2RheXNbaV0sXG4gICAgfSkpO1xuXG4gICAgLy8gUm90YXRlcyB0aGUgbGFiZWxzIGZvciBkYXlzIG9mIHRoZSB3ZWVrIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICBjb25zdCBmaXJzdERheU9mV2VlazogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3REYXlPZldlZWsoKTtcbiAgICB0aGlzLl93ZWVrZGF5cyA9IHdlZWtkYXlzLnNsaWNlKGZpcnN0RGF5T2ZXZWVrKS5jb25jYXQod2Vla2RheXMuc2xpY2UoMCwgZmlyc3REYXlPZldlZWspKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSByb3dzIGZvciBlYWNoIHdlZWsuICovXG4gIHByaXZhdGUgX2NyZWF0ZVdlZWtSb3dzKHZhbHVlOiBUKTogRGF5W11bXSB7XG4gICAgY29uc3QgZGF5c0luTW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHZhbHVlKTtcbiAgICBjb25zdCBkYXRlTmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgY29uc3Qgd2Vla3M6IERheVtdW10gPSBbW11dO1xuICAgIGNvbnN0IHdlZWtPZmZzZXQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdFdlZWtPZmZzZXQodmFsdWUpO1xuICAgIGZvciAobGV0IGkgPSAwLCBjZWxsID0gd2Vla09mZnNldDsgaSA8IGRheXNJbk1vbnRoOyBpKyssIGNlbGwrKykge1xuICAgICAgaWYgKGNlbGwgPT09IERBWVNfUEVSX1JPVykge1xuICAgICAgICB3ZWVrcy5wdXNoKFtdKTtcbiAgICAgICAgY2VsbCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih2YWx1ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHZhbHVlKSxcbiAgICAgICAgaSArIDEsXG4gICAgICApITtcbiAgICAgIHdlZWtzW3dlZWtzLmxlbmd0aCAtIDFdLnB1c2goe1xuICAgICAgICB2YWx1ZTogdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKGRhdGUpLFxuICAgICAgICBkYXlWYWx1ZTogZGF0ZU5hbWVzW2ldLFxuICAgICAgICBtb250aFZhbHVlOiBTdHJpbmcodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkpLFxuICAgICAgICB5ZWFyVmFsdWU6IFN0cmluZyh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVNb250aFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvcnROYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdzaG9ydCcpO1xuICAgIGNvbnN0IG1vbnRoczogTW9udGhbXSA9IG5ldyBBcnJheSgxMikuZmlsbChudWxsKS5tYXAoXG4gICAgICAoXywgaTogbnVtYmVyKTogTW9udGggPT4gKHtcbiAgICAgICAgdmFsdWU6IHNob3J0TmFtZXNbaV0sXG4gICAgICAgIGxvbmdWYWx1ZTogdGhpcy5fbW9udGhOYW1lc1tpXSxcbiAgICAgICAgbW9udGhWYWx1ZTogaSArIDEsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IDEyIC8gTU9OVEhTX1BFUl9ST1c7XG4gICAgY29uc3QgbW9udGhBcnJheTogTW9udGhbXVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgbW9udGhBcnJheS5wdXNoKG1vbnRocy5zbGljZShNT05USFNfUEVSX1JPVyAqIGksIE1PTlRIU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICB0aGlzLl9tb250aHMgPSBtb250aEFycmF5O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyUm93cyhvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXJbXVtdIHtcbiAgICBjb25zdCBzdGFydFZhbHVlWWVhclZpZXc6IG51bWJlciA9IHRoaXMuX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpO1xuICAgIGNvbnN0IGFsbFllYXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShZRUFSU19QRVJfUEFHRSlcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChfLCBpOiBudW1iZXIpID0+IHN0YXJ0VmFsdWVZZWFyVmlldyArIG9mZnNldCArIGkpO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IFlFQVJTX1BFUl9QQUdFIC8gWUVBUlNfUEVSX1JPVztcbiAgICBjb25zdCB5ZWFyQXJyYXk6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICB5ZWFyQXJyYXkucHVzaChhbGxZZWFycy5zbGljZShZRUFSU19QRVJfUk9XICogaSwgWUVBUlNfUEVSX1JPVyAqIChpICsgMSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHllYXJBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBmaXJzdCB5ZWFyIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgeWVhciBzZWxlY3Rpb24gcGFuZWwuXG4gICAqIElmIGBtaW5EYXRlYCBhbmQgYG1heERhdGVgIGFyZSBib3RoIG51bGwsIHRoZSBzdGFydGluZyB5ZWFyIGlzIGNhbGN1bGF0ZWQgYXNcbiAgICogdGhlIG11bHRpcGxlIG9mIFlFQVJTX1BFUl9QQUdFIGNsb3Nlc3QgdG8gYW5kIGxlc3MgdGhhbiBhY3RpdmVEYXRlLFxuICAgKiBlLmcuLCB3aXRoIGBZRUFSU19QRVJfUEFHRWAgPSAyNCBhbmQgYGFjdGl2ZURhdGVgID0gMjAyMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDIwMTYgKDI0ICogODMpLFxuICAgKiB3aGlsZSB3aXRoIGBhY3RpdmVEYXRlYCA9IDIwMDAsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAxOTkyICgyNCAqIDgyKS5cbiAgICogSWYgYG1pbkRhdGVgIGlzIG5vdCBudWxsLCBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXI7IGlmIGBtYXhEYXRlYCBpcyBub3QgbnVsbCxcbiAgICogaXQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB5ZWFyIG1pbnVzIGBZRUFSU19QRVJfUEFHRWAsIHNvIHRoYXQgdGhlIGBtYXhEYXRlYCBpcyB0aGUgbGFzdCByZW5kZXJlZCB5ZWFyLlxuICAgKiBJZiBib3RoIGFyZSBub3QgbnVsbCwgYG1heERhdGVgIGhhcyBwcmlvcml0eSBvdmVyIGBtaW5EYXRlYC5cbiAgICovXG4gIHByaXZhdGUgX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpOiBudW1iZXIge1xuICAgIGxldCBzdGFydGluZ1llYXIgPSAwO1xuICAgIGlmICh0aGlzLm1heCkge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCkgLSBZRUFSU19QRVJfUEFHRSArIDE7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbikge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1pbik7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHJldHVybiAoXG4gICAgICBhY3RpdmVZZWFyIC1cbiAgICAgICgoKChhY3RpdmVZZWFyIC0gc3RhcnRpbmdZZWFyKSAlIFlFQVJTX1BFUl9QQUdFKSArIFlFQVJTX1BFUl9QQUdFKSAlIFlFQVJTX1BFUl9QQUdFKVxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGRhdGUgaXMgd2l0aGluIHRoZSBtaW4tbWF4IHJhbmdlLiAqL1xuICBwcml2YXRlIF9pc0RheUluUmFuZ2UoZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWluISwgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkhKSA+IDA7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuX21heCEsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpISkgPCAwO1xuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNNb250aEluUmFuZ2UobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWluISkgPj0gdGhpcy5fY2hvc2VuWWVhciEgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX21pbiEpID4gbW9udGg7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWF4ISkgPD0gdGhpcy5fY2hvc2VuWWVhciEgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX21heCEpIDwgbW9udGg7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICBwcml2YXRlIF9pc1llYXJJblJhbmdlKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9taW4hKSA+IHllYXI7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9tYXghKSA8IHllYXI7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICAvLyBJbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL21hdGVyaWFsL2RhdGVwaWNrZXIveWVhci12aWV3LnRzI0wzNjZcbiAgcHJpdmF0ZSBfaXNNb250aEZpbHRlcmVkT3V0KG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGF0ZUZpbHRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RPZk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh0aGlzLl9jaG9zZW5ZZWFyISwgbW9udGgsIDEpITtcbiAgICBmb3IgKFxuICAgICAgbGV0IGRhdGU6IFQgPSBmaXJzdE9mTW9udGg7XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSA9PSBtb250aDtcbiAgICAgIGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW1wbGVtZW50YXRpb24gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL211bHRpLXllYXItdmlldy50cyNMMzUxXG4gIHByaXZhdGUgX2lzWWVhckZpbHRlcmVkT3V0KHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9mWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgMSwgMSkhO1xuICAgIGZvciAoXG4gICAgICBsZXQgZGF0ZTogVCA9IGZpcnN0T2ZZZWFyO1xuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSA9PSB5ZWFyO1xuICAgICAgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGUgYW5kIHNldHMgaXQgaW50ZXJuYWxseS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0RGF0ZShkYXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWQgIT09IGRheSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBkYXk7XG4gICAgICB0aGlzLl9kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkpISk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2hvc2VuWWVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpID8/IHRoaXMuc2VsZWN0ZWQgPz8gdGhpcy5ub3csXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2lnbkFjdGl2ZURhdGUoZGF0ZTogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9taW4gJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWluLCBkYXRlKSA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9taW47XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXggJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWF4LCBkYXRlKSA8IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9tYXg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICB9XG5cbiAgLyoqIEdvZXMgdG8gdGhlIG1vbnRoIGlkZW50aWZpZWQgYnkgdGhlIHNoaWZ0LiAqL1xuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50TW9udGgobW9udGhzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIG1vbnRocykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudFllYXIoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIhICs9IHllYXJzO1xuICAgIC8vIENhbid0IHVzZSBgX2Fzc2lnbkFjdGl2ZURhdGUoLi4uKWAgaGVyZSwgYmVjYXVzZSBpdCB3aWxsIHNldCBpdCB0byBtaW4vbWF4IHZhbHVlIGlmIGFyZ3VtZW50IGlzIG91dCBvZiByYW5nZVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fY2hvc2VuWWVhciEsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50WWVhclJhbmdlKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgeWVhcnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZEaXNhYmxlZChwcmV2RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShwcmV2RGF0ZSwgdGhpcy5fbWluKSA8IDA7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0RGlzYWJsZWQobmV4dERhdGU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUobmV4dERhdGUsIHRoaXMuX21heCkgPiAwO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJwcmV2aW91cyBtb250aFwiIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXG4gICAgICB0aGlzLl9hY3RpdmVEYXRlLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSAqIC0xLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2TW9udGgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJuZXh0IG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5leHRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuX3dpZGUgPyAyIDogMSk7XG4gICAgbmV4dE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIobmV4dE1vbnRoKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKG5leHRNb250aCksXG4gICAgICAxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0TW9udGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmlvdXNZZWFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKSAtIDEsXG4gICAgICAxMixcbiAgICAgIDMxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0WWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSkgKyAxLFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX3llYXJzWzBdWzBdIC0gMSwgMTIsIDMxKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX25leHRZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB5ZWFycyA9IGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFycztcbiAgICBjb25zdCBsYXN0WWVhclJhbmdlID0geWVhcnNbeWVhcnMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbGFzdFllYXIgPSBsYXN0WWVhclJhbmdlW2xhc3RZZWFyUmFuZ2UubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbmV4dFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGxhc3RZZWFyICsgMSwgMSwgMSk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUYWJsZUJsdXIoZXZlbnRUYXJnZXQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50VGFyZ2V0Py5sb2NhbE5hbWUgIT09ICdidXR0b24nKSB7XG4gICAgICB0aGlzLl9zZXRUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFRhYkluZGV4KCk6IHZvaWQge1xuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGxbdGFiaW5kZXg9XCIwXCJdJykgPz8gW10sXG4gICAgKS5mb3JFYWNoKChkYXkpID0+ICgoZGF5IGFzIEhUTUxFbGVtZW50KS50YWJJbmRleCA9IC0xKSk7XG4gICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPSB0aGlzLl9nZXRGaXJzdEZvY3VzYWJsZSgpO1xuICAgIGlmIChmaXJzdEZvY3VzYWJsZSkge1xuICAgICAgZmlyc3RGb2N1c2FibGUudGFiSW5kZXggPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEZpcnN0Rm9jdXNhYmxlKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9zZWxlY3RlZCA/IHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEgOiB0aGlzLm5vdztcbiAgICBsZXQgZmlyc3RGb2N1c2FibGUgPVxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLWNhbGVuZGFyX19zZWxlY3RlZCcpID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBbZGF0YS1kYXk9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUoYWN0aXZlKX0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChcbiAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICl9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihhY3RpdmUpfVwiXWAsXG4gICAgICApID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1vbnRoPVwiJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChhY3RpdmUpfVwiXWApID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXllYXI9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoYWN0aXZlKX1cIl1gKTtcbiAgICBpZiAoIWZpcnN0Rm9jdXNhYmxlIHx8IChmaXJzdEZvY3VzYWJsZSBhcyBIVE1MQnV0dG9uRWxlbWVudCk/LmRpc2FibGVkKSB7XG4gICAgICBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1jYWxlbmRhcl9fY2VsbDpub3QoW2Rpc2FibGVkXSknKTtcbiAgICB9XG4gICAgcmV0dXJuIChmaXJzdEZvY3VzYWJsZSBhcyBIVE1MQnV0dG9uRWxlbWVudCkgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRheT86IERheSk6IHZvaWQge1xuICAgIGlmIChpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyBHZXRzIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgdGFibGUncyBjZWxsO1xuICAgIC8vIHRoZXkgY291bGQgYmUgZGF5cywgbW9udGhzIG9yIHllYXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2aWV3LlxuICAgIC8vIElmIGB3aWRlYCBpcyB0cnVlLCB5ZWFycyBhcmUgZG91YmxlZCBpbiBudW1iZXIgYW5kIGRheXMgYXJlIChyb3VnaGx5KSBkb3VibGVkIHRvbywgYWZmZWN0aW5nIHRoZSBgaW5kZXhgIGNhbGN1bGF0aW9uLlxuICAgIGNvbnN0IGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdID0gdGhpcy5fY2VsbHM7XG4gICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGNlbGxzLmZpbmRJbmRleCgoZTogSFRNTEJ1dHRvbkVsZW1lbnQpID0+IGUgPT09IGV2ZW50LnRhcmdldCk7XG4gICAgY29uc3QgbmV4dEVsOiBIVE1MQnV0dG9uRWxlbWVudCA9IHRoaXMuX25hdmlnYXRlQnlLZXlib2FyZChldmVudCwgaW5kZXgsIGNlbGxzLCBkYXkpO1xuICAgIGNvbnN0IGFjdGl2ZUVsOiBIVE1MQnV0dG9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdCEuYWN0aXZlRWxlbWVudCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBpZiAobmV4dEVsICE9PSBhY3RpdmVFbCkge1xuICAgICAgKG5leHRFbCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFiSW5kZXggPSAwO1xuICAgICAgbmV4dEVsPy5mb2N1cygpO1xuICAgICAgKGFjdGl2ZUVsIGFzIEhUTUxCdXR0b25FbGVtZW50KS50YWJJbmRleCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRvLCBiYXNlZCBvbiBhIGxpc3Qgb2YgZWxlbWVudHMgKHdoaWNoIGNhbiBiZSBwb3RlbnRpYWxseSBkaXNhYmxlZCksXG4gICAqIHRoZSBrZXlib2FyZCBpbnB1dCBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gICAqIEluIHRoZSBkYXkgdmlldywgdGhlIGBkYXk/OiBEYXlgIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgZm9yIGNhbGN1bGF0aW9uLFxuICAgKiB3aGlsZSBpbiBtb250aCBhbmQgeWVhciB2aWV3IGl0J3Mgbm90IGR1ZSB0byB0aGUgZml4ZWQgYW1vdW50IG9mIHJlbmRlcmVkIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBfbmF2aWdhdGVCeUtleWJvYXJkKFxuICAgIGV2dDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGRheT86IERheSxcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICB2ZXJ0aWNhbE9mZnNldCxcbiAgICB9OiBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB0aGlzLl9jYWxjdWxhdGVQYXJhbWV0ZXJzRm9yS2V5Ym9hcmROYXZpZ2F0aW9uKFxuICAgICAgY2VsbHMsXG4gICAgICBpbmRleCxcbiAgICAgIGRheSxcbiAgICApO1xuXG4gICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgLXZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIC0xKTtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAxKTtcbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0KGNlbGxzLCBvZmZzZXRGb3JXaWRlTW9kZSk7XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0T25Db2x1bW4oXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgdmVydGljYWxPZmZzZXQsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTGFzdE9uQ29sdW1uKGNlbGxzLCBpbmRleCwgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlLCB2ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZExhc3QoY2VsbHMsIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSAtIDEpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgcGFyYW1ldGVyIG5lZWRlZCBpbiBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgKiBTaW5jZSB0aHJlZSB2aWV3cyBhcmUgbm93IGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgZWFjaCBvZiB0aGVtXG4gICAqIGJ5IGNvbnNpZGVyaW5nIHRoZSBudW1iZXIgb2YgY2VsbHMgcGVyIGVhY2ggcm93IGFuZCB0aGUgY29ycmVjdGlvbiBmb3IgdGhlIHdpZGUgbW9kZS5cbiAgICogQHBhcmFtIGNlbGxzIFRoZSBhcnJheSBvZiByZW5kZXJlZCB0YWJsZSBjZWxsczsgdGhleSBhcmUgYnV0dG9ucyB0aGF0IGNhbiByZXByZXNlbnQgZGF5cywgbW9udGhzIG9yIHllYXJzLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHN0YXJ0aW5nIGVsZW1lbnQncyBpbmRleCBpbiB0aGUgY2VsbCBhcnJheS5cbiAgICogQHBhcmFtIGRheSAob3B0aW9uYWwpIE9ubHkgaW4gdGhlIGRheSB2aWV3LCB0aGUgZGF5IHJlcHJlc2VudGVkIGJ5IHRoZSBzdGFydGluZyBjZWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlUGFyYW1ldGVyc0ZvcktleWJvYXJkTmF2aWdhdGlvbihcbiAgICBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGRheT86IERheSxcbiAgKTogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25QYXJhbWV0ZXJzIHtcbiAgICBzd2l0Y2ggKHRoaXMuX2NhbGVuZGFyVmlldykge1xuICAgICAgY2FzZSAnZGF5Jzoge1xuICAgICAgICBjb25zdCBpbmRleEluVmlldyA9ICtkYXkhLmRheVZhbHVlIC0gMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogREFZU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleEluVmlldyxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogaW5kZXggLSBpbmRleEluVmlldyxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6XG4gICAgICAgICAgICBpbmRleCA9PT0gaW5kZXhJblZpZXdcbiAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkhLnZhbHVlKSEsXG4gICAgICAgICAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY2VsbHMubGVuZ3RoLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gTW9udGggdmlldyBpcyBub3QgZGVwZW5kZW50IGZyb20gYHdpZGVgIHZhbHVlLCBzbyBzb21lIHBhcmFtZXRlcnMgYXJlIGZpeGVkLlxuICAgICAgY2FzZSAnbW9udGgnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IE1PTlRIU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleCxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogMCxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IDEyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAneWVhcic6IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSBNYXRoLnRydW5jKGluZGV4IC8gWUVBUlNfUEVSX1BBR0UpICogWUVBUlNfUEVSX1BBR0U7XG4gICAgICAgIGNvbnN0IGluZGV4SW5WaWV3OiBudW1iZXIgPSBvZmZzZXQgPT09IDAgPyBpbmRleCA6IGluZGV4IC0gWUVBUlNfUEVSX1BBR0U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IFlFQVJTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4SW5WaWV3LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiBpbmRleCAtIGluZGV4SW5WaWV3LFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogb2Zmc2V0ID09PSAwID8gWUVBUlNfUEVSX1BBR0UgOiBZRUFSU19QRVJfUEFHRSAqIDIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgc3RhcnRpbmcgZnJvbSBgaW5kZXhgIGJ5IGFkZGluZyBgZGVsdGFgLlxuICAgKiBJZiB0aGUgZm91bmQgZWxlbWVudCBpcyBkaXNhYmxlZCwgaXQgY29udGludWVzIGFkZGluZyBgZGVsdGFgIHVudGlsIGl0IGZpbmRzIGFuIGVuYWJsZWQgb25lIGluIHRoZSBhcnJheSBib3VuZHMuXG4gICAqL1xuICBwcml2YXRlIF9maW5kTmV4dChkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLCBpbmRleDogbnVtYmVyLCBkZWx0YTogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGxldCBuZXh0SW5kZXggPSBpbmRleCArIGRlbHRhO1xuICAgIHdoaWxlIChuZXh0SW5kZXggPCBkYXlzLmxlbmd0aCAmJiBkYXlzW25leHRJbmRleF0/LmRpc2FibGVkKSB7XG4gICAgICBuZXh0SW5kZXggKz0gZGVsdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXlzW25leHRJbmRleF0gPz8gZGF5c1tpbmRleF07XG4gIH1cblxuICAvKiogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGZpcnN0T2ZDdXJyZW50TW9udGg6IG51bWJlcik6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gIWRheXNbZmlyc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBmaXJzdE9mQ3VycmVudE1vbnRoLCAxKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGxhc3RPZkN1cnJlbnRNb250aDogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiAhZGF5c1tsYXN0T2ZDdXJyZW50TW9udGhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbGFzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBsYXN0T2ZDdXJyZW50TW9udGgsIC0xKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSAoaW5kZXggJSB2ZXJ0aWNhbE9mZnNldCkgKyBvZmZzZXQ7XG4gICAgcmV0dXJuICFkYXlzW25leHRJbmRleF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tuZXh0SW5kZXhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIG5leHRJbmRleCwgdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxhc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCArIE1hdGgudHJ1bmMoKG9mZnNldCAtIGluZGV4IC0gMSkgLyB2ZXJ0aWNhbE9mZnNldCkgKiB2ZXJ0aWNhbE9mZnNldDtcbiAgICByZXR1cm4gIWRheXNbbmV4dEluZGV4XS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW25leHRJbmRleF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbmV4dEluZGV4LCAtdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRDYWxlbmRhclZpZXcoaW5pdFRyYW5zaXRpb24gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLnNlbGVjdGVkID8/IHRoaXMubm93O1xuICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuXG4gICAgaWYgKGluaXRUcmFuc2l0aW9uKSB7XG4gICAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSBkYXkgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJEYXlWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBuZXh0TW9udGhBY3RpdmVEYXRlID0gdGhpcy5fd2lkZVxuICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50TW9udGgoLTEpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c01vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlTGFiZWxGb3JEYXlWaWV3KHRoaXMuX2FjdGl2ZURhdGUpfVxuICAgICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZUxhYmVsRm9yRGF5VmlldyhuZXh0TW9udGhBY3RpdmVEYXRlISkgOiBub3RoaW5nfVxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5IHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlQXJpYUxhYmVsRm9yRGF5Vmlldyh0aGlzLl9hY3RpdmVEYXRlLCBuZXh0TW9udGhBY3RpdmVEYXRlISl9XG4gICAgICAgICAgPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRNb250aCgxKSxcbiAgICAgICAgICBpMThuTmV4dE1vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRNb250aERpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLWRheS12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGUodGhpcy5fd2Vla3MpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVEYXlUYWJsZSh0aGlzLl9uZXh0TW9udGhXZWVrcykgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSBtb250aCBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yRGF5VmlldyhkOiBUKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG1vbnRoTGFiZWwgPSBgJHtcbiAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgIH0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQpfWA7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpZD1cInNiYi1jYWxlbmRhcl9fZGF0ZS1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtpMThuWWVhck1vbnRoU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke21vbnRoTGFiZWx9XCJcbiAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAneWVhcic7XG4gICAgICAgICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgJHttb250aExhYmVsfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtZG93bi1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFyaWEtbGFiZWwgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KC4uLmRhdGVzOiBUW10pOiBzdHJpbmcge1xuICAgIGxldCBtb250aExhYmVsID0gJyc7XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGVzKSB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICBtb250aExhYmVsICs9IGAke1xuICAgICAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgICAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1vbnRoTGFiZWw7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgY2FsZW5kYXIgdGFibGUgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZSh3ZWVrczogRGF5W11bXSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDx0YWJsZVxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgICBAZm9jdXNvdXQ9JHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5faGFuZGxlVGFibGVCbHVyKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpfVxuICAgICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICAgID5cbiAgICAgICAgPHRoZWFkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGVIZWFkZXIoKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheVRhYmxlQm9keSh3ZWVrcyl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgaGVhZGVyIHdpdGggdGhlIG1vbnRoIGhlYWRlciBjZWxscy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5VGFibGVIZWFkZXIoKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzLm1hcChcbiAgICAgIChkYXk6IFdlZWtkYXkpID0+IGh0bWxgXG4gICAgICAgIDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkYXkubG9uZ308L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkYXkubmFycm93fTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgIGAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBib2R5IHdpdGggdGhlIGRheSBjZWxscy4gRm9yIHRoZSBmaXJzdCByb3csIGl0IGFsc28gY29uc2lkZXJzIHRoZSBwb3NzaWJsZSBkYXkncyBvZmZzZXQuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlQm9keSh3ZWVrczogRGF5W11bXSk6IFRlbXBsYXRlUmVzdWx0W10ge1xuICAgIGNvbnN0IHRvZGF5OiBzdHJpbmcgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEodGhpcy5ub3cpO1xuICAgIHJldHVybiB3ZWVrcy5tYXAoKHdlZWs6IERheVtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvd09mZnNldDogbnVtYmVyID0gREFZU19QRVJfUk9XIC0gd2Vlay5sZW5ndGg7XG4gICAgICBpZiAocm93SW5kZXggPT09IDAgJiYgZmlyc3RSb3dPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgJHtbLi4uQXJyYXkoZmlyc3RSb3dPZmZzZXQpLmtleXMoKV0ubWFwKFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIGh0bWxgPHRkXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YVwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWRheT0ke2AwICR7d2Vla1swXS5tb250aFZhbHVlfSAke3dlZWtbMF0ueWVhclZhbHVlfWB9XG4gICAgICAgICAgICAgICAgPjwvdGQ+YCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWssIHRvZGF5KX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGh0bWxgPHRyPlxuICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWssIHRvZGF5KX1cbiAgICAgIDwvdHI+YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBjZWxscyBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheUNlbGxzKHdlZWs6IERheVtdLCB0b2RheTogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHdlZWsubWFwKChkYXk6IERheSkgPT4ge1xuICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzRGF5SW5SYW5nZShkYXkudmFsdWUpO1xuICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheS52YWx1ZSkhKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkOiBib29sZWFuID0gISF0aGlzLl9zZWxlY3RlZCAmJiBkYXkudmFsdWUgPT09IHRoaXMuX3NlbGVjdGVkO1xuICAgICAgY29uc3QgZGF5VmFsdWUgPSBgJHtkYXkuZGF5VmFsdWV9ICR7ZGF5Lm1vbnRoVmFsdWV9ICR7ZGF5LnllYXJWYWx1ZX1gO1xuICAgICAgY29uc3QgaXNUb2RheSA9IGRheS52YWx1ZSA9PT0gdG9kYXk7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHRkXG4gICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAnc2JiLWNhbGVuZGFyX190YWJsZS1kYXRhJzogdHJ1ZSxcbiAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEtc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fZGF5JzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbC1jdXJyZW50JzogaXNUb2RheSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3NlbGVjdERhdGUoZGF5LnZhbHVlKX1cbiAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgYXJpYS1sYWJlbD0ke3RoaXMuX2RhdGVBZGFwdGVyLmdldEFjY2Vzc2liaWxpdHlGb3JtYXREYXRlKGRheS52YWx1ZSl9XG4gICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgIGFyaWEtY3VycmVudD0ke2lzVG9kYXkgPyAnZGF0ZScgOiBub3RoaW5nfVxuICAgICAgICAgICAgZGF0YS1kYXk9JHtkYXlWYWx1ZSB8fCBub3RoaW5nfVxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0LCBkYXkpfVxuICAgICAgICAgICAgc2JiLXBvcG92ZXItY2xvc2VcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2RheS5kYXlWYWx1ZX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJNb250aFZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHNcIj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXIoLTEpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c1llYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNZZWFyRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj4ke3RoaXMuX2NyZWF0ZUxhYmVsRm9yTW9udGhWaWV3KCl9PC9kaXY+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhcigxKSxcbiAgICAgICAgICBpMThuTmV4dFllYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dFllYXJEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1jb250YWluZXIgc2JiLWNhbGVuZGFyX190YWJsZS1tb250aC12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhICsgMSwgdHJ1ZSkgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSB5ZWFyIGZvciB0aGUgbW9udGhseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvck1vbnRoVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19tb250aC1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPSR7YCR7aTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt0aGlzLl9jaG9zZW5ZZWFyfWB9XG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX2Nob3NlblllYXJ9ICR7dGhpcy5fd2lkZSA/IGAgLSAke3RoaXMuX2Nob3NlblllYXIhICsgMX1gIDogbm90aGluZ31cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3RoaXMuX2Nob3NlblllYXJ9IDwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5gO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGZvciB0aGUgbW9udGggc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZU1vbnRoVGFibGUobW9udGhzOiBNb250aFtdW10sIHllYXI6IG51bWJlciwgc2hpZnRSaWdodCA9IGZhbHNlKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHRhYmxlXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgIEBhbmltYXRpb25lbmQ9JHsoZTogQW5pbWF0aW9uRXZlbnQpID0+IHRoaXMuX3RhYmxlQW5pbWF0aW9uRW5kKGUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX3dpZGVcbiAgICAgICAgICA/IGh0bWxgPHRoZWFkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIiBjb2xzcGFuPSR7TU9OVEhTX1BFUl9ST1d9PiR7eWVhcn08L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgICAke21vbnRocy5tYXAoXG4gICAgICAgICAgICAocm93OiBNb250aFtdKSA9PiBodG1sYFxuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgJHtyb3cubWFwKChtb250aDogTW9udGgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc01vbnRoSW5SYW5nZShtb250aC5tb250aFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5faXNNb250aEZpbHRlcmVkT3V0KG1vbnRoLm1vbnRoVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHRoaXMuX3NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICEhdGhpcy5fc2VsZWN0ZWQgJiYgeWVhciA9PT0gc2VsZWN0ZWRZZWFyICYmIG1vbnRoLm1vbnRoVmFsdWUgPT09IHNlbGVjdGVkTW9udGg7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudE1vbnRoID1cbiAgICAgICAgICAgICAgICAgICAgeWVhciA9PT0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm5vdykgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5ub3cpID09PSBtb250aC5tb250aFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGAgPHRkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLW1vbnRoJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fcGlsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2Nyb3NzZWQtb3V0JzogIWlzT3V0T2ZSYW5nZSAmJiBpc0ZpbHRlcmVkT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9vbk1vbnRoU2VsZWN0aW9uKG1vbnRoLm1vbnRoVmFsdWUsIHllYXIsIHNoaWZ0UmlnaHQpfVxuICAgICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtgJHttb250aC5sb25nVmFsdWV9ICR7dGhpcy5fY2hvc2VuWWVhcn1gfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtTdHJpbmcoaXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXQpfVxuICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9udGg9JHttb250aC5tb250aFZhbHVlIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAke21vbnRoLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIG1vbnRoIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gZGF5IHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfb25Nb250aFNlbGVjdGlvbihtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNoaWZ0UmlnaHQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHNoaWZ0UmlnaHQgPyBtb250aCArIDEgOiBtb250aDtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gJ2RheSc7XG4gICAgdGhpcy5faW5pdChcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHllYXIsXG4gICAgICAgIHRoaXMuX2Nob3Nlbk1vbnRoLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgeWVhciBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoLVlFQVJTX1BFUl9QQUdFKSxcbiAgICAgICAgICBpMThuUHJldmlvdXNZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj4ke3RoaXMuX2NyZWF0ZUxhYmVsRm9yWWVhclZpZXcoKX08L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpLFxuICAgICAgICAgIGkxOG5OZXh0WWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9uZXh0WWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUteWVhci12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX3llYXJzKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX25leHRNb250aFllYXJzLCB0cnVlKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGJ1dHRvbiBhcnJvdyBmb3IgYWxsIHRoZSB2aWV3cy4gKi9cbiAgcHJpdmF0ZSBfZ2V0QXJyb3coXG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnLFxuICAgIGNsaWNrOiAoKSA9PiB2b2lkLFxuICAgIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgIGRpc2FibGVkOiBib29sZWFuLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICBzaXplPVwibVwiXG4gICAgICBpY29uLW5hbWU9XCJjaGV2cm9uLXNtYWxsLSR7ZGlyZWN0aW9ufS1zbWFsbFwiXG4gICAgICBhcmlhLWxhYmVsPSR7YXJpYUxhYmVsfVxuICAgICAgQGNsaWNrPSR7Y2xpY2t9XG4gICAgICA/ZGlzYWJsZWQ9JHtkaXNhYmxlZH1cbiAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19jb250cm9scy0ke2RpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ3ByZXZpb3VzJyA6ICduZXh0J31cIlxuICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPmA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgeWVhciByYW5nZSBmb3IgdGhlIHllYXJseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBmaXJzdFllYXI6IG51bWJlciA9IHRoaXMuX3llYXJzLmZsYXQoKVswXTtcbiAgICBjb25zdCBsYXN0WWVhckFycmF5OiBudW1iZXJbXSA9IChcbiAgICAgIGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFyc1xuICAgICkuZmxhdCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyOiBudW1iZXIgPSBsYXN0WWVhckFycmF5W2xhc3RZZWFyQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgeWVhckxhYmVsID0gYCR7Zmlyc3RZZWFyfSAtICR7bGFzdFllYXJ9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX195ZWFyLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2kxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7eWVhckxhYmVsfVwiXG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3llYXJMYWJlbH1cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3llYXJMYWJlbH0gPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyVGFibGUoeWVhcnM6IG51bWJlcltdW10sIHNoaWZ0UmlnaHQgPSBmYWxzZSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBub3cgPSB0aGlzLm5vdztcbiAgICByZXR1cm4gaHRtbGAgPHRhYmxlXG4gICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgPlxuICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICR7eWVhcnMubWFwKFxuICAgICAgICAgIChyb3c6IG51bWJlcltdKSA9PlxuICAgICAgICAgICAgaHRtbGAgPHRyPlxuICAgICAgICAgICAgICAke3Jvdy5tYXAoKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc1llYXJJblJhbmdlKHllYXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5faXNZZWFyRmlsdGVyZWRPdXQoeWVhcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQ6IGJvb2xlYW4gPSAhIXRoaXMuX3NlbGVjdGVkICYmIHllYXIgPT09IHNlbGVjdGVkWWVhcjtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihub3cpID09PSB5ZWFyO1xuICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEgc2JiLWNhbGVuZGFyX190YWJsZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3BpbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudFllYXIsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uWWVhclNlbGVjdGlvbih5ZWFyLCBzaGlmdFJpZ2h0KX1cbiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt5ZWFyfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXllYXI9JHt5ZWFyIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAke3llYXJ9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPmA7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC90cj5gLFxuICAgICAgICApfVxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG4gIH1cblxuICAvKiogU2VsZWN0IHRoZSB5ZWFyIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vblllYXJTZWxlY3Rpb24oeWVhcjogbnVtYmVyLCByaWdodFNpZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5ZZWFyID0gcmlnaHRTaWRlID8geWVhciAtIDEgOiB5ZWFyO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9jaG9zZW5ZZWFyLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgaWYgKGlzU2VydmVyIHx8IHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIC8vIFRPRE86IFdlIGRpc2FibGUgU1NSIGZvciBjYWxlbmRhciBmb3Igbm93LiBGaWd1cmUgb3VyLCBpZiB0aGVyZSBpcyBhIHdheVxuICAgICAgLy8gdG8gZW5hYmxlIGl0LCB3aGlsZSBjb25zaWRlcmluZyBpMThuIGFuZCBkYXRlIGluZm9ybWF0aW9uLlxuICAgICAgcmV0dXJuIGh0bWxgJHtub3RoaW5nfWA7XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5fY2FsZW5kYXJWaWV3KSB7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclllYXJWaWV3KCk7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJNb250aFZpZXcoKTtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRGF5VmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnaGlkZScpIHtcbiAgICAgIHRhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NiYi1jYWxlbmRhcl9fdGFibGUtaGlkZScpO1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3O1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ3Nob3cnKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUYWJsZVRyYW5zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtdHJhbnNpdGlvbicsIHRydWUpO1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICA/LmZvckVhY2goKGUpID0+IGUuY2xhc3NMaXN0LnRvZ2dsZSgnc2JiLWNhbGVuZGFyX190YWJsZS1oaWRlJykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fd3JhcHBlclwiPiR7dGhpcy5fZ2V0VmlldygpfTwvZGl2PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1jYWxlbmRhcic6IFNiYkNhbGVuZGFyRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4Rk8sSUFBTSxxQkFBTixjQUEyQyxrQkFBa0IsVUFBVSxFQUFFO0FBQUEsRUF5SXZFLGNBQWM7O0FBQ2I7QUFuSXFCLFNBQU8sT0FBTztBQUcvQixTQUFPLE9BQXFCO0FBOEJ4QyxTQUFRLE9BQWlCO0FBd0J6QixTQUFRLGlCQUErQixnQkFBQSxFQUFhLGFBQWIsbUJBQXVCLGdCQUFlO0FBRzdFLFNBQVEsZ0JBQWlDLElBQUk7QUFBQSxNQUMzQztBQUFBLE1BQ0EsbUJBQW1CLE9BQU87QUFBQSxJQUFBO0FBSW5CLFNBQVEsY0FBaUIs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
1335
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLCBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9jb3JlL2ExMXkuanMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9ST1csXG4gIFlFQVJTX1BFUl9QQUdFLFxuICBZRUFSU19QRVJfUk9XLFxufSBmcm9tICcuLi9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpc0JyZWFrcG9pbnQgfSBmcm9tICcuLi9jb3JlL2RvbS5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7XG4gIGkxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb24sXG4gIGkxOG5OZXh0TW9udGgsXG4gIGkxOG5OZXh0WWVhcixcbiAgaTE4bk5leHRZZWFyUmFuZ2UsXG4gIGkxOG5QcmV2aW91c01vbnRoLFxuICBpMThuUHJldmlvdXNZZWFyLFxuICBpMThuUHJldmlvdXNZZWFyUmFuZ2UsXG4gIGkxOG5ZZWFyTW9udGhTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvcmUvaTE4bi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYkRhdGVMaWtlIH0gZnJvbSAnLi4vY29yZS9pbnRlcmZhY2VzLmpzJztcbmltcG9ydCB7IFNiYkh5ZHJhdGlvbk1peGluIH0gZnJvbSAnLi4vY29yZS9taXhpbnMuanMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9jYWxlbmRhci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uL2J1dHRvbi9zZWNvbmRhcnktYnV0dG9uLmpzJztcbmltcG9ydCAnLi4vaWNvbi5qcyc7XG5pbXBvcnQgJy4uL3NjcmVlbi1yZWFkZXItb25seS5qcyc7XG5cbi8qKlxuICogSW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiwgdGhlIGNlbGwncyBpbmRleCBhbmQgdGhlIGVsZW1lbnQncyBpbmRleCBpbiBpdHMgbW9udGggLyB5ZWFyIGJhdGNoIG11c3QgYmUgZGlzdGluZ3Vpc2hlZDtcbiAqIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5hdmlnYXRpb24gaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiB1c2luZyBzb21lIGtleXMgaXMgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBtb250aCBmb3IgZGF5cyxcbiAqIGFuZCB0byBhIHNpbmdsZSByYW5nZSBvZiAyNCB5ZWFycyBmb3IgeWVhcnMuIFdoaWxlIHRoZSBsYXR0ZXIgaXMgZWFzeSB0byB1bmRlcnN0YW5kLCB0aGUgY2VsbCdzIGluZGV4IGlzIHRoZSBpbmRleFxuICogb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGFycmF5IG9mIGFsbCB0aGUgcmVuZGVyZWQgY2VsbHMuIEluIG5vbi13aWRlIG1vZGUsIHRoZXJlJ3Mgbm8gaXNzdWUgYmVjYXVzZSB0aGUgZWxlbWVudCBpbmRleFxuICogaXMgYmFzaWNhbGx5IHRoZSBjZWxsJ3MgaW5kZXggcGx1cyAxIChlbGVtZW50IHdpdGggaW5kZXggMCBkaXNwbGF5cyB0aGUgMXN0IG9mIG1vbnRoLCBlbGVtZW50IHdpdGggaW5kZXggMSBkaXNwbGF5cyB0aGUgMm5kIGFuZCBzbyBvbikuXG4gKiBJbiB3aWRlIG1vZGUsIHRoZSBjZWxsJ3MgaW5kZXggY2FuIGdvIGZyb20gMCB0byA0NyBmb3IgeWVhcnMgKHR3byBiYXRjaGVzIG9mIDI0IHllYXJzKSwgYW5kIGZyb20gMCB0byBhIG1heGltdW0gb2YgNjEgZm9yIGRheXNcbiAqICh0d28gY29uc2VjdXRpdmUgbW9udGhzIG9mIDMxIGRheXMsIGFzIEp1bHktQXVndXN0IG9yIERlY2VtYmVyLUphbnVhcnkpLCBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aHMgb2YgdGhlIHJlbmRlcmVkIG1vbnRocztcbiAqIHRoZSBlbGVtZW50IGluZGV4IGluc3RlYWQgZ29lcyBmcm9tIDAgdG8gYSBtYXggdmFsdWUgb2YgMjQgZm9yIHllYXJzIGFuZCAzMSBmb3IgZGF5cy5cbiAqIE1vcmVvdmVyLCBpbiBkYXkgdmlldywgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHNlY29uZCByZW5kZXJlZCBtb250aCBhbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHJlbmRlcmVkIGRheVxuICogY2FuIGFsc28gdmFyeSBkZXBlbmRpbmcgb24gd2hpY2ggbW9udGhzIGFyZSByZW5kZXJlZDsgZm9yIEp1bHktQXVndXN0IHRoZXkgYXJlIGVxdWFscyB0byAzMSBhbmQgNjEsIHdoaWxlIGZvciBGZWJydWFyeS1NYXJjaCB0aGV5IGFyZSAyOCBhbmQgNTguXG4gKiBTbywgc29tZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZCwgYmVzaWRlIHRoZSBjZWxsJ3MgaW5kZXgsIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgdG8gbmF2aWdhdGUgdG8uXG4gKi9cbmludGVyZmFjZSBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMge1xuICAvKiogVGhlIGVsZW1lbnQgaW5kZXggd2l0aGluIGl0cyBtb250aCAob3IgeWVhciByYW5nZSkuICovXG4gIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBJbiB3aWRlIG1vZGUsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2Vjb25kIHBhbmVsLCBvciwgYWx0ZXJuYXRpdmVseSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZmlyc3QgcGFuZWwuICovXG4gIG9mZnNldEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCB3aXRoaW4gdGhlIGVsZW1lbnQncyBtb250aCAob3IgeWVhciByYW5nZSkuICovXG4gIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogbnVtYmVyO1xuICAvKiogVGhlIG51bWJlciBvZiBjZWxscyBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgcm93LCBkZXBlbmRpbmcgb24gdGhlIHJlbmRlcmVkIHZpZXcuICovXG4gIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF5IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgZGF5VmFsdWU6IHN0cmluZztcbiAgbW9udGhWYWx1ZTogc3RyaW5nO1xuICB5ZWFyVmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aCB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxvbmdWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vla2RheSB7XG4gIGxvbmc6IHN0cmluZztcbiAgbmFycm93OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENhbGVuZGFyVmlldyA9ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJztcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIGNhbGVuZGFyIHdoaWNoIGFsbG93cyB0byBjaG9vc2UgYSBkYXRlLlxuICpcbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8VD59IGRhdGVTZWxlY3RlZCAtIEV2ZW50IGVtaXR0ZWQgb24gZGF0ZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5jbGFzcyBTYmJDYWxlbmRhckVsZW1lbnQ8VCA9IERhdGU+IGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW4oTGl0RWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgZGF0ZVNlbGVjdGVkOiAnZGF0ZVNlbGVjdGVkJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogSWYgc2V0IHRvIHRydWUsIHR3byBtb250aHMgYXJlIGRpc3BsYXllZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igd2lkZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyBhY2Nlc3NvciB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBTYmJEYXRlTGlrZTxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX21pbj86IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBUYWtlcyBUIE9iamVjdCwgSVNPU3RyaW5nLCBhbmQgVW5peCBUaW1lc3RhbXAgKG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwKS4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXggPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIF9tYXg/OiBUIHwgbnVsbDtcblxuICAvKiogQSBjb25maWd1cmVkIGRhdGUgd2hpY2ggYWN0cyBhcyB0aGUgY3VycmVudCBkYXRlIGluc3RlYWQgb2YgdGhlIHJlYWwgY3VycmVudCBkYXRlLiBSZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBub3codmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm93ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zZWxlY3RlZERhdGUgJiZcbiAgICAgICghdGhpcy5faXNEYXlJblJhbmdlKHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpKSB8fFxuICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX3NlbGVjdGVkRGF0ZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZT86IFQgfCBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pIHB1YmxpYyBhY2Nlc3NvciBkYXRlRmlsdGVyOlxuICAgIHwgKChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbilcbiAgICB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9kYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJDYWxlbmRhckVsZW1lbnQuZXZlbnRzLmRhdGVTZWxlY3RlZCxcbiAgKTtcblxuICAvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGF0ZS4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBhY2Nlc3NvciBfYWN0aXZlRGF0ZTogVCA9IHRoaXMubm93O1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZSBhcyBJU09TdHJpbmcuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX3NlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBjdXJyZW50IHdpZGUgcHJvcGVydHkgY29uc2lkZXJpbmcgcHJvcGVydHkgdmFsdWUgYW5kIGJyZWFrcG9pbnRzLiBGcm9tIHplcm8gdG8gc21hbGwgYHdpZGVgIGhhcyBhbHdheXMgdG8gYmUgZmFsc2UuICovXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgc2V0IF93aWRlKHdpZGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS13aWRlJywgd2lkZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgX3dpZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXdpZGUnKTtcbiAgfVxuXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2NhbGVuZGFyVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgcHJpdmF0ZSBfbmV4dENhbGVuZGFyVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgLyoqIEEgbGlzdCBvZiBkYXlzLCBpbiB0d28gZm9ybWF0cyAobG9uZyBhbmQgc2luZ2xlIGNoYXIpLiAqL1xuICBwcml2YXRlIF93ZWVrZGF5cyE6IFdlZWtkYXlbXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgdGhlIGRhdGVzIG9mIHRoZSBtb250aC4gKi9cbiAgcHJpdmF0ZSBfd2Vla3M6IERheVtdW10gPSBbXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgbW9udGhzLiAqL1xuICBwcml2YXRlIF9tb250aHMhOiBNb250aFtdW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHllYXJzLiAqL1xuICBwcml2YXRlIF95ZWFycyE6IG51bWJlcltdW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHllYXJzIGZvciB0aGUgd2lkZSB2aWV3LiAqL1xuICBwcml2YXRlIF9uZXh0TW9udGhZZWFycyE6IG51bWJlcltdW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHRoZSBkYXRlcyBvZiB0aGUgbmV4dCBtb250aC4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoV2Vla3MhOiBEYXlbXVtdO1xuXG4gIC8qKiBBbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbW9udGggbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICovXG4gIHByaXZhdGUgX21vbnRoTmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygnbG9uZycpO1xuXG4gIC8qKiBBIGxpc3Qgb2YgYnV0dG9ucyBjb3JyZXNwb25kaW5nIHRvIGRheXMsIG1vbnRocyBvciB5ZWFycyBkZXBlbmRpbmcgb24gdGhlIHZpZXcuICovXG4gIHByaXZhdGUgZ2V0IF9jZWxscygpOiBIVE1MQnV0dG9uRWxlbWVudFtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvckFsbCgnLnNiYi1jYWxlbmRhcl9fY2VsbCcpID8/IFtdLFxuICAgICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnRbXTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hvc2VuIHllYXIgaW4gdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2Nob3NlblllYXI/OiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjaG9zZW4gbW9udGggaW4gdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2Nob3Nlbk1vbnRoPzogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBmb2N1cyBzaG91bGQgYmUgcmVzZXQgb24gZm9jdXNDZWxsLiAqL1xuICBwcml2YXRlIF9yZXNldEZvY3VzID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBhY2Nlc3NvciBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9hYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKS53aXRoSGFuZGxlcigoKSA9PiB7XG4gICAgdGhpcy5fbW9udGhOYW1lcyA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKTtcbiAgICB0aGlzLl9jcmVhdGVNb250aFJvd3MoKTtcbiAgfSk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gICAgdGhpcy5fc2V0V2Vla2RheXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGVGaWx0ZXIoZGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGVGaWx0ZXI/LihkYXRlKSA/PyB0cnVlO1xuICB9XG5cbiAgLyoqIFJlc2V0cyB0aGUgYWN0aXZlIG1vbnRoIGFjY29yZGluZyB0byB0aGUgbmV3IHN0YXRlIG9mIHRoZSBjYWxlbmRhci4gKi9cbiAgcHVibGljIHJlc2V0UG9zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzZXRDYWxlbmRhclZpZXcoKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTtcbiAgICB0aGlzLmZvY3VzID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLl9mb2N1c0NlbGwoKTtcbiAgICB9O1xuICAgIGdsb2JhbFRoaXMud2luZG93Py5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9pbml0KCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX2Fib3J0LnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3dpZGUnKSkge1xuICAgICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygndmlldycpKSB7XG4gICAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLnZpZXc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgLy8gVGhlIGNhbGVuZGFyIG5lZWRzIHRvIGNhbGN1bGF0ZSB0YWItaW5kZXhlcyBvbiBmaXJzdCByZW5kZXIsXG4gICAgLy8gYW5kIGV2ZXJ5IHRpbWUgYSBkYXRlIGlzIHNlbGVjdGVkIG9yIHRoZSBtb250aCB2aWV3IGNoYW5nZXMuXG4gICAgdGhpcy5fc2V0VGFiSW5kZXgoKTtcbiAgICAvLyBXaGVuIGNoYW5naW5nIHZpZXcgdG8geWVhci9tb250aCwgdGhlIHRhYmluZGV4IGlzIGNoYW5nZWQsIGJ1dCB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIG5vdCxcbiAgICAvLyBzbyBpZiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lIHZpYSBrZXlib2FyZCwgdGhlcmUncyB0aGUgbmVlZFxuICAgIC8vIHRvIGNhbGwgdGhlIGBfZm9jdXNDZWxsKClgIG1ldGhvZCBleHBsaWNpdGx5IHRvIGNvcnJlY3RseSBzZXQgdGhlIGZvY3VzLlxuICAgIGlmIChzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IubW9zdFJlY2VudE1vZGFsaXR5ID09PSAna2V5Ym9hcmQnKSB7XG4gICAgICB0aGlzLl9mb2N1c0NlbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudC4gKi9cbiAgcHJpdmF0ZSBfaW5pdChhY3RpdmVEYXRlPzogVCk6IHZvaWQge1xuICAgIC8vRHVlIHRvIGl0cyBjb21wbGV4aXR5LCB0aGUgY2FsZWRhciBpcyBvbmx5IGluaXRpYWxpemVkIG9uIGNsaWVudCBzaWRlXG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5faW5pdCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlRGF0ZSkge1xuICAgICAgdGhpcy5fYXNzaWduQWN0aXZlRGF0ZShhY3RpdmVEYXRlKTtcbiAgICB9XG4gICAgdGhpcy5fd2lkZSA9IGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlO1xuICAgIHRoaXMuX3dlZWtzID0gdGhpcy5fY3JlYXRlV2Vla1Jvd3ModGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgdGhpcy5feWVhcnMgPSB0aGlzLl9jcmVhdGVZZWFyUm93cygpO1xuICAgIHRoaXMuX25leHRNb250aFdlZWtzID0gW1tdXTtcbiAgICB0aGlzLl9uZXh0TW9udGhZZWFycyA9IFtbXV07XG4gICAgaWYgKHRoaXMuX3dpZGUpIHtcbiAgICAgIGNvbnN0IG5leHRNb250aERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgIHRoaXMuX25leHRNb250aFdlZWtzID0gdGhpcy5fY3JlYXRlV2Vla1Jvd3MobmV4dE1vbnRoRGF0ZSk7XG4gICAgICB0aGlzLl9uZXh0TW9udGhZZWFycyA9IHRoaXMuX2NyZWF0ZVllYXJSb3dzKFlFQVJTX1BFUl9QQUdFKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqIEZvY3VzZXMgb24gYSBkYXkgY2VsbCBwcmlvcml0aXppbmcgdGhlIHNlbGVjdGVkIGRheSwgdGhlIGN1cnJlbnQgZGF5LCBhbmQgbGFzdGx5LCB0aGUgZmlyc3Qgc2VsZWN0YWJsZSBkYXkuICovXG4gIHByaXZhdGUgX2ZvY3VzQ2VsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVzZXRGb2N1cykge1xuICAgICAgdGhpcy5fZ2V0Rmlyc3RGb2N1c2FibGUoKT8uZm9jdXMoKTtcbiAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgYXJyYXkgb2Ygd2Vla2RheXMuICovXG4gIHByaXZhdGUgX3NldFdlZWtkYXlzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hcnJvd1dlZWtkYXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCduYXJyb3cnKTtcbiAgICBjb25zdCBsb25nV2Vla2RheXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcbiAgICBjb25zdCB3ZWVrZGF5czogV2Vla2RheVtdID0gbG9uZ1dlZWtkYXlzLm1hcCgobG9uZzogc3RyaW5nLCBpOiBudW1iZXIpID0+ICh7XG4gICAgICBsb25nLFxuICAgICAgbmFycm93OiBuYXJyb3dXZWVrZGF5c1tpXSxcbiAgICB9KSk7XG5cbiAgICAvLyBSb3RhdGVzIHRoZSBsYWJlbHMgZm9yIGRheXMgb2YgdGhlIHdlZWsgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgIGNvbnN0IGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdERheU9mV2VlaygpO1xuICAgIHRoaXMuX3dlZWtkYXlzID0gd2Vla2RheXMuc2xpY2UoZmlyc3REYXlPZldlZWspLmNvbmNhdCh3ZWVrZGF5cy5zbGljZSgwLCBmaXJzdERheU9mV2VlaykpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIGVhY2ggd2Vlay4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlV2Vla1Jvd3ModmFsdWU6IFQpOiBEYXlbXVtdIHtcbiAgICBjb25zdCBkYXlzSW5Nb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodmFsdWUpO1xuICAgIGNvbnN0IGRhdGVOYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlTmFtZXMoKTtcbiAgICBjb25zdCB3ZWVrczogRGF5W11bXSA9IFtbXV07XG4gICAgY29uc3Qgd2Vla09mZnNldCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0V2Vla09mZnNldCh2YWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGNlbGwgPSB3ZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICBpZiAoY2VsbCA9PT0gREFZU19QRVJfUk9XKSB7XG4gICAgICAgIHdlZWtzLnB1c2goW10pO1xuICAgICAgICBjZWxsID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodmFsdWUpLFxuICAgICAgICBpICsgMSxcbiAgICAgICkhO1xuICAgICAgd2Vla3Nbd2Vla3MubGVuZ3RoIC0gMV0ucHVzaCh7XG4gICAgICAgIHZhbHVlOiB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoZGF0ZSksXG4gICAgICAgIGRheVZhbHVlOiBkYXRlTmFtZXNbaV0sXG4gICAgICAgIG1vbnRoVmFsdWU6IFN0cmluZyh0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSksXG4gICAgICAgIHllYXJWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSkpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB3ZWVrcztcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSByb3dzIGZvciB0aGUgbW9udGggc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZU1vbnRoUm93cygpOiB2b2lkIHtcbiAgICBjb25zdCBzaG9ydE5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ3Nob3J0Jyk7XG4gICAgY29uc3QgbW9udGhzOiBNb250aFtdID0gbmV3IEFycmF5KDEyKS5maWxsKG51bGwpLm1hcChcbiAgICAgIChfLCBpOiBudW1iZXIpOiBNb250aCA9PiAoe1xuICAgICAgICB2YWx1ZTogc2hvcnROYW1lc1tpXSxcbiAgICAgICAgbG9uZ1ZhbHVlOiB0aGlzLl9tb250aE5hbWVzW2ldLFxuICAgICAgICBtb250aFZhbHVlOiBpICsgMSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3Qgcm93czogbnVtYmVyID0gMTIgLyBNT05USFNfUEVSX1JPVztcbiAgICBjb25zdCBtb250aEFycmF5OiBNb250aFtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBtb250aEFycmF5LnB1c2gobW9udGhzLnNsaWNlKE1PTlRIU19QRVJfUk9XICogaSwgTU9OVEhTX1BFUl9ST1cgKiAoaSArIDEpKSk7XG4gICAgfVxuICAgIHRoaXMuX21vbnRocyA9IG1vbnRoQXJyYXk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZVllYXJSb3dzKG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlcltdW10ge1xuICAgIGNvbnN0IHN0YXJ0VmFsdWVZZWFyVmlldzogbnVtYmVyID0gdGhpcy5fZ2V0U3RhcnRWYWx1ZVllYXJWaWV3KCk7XG4gICAgY29uc3QgYWxsWWVhcnM6IG51bWJlcltdID0gbmV3IEFycmF5KFlFQVJTX1BFUl9QQUdFKVxuICAgICAgLmZpbGwoMClcbiAgICAgIC5tYXAoKF8sIGk6IG51bWJlcikgPT4gc3RhcnRWYWx1ZVllYXJWaWV3ICsgb2Zmc2V0ICsgaSk7XG4gICAgY29uc3Qgcm93czogbnVtYmVyID0gWUVBUlNfUEVSX1BBR0UgLyBZRUFSU19QRVJfUk9XO1xuICAgIGNvbnN0IHllYXJBcnJheTogbnVtYmVyW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgIHllYXJBcnJheS5wdXNoKGFsbFllYXJzLnNsaWNlKFlFQVJTX1BFUl9ST1cgKiBpLCBZRUFSU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICByZXR1cm4geWVhckFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGZpcnN0IHllYXIgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiBwYW5lbC5cbiAgICogSWYgYG1pbkRhdGVgIGFuZCBgbWF4RGF0ZWAgYXJlIGJvdGggbnVsbCwgdGhlIHN0YXJ0aW5nIHllYXIgaXMgY2FsY3VsYXRlZCBhc1xuICAgKiB0aGUgbXVsdGlwbGUgb2YgWUVBUlNfUEVSX1BBR0UgY2xvc2VzdCB0byBhbmQgbGVzcyB0aGFuIGFjdGl2ZURhdGUsXG4gICAqIGUuZy4sIHdpdGggYFlFQVJTX1BFUl9QQUdFYCA9IDI0IGFuZCBgYWN0aXZlRGF0ZWAgPSAyMDIwLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gMjAxNiAoMjQgKiA4MyksXG4gICAqIHdoaWxlIHdpdGggYGFjdGl2ZURhdGVgID0gMjAwMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDE5OTIgKDI0ICogODIpLlxuICAgKiBJZiBgbWluRGF0ZWAgaXMgbm90IG51bGwsIGl0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgeWVhcjsgaWYgYG1heERhdGVgIGlzIG5vdCBudWxsLFxuICAgKiBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXIgbWludXMgYFlFQVJTX1BFUl9QQUdFYCwgc28gdGhhdCB0aGUgYG1heERhdGVgIGlzIHRoZSBsYXN0IHJlbmRlcmVkIHllYXIuXG4gICAqIElmIGJvdGggYXJlIG5vdCBudWxsLCBgbWF4RGF0ZWAgaGFzIHByaW9yaXR5IG92ZXIgYG1pbkRhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3RhcnRWYWx1ZVllYXJWaWV3KCk6IG51bWJlciB7XG4gICAgbGV0IHN0YXJ0aW5nWWVhciA9IDA7XG4gICAgaWYgKHRoaXMubWF4KSB7XG4gICAgICBzdGFydGluZ1llYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWF4KSAtIFlFQVJTX1BFUl9QQUdFICsgMTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWluKSB7XG4gICAgICBzdGFydGluZ1llYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWluKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGFjdGl2ZVllYXIgLVxuICAgICAgKCgoKGFjdGl2ZVllYXIgLSBzdGFydGluZ1llYXIpICUgWUVBUlNfUEVSX1BBR0UpICsgWUVBUlNfUEVSX1BBR0UpICUgWUVBUlNfUEVSX1BBR0UpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgZGF0ZSBpcyB3aXRoaW4gdGhlIG1pbi1tYXggcmFuZ2UuICovXG4gIHByaXZhdGUgX2lzRGF5SW5SYW5nZShkYXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21pbiAmJiAhdGhpcy5fbWF4KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaXNCZWZvcmVNaW46IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9taW4pICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9taW4hLCB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXRlKSEpID4gMDtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWF4KSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWF4ISwgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkhKSA8IDA7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICBwcml2YXRlIF9pc01vbnRoSW5SYW5nZShtb250aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9taW4hKSA+PSB0aGlzLl9jaG9zZW5ZZWFyISAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fbWluISkgPiBtb250aDtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWF4KSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9tYXghKSA8PSB0aGlzLl9jaG9zZW5ZZWFyISAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fbWF4ISkgPCBtb250aDtcbiAgICByZXR1cm4gIShpc0JlZm9yZU1pbiB8fCBpc0FmdGVyTWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzWWVhckluUmFuZ2UoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJiB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX21pbiEpID4geWVhcjtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWF4KSAmJiB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX21heCEpIDwgeWVhcjtcbiAgICByZXR1cm4gIShpc0JlZm9yZU1pbiB8fCBpc0FmdGVyTWF4KTtcbiAgfVxuXG4gIC8vIEltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFpbi9zcmMvbWF0ZXJpYWwvZGF0ZXBpY2tlci95ZWFyLXZpZXcudHMjTDM2NlxuICBwcml2YXRlIF9pc01vbnRoRmlsdGVyZWRPdXQobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX2Nob3NlblllYXIhLCBtb250aCwgMSkhO1xuICAgIGZvciAoXG4gICAgICBsZXQgZGF0ZTogVCA9IGZpcnN0T2ZNb250aDtcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpID09IG1vbnRoO1xuICAgICAgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL21hdGVyaWFsL2RhdGVwaWNrZXIvbXVsdGkteWVhci12aWV3LnRzI0wzNTFcbiAgcHJpdmF0ZSBfaXNZZWFyRmlsdGVyZWRPdXQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRhdGVGaWx0ZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2ZZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCAxLCAxKSE7XG4gICAgZm9yIChcbiAgICAgIGxldCBkYXRlOiBUID0gZmlyc3RPZlllYXI7XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpID09IHllYXI7XG4gICAgICBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKGRhdGUsIDEpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5kYXRlRmlsdGVyKGRhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgc2VsZWN0ZWQgZGF0ZSBhbmQgc2V0cyBpdCBpbnRlcm5hbGx5LiAqL1xuICBwcml2YXRlIF9zZWxlY3REYXRlKGRheTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZCAhPT0gZGF5KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IGRheTtcbiAgICAgIHRoaXMuX2RhdGVTZWxlY3RlZC5lbWl0KHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheSkhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRDaG9zZW5ZZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuX2Nob3NlblllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkgPz8gdGhpcy5zZWxlY3RlZCA/PyB0aGlzLm5vdyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Nob3NlblllYXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXNzaWduQWN0aXZlRGF0ZShkYXRlOiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21pbiAmJiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9taW4sIGRhdGUpID4gMCkge1xuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX21pbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heCAmJiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9tYXgsIGRhdGUpIDwgMCkge1xuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX21heDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IGRhdGU7XG4gIH1cblxuICAvKiogR29lcyB0byB0aGUgbW9udGggaWRlbnRpZmllZCBieSB0aGUgc2hpZnQuICovXG4gIHByaXZhdGUgX2dvVG9EaWZmZXJlbnRNb250aChtb250aHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2luaXQodGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgbW9udGhzKSk7XG4gIH1cblxuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50WWVhcih5ZWFyczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY2hvc2VuWWVhciEgKz0geWVhcnM7XG4gICAgLy8gQ2FuJ3QgdXNlIGBfYXNzaWduQWN0aXZlRGF0ZSguLi4pYCBoZXJlLCBiZWNhdXNlIGl0IHdpbGwgc2V0IGl0IHRvIG1pbi9tYXggdmFsdWUgaWYgYXJndW1lbnQgaXMgb3V0IG9mIHJhbmdlXG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyISxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICApO1xuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2luaXQodGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCB5ZWFycykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldkRpc2FibGVkKHByZXZEYXRlOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHByZXZEYXRlLCB0aGlzLl9taW4pIDwgMDtcbiAgfVxuXG4gIHByaXZhdGUgX25leHREaXNhYmxlZChuZXh0RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWF4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShuZXh0RGF0ZSwgdGhpcy5fbWF4KSA+IDA7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcInByZXZpb3VzIG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfcHJldmlvdXNNb250aERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpICogLTEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZNb250aCk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcIm5leHQgbW9udGhcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF9uZXh0TW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBsZXQgbmV4dE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5fd2lkZSA/IDIgOiAxKTtcbiAgICBuZXh0TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihuZXh0TW9udGgpLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgobmV4dE1vbnRoKSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRNb250aCk7XG4gIH1cblxuICBwcml2YXRlIF9wcmV2aW91c1llYXJEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpIC0gMSxcbiAgICAgIDEyLFxuICAgICAgMzEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX25leHRZZWFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmV4dFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKSArIDEsXG4gICAgICAxLFxuICAgICAgMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dFllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmlvdXNZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5feWVhcnNbMF1bMF0gLSAxLCAxMiwgMzEpO1xuICAgIHJldHVybiB0aGlzLl9wcmV2RGlzYWJsZWQocHJldlllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmV4dFllYXJSYW5nZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHllYXJzID0gaXNCcmVha3BvaW50KCdtZWRpdW0nKSAmJiB0aGlzLndpZGUgPyB0aGlzLl9uZXh0TW9udGhZZWFycyA6IHRoaXMuX3llYXJzO1xuICAgIGNvbnN0IGxhc3RZZWFyUmFuZ2UgPSB5ZWFyc1t5ZWFycy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBsYXN0WWVhciA9IGxhc3RZZWFyUmFuZ2VbbGFzdFllYXJSYW5nZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBuZXh0WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUobGFzdFllYXIgKyAxLCAxLCAxKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVRhYmxlQmx1cihldmVudFRhcmdldDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnRUYXJnZXQ/LmxvY2FsTmFtZSAhPT0gJ2J1dHRvbicpIHtcbiAgICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VGFiSW5kZXgoKTogdm9pZCB7XG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvckFsbCgnLnNiYi1jYWxlbmRhcl9fY2VsbFt0YWJpbmRleD1cIjBcIl0nKSA/PyBbXSxcbiAgICApLmZvckVhY2goKGRheSkgPT4gKChkYXkgYXMgSFRNTEVsZW1lbnQpLnRhYkluZGV4ID0gLTEpKTtcbiAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk7XG4gICAgaWYgKGZpcnN0Rm9jdXNhYmxlKSB7XG4gICAgICBmaXJzdEZvY3VzYWJsZS50YWJJbmRleCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RGb2N1c2FibGUoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX3NlbGVjdGVkID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISA6IHRoaXMubm93O1xuICAgIGxldCBmaXJzdEZvY3VzYWJsZSA9XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItY2FsZW5kYXJfX3NlbGVjdGVkJykgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYFtkYXRhLWRheT1cIiR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShhY3RpdmUpfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKFxuICAgICAgICAgIGFjdGl2ZSxcbiAgICAgICAgKX0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGFjdGl2ZSl9XCJdYCxcbiAgICAgICkgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcihgW2RhdGEtbW9udGg9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGFjdGl2ZSl9XCJdYCkgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcihgW2RhdGEteWVhcj1cIiR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihhY3RpdmUpfVwiXWApO1xuICAgIGlmICghZmlyc3RGb2N1c2FibGUgfHwgKGZpcnN0Rm9jdXNhYmxlIGFzIEhUTUxCdXR0b25FbGVtZW50KT8uZGlzYWJsZWQpIHtcbiAgICAgIGZpcnN0Rm9jdXNhYmxlID0gdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLWNhbGVuZGFyX19jZWxsOm5vdChbZGlzYWJsZWRdKScpO1xuICAgIH1cbiAgICByZXR1cm4gKGZpcnN0Rm9jdXNhYmxlIGFzIEhUTUxCdXR0b25FbGVtZW50KSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCwgZGF5PzogRGF5KTogdm9pZCB7XG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSdzIGNlbGw7XG4gICAgLy8gdGhleSBjb3VsZCBiZSBkYXlzLCBtb250aHMgb3IgeWVhcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZpZXcuXG4gICAgLy8gSWYgYHdpZGVgIGlzIHRydWUsIHllYXJzIGFyZSBkb3VibGVkIGluIG51bWJlciBhbmQgZGF5cyBhcmUgKHJvdWdobHkpIGRvdWJsZWQgdG9vLCBhZmZlY3RpbmcgdGhlIGBpbmRleGAgY2FsY3VsYXRpb24uXG4gICAgY29uc3QgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10gPSB0aGlzLl9jZWxscztcbiAgICBjb25zdCBpbmRleDogbnVtYmVyID0gY2VsbHMuZmluZEluZGV4KChlOiBIVE1MQnV0dG9uRWxlbWVudCkgPT4gZSA9PT0gZXZlbnQudGFyZ2V0KTtcbiAgICBjb25zdCBuZXh0RWw6IEhUTUxCdXR0b25FbGVtZW50ID0gdGhpcy5fbmF2aWdhdGVCeUtleWJvYXJkKGV2ZW50LCBpbmRleCwgY2VsbHMsIGRheSk7XG4gICAgY29uc3QgYWN0aXZlRWw6IEhUTUxCdXR0b25FbGVtZW50ID0gdGhpcy5zaGFkb3dSb290IS5hY3RpdmVFbGVtZW50IGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGlmIChuZXh0RWwgIT09IGFjdGl2ZUVsKSB7XG4gICAgICAobmV4dEVsIGFzIEhUTUxCdXR0b25FbGVtZW50KS50YWJJbmRleCA9IDA7XG4gICAgICBuZXh0RWw/LmZvY3VzKCk7XG4gICAgICAoYWN0aXZlRWwgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhYkluZGV4ID0gLTE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdG8sIGJhc2VkIG9uIGEgbGlzdCBvZiBlbGVtZW50cyAod2hpY2ggY2FuIGJlIHBvdGVudGlhbGx5IGRpc2FibGVkKSxcbiAgICogdGhlIGtleWJvYXJkIGlucHV0IGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAgICogSW4gdGhlIGRheSB2aWV3LCB0aGUgYGRheT86IERheWAgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgY2FsY3VsYXRpb24sXG4gICAqIHdoaWxlIGluIG1vbnRoIGFuZCB5ZWFyIHZpZXcgaXQncyBub3QgZHVlIHRvIHRoZSBmaXhlZCBhbW91bnQgb2YgcmVuZGVyZWQgY2VsbHMuXG4gICAqL1xuICBwcml2YXRlIF9uYXZpZ2F0ZUJ5S2V5Ym9hcmQoXG4gICAgZXZ0OiBLZXlib2FyZEV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgZGF5PzogRGF5LFxuICApOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICBvZmZzZXRGb3JXaWRlTW9kZSxcbiAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgIHZlcnRpY2FsT2Zmc2V0LFxuICAgIH06IENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHRoaXMuX2NhbGN1bGF0ZVBhcmFtZXRlcnNGb3JLZXlib2FyZE5hdmlnYXRpb24oXG4gICAgICBjZWxscyxcbiAgICAgIGluZGV4LFxuICAgICAgZGF5LFxuICAgICk7XG5cbiAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAtdmVydGljYWxPZmZzZXQpO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgdmVydGljYWxPZmZzZXQpO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgLTEpO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIDEpO1xuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRmlyc3QoY2VsbHMsIG9mZnNldEZvcldpZGVNb2RlKTtcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRmlyc3RPbkNvbHVtbihcbiAgICAgICAgICBjZWxscyxcbiAgICAgICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZSxcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRMYXN0T25Db2x1bW4oY2VsbHMsIGluZGV4LCBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTGFzdChjZWxscywgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlIC0gMSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY2VsbHNbaW5kZXhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBwYXJhbWV0ZXIgbmVlZGVkIGluIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAqIFNpbmNlIHRocmVlIHZpZXdzIGFyZSBub3cgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIGZvciBlYWNoIG9mIHRoZW1cbiAgICogYnkgY29uc2lkZXJpbmcgdGhlIG51bWJlciBvZiBjZWxscyBwZXIgZWFjaCByb3cgYW5kIHRoZSBjb3JyZWN0aW9uIGZvciB0aGUgd2lkZSBtb2RlLlxuICAgKiBAcGFyYW0gY2VsbHMgVGhlIGFycmF5IG9mIHJlbmRlcmVkIHRhYmxlIGNlbGxzOyB0aGV5IGFyZSBidXR0b25zIHRoYXQgY2FuIHJlcHJlc2VudCBkYXlzLCBtb250aHMgb3IgeWVhcnMuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgc3RhcnRpbmcgZWxlbWVudCdzIGluZGV4IGluIHRoZSBjZWxsIGFycmF5LlxuICAgKiBAcGFyYW0gZGF5IChvcHRpb25hbCkgT25seSBpbiB0aGUgZGF5IHZpZXcsIHRoZSBkYXkgcmVwcmVzZW50ZWQgYnkgdGhlIHN0YXJ0aW5nIGNlbGwuXG4gICAqL1xuICBwcml2YXRlIF9jYWxjdWxhdGVQYXJhbWV0ZXJzRm9yS2V5Ym9hcmROYXZpZ2F0aW9uKFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZGF5PzogRGF5LFxuICApOiBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMge1xuICAgIHN3aXRjaCAodGhpcy5fY2FsZW5kYXJWaWV3KSB7XG4gICAgICBjYXNlICdkYXknOiB7XG4gICAgICAgIGNvbnN0IGluZGV4SW5WaWV3ID0gK2RheSEuZGF5VmFsdWUgLSAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBEQVlTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4SW5WaWV3LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiBpbmRleCAtIGluZGV4SW5WaWV3LFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTpcbiAgICAgICAgICAgIGluZGV4ID09PSBpbmRleEluVmlld1xuICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheSEudmFsdWUpISxcbiAgICAgICAgICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjZWxscy5sZW5ndGgsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBNb250aCB2aWV3IGlzIG5vdCBkZXBlbmRlbnQgZnJvbSBgd2lkZWAgdmFsdWUsIHNvIHNvbWUgcGFyYW1ldGVycyBhcmUgZml4ZWQuXG4gICAgICBjYXNlICdtb250aCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogTU9OVEhTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiAwLFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogMTIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICd5ZWFyJzoge1xuICAgICAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IE1hdGgudHJ1bmMoaW5kZXggLyBZRUFSU19QRVJfUEFHRSkgKiBZRUFSU19QRVJfUEFHRTtcbiAgICAgICAgY29uc3QgaW5kZXhJblZpZXc6IG51bWJlciA9IG9mZnNldCA9PT0gMCA/IGluZGV4IDogaW5kZXggLSBZRUFSU19QRVJfUEFHRTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogWUVBUlNfUEVSX1JPVyxcbiAgICAgICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogaW5kZXhJblZpZXcsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGU6IGluZGV4IC0gaW5kZXhJblZpZXcsXG4gICAgICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBvZmZzZXQgPT09IDAgPyBZRUFSU19QRVJfUEFHRSA6IFlFQVJTX1BFUl9QQUdFICogMixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBwcm92aWRlZCBhcnJheSBzdGFydGluZyBmcm9tIGBpbmRleGAgYnkgYWRkaW5nIGBkZWx0YWAuXG4gICAqIElmIHRoZSBmb3VuZCBlbGVtZW50IGlzIGRpc2FibGVkLCBpdCBjb250aW51ZXMgYWRkaW5nIGBkZWx0YWAgdW50aWwgaXQgZmluZHMgYW4gZW5hYmxlZCBvbmUgaW4gdGhlIGFycmF5IGJvdW5kcy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmROZXh0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGluZGV4OiBudW1iZXIsIGRlbHRhOiBudW1iZXIpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgbGV0IG5leHRJbmRleCA9IGluZGV4ICsgZGVsdGE7XG4gICAgd2hpbGUgKG5leHRJbmRleCA8IGRheXMubGVuZ3RoICYmIGRheXNbbmV4dEluZGV4XT8uZGlzYWJsZWQpIHtcbiAgICAgIG5leHRJbmRleCArPSBkZWx0YTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNbbmV4dEluZGV4XSA/PyBkYXlzW2luZGV4XTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kRmlyc3QoZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSwgZmlyc3RPZkN1cnJlbnRNb250aDogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiAhZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW2ZpcnN0T2ZDdXJyZW50TW9udGhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIGZpcnN0T2ZDdXJyZW50TW9udGgsIDEpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxhc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZExhc3QoZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSwgbGFzdE9mQ3VycmVudE1vbnRoOiBudW1iZXIpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgcmV0dXJuICFkYXlzW2xhc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tsYXN0T2ZDdXJyZW50TW9udGhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIGxhc3RPZkN1cnJlbnRNb250aCwgLTEpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGZpcnN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgc2FtZSBjb2x1bW4gb2YgdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kRmlyc3RPbkNvbHVtbihcbiAgICBkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgdmVydGljYWxPZmZzZXQ6IG51bWJlcixcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IChpbmRleCAlIHZlcnRpY2FsT2Zmc2V0KSArIG9mZnNldDtcbiAgICByZXR1cm4gIWRheXNbbmV4dEluZGV4XS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW25leHRJbmRleF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbmV4dEluZGV4LCB2ZXJ0aWNhbE9mZnNldCk7XG4gIH1cblxuICAvKiogRmluZCB0aGUgbGFzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZExhc3RPbkNvbHVtbihcbiAgICBkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgdmVydGljYWxPZmZzZXQ6IG51bWJlcixcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgTWF0aC50cnVuYygob2Zmc2V0IC0gaW5kZXggLSAxKSAvIHZlcnRpY2FsT2Zmc2V0KSAqIHZlcnRpY2FsT2Zmc2V0O1xuICAgIHJldHVybiAhZGF5c1tuZXh0SW5kZXhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbmV4dEluZGV4XVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBuZXh0SW5kZXgsIC12ZXJ0aWNhbE9mZnNldCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldENhbGVuZGFyVmlldyhpbml0VHJhbnNpdGlvbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuc2VsZWN0ZWQgPz8gdGhpcy5ub3c7XG4gICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLnZpZXc7XG5cbiAgICBpZiAoaW5pdFRyYW5zaXRpb24pIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIGRheSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlckRheVZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG5leHRNb250aEFjdGl2ZURhdGUgPSB0aGlzLl93aWRlXG4gICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIDEpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRNb250aCgtMSksXG4gICAgICAgICAgaTE4blByZXZpb3VzTW9udGhbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNNb250aERpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+XG4gICAgICAgICAgJHt0aGlzLl9jcmVhdGVMYWJlbEZvckRheVZpZXcodGhpcy5fYWN0aXZlRGF0ZSl9XG4gICAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlTGFiZWxGb3JEYXlWaWV3KG5leHRNb250aEFjdGl2ZURhdGUhKSA6IG5vdGhpbmd9XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KHRoaXMuX2FjdGl2ZURhdGUsIG5leHRNb250aEFjdGl2ZURhdGUhKX1cbiAgICAgICAgICA8L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudE1vbnRoKDEpLFxuICAgICAgICAgIGkxOG5OZXh0TW9udGhbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dE1vbnRoRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUtZGF5LXZpZXdcIj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlUYWJsZSh0aGlzLl93ZWVrcyl9XG4gICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZURheVRhYmxlKHRoaXMuX25leHRNb250aFdlZWtzKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGxhYmVsIHdpdGggdGhlIG1vbnRoIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTGFiZWxGb3JEYXlWaWV3KGQ6IFQpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgbW9udGhMYWJlbCA9IGAke1xuICAgICAgdGhpcy5fbW9udGhOYW1lc1t0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkKSAtIDFdXG4gICAgfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZCl9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19kYXRlLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2kxOG5ZZWFyTW9udGhTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7bW9udGhMYWJlbH1cIlxuICAgICAgICBAY2xpY2s9JHsoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9ICd5ZWFyJztcbiAgICAgICAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICAke21vbnRoTGFiZWx9XG4gICAgICAgIDxzYmItaWNvbiBuYW1lPVwiY2hldnJvbi1zbWFsbC1kb3duLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgYXJpYS1sYWJlbCBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUFyaWFMYWJlbEZvckRheVZpZXcoLi4uZGF0ZXM6IFRbXSk6IHN0cmluZyB7XG4gICAgbGV0IG1vbnRoTGFiZWwgPSAnJztcbiAgICBmb3IgKGNvbnN0IGQgb2YgZGF0ZXMpIHtcbiAgICAgIGlmIChkKSB7XG4gICAgICAgIG1vbnRoTGFiZWwgKz0gYCR7XG4gICAgICAgICAgdGhpcy5fbW9udGhOYW1lc1t0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkKSAtIDFdXG4gICAgICAgIH0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQpfSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9udGhMYWJlbDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBjYWxlbmRhciB0YWJsZSBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlKHdlZWtzOiBEYXlbXVtdKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHRhYmxlXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgIEBmb2N1c291dD0keyhldmVudDogRm9jdXNFdmVudCkgPT5cbiAgICAgICAgICB0aGlzLl9oYW5kbGVUYWJsZUJsdXIoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCl9XG4gICAgICAgIEBhbmltYXRpb25lbmQ9JHsoZTogQW5pbWF0aW9uRXZlbnQpID0+IHRoaXMuX3RhYmxlQW5pbWF0aW9uRW5kKGUpfVxuICAgICAgPlxuICAgICAgICA8dGhlYWQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgIDx0ciBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlUYWJsZUhlYWRlcigpfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtYm9keVwiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGVCb2R5KHdlZWtzKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBoZWFkZXIgd2l0aCB0aGUgbW9udGggaGVhZGVyIGNlbGxzLiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZUhlYWRlcigpOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2Vla2RheXMubWFwKFxuICAgICAgKGRheTogV2Vla2RheSkgPT4gaHRtbGBcbiAgICAgICAgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seT4ke2RheS5sb25nfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2RheS5uYXJyb3d9PC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgYCxcbiAgICApO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGJvZHkgd2l0aCB0aGUgZGF5IGNlbGxzLiBGb3IgdGhlIGZpcnN0IHJvdywgaXQgYWxzbyBjb25zaWRlcnMgdGhlIHBvc3NpYmxlIGRheSdzIG9mZnNldC4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5VGFibGVCb2R5KHdlZWtzOiBEYXlbXVtdKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgY29uc3QgdG9kYXk6IHN0cmluZyA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLm5vdyk7XG4gICAgcmV0dXJuIHdlZWtzLm1hcCgod2VlazogRGF5W10sIHJvd0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Um93T2Zmc2V0OiBudW1iZXIgPSBEQVlTX1BFUl9ST1cgLSB3ZWVrLmxlbmd0aDtcbiAgICAgIGlmIChyb3dJbmRleCA9PT0gMCAmJiBmaXJzdFJvd09mZnNldCkge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAke1suLi5BcnJheShmaXJzdFJvd09mZnNldCkua2V5cygpXS5tYXAoXG4gICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgaHRtbGA8dGRcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtZGF5PSR7YDAgJHt3ZWVrWzBdLm1vbnRoVmFsdWV9ICR7d2Vla1swXS55ZWFyVmFsdWV9YH1cbiAgICAgICAgICAgICAgICA+PC90ZD5gLFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5Q2VsbHMod2VlaywgdG9kYXkpfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIGA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaHRtbGA8dHI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlRGF5Q2VsbHMod2VlaywgdG9kYXkpfVxuICAgICAgPC90cj5gO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGNlbGxzIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5Q2VsbHMod2VlazogRGF5W10sIHRvZGF5OiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICByZXR1cm4gd2Vlay5tYXAoKGRheTogRGF5KSA9PiB7XG4gICAgICBjb25zdCBpc091dE9mUmFuZ2UgPSAhdGhpcy5faXNEYXlJblJhbmdlKGRheS52YWx1ZSk7XG4gICAgICBjb25zdCBpc0ZpbHRlcmVkT3V0ID0gIXRoaXMuX2RhdGVGaWx0ZXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF5LnZhbHVlKSEpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQ6IGJvb2xlYW4gPSAhIXRoaXMuX3NlbGVjdGVkICYmIGRheS52YWx1ZSA9PT0gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgICBjb25zdCBkYXlWYWx1ZSA9IGAke2RheS5kYXlWYWx1ZX0gJHtkYXkubW9udGhWYWx1ZX0gJHtkYXkueWVhclZhbHVlfWA7XG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LnZhbHVlID09PSB0b2RheTtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8dGRcbiAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEnOiB0cnVlLFxuICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YS1zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19kYXknOiB0cnVlLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc1RvZGF5LFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jcm9zc2VkLW91dCc6ICFpc091dE9mUmFuZ2UgJiYgaXNGaWx0ZXJlZE91dCxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fc2VsZWN0RGF0ZShkYXkudmFsdWUpfVxuICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPSR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0QWNjZXNzaWJpbGl0eUZvcm1hdERhdGUoZGF5LnZhbHVlKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgYXJpYS1jdXJyZW50PSR7aXNUb2RheSA/ICdkYXRlJyA6IG5vdGhpbmd9XG4gICAgICAgICAgICBkYXRhLWRheT0ke2RheVZhbHVlIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQsIGRheSl9XG4gICAgICAgICAgICBzYmItcG9wb3Zlci1jbG9zZVxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7ZGF5LmRheVZhbHVlfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSBtb250aCBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlck1vbnRoVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhcigtMSksXG4gICAgICAgICAgaTE4blByZXZpb3VzWWVhclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1llYXJEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPiR7dGhpcy5fY3JlYXRlTGFiZWxGb3JNb250aFZpZXcoKX08L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyKDEpLFxuICAgICAgICAgIGkxOG5OZXh0WWVhclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9uZXh0WWVhckRpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLW1vbnRoLXZpZXdcIj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVNb250aFRhYmxlKHRoaXMuX21vbnRocywgdGhpcy5fY2hvc2VuWWVhciEpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVNb250aFRhYmxlKHRoaXMuX21vbnRocywgdGhpcy5fY2hvc2VuWWVhciEgKyAxLCB0cnVlKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGxhYmVsIHdpdGggdGhlIHllYXIgZm9yIHRoZSBtb250aGx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yTW9udGhWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX21vbnRoLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9JHtgJHtpMThuQ2FsZW5kYXJEYXRlU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3RoaXMuX2Nob3NlblllYXJ9YH1cbiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fcmVzZXRDYWxlbmRhclZpZXcodHJ1ZSl9XG4gICAgICA+XG4gICAgICAgICR7dGhpcy5fY2hvc2VuWWVhcn0gJHt0aGlzLl93aWRlID8gYCAtICR7dGhpcy5fY2hvc2VuWWVhciEgKyAxfWAgOiBub3RoaW5nfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtdXAtc21hbGxcIj48L3NiYi1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seSByb2xlPVwic3RhdHVzXCI+ICR7dGhpcy5fY2hvc2VuWWVhcn0gPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PmA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgZm9yIHRoZSBtb250aCBzZWxlY3Rpb24gdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTW9udGhUYWJsZShtb250aHM6IE1vbnRoW11bXSwgeWVhcjogbnVtYmVyLCBzaGlmdFJpZ2h0ID0gZmFsc2UpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8dGFibGVcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlXCJcbiAgICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgICA+XG4gICAgICAgICR7dGhpcy5fd2lkZVxuICAgICAgICAgID8gaHRtbGA8dGhlYWQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiIGNvbHNwYW49JHtNT05USFNfUEVSX1JPV30+JHt5ZWFyfTwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtYm9keVwiPlxuICAgICAgICAgICR7bW9udGhzLm1hcChcbiAgICAgICAgICAgIChyb3c6IE1vbnRoW10pID0+IGh0bWxgXG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAke3Jvdy5tYXAoKG1vbnRoOiBNb250aCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzTW9udGhJblJhbmdlKG1vbnRoLm1vbnRoVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9pc01vbnRoRmlsdGVyZWRPdXQobW9udGgubW9udGhWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHRoaXMuX3NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgISF0aGlzLl9zZWxlY3RlZCAmJiB5ZWFyID09PSBzZWxlY3RlZFllYXIgJiYgbW9udGgubW9udGhWYWx1ZSA9PT0gc2VsZWN0ZWRNb250aDtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50TW9udGggPVxuICAgICAgICAgICAgICAgICAgICB5ZWFyID09PSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubm93KSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLm5vdykgPT09IG1vbnRoLm1vbnRoVmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtbW9udGgnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19waWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uTW9udGhTZWxlY3Rpb24obW9udGgubW9udGhWYWx1ZSwgeWVhciwgc2hpZnRSaWdodCl9XG4gICAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0ke2Ake21vbnRoLmxvbmdWYWx1ZX0gJHt0aGlzLl9jaG9zZW5ZZWFyfWB9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPSR7c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb250aD0ke21vbnRoLm1vbnRoVmFsdWUgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICR7bW9udGgudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICApfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG5cbiAgLyoqIFNlbGVjdCB0aGUgbW9udGggYW5kIGNoYW5nZSB0aGUgdmlldyB0byBkYXkgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vbk1vbnRoU2VsZWN0aW9uKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlciwgc2hpZnRSaWdodDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gc2hpZnRSaWdodCA/IG1vbnRoICsgMSA6IG1vbnRoO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAnZGF5JztcbiAgICB0aGlzLl9pbml0KFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgeWVhcixcbiAgICAgICAgdGhpcy5fY2hvc2VuTW9udGgsXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyWWVhclZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHNcIj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXJSYW5nZSgtWUVBUlNfUEVSX1BBR0UpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c1llYXJSYW5nZShZRUFSU19QRVJfUEFHRSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNZZWFyUmFuZ2VEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPiR7dGhpcy5fY3JlYXRlTGFiZWxGb3JZZWFyVmlldygpfTwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXJSYW5nZShZRUFSU19QRVJfUEFHRSksXG4gICAgICAgICAgaTE4bk5leHRZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRZZWFyUmFuZ2VEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1jb250YWluZXIgc2JiLWNhbGVuZGFyX190YWJsZS15ZWFyLXZpZXdcIj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVZZWFyVGFibGUodGhpcy5feWVhcnMpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVZZWFyVGFibGUodGhpcy5fbmV4dE1vbnRoWWVhcnMsIHRydWUpIDogbm90aGluZ31cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgYnV0dG9uIGFycm93IGZvciBhbGwgdGhlIHZpZXdzLiAqL1xuICBwcml2YXRlIF9nZXRBcnJvdyhcbiAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcsXG4gICAgY2xpY2s6ICgpID0+IHZvaWQsXG4gICAgYXJpYUxhYmVsOiBzdHJpbmcsXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4sXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGA8c2JiLXNlY29uZGFyeS1idXR0b25cbiAgICAgIHNpemU9XCJtXCJcbiAgICAgIGljb24tbmFtZT1cImNoZXZyb24tc21hbGwtJHtkaXJlY3Rpb259LXNtYWxsXCJcbiAgICAgIGFyaWEtbGFiZWw9JHthcmlhTGFiZWx9XG4gICAgICBAY2xpY2s9JHtjbGlja31cbiAgICAgID9kaXNhYmxlZD0ke2Rpc2FibGVkfVxuICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLSR7ZGlyZWN0aW9uID09PSAnbGVmdCcgPyAncHJldmlvdXMnIDogJ25leHQnfVwiXG4gICAgPjwvc2JiLXNlY29uZGFyeS1idXR0b24+YDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSB5ZWFyIHJhbmdlIGZvciB0aGUgeWVhcmx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yWWVhclZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGZpcnN0WWVhcjogbnVtYmVyID0gdGhpcy5feWVhcnMuZmxhdCgpWzBdO1xuICAgIGNvbnN0IGxhc3RZZWFyQXJyYXk6IG51bWJlcltdID0gKFxuICAgICAgaXNCcmVha3BvaW50KCdtZWRpdW0nKSAmJiB0aGlzLndpZGUgPyB0aGlzLl9uZXh0TW9udGhZZWFycyA6IHRoaXMuX3llYXJzXG4gICAgKS5mbGF0KCk7XG4gICAgY29uc3QgbGFzdFllYXI6IG51bWJlciA9IGxhc3RZZWFyQXJyYXlbbGFzdFllYXJBcnJheS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB5ZWFyTGFiZWwgPSBgJHtmaXJzdFllYXJ9IC0gJHtsYXN0WWVhcn1gO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX3llYXItc2VsZWN0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLWNoYW5nZS1kYXRlXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIiR7aTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt5ZWFyTGFiZWx9XCJcbiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fcmVzZXRDYWxlbmRhclZpZXcodHJ1ZSl9XG4gICAgICA+XG4gICAgICAgICR7eWVhckxhYmVsfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtdXAtc21hbGxcIj48L3NiYi1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seSByb2xlPVwic3RhdHVzXCI+ICR7eWVhckxhYmVsfSA8L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBmb3IgdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZVllYXJUYWJsZSh5ZWFyczogbnVtYmVyW11bXSwgc2hpZnRSaWdodCA9IGZhbHNlKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG5vdyA9IHRoaXMubm93O1xuICAgIHJldHVybiBodG1sYCA8dGFibGVcbiAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICA+XG4gICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgJHt5ZWFycy5tYXAoXG4gICAgICAgICAgKHJvdzogbnVtYmVyW10pID0+XG4gICAgICAgICAgICBodG1sYCA8dHI+XG4gICAgICAgICAgICAgICR7cm93Lm1hcCgoeWVhcjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzWWVhckluUmFuZ2UoeWVhcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9pc1llYXJGaWx0ZXJlZE91dCh5ZWFyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZDogYm9vbGVhbiA9ICEhdGhpcy5fc2VsZWN0ZWQgJiYgeWVhciA9PT0gc2VsZWN0ZWRZZWFyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKG5vdykgPT09IHllYXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgIDx0ZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSBzYmItY2FsZW5kYXJfX3RhYmxlLXllYXJcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fcGlsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbC1jdXJyZW50JzogaXNDdXJyZW50WWVhcixcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jcm9zc2VkLW91dCc6ICFpc091dE9mUmFuZ2UgJiYgaXNGaWx0ZXJlZE91dCxcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fb25ZZWFyU2VsZWN0aW9uKHllYXIsIHNoaWZ0UmlnaHQpfVxuICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0ke3llYXJ9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7U3RyaW5nKGlzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0KX1cbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEteWVhcj0ke3llYXIgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICR7eWVhcn1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmAsXG4gICAgICAgICl9XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIHllYXIgYW5kIGNoYW5nZSB0aGUgdmlldyB0byBtb250aCBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX29uWWVhclNlbGVjdGlvbih5ZWFyOiBudW1iZXIsIHJpZ2h0U2lkZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIgPSByaWdodFNpZGUgPyB5ZWFyIC0gMSA6IHllYXI7XG4gICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9ICdtb250aCc7XG4gICAgdGhpcy5fYXNzaWduQWN0aXZlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHRoaXMuX2Nob3NlblllYXIsXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgdGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgLy8gVE9ETzogV2UgZGlzYWJsZSBTU1IgZm9yIGNhbGVuZGFyIGZvciBub3cuIEZpZ3VyZSBvdXIsIGlmIHRoZXJlIGlzIGEgd2F5XG4gICAgICAvLyB0byBlbmFibGUgaXQsIHdoaWxlIGNvbnNpZGVyaW5nIGkxOG4gYW5kIGRhdGUgaW5mb3JtYXRpb24uXG4gICAgICByZXR1cm4gaHRtbGAke25vdGhpbmd9YDtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLl9jYWxlbmRhclZpZXcpIHtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyWWVhclZpZXcoKTtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlck1vbnRoVmlldygpO1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJEYXlWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFibGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdoaWRlJykge1xuICAgICAgdGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnc2JiLWNhbGVuZGFyX190YWJsZS1oaWRlJyk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMuX25leHRDYWxlbmRhclZpZXc7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnc2hvdycpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRyYW5zaXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRhYmxlVHJhbnNpdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJywgdHJ1ZSk7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJylcbiAgICAgID8uZm9yRWFjaCgoZSkgPT4gZS5jbGFzc0xpc3QudG9nZ2xlKCdzYmItY2FsZW5kYXJfX3RhYmxlLWhpZGUnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX193cmFwcGVyXCI+JHt0aGlzLl9nZXRWaWV3KCl9PC9kaXY+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLWNhbGVuZGFyJzogU2JiQ2FsZW5kYXJFbGVtZW50O1xuICB9XG59XG4iXSwibmFtZXMiOlsiU2JiQ2FsZW5kYXJFbGVtZW50IiwiX2EiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWdHTSxzQkFBa0IsTUFBQTs7MEJBRHZCLGNBQWMsY0FBYyxDQUFD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