@angular/material 14.0.0-next.9 → 14.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (943) hide show
  1. package/autocomplete/index.d.ts +436 -6
  2. package/autocomplete/testing/index.d.ts +71 -8
  3. package/badge/index.d.ts +107 -8
  4. package/badge/testing/index.d.ts +36 -8
  5. package/bottom-sheet/index.d.ts +199 -6
  6. package/bottom-sheet/testing/index.d.ts +27 -8
  7. package/button/index.d.ts +77 -6
  8. package/button/testing/index.d.ts +44 -8
  9. package/button-toggle/index.d.ts +245 -6
  10. package/button-toggle/testing/index.d.ts +91 -8
  11. package/card/index.d.ts +165 -5
  12. package/card/testing/index.d.ts +44 -8
  13. package/checkbox/index.d.ts +277 -6
  14. package/checkbox/testing/index.d.ts +91 -8
  15. package/chips/index.d.ts +650 -5
  16. package/chips/testing/index.d.ts +256 -8
  17. package/core/index.d.ts +1079 -5
  18. package/core/style/_private.scss +5 -14
  19. package/core/testing/index.d.ts +64 -8
  20. package/core/theming/_theming.scss +2 -2
  21. package/datepicker/index.d.ts +1782 -6
  22. package/datepicker/testing/index.d.ts +307 -8
  23. package/dialog/index.d.ts +489 -6
  24. package/dialog/testing/index.d.ts +97 -8
  25. package/divider/index.d.ts +30 -8
  26. package/divider/testing/index.d.ts +16 -8
  27. package/esm2020/autocomplete/autocomplete-module.mjs +5 -5
  28. package/esm2020/autocomplete/autocomplete-origin.mjs +7 -7
  29. package/esm2020/autocomplete/autocomplete-trigger.mjs +13 -8
  30. package/esm2020/autocomplete/autocomplete.mjs +8 -8
  31. package/esm2020/autocomplete/testing/autocomplete-harness.mjs +5 -1
  32. package/esm2020/badge/badge-module.mjs +5 -5
  33. package/esm2020/badge/badge.mjs +4 -4
  34. package/esm2020/bottom-sheet/bottom-sheet-container.mjs +23 -175
  35. package/esm2020/bottom-sheet/bottom-sheet-module.mjs +7 -7
  36. package/esm2020/bottom-sheet/bottom-sheet-ref.mjs +34 -34
  37. package/esm2020/bottom-sheet/bottom-sheet.mjs +30 -89
  38. package/esm2020/button/button-module.mjs +5 -5
  39. package/esm2020/button/button.mjs +9 -9
  40. package/esm2020/button-toggle/button-toggle-module.mjs +5 -5
  41. package/esm2020/button-toggle/button-toggle.mjs +8 -8
  42. package/esm2020/card/card-module.mjs +5 -5
  43. package/esm2020/card/card.mjs +44 -44
  44. package/esm2020/checkbox/checkbox-module.mjs +9 -9
  45. package/esm2020/checkbox/checkbox-required-validator.mjs +4 -4
  46. package/esm2020/checkbox/checkbox.mjs +151 -133
  47. package/esm2020/chips/chip-input.mjs +4 -4
  48. package/esm2020/chips/chip-list.mjs +5 -5
  49. package/esm2020/chips/chip.mjs +15 -16
  50. package/esm2020/chips/chips-module.mjs +6 -6
  51. package/esm2020/core/common-behaviors/common-module.mjs +5 -5
  52. package/esm2020/core/datetime/index.mjs +9 -9
  53. package/esm2020/core/datetime/native-date-adapter.mjs +4 -4
  54. package/esm2020/core/error/error-options.mjs +7 -7
  55. package/esm2020/core/line/line.mjs +8 -8
  56. package/esm2020/core/option/index.mjs +5 -5
  57. package/esm2020/core/option/optgroup.mjs +7 -7
  58. package/esm2020/core/option/option.mjs +10 -10
  59. package/esm2020/core/ripple/index.mjs +5 -5
  60. package/esm2020/core/ripple/ripple-ref.mjs +2 -2
  61. package/esm2020/core/ripple/ripple-renderer.mjs +10 -10
  62. package/esm2020/core/ripple/ripple.mjs +4 -4
  63. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox-module.mjs +5 -5
  64. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +5 -5
  65. package/esm2020/core/version.mjs +1 -1
  66. package/esm2020/datepicker/calendar-body.mjs +5 -5
  67. package/esm2020/datepicker/calendar.mjs +25 -14
  68. package/esm2020/datepicker/date-range-input-parts.mjs +10 -10
  69. package/esm2020/datepicker/date-range-input.mjs +6 -6
  70. package/esm2020/datepicker/date-range-picker.mjs +4 -4
  71. package/esm2020/datepicker/date-range-selection-strategy.mjs +4 -4
  72. package/esm2020/datepicker/date-selection-model.mjs +10 -10
  73. package/esm2020/datepicker/datepicker-actions.mjs +10 -10
  74. package/esm2020/datepicker/datepicker-base.mjs +10 -10
  75. package/esm2020/datepicker/datepicker-input-base.mjs +6 -7
  76. package/esm2020/datepicker/datepicker-input.mjs +4 -4
  77. package/esm2020/datepicker/datepicker-intl.mjs +4 -4
  78. package/esm2020/datepicker/datepicker-module.mjs +10 -12
  79. package/esm2020/datepicker/datepicker-toggle.mjs +9 -9
  80. package/esm2020/datepicker/datepicker.mjs +4 -4
  81. package/esm2020/datepicker/month-view.mjs +6 -6
  82. package/esm2020/datepicker/multi-year-view.mjs +4 -4
  83. package/esm2020/datepicker/testing/calendar-harness.mjs +4 -4
  84. package/esm2020/datepicker/year-view.mjs +4 -4
  85. package/esm2020/dialog/dialog-container.mjs +41 -219
  86. package/esm2020/dialog/dialog-content-directives.mjs +14 -14
  87. package/esm2020/dialog/dialog-module.mjs +8 -7
  88. package/esm2020/dialog/dialog-ref.mjs +28 -60
  89. package/esm2020/dialog/dialog.mjs +74 -197
  90. package/esm2020/dialog/testing/dialog-harness.mjs +4 -4
  91. package/esm2020/divider/divider-module.mjs +5 -5
  92. package/esm2020/divider/divider.mjs +4 -4
  93. package/esm2020/expansion/accordion.mjs +4 -4
  94. package/esm2020/expansion/expansion-module.mjs +5 -5
  95. package/esm2020/expansion/expansion-panel-content.mjs +4 -4
  96. package/esm2020/expansion/expansion-panel-header.mjs +10 -10
  97. package/esm2020/expansion/expansion-panel.mjs +9 -9
  98. package/esm2020/expansion/testing/expansion-harness.mjs +6 -6
  99. package/esm2020/form-field/error.mjs +4 -4
  100. package/esm2020/form-field/form-field-control.mjs +4 -4
  101. package/esm2020/form-field/form-field-module.mjs +5 -5
  102. package/esm2020/form-field/form-field.mjs +5 -5
  103. package/esm2020/form-field/hint.mjs +4 -4
  104. package/esm2020/form-field/label.mjs +4 -4
  105. package/esm2020/form-field/placeholder.mjs +4 -4
  106. package/esm2020/form-field/prefix.mjs +4 -4
  107. package/esm2020/form-field/suffix.mjs +4 -4
  108. package/esm2020/grid-list/grid-list-module.mjs +5 -5
  109. package/esm2020/grid-list/grid-list.mjs +4 -4
  110. package/esm2020/grid-list/grid-tile.mjs +16 -16
  111. package/esm2020/grid-list/testing/grid-tile-harness.mjs +3 -3
  112. package/esm2020/icon/icon-module.mjs +5 -5
  113. package/esm2020/icon/icon-registry.mjs +4 -4
  114. package/esm2020/icon/icon.mjs +4 -4
  115. package/esm2020/icon/testing/fake-icon-registry.mjs +8 -8
  116. package/esm2020/icon/testing/icon-harness.mjs +3 -3
  117. package/esm2020/input/input-module.mjs +5 -5
  118. package/esm2020/input/input.mjs +4 -4
  119. package/esm2020/list/list-module.mjs +5 -5
  120. package/esm2020/list/list.mjs +21 -21
  121. package/esm2020/list/selection-list.mjs +9 -9
  122. package/esm2020/menu/menu-content.mjs +7 -7
  123. package/esm2020/menu/menu-item.mjs +6 -6
  124. package/esm2020/menu/menu-module.mjs +5 -5
  125. package/esm2020/menu/menu-trigger.mjs +7 -7
  126. package/esm2020/menu/menu.mjs +28 -40
  127. package/esm2020/paginator/paginator-intl.mjs +4 -4
  128. package/esm2020/paginator/paginator-module.mjs +5 -5
  129. package/esm2020/paginator/paginator.mjs +12 -12
  130. package/esm2020/paginator/testing/paginator-harness.mjs +11 -1
  131. package/esm2020/progress-bar/progress-bar-module.mjs +5 -5
  132. package/esm2020/progress-bar/progress-bar.mjs +8 -5
  133. package/esm2020/progress-spinner/progress-spinner-module.mjs +5 -5
  134. package/esm2020/progress-spinner/progress-spinner.mjs +5 -5
  135. package/esm2020/radio/radio-module.mjs +5 -5
  136. package/esm2020/radio/radio.mjs +14 -14
  137. package/esm2020/select/select-module.mjs +5 -5
  138. package/esm2020/select/select.mjs +25 -18
  139. package/esm2020/sidenav/drawer.mjs +11 -11
  140. package/esm2020/sidenav/sidenav-module.mjs +5 -5
  141. package/esm2020/sidenav/sidenav.mjs +11 -11
  142. package/esm2020/slide-toggle/slide-toggle-module.mjs +12 -14
  143. package/esm2020/slide-toggle/slide-toggle-required-validator.mjs +4 -4
  144. package/esm2020/slide-toggle/slide-toggle.mjs +89 -77
  145. package/esm2020/slide-toggle/testing/slide-toggle-harness-filters.mjs +1 -1
  146. package/esm2020/slide-toggle/testing/slide-toggle-harness.mjs +3 -2
  147. package/esm2020/slider/slider-module.mjs +5 -5
  148. package/esm2020/slider/slider.mjs +5 -5
  149. package/esm2020/snack-bar/simple-snack-bar.mjs +6 -6
  150. package/esm2020/snack-bar/snack-bar-container.mjs +4 -4
  151. package/esm2020/snack-bar/snack-bar-module.mjs +5 -5
  152. package/esm2020/snack-bar/snack-bar-ref.mjs +2 -3
  153. package/esm2020/snack-bar/snack-bar.mjs +7 -7
  154. package/esm2020/sort/sort-header-intl.mjs +4 -4
  155. package/esm2020/sort/sort-header.mjs +4 -4
  156. package/esm2020/sort/sort-module.mjs +5 -5
  157. package/esm2020/sort/sort.mjs +4 -4
  158. package/esm2020/stepper/step-content.mjs +4 -4
  159. package/esm2020/stepper/step-header.mjs +8 -8
  160. package/esm2020/stepper/step-label.mjs +4 -4
  161. package/esm2020/stepper/stepper-button.mjs +7 -7
  162. package/esm2020/stepper/stepper-icon.mjs +4 -4
  163. package/esm2020/stepper/stepper-intl.mjs +4 -4
  164. package/esm2020/stepper/stepper-module.mjs +11 -13
  165. package/esm2020/stepper/stepper.mjs +10 -10
  166. package/esm2020/stepper/testing/stepper-harness.mjs +3 -3
  167. package/esm2020/table/cell.mjs +22 -22
  168. package/esm2020/table/row.mjs +22 -22
  169. package/esm2020/table/table-data-source.mjs +1 -1
  170. package/esm2020/table/table-module.mjs +5 -5
  171. package/esm2020/table/table.mjs +8 -8
  172. package/esm2020/table/text-column.mjs +5 -5
  173. package/esm2020/tabs/ink-bar.mjs +4 -4
  174. package/esm2020/tabs/paginated-tab-header.mjs +34 -8
  175. package/esm2020/tabs/tab-body.mjs +10 -10
  176. package/esm2020/tabs/tab-content.mjs +4 -4
  177. package/esm2020/tabs/tab-group.mjs +16 -16
  178. package/esm2020/tabs/tab-header.mjs +8 -8
  179. package/esm2020/tabs/tab-label-wrapper.mjs +4 -4
  180. package/esm2020/tabs/tab-label.mjs +4 -4
  181. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +17 -17
  182. package/esm2020/tabs/tab.mjs +4 -4
  183. package/esm2020/tabs/tabs-module.mjs +10 -12
  184. package/esm2020/toolbar/testing/toolbar-harness.mjs +2 -2
  185. package/esm2020/toolbar/toolbar-module.mjs +5 -5
  186. package/esm2020/toolbar/toolbar.mjs +7 -7
  187. package/esm2020/tooltip/tooltip-module.mjs +5 -5
  188. package/esm2020/tooltip/tooltip.mjs +13 -13
  189. package/esm2020/tree/node.mjs +10 -10
  190. package/esm2020/tree/outlet.mjs +4 -4
  191. package/esm2020/tree/padding.mjs +4 -4
  192. package/esm2020/tree/toggle.mjs +4 -4
  193. package/esm2020/tree/tree-module.mjs +5 -5
  194. package/esm2020/tree/tree.mjs +4 -4
  195. package/expansion/index.d.ts +343 -5
  196. package/expansion/testing/index.d.ts +106 -8
  197. package/fesm2015/autocomplete/testing.mjs +6 -0
  198. package/fesm2015/autocomplete/testing.mjs.map +1 -1
  199. package/fesm2015/autocomplete.mjs +29 -24
  200. package/fesm2015/autocomplete.mjs.map +1 -1
  201. package/fesm2015/badge.mjs +7 -7
  202. package/fesm2015/badge.mjs.map +1 -1
  203. package/fesm2015/bottom-sheet.mjs +125 -343
  204. package/fesm2015/bottom-sheet.mjs.map +1 -1
  205. package/fesm2015/button-toggle.mjs +11 -11
  206. package/fesm2015/button-toggle.mjs.map +1 -1
  207. package/fesm2015/button.mjs +12 -12
  208. package/fesm2015/button.mjs.map +1 -1
  209. package/fesm2015/card.mjs +47 -47
  210. package/fesm2015/card.mjs.map +1 -1
  211. package/fesm2015/checkbox.mjs +164 -146
  212. package/fesm2015/checkbox.mjs.map +1 -1
  213. package/fesm2015/chips.mjs +26 -27
  214. package/fesm2015/chips.mjs.map +1 -1
  215. package/fesm2015/core.mjs +71 -71
  216. package/fesm2015/core.mjs.map +1 -1
  217. package/fesm2015/datepicker/testing.mjs +3 -3
  218. package/fesm2015/datepicker/testing.mjs.map +1 -1
  219. package/fesm2015/datepicker.mjs +106 -98
  220. package/fesm2015/datepicker.mjs.map +1 -1
  221. package/fesm2015/dialog/testing.mjs +3 -3
  222. package/fesm2015/dialog/testing.mjs.map +1 -1
  223. package/fesm2015/dialog.mjs +151 -490
  224. package/fesm2015/dialog.mjs.map +1 -1
  225. package/fesm2015/divider.mjs +7 -7
  226. package/fesm2015/divider.mjs.map +1 -1
  227. package/fesm2015/expansion/testing.mjs +5 -5
  228. package/fesm2015/expansion/testing.mjs.map +1 -1
  229. package/fesm2015/expansion.mjs +27 -27
  230. package/fesm2015/expansion.mjs.map +1 -1
  231. package/fesm2015/form-field.mjs +29 -29
  232. package/fesm2015/form-field.mjs.map +1 -1
  233. package/fesm2015/grid-list/testing.mjs +2 -2
  234. package/fesm2015/grid-list/testing.mjs.map +1 -1
  235. package/fesm2015/grid-list.mjs +22 -22
  236. package/fesm2015/grid-list.mjs.map +1 -1
  237. package/fesm2015/icon/testing.mjs +9 -9
  238. package/fesm2015/icon/testing.mjs.map +1 -1
  239. package/fesm2015/icon.mjs +10 -10
  240. package/fesm2015/icon.mjs.map +1 -1
  241. package/fesm2015/input.mjs +7 -7
  242. package/fesm2015/input.mjs.map +1 -1
  243. package/fesm2015/list.mjs +32 -32
  244. package/fesm2015/list.mjs.map +1 -1
  245. package/fesm2015/menu.mjs +48 -60
  246. package/fesm2015/menu.mjs.map +1 -1
  247. package/fesm2015/paginator/testing.mjs +14 -0
  248. package/fesm2015/paginator/testing.mjs.map +1 -1
  249. package/fesm2015/paginator.mjs +18 -18
  250. package/fesm2015/paginator.mjs.map +1 -1
  251. package/fesm2015/progress-bar.mjs +11 -8
  252. package/fesm2015/progress-bar.mjs.map +1 -1
  253. package/fesm2015/progress-spinner.mjs +8 -8
  254. package/fesm2015/progress-spinner.mjs.map +1 -1
  255. package/fesm2015/radio.mjs +17 -17
  256. package/fesm2015/radio.mjs.map +1 -1
  257. package/fesm2015/select.mjs +29 -22
  258. package/fesm2015/select.mjs.map +1 -1
  259. package/fesm2015/sidenav.mjs +24 -24
  260. package/fesm2015/sidenav.mjs.map +1 -1
  261. package/fesm2015/slide-toggle/testing.mjs +2 -1
  262. package/fesm2015/slide-toggle/testing.mjs.map +1 -1
  263. package/fesm2015/slide-toggle.mjs +103 -93
  264. package/fesm2015/slide-toggle.mjs.map +1 -1
  265. package/fesm2015/slider.mjs +8 -8
  266. package/fesm2015/slider.mjs.map +1 -1
  267. package/fesm2015/snack-bar.mjs +19 -20
  268. package/fesm2015/snack-bar.mjs.map +1 -1
  269. package/fesm2015/sort.mjs +13 -13
  270. package/fesm2015/sort.mjs.map +1 -1
  271. package/fesm2015/stepper/testing.mjs +2 -2
  272. package/fesm2015/stepper/testing.mjs.map +1 -1
  273. package/fesm2015/stepper.mjs +41 -43
  274. package/fesm2015/stepper.mjs.map +1 -1
  275. package/fesm2015/table.mjs +57 -57
  276. package/fesm2015/table.mjs.map +1 -1
  277. package/fesm2015/tabs.mjs +99 -75
  278. package/fesm2015/tabs.mjs.map +1 -1
  279. package/fesm2015/toolbar/testing.mjs +1 -1
  280. package/fesm2015/toolbar/testing.mjs.map +1 -1
  281. package/fesm2015/toolbar.mjs +10 -10
  282. package/fesm2015/toolbar.mjs.map +1 -1
  283. package/fesm2015/tooltip.mjs +16 -16
  284. package/fesm2015/tooltip.mjs.map +1 -1
  285. package/fesm2015/tree.mjs +25 -25
  286. package/fesm2015/tree.mjs.map +1 -1
  287. package/fesm2020/autocomplete/testing.mjs +4 -0
  288. package/fesm2020/autocomplete/testing.mjs.map +1 -1
  289. package/fesm2020/autocomplete.mjs +29 -24
  290. package/fesm2020/autocomplete.mjs.map +1 -1
  291. package/fesm2020/badge.mjs +7 -7
  292. package/fesm2020/badge.mjs.map +1 -1
  293. package/fesm2020/bottom-sheet.mjs +132 -342
  294. package/fesm2020/bottom-sheet.mjs.map +1 -1
  295. package/fesm2020/button-toggle.mjs +11 -11
  296. package/fesm2020/button-toggle.mjs.map +1 -1
  297. package/fesm2020/button.mjs +12 -12
  298. package/fesm2020/button.mjs.map +1 -1
  299. package/fesm2020/card.mjs +47 -47
  300. package/fesm2020/card.mjs.map +1 -1
  301. package/fesm2020/checkbox.mjs +162 -144
  302. package/fesm2020/checkbox.mjs.map +1 -1
  303. package/fesm2020/chips.mjs +26 -27
  304. package/fesm2020/chips.mjs.map +1 -1
  305. package/fesm2020/core.mjs +71 -71
  306. package/fesm2020/core.mjs.map +1 -1
  307. package/fesm2020/datepicker/testing.mjs +3 -3
  308. package/fesm2020/datepicker/testing.mjs.map +1 -1
  309. package/fesm2020/datepicker.mjs +106 -98
  310. package/fesm2020/datepicker.mjs.map +1 -1
  311. package/fesm2020/dialog/testing.mjs +3 -3
  312. package/fesm2020/dialog/testing.mjs.map +1 -1
  313. package/fesm2020/dialog.mjs +154 -488
  314. package/fesm2020/dialog.mjs.map +1 -1
  315. package/fesm2020/divider.mjs +7 -7
  316. package/fesm2020/divider.mjs.map +1 -1
  317. package/fesm2020/expansion/testing.mjs +5 -5
  318. package/fesm2020/expansion/testing.mjs.map +1 -1
  319. package/fesm2020/expansion.mjs +27 -27
  320. package/fesm2020/expansion.mjs.map +1 -1
  321. package/fesm2020/form-field.mjs +29 -29
  322. package/fesm2020/form-field.mjs.map +1 -1
  323. package/fesm2020/grid-list/testing.mjs +2 -2
  324. package/fesm2020/grid-list/testing.mjs.map +1 -1
  325. package/fesm2020/grid-list.mjs +22 -22
  326. package/fesm2020/grid-list.mjs.map +1 -1
  327. package/fesm2020/icon/testing.mjs +9 -9
  328. package/fesm2020/icon/testing.mjs.map +1 -1
  329. package/fesm2020/icon.mjs +10 -10
  330. package/fesm2020/icon.mjs.map +1 -1
  331. package/fesm2020/input.mjs +7 -7
  332. package/fesm2020/input.mjs.map +1 -1
  333. package/fesm2020/list.mjs +32 -32
  334. package/fesm2020/list.mjs.map +1 -1
  335. package/fesm2020/menu.mjs +48 -60
  336. package/fesm2020/menu.mjs.map +1 -1
  337. package/fesm2020/paginator/testing.mjs +10 -0
  338. package/fesm2020/paginator/testing.mjs.map +1 -1
  339. package/fesm2020/paginator.mjs +18 -18
  340. package/fesm2020/paginator.mjs.map +1 -1
  341. package/fesm2020/progress-bar.mjs +11 -8
  342. package/fesm2020/progress-bar.mjs.map +1 -1
  343. package/fesm2020/progress-spinner.mjs +8 -8
  344. package/fesm2020/progress-spinner.mjs.map +1 -1
  345. package/fesm2020/radio.mjs +17 -17
  346. package/fesm2020/radio.mjs.map +1 -1
  347. package/fesm2020/select.mjs +29 -22
  348. package/fesm2020/select.mjs.map +1 -1
  349. package/fesm2020/sidenav.mjs +24 -24
  350. package/fesm2020/sidenav.mjs.map +1 -1
  351. package/fesm2020/slide-toggle/testing.mjs +2 -1
  352. package/fesm2020/slide-toggle/testing.mjs.map +1 -1
  353. package/fesm2020/slide-toggle.mjs +103 -93
  354. package/fesm2020/slide-toggle.mjs.map +1 -1
  355. package/fesm2020/slider.mjs +8 -8
  356. package/fesm2020/slider.mjs.map +1 -1
  357. package/fesm2020/snack-bar.mjs +19 -20
  358. package/fesm2020/snack-bar.mjs.map +1 -1
  359. package/fesm2020/sort.mjs +13 -13
  360. package/fesm2020/sort.mjs.map +1 -1
  361. package/fesm2020/stepper/testing.mjs +2 -2
  362. package/fesm2020/stepper/testing.mjs.map +1 -1
  363. package/fesm2020/stepper.mjs +41 -43
  364. package/fesm2020/stepper.mjs.map +1 -1
  365. package/fesm2020/table.mjs +57 -57
  366. package/fesm2020/table.mjs.map +1 -1
  367. package/fesm2020/tabs.mjs +99 -75
  368. package/fesm2020/tabs.mjs.map +1 -1
  369. package/fesm2020/toolbar/testing.mjs +1 -1
  370. package/fesm2020/toolbar/testing.mjs.map +1 -1
  371. package/fesm2020/toolbar.mjs +10 -10
  372. package/fesm2020/toolbar.mjs.map +1 -1
  373. package/fesm2020/tooltip.mjs +16 -16
  374. package/fesm2020/tooltip.mjs.map +1 -1
  375. package/fesm2020/tree.mjs +25 -25
  376. package/fesm2020/tree.mjs.map +1 -1
  377. package/form-field/index.d.ts +401 -5
  378. package/form-field/testing/control/index.d.ts +8 -6
  379. package/form-field/testing/index.d.ts +127 -8
  380. package/grid-list/index.d.ts +232 -5
  381. package/grid-list/testing/index.d.ts +86 -8
  382. package/icon/index.d.ts +443 -5
  383. package/icon/testing/index.d.ts +81 -6
  384. package/index.d.ts +3 -7
  385. package/input/index.d.ts +209 -6
  386. package/input/testing/index.d.ts +129 -8
  387. package/list/index.d.ts +369 -6
  388. package/list/testing/index.d.ts +329 -6
  389. package/menu/index.d.ts +613 -6
  390. package/menu/testing/index.d.ts +115 -8
  391. package/package.json +38 -38
  392. package/paginator/index.d.ts +224 -6
  393. package/paginator/testing/index.d.ts +65 -8
  394. package/prebuilt-themes/deeppurple-amber.css +1 -1
  395. package/prebuilt-themes/indigo-pink.css +1 -1
  396. package/prebuilt-themes/pink-bluegrey.css +1 -1
  397. package/prebuilt-themes/purple-green.css +1 -1
  398. package/progress-bar/index.d.ts +147 -6
  399. package/progress-bar/testing/index.d.ts +26 -8
  400. package/progress-spinner/index.d.ts +138 -6
  401. package/progress-spinner/testing/index.d.ts +27 -8
  402. package/radio/index.d.ts +305 -6
  403. package/radio/testing/index.d.ts +130 -8
  404. package/schematics/ng-add/index.js +1 -1
  405. package/schematics/ng-add/index.mjs +1 -1
  406. package/schematics/ng-add/setup-project.js +59 -18
  407. package/schematics/ng-add/setup-project.mjs +59 -18
  408. package/schematics/ng-generate/address-form/schema.json +3 -0
  409. package/schematics/ng-generate/dashboard/schema.json +3 -0
  410. package/schematics/ng-generate/navigation/schema.json +3 -0
  411. package/schematics/ng-generate/table/schema.json +3 -0
  412. package/schematics/ng-generate/tree/schema.json +3 -0
  413. package/schematics/ng-update/migrations/hammer-gestures-v9/gesture-config.template +1 -1
  414. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.js +5 -5
  415. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.mjs +5 -5
  416. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.js +22 -22
  417. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.mjs +22 -22
  418. package/select/index.d.ts +534 -5
  419. package/select/testing/index.d.ts +79 -8
  420. package/sidenav/index.d.ts +395 -5
  421. package/sidenav/testing/index.d.ts +124 -6
  422. package/slide-toggle/index.d.ts +186 -5
  423. package/slide-toggle/testing/index.d.ts +77 -8
  424. package/slider/index.d.ts +289 -6
  425. package/slider/testing/index.d.ts +60 -8
  426. package/snack-bar/index.d.ts +372 -6
  427. package/snack-bar/testing/index.d.ts +72 -8
  428. package/sort/index.d.ts +326 -5
  429. package/sort/testing/index.d.ts +50 -8
  430. package/stepper/index.d.ts +288 -6
  431. package/stepper/testing/index.d.ts +142 -6
  432. package/table/index.d.ts +382 -5
  433. package/table/testing/index.d.ts +178 -8
  434. package/tabs/index.d.ts +965 -5
  435. package/tabs/testing/index.d.ts +153 -8
  436. package/toolbar/index.d.ts +56 -6
  437. package/toolbar/testing/index.d.ts +35 -8
  438. package/tooltip/index.d.ts +362 -5
  439. package/tooltip/testing/index.d.ts +42 -8
  440. package/tree/index.d.ts +243 -5
  441. package/tree/testing/index.d.ts +122 -8
  442. package/autocomplete/autocomplete-module.d.ts +0 -13
  443. package/autocomplete/autocomplete-origin.d.ts +0 -27
  444. package/autocomplete/autocomplete-trigger.d.ts +0 -211
  445. package/autocomplete/autocomplete.d.ts +0 -150
  446. package/autocomplete/autocomplete_public_index.d.ts +0 -4
  447. package/autocomplete/package.json +0 -9
  448. package/autocomplete/public-api.d.ts +0 -11
  449. package/autocomplete/testing/autocomplete-harness-filters.d.ts +0 -13
  450. package/autocomplete/testing/autocomplete-harness.d.ts +0 -61
  451. package/autocomplete/testing/package.json +0 -9
  452. package/autocomplete/testing/public-api.d.ts +0 -9
  453. package/badge/badge-module.d.ts +0 -9
  454. package/badge/badge.d.ts +0 -86
  455. package/badge/badge_public_index.d.ts +0 -4
  456. package/badge/package.json +0 -9
  457. package/badge/public-api.d.ts +0 -9
  458. package/badge/testing/badge-harness-filters.d.ts +0 -11
  459. package/badge/testing/badge-harness.d.ts +0 -34
  460. package/badge/testing/package.json +0 -9
  461. package/badge/testing/public-api.d.ts +0 -9
  462. package/bottom-sheet/bottom-sheet-animations.d.ts +0 -12
  463. package/bottom-sheet/bottom-sheet-config.d.ts +0 -54
  464. package/bottom-sheet/bottom-sheet-container.d.ts +0 -87
  465. package/bottom-sheet/bottom-sheet-module.d.ts +0 -10
  466. package/bottom-sheet/bottom-sheet-ref.d.ts +0 -51
  467. package/bottom-sheet/bottom-sheet.d.ts +0 -59
  468. package/bottom-sheet/bottom-sheet_public_index.d.ts +0 -4
  469. package/bottom-sheet/package.json +0 -9
  470. package/bottom-sheet/public-api.d.ts +0 -13
  471. package/bottom-sheet/testing/bottom-sheet-harness-filters.d.ts +0 -10
  472. package/bottom-sheet/testing/bottom-sheet-harness.d.ts +0 -27
  473. package/bottom-sheet/testing/package.json +0 -9
  474. package/bottom-sheet/testing/public-api.d.ts +0 -9
  475. package/button/button-module.d.ts +0 -8
  476. package/button/button.d.ts +0 -58
  477. package/button/button_public_index.d.ts +0 -4
  478. package/button/package.json +0 -9
  479. package/button/public-api.d.ts +0 -9
  480. package/button/testing/button-harness-filters.d.ts +0 -13
  481. package/button/testing/button-harness.d.ts +0 -41
  482. package/button/testing/package.json +0 -9
  483. package/button/testing/public-api.d.ts +0 -9
  484. package/button-toggle/button-toggle-module.d.ts +0 -8
  485. package/button-toggle/button-toggle.d.ts +0 -212
  486. package/button-toggle/button-toggle_public_index.d.ts +0 -4
  487. package/button-toggle/package.json +0 -9
  488. package/button-toggle/public-api.d.ts +0 -9
  489. package/button-toggle/testing/button-toggle-group-harness-filters.d.ts +0 -11
  490. package/button-toggle/testing/button-toggle-group-harness.d.ts +0 -35
  491. package/button-toggle/testing/button-toggle-harness-filters.d.ts +0 -17
  492. package/button-toggle/testing/button-toggle-harness.d.ts +0 -56
  493. package/button-toggle/testing/package.json +0 -9
  494. package/button-toggle/testing/public-api.d.ts +0 -11
  495. package/card/card-module.d.ts +0 -8
  496. package/card/card.d.ts +0 -126
  497. package/card/card_public_index.d.ts +0 -4
  498. package/card/package.json +0 -9
  499. package/card/public-api.d.ts +0 -9
  500. package/card/testing/card-harness-filters.d.ts +0 -17
  501. package/card/testing/card-harness.d.ts +0 -36
  502. package/card/testing/package.json +0 -9
  503. package/card/testing/public-api.d.ts +0 -9
  504. package/checkbox/checkbox-config.d.ts +0 -28
  505. package/checkbox/checkbox-module.d.ts +0 -16
  506. package/checkbox/checkbox-required-validator.d.ts +0 -20
  507. package/checkbox/checkbox.d.ts +0 -166
  508. package/checkbox/checkbox_public_index.d.ts +0 -4
  509. package/checkbox/package.json +0 -9
  510. package/checkbox/public-api.d.ts +0 -11
  511. package/checkbox/testing/checkbox-harness-filters.d.ts +0 -17
  512. package/checkbox/testing/checkbox-harness.d.ts +0 -81
  513. package/checkbox/testing/package.json +0 -9
  514. package/checkbox/testing/public-api.d.ts +0 -9
  515. package/chips/chip-default-options.d.ts +0 -15
  516. package/chips/chip-input.d.ts +0 -91
  517. package/chips/chip-list.d.ts +0 -289
  518. package/chips/chip-text-control.d.ts +0 -20
  519. package/chips/chip.d.ts +0 -210
  520. package/chips/chips-module.d.ts +0 -10
  521. package/chips/chips_public_index.d.ts +0 -4
  522. package/chips/package.json +0 -9
  523. package/chips/public-api.d.ts +0 -12
  524. package/chips/testing/chip-avatar-harness.d.ts +0 -20
  525. package/chips/testing/chip-harness-filters.d.ts +0 -43
  526. package/chips/testing/chip-harness.d.ts +0 -63
  527. package/chips/testing/chip-input-harness.d.ts +0 -47
  528. package/chips/testing/chip-list-harness.d.ts +0 -54
  529. package/chips/testing/chip-listbox-harness.d.ts +0 -34
  530. package/chips/testing/chip-option-harness.d.ts +0 -29
  531. package/chips/testing/chip-remove-harness.d.ts +0 -22
  532. package/chips/testing/package.json +0 -9
  533. package/chips/testing/public-api.d.ts +0 -14
  534. package/core/animation/animation.d.ts +0 -20
  535. package/core/common-behaviors/color.d.ts +0 -26
  536. package/core/common-behaviors/common-module.d.ts +0 -44
  537. package/core/common-behaviors/constructor.d.ts +0 -14
  538. package/core/common-behaviors/disable-ripple.d.ts +0 -17
  539. package/core/common-behaviors/disabled.d.ts +0 -17
  540. package/core/common-behaviors/error-state.d.ts +0 -35
  541. package/core/common-behaviors/index.d.ts +0 -15
  542. package/core/common-behaviors/initialized.d.ts +0 -30
  543. package/core/common-behaviors/tabindex.d.ts +0 -20
  544. package/core/core_public_index.d.ts +0 -4
  545. package/core/datetime/date-adapter.d.ts +0 -215
  546. package/core/datetime/date-formats.d.ts +0 -21
  547. package/core/datetime/index.d.ts +0 -15
  548. package/core/datetime/native-date-adapter.d.ts +0 -74
  549. package/core/datetime/native-date-formats.d.ts +0 -9
  550. package/core/error/error-options.d.ts +0 -14
  551. package/core/line/line.d.ts +0 -29
  552. package/core/option/index.d.ts +0 -15
  553. package/core/option/optgroup.d.ts +0 -40
  554. package/core/option/option-parent.d.ts +0 -22
  555. package/core/option/option.d.ts +0 -135
  556. package/core/package.json +0 -9
  557. package/core/public-api.d.ts +0 -16
  558. package/core/ripple/index.d.ts +0 -11
  559. package/core/ripple/ripple-ref.d.ts +0 -54
  560. package/core/ripple/ripple-renderer.d.ts +0 -105
  561. package/core/ripple/ripple.d.ts +0 -113
  562. package/core/selection/index.d.ts +0 -9
  563. package/core/selection/pseudo-checkbox/pseudo-checkbox-module.d.ts +0 -8
  564. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +0 -29
  565. package/core/testing/optgroup-harness-filters.d.ts +0 -11
  566. package/core/testing/optgroup-harness.d.ts +0 -33
  567. package/core/testing/option-harness-filters.d.ts +0 -12
  568. package/core/testing/option-harness.d.ts +0 -35
  569. package/core/testing/package.json +0 -9
  570. package/core/testing/public-api.d.ts +0 -11
  571. package/core/version.d.ts +0 -10
  572. package/datepicker/calendar-body.d.ts +0 -176
  573. package/datepicker/calendar.d.ts +0 -156
  574. package/datepicker/date-range-input-parts.d.ts +0 -108
  575. package/datepicker/date-range-input.d.ts +0 -133
  576. package/datepicker/date-range-picker.d.ts +0 -17
  577. package/datepicker/date-range-selection-strategy.d.ts +0 -48
  578. package/datepicker/date-selection-model.d.ts +0 -139
  579. package/datepicker/datepicker-actions.d.ts +0 -40
  580. package/datepicker/datepicker-animations.d.ts +0 -16
  581. package/datepicker/datepicker-base.d.ts +0 -272
  582. package/datepicker/datepicker-errors.d.ts +0 -9
  583. package/datepicker/datepicker-input-base.d.ts +0 -136
  584. package/datepicker/datepicker-input.d.ts +0 -67
  585. package/datepicker/datepicker-intl.d.ts +0 -36
  586. package/datepicker/datepicker-module.d.ts +0 -26
  587. package/datepicker/datepicker-toggle.d.ts +0 -47
  588. package/datepicker/datepicker.d.ts +0 -7
  589. package/datepicker/datepicker_public_index.d.ts +0 -4
  590. package/datepicker/month-view.d.ts +0 -139
  591. package/datepicker/multi-year-view.d.ts +0 -103
  592. package/datepicker/package.json +0 -9
  593. package/datepicker/public-api.d.ts +0 -26
  594. package/datepicker/testing/calendar-cell-harness.d.ts +0 -64
  595. package/datepicker/testing/calendar-harness.d.ts +0 -53
  596. package/datepicker/testing/date-range-input-harness.d.ts +0 -59
  597. package/datepicker/testing/datepicker-harness-filters.d.ts +0 -45
  598. package/datepicker/testing/datepicker-input-harness-base.d.ts +0 -44
  599. package/datepicker/testing/datepicker-input-harness.d.ts +0 -36
  600. package/datepicker/testing/datepicker-toggle-harness.d.ts +0 -28
  601. package/datepicker/testing/datepicker-trigger-harness-base.d.ts +0 -44
  602. package/datepicker/testing/package.json +0 -9
  603. package/datepicker/testing/public-api.d.ts +0 -13
  604. package/datepicker/year-view.d.ts +0 -114
  605. package/dialog/dialog-animations.d.ts +0 -25
  606. package/dialog/dialog-config.d.ts +0 -105
  607. package/dialog/dialog-container.d.ts +0 -133
  608. package/dialog/dialog-content-directives.d.ts +0 -76
  609. package/dialog/dialog-module.d.ts +0 -11
  610. package/dialog/dialog-ref.d.ts +0 -101
  611. package/dialog/dialog.d.ts +0 -154
  612. package/dialog/dialog_public_index.d.ts +0 -4
  613. package/dialog/package.json +0 -9
  614. package/dialog/public-api.d.ts +0 -14
  615. package/dialog/testing/dialog-harness-filters.d.ts +0 -11
  616. package/dialog/testing/dialog-harness.d.ts +0 -58
  617. package/dialog/testing/dialog-opener.d.ts +0 -33
  618. package/dialog/testing/package.json +0 -9
  619. package/dialog/testing/public-api.d.ts +0 -10
  620. package/divider/divider-module.d.ts +0 -8
  621. package/divider/divider.d.ts +0 -14
  622. package/divider/divider_public_index.d.ts +0 -4
  623. package/divider/package.json +0 -9
  624. package/divider/public-api.d.ts +0 -9
  625. package/divider/testing/divider-harness-filters.d.ts +0 -10
  626. package/divider/testing/divider-harness.d.ts +0 -16
  627. package/divider/testing/package.json +0 -9
  628. package/divider/testing/public-api.d.ts +0 -9
  629. package/expansion/accordion-base.d.ts +0 -34
  630. package/expansion/accordion.d.ts +0 -45
  631. package/expansion/expansion-animations.d.ts +0 -36
  632. package/expansion/expansion-module.d.ts +0 -14
  633. package/expansion/expansion-panel-base.d.ts +0 -22
  634. package/expansion/expansion-panel-content.d.ts +0 -21
  635. package/expansion/expansion-panel-header.d.ts +0 -83
  636. package/expansion/expansion-panel.d.ts +0 -96
  637. package/expansion/expansion_public_index.d.ts +0 -4
  638. package/expansion/package.json +0 -9
  639. package/expansion/public-api.d.ts +0 -15
  640. package/expansion/testing/accordion-harness.d.ts +0 -25
  641. package/expansion/testing/expansion-harness-filters.d.ts +0 -17
  642. package/expansion/testing/expansion-harness.d.ts +0 -79
  643. package/expansion/testing/package.json +0 -9
  644. package/expansion/testing/public-api.d.ts +0 -10
  645. package/form-field/error.d.ts +0 -22
  646. package/form-field/form-field-animations.d.ts +0 -15
  647. package/form-field/form-field-control.d.ts +0 -60
  648. package/form-field/form-field-errors.d.ts +0 -13
  649. package/form-field/form-field-module.d.ts +0 -16
  650. package/form-field/form-field.d.ts +0 -189
  651. package/form-field/form-field_public_index.d.ts +0 -4
  652. package/form-field/hint.d.ts +0 -27
  653. package/form-field/label.d.ts +0 -6
  654. package/form-field/package.json +0 -9
  655. package/form-field/placeholder.d.ts +0 -11
  656. package/form-field/prefix.d.ts +0 -20
  657. package/form-field/public-api.d.ts +0 -18
  658. package/form-field/suffix.d.ts +0 -20
  659. package/form-field/testing/control/form-field-control-harness.d.ts +0 -14
  660. package/form-field/testing/control/package.json +0 -9
  661. package/form-field/testing/form-field-harness-filters.d.ts +0 -15
  662. package/form-field/testing/form-field-harness.d.ts +0 -114
  663. package/form-field/testing/package.json +0 -9
  664. package/form-field/testing/public-api.d.ts +0 -10
  665. package/grid-list/grid-list-base.d.ts +0 -22
  666. package/grid-list/grid-list-module.d.ts +0 -9
  667. package/grid-list/grid-list.d.ts +0 -63
  668. package/grid-list/grid-list_public_index.d.ts +0 -4
  669. package/grid-list/grid-tile.d.ts +0 -64
  670. package/grid-list/package.json +0 -9
  671. package/grid-list/public-api.d.ts +0 -12
  672. package/grid-list/testing/grid-list-harness-filters.d.ts +0 -18
  673. package/grid-list/testing/grid-list-harness.d.ts +0 -41
  674. package/grid-list/testing/grid-tile-harness.d.ts +0 -43
  675. package/grid-list/testing/package.json +0 -9
  676. package/grid-list/testing/public-api.d.ts +0 -10
  677. package/grid-list/tile-coordinator.d.ts +0 -79
  678. package/grid-list/tile-styler.d.ts +0 -134
  679. package/icon/fake-svgs.d.ts +0 -23
  680. package/icon/icon-module.d.ts +0 -8
  681. package/icon/icon-registry.d.ts +0 -262
  682. package/icon/icon.d.ts +0 -147
  683. package/icon/icon_public_index.d.ts +0 -4
  684. package/icon/package.json +0 -9
  685. package/icon/public-api.d.ts +0 -10
  686. package/icon/testing/fake-icon-registry.d.ts +0 -46
  687. package/icon/testing/icon-harness-filters.d.ts +0 -22
  688. package/icon/testing/icon-harness.d.ts +0 -29
  689. package/icon/testing/package.json +0 -9
  690. package/icon/testing/public-api.d.ts +0 -10
  691. package/icon/testing/testing_public_index.d.ts +0 -4
  692. package/icon/trusted-types.d.ts +0 -37
  693. package/input/input-errors.d.ts +0 -9
  694. package/input/input-module.d.ts +0 -10
  695. package/input/input-value-accessor.d.ts +0 -17
  696. package/input/input.d.ts +0 -174
  697. package/input/input_public_index.d.ts +0 -4
  698. package/input/package.json +0 -9
  699. package/input/public-api.d.ts +0 -11
  700. package/input/testing/input-harness-filters.d.ts +0 -15
  701. package/input/testing/input-harness.d.ts +0 -57
  702. package/input/testing/native-option-harness.d.ts +0 -29
  703. package/input/testing/native-select-harness-filters.d.ts +0 -17
  704. package/input/testing/native-select-harness.d.ts +0 -45
  705. package/input/testing/package.json +0 -9
  706. package/input/testing/public-api.d.ts +0 -12
  707. package/list/list-module.d.ts +0 -11
  708. package/list/list.d.ts +0 -99
  709. package/list/list_public_index.d.ts +0 -4
  710. package/list/package.json +0 -9
  711. package/list/public-api.d.ts +0 -10
  712. package/list/selection-list.d.ts +0 -226
  713. package/list/testing/action-list-harness.d.ts +0 -44
  714. package/list/testing/list-harness-base.d.ts +0 -100
  715. package/list/testing/list-harness-filters.d.ts +0 -32
  716. package/list/testing/list-harness.d.ts +0 -36
  717. package/list/testing/list-item-harness-base.d.ts +0 -48
  718. package/list/testing/nav-list-harness.d.ts +0 -46
  719. package/list/testing/package.json +0 -9
  720. package/list/testing/public-api.d.ts +0 -13
  721. package/list/testing/selection-list-harness.d.ts +0 -74
  722. package/menu/menu-animations.d.ts +0 -30
  723. package/menu/menu-content.d.ts +0 -47
  724. package/menu/menu-errors.d.ts +0 -25
  725. package/menu/menu-item.d.ts +0 -61
  726. package/menu/menu-module.d.ts +0 -14
  727. package/menu/menu-panel.d.ts +0 -49
  728. package/menu/menu-positions.d.ts +0 -9
  729. package/menu/menu-trigger.d.ts +0 -180
  730. package/menu/menu.d.ts +0 -207
  731. package/menu/menu_public_index.d.ts +0 -4
  732. package/menu/package.json +0 -9
  733. package/menu/public-api.d.ts +0 -15
  734. package/menu/testing/menu-harness-filters.d.ts +0 -20
  735. package/menu/testing/menu-harness.d.ts +0 -98
  736. package/menu/testing/package.json +0 -9
  737. package/menu/testing/public-api.d.ts +0 -9
  738. package/paginator/package.json +0 -9
  739. package/paginator/paginator-intl.d.ts +0 -43
  740. package/paginator/paginator-module.d.ts +0 -12
  741. package/paginator/paginator.d.ts +0 -157
  742. package/paginator/paginator_public_index.d.ts +0 -4
  743. package/paginator/public-api.d.ts +0 -10
  744. package/paginator/testing/package.json +0 -9
  745. package/paginator/testing/paginator-harness-filters.d.ts +0 -11
  746. package/paginator/testing/paginator-harness.d.ts +0 -58
  747. package/paginator/testing/public-api.d.ts +0 -9
  748. package/progress-bar/package.json +0 -9
  749. package/progress-bar/progress-bar-module.d.ts +0 -9
  750. package/progress-bar/progress-bar.d.ts +0 -116
  751. package/progress-bar/progress-bar_public_index.d.ts +0 -4
  752. package/progress-bar/public-api.d.ts +0 -9
  753. package/progress-bar/testing/package.json +0 -9
  754. package/progress-bar/testing/progress-bar-harness-filters.d.ts +0 -11
  755. package/progress-bar/testing/progress-bar-harness.d.ts +0 -25
  756. package/progress-bar/testing/public-api.d.ts +0 -9
  757. package/progress-spinner/package.json +0 -9
  758. package/progress-spinner/progress-spinner-module.d.ts +0 -9
  759. package/progress-spinner/progress-spinner.d.ts +0 -107
  760. package/progress-spinner/progress-spinner_public_index.d.ts +0 -4
  761. package/progress-spinner/public-api.d.ts +0 -16
  762. package/progress-spinner/testing/package.json +0 -9
  763. package/progress-spinner/testing/progress-spinner-harness-filters.d.ts +0 -11
  764. package/progress-spinner/testing/progress-spinner-harness.d.ts +0 -26
  765. package/progress-spinner/testing/public-api.d.ts +0 -9
  766. package/radio/package.json +0 -9
  767. package/radio/public-api.d.ts +0 -9
  768. package/radio/radio-module.d.ts +0 -8
  769. package/radio/radio.d.ts +0 -265
  770. package/radio/radio_public_index.d.ts +0 -4
  771. package/radio/testing/package.json +0 -9
  772. package/radio/testing/public-api.d.ts +0 -9
  773. package/radio/testing/radio-harness-filters.d.ts +0 -22
  774. package/radio/testing/radio-harness.d.ts +0 -111
  775. package/select/package.json +0 -9
  776. package/select/public-api.d.ts +0 -10
  777. package/select/select-animations.d.ts +0 -19
  778. package/select/select-errors.d.ts +0 -26
  779. package/select/select-module.d.ts +0 -12
  780. package/select/select.d.ts +0 -452
  781. package/select/select_public_index.d.ts +0 -4
  782. package/select/testing/package.json +0 -9
  783. package/select/testing/public-api.d.ts +0 -9
  784. package/select/testing/select-harness-filters.d.ts +0 -11
  785. package/select/testing/select-harness.d.ts +0 -73
  786. package/sidenav/drawer-animations.d.ts +0 -15
  787. package/sidenav/drawer.d.ts +0 -299
  788. package/sidenav/package.json +0 -9
  789. package/sidenav/public-api.d.ts +0 -11
  790. package/sidenav/sidenav-module.d.ts +0 -11
  791. package/sidenav/sidenav.d.ts +0 -45
  792. package/sidenav/sidenav_public_index.d.ts +0 -4
  793. package/sidenav/testing/drawer-container-harness.d.ts +0 -30
  794. package/sidenav/testing/drawer-content-harness.d.ts +0 -21
  795. package/sidenav/testing/drawer-harness-filters.d.ts +0 -19
  796. package/sidenav/testing/drawer-harness.d.ts +0 -33
  797. package/sidenav/testing/package.json +0 -9
  798. package/sidenav/testing/public-api.d.ts +0 -14
  799. package/sidenav/testing/sidenav-container-harness.d.ts +0 -30
  800. package/sidenav/testing/sidenav-content-harness.d.ts +0 -21
  801. package/sidenav/testing/sidenav-harness.d.ts +0 -24
  802. package/slide-toggle/package.json +0 -9
  803. package/slide-toggle/public-api.d.ts +0 -11
  804. package/slide-toggle/slide-toggle-config.d.ts +0 -18
  805. package/slide-toggle/slide-toggle-module.d.ts +0 -16
  806. package/slide-toggle/slide-toggle-required-validator.d.ts +0 -23
  807. package/slide-toggle/slide-toggle.d.ts +0 -109
  808. package/slide-toggle/slide-toggle_public_index.d.ts +0 -4
  809. package/slide-toggle/testing/package.json +0 -9
  810. package/slide-toggle/testing/public-api.d.ts +0 -9
  811. package/slide-toggle/testing/slide-toggle-harness-filters.d.ts +0 -17
  812. package/slide-toggle/testing/slide-toggle-harness.d.ts +0 -65
  813. package/slider/package.json +0 -9
  814. package/slider/public-api.d.ts +0 -9
  815. package/slider/slider-module.d.ts +0 -9
  816. package/slider/slider.d.ts +0 -267
  817. package/slider/slider_public_index.d.ts +0 -4
  818. package/slider/testing/package.json +0 -9
  819. package/slider/testing/public-api.d.ts +0 -9
  820. package/slider/testing/slider-harness-filters.d.ts +0 -11
  821. package/slider/testing/slider-harness.d.ts +0 -59
  822. package/snack-bar/package.json +0 -9
  823. package/snack-bar/public-api.d.ts +0 -14
  824. package/snack-bar/simple-snack-bar.d.ts +0 -33
  825. package/snack-bar/snack-bar-animations.d.ts +0 -15
  826. package/snack-bar/snack-bar-config.d.ts +0 -45
  827. package/snack-bar/snack-bar-container.d.ts +0 -101
  828. package/snack-bar/snack-bar-module.d.ts +0 -13
  829. package/snack-bar/snack-bar-ref.d.ts +0 -64
  830. package/snack-bar/snack-bar.d.ts +0 -107
  831. package/snack-bar/snack-bar_public_index.d.ts +0 -4
  832. package/snack-bar/testing/package.json +0 -9
  833. package/snack-bar/testing/public-api.d.ts +0 -9
  834. package/snack-bar/testing/snack-bar-harness-filters.d.ts +0 -11
  835. package/snack-bar/testing/snack-bar-harness.d.ts +0 -71
  836. package/sort/package.json +0 -9
  837. package/sort/public-api.d.ts +0 -13
  838. package/sort/sort-animations.d.ts +0 -20
  839. package/sort/sort-direction.d.ts +0 -8
  840. package/sort/sort-errors.d.ts +0 -15
  841. package/sort/sort-header-intl.d.ts +0 -31
  842. package/sort/sort-header.d.ts +0 -166
  843. package/sort/sort-module.d.ts +0 -10
  844. package/sort/sort.d.ts +0 -93
  845. package/sort/sort_public_index.d.ts +0 -4
  846. package/sort/testing/package.json +0 -9
  847. package/sort/testing/public-api.d.ts +0 -10
  848. package/sort/testing/sort-harness-filters.d.ts +0 -15
  849. package/sort/testing/sort-harness.d.ts +0 -24
  850. package/sort/testing/sort-header-harness.d.ts +0 -30
  851. package/stepper/package.json +0 -9
  852. package/stepper/public-api.d.ts +0 -17
  853. package/stepper/step-content.d.ts +0 -18
  854. package/stepper/step-header.d.ts +0 -66
  855. package/stepper/step-label.d.ts +0 -6
  856. package/stepper/stepper-animations.d.ts +0 -18
  857. package/stepper/stepper-button.d.ts +0 -19
  858. package/stepper/stepper-icon.d.ts +0 -30
  859. package/stepper/stepper-intl.d.ts +0 -34
  860. package/stepper/stepper-module.d.ts +0 -18
  861. package/stepper/stepper.d.ts +0 -80
  862. package/stepper/stepper_public_index.d.ts +0 -4
  863. package/stepper/testing/package.json +0 -9
  864. package/stepper/testing/public-api.d.ts +0 -11
  865. package/stepper/testing/step-harness-filters.d.ts +0 -37
  866. package/stepper/testing/step-harness.d.ts +0 -52
  867. package/stepper/testing/stepper-button-harnesses.d.ts +0 -41
  868. package/stepper/testing/stepper-harness.d.ts +0 -35
  869. package/table/cell.d.ts +0 -59
  870. package/table/package.json +0 -9
  871. package/table/public-api.d.ts +0 -13
  872. package/table/row.d.ts +0 -55
  873. package/table/table-data-source.d.ts +0 -169
  874. package/table/table-module.d.ts +0 -12
  875. package/table/table.d.ts +0 -28
  876. package/table/table_public_index.d.ts +0 -4
  877. package/table/testing/cell-harness.d.ts +0 -49
  878. package/table/testing/package.json +0 -9
  879. package/table/testing/public-api.d.ts +0 -11
  880. package/table/testing/row-harness.d.ts +0 -66
  881. package/table/testing/table-harness-filters.d.ts +0 -21
  882. package/table/testing/table-harness.d.ts +0 -58
  883. package/table/text-column.d.ts +0 -22
  884. package/tabs/ink-bar.d.ts +0 -49
  885. package/tabs/package.json +0 -9
  886. package/tabs/paginated-tab-header.d.ts +0 -196
  887. package/tabs/public-api.d.ts +0 -20
  888. package/tabs/tab-body.d.ts +0 -116
  889. package/tabs/tab-config.d.ts +0 -35
  890. package/tabs/tab-content.d.ts +0 -22
  891. package/tabs/tab-group.d.ts +0 -183
  892. package/tabs/tab-header.d.ts +0 -49
  893. package/tabs/tab-label-wrapper.d.ts +0 -29
  894. package/tabs/tab-label.d.ts +0 -28
  895. package/tabs/tab-nav-bar/index.d.ts +0 -8
  896. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +0 -134
  897. package/tabs/tab.d.ts +0 -89
  898. package/tabs/tabs-animations.d.ts +0 -15
  899. package/tabs/tabs-module.d.ts +0 -20
  900. package/tabs/tabs_public_index.d.ts +0 -4
  901. package/tabs/testing/package.json +0 -9
  902. package/tabs/testing/public-api.d.ts +0 -12
  903. package/tabs/testing/tab-group-harness.d.ts +0 -35
  904. package/tabs/testing/tab-harness-filters.d.ts +0 -29
  905. package/tabs/testing/tab-harness.d.ts +0 -38
  906. package/tabs/testing/tab-link-harness.d.ts +0 -29
  907. package/tabs/testing/tab-nav-bar-harness.d.ts +0 -38
  908. package/tabs/testing/tab-nav-panel-harness.d.ts +0 -23
  909. package/toolbar/package.json +0 -9
  910. package/toolbar/public-api.d.ts +0 -9
  911. package/toolbar/testing/package.json +0 -9
  912. package/toolbar/testing/public-api.d.ts +0 -9
  913. package/toolbar/testing/toolbar-harness-filters.d.ts +0 -13
  914. package/toolbar/testing/toolbar-harness.d.ts +0 -31
  915. package/toolbar/toolbar-module.d.ts +0 -8
  916. package/toolbar/toolbar.d.ts +0 -41
  917. package/toolbar/toolbar_public_index.d.ts +0 -4
  918. package/tooltip/package.json +0 -9
  919. package/tooltip/public-api.d.ts +0 -10
  920. package/tooltip/testing/package.json +0 -9
  921. package/tooltip/testing/public-api.d.ts +0 -9
  922. package/tooltip/testing/tooltip-harness-filters.d.ts +0 -11
  923. package/tooltip/testing/tooltip-harness.d.ts +0 -38
  924. package/tooltip/tooltip-animations.d.ts +0 -15
  925. package/tooltip/tooltip-module.d.ts +0 -12
  926. package/tooltip/tooltip.d.ts +0 -299
  927. package/tooltip/tooltip_public_index.d.ts +0 -4
  928. package/tree/data-source/flat-data-source.d.ts +0 -83
  929. package/tree/data-source/nested-data-source.d.ts +0 -25
  930. package/tree/node.d.ts +0 -53
  931. package/tree/outlet.d.ts +0 -21
  932. package/tree/package.json +0 -9
  933. package/tree/padding.d.ts +0 -23
  934. package/tree/public-api.d.ts +0 -15
  935. package/tree/testing/node-harness.d.ts +0 -35
  936. package/tree/testing/package.json +0 -9
  937. package/tree/testing/public-api.d.ts +0 -10
  938. package/tree/testing/tree-harness-filters.d.ts +0 -22
  939. package/tree/testing/tree-harness.d.ts +0 -79
  940. package/tree/toggle.d.ts +0 -16
  941. package/tree/tree-module.d.ts +0 -13
  942. package/tree/tree.d.ts +0 -18
  943. package/tree/tree_public_index.d.ts +0 -4
@@ -45,7 +45,7 @@ class ImportManager {
45
45
  // Handles side-effect imports which do neither have a name or
46
46
  // specifiers. e.g. `import "my-package";`
47
47
  if (!node.importClause) {
48
- result.push({ moduleName, node, state: 0 /* UNMODIFIED */ });
48
+ result.push({ moduleName, node, state: 0 /* ImportState.UNMODIFIED */ });
49
49
  continue;
50
50
  }
51
51
  // Handles imports resolving to default exports of a module.
@@ -55,7 +55,7 @@ class ImportManager {
55
55
  moduleName,
56
56
  node,
57
57
  name: node.importClause.name,
58
- state: 0 /* UNMODIFIED */,
58
+ state: 0 /* ImportState.UNMODIFIED */,
59
59
  });
60
60
  continue;
61
61
  }
@@ -69,7 +69,7 @@ class ImportManager {
69
69
  name: el.name,
70
70
  propertyName: el.propertyName,
71
71
  })),
72
- state: 0 /* UNMODIFIED */,
72
+ state: 0 /* ImportState.UNMODIFIED */,
73
73
  });
74
74
  }
75
75
  else {
@@ -79,7 +79,7 @@ class ImportManager {
79
79
  node,
80
80
  name: node.importClause.namedBindings.name,
81
81
  namespace: true,
82
- state: 0 /* UNMODIFIED */,
82
+ state: 0 /* ImportState.UNMODIFIED */,
83
83
  });
84
84
  }
85
85
  }
@@ -111,10 +111,10 @@ class ImportManager {
111
111
  // given symbol, we can just mark the whole import for deletion. Otherwise, we mark
112
112
  // it as modified so that it will be re-printed.
113
113
  if (importData.specifiers.length === 0) {
114
- importData.state |= 8 /* DELETED */;
114
+ importData.state |= 8 /* ImportState.DELETED */;
115
115
  }
116
116
  else {
117
- importData.state |= 2 /* MODIFIED */;
117
+ importData.state |= 2 /* ImportState.MODIFIED */;
118
118
  }
119
119
  }
120
120
  }
@@ -124,7 +124,7 @@ class ImportManager {
124
124
  const fileImports = this._analyzeImportsIfNeeded(declaration.getSourceFile());
125
125
  for (let importData of fileImports) {
126
126
  if (importData.node === declaration) {
127
- importData.state |= 8 /* DELETED */;
127
+ importData.state |= 8 /* ImportState.DELETED */;
128
128
  }
129
129
  }
130
130
  }
@@ -184,11 +184,11 @@ class ImportManager {
184
184
  name: importName,
185
185
  propertyName: needsGeneratedUniqueName ? propertyIdentifier : undefined,
186
186
  });
187
- existingImport.state |= 2 /* MODIFIED */;
188
- if (hasFlag(existingImport, 8 /* DELETED */)) {
187
+ existingImport.state |= 2 /* ImportState.MODIFIED */;
188
+ if (hasFlag(existingImport, 8 /* ImportState.DELETED */)) {
189
189
  // unset the deleted flag if the import is pending deletion, but
190
190
  // can now be used for the new imported symbol.
191
- existingImport.state &= ~8 /* DELETED */;
191
+ existingImport.state &= ~8 /* ImportState.DELETED */;
192
192
  }
193
193
  return importName;
194
194
  }
@@ -209,7 +209,7 @@ class ImportManager {
209
209
  name: identifier,
210
210
  },
211
211
  ],
212
- state: 4 /* ADDED */,
212
+ state: 4 /* ImportState.ADDED */,
213
213
  };
214
214
  }
215
215
  else {
@@ -219,7 +219,7 @@ class ImportManager {
219
219
  moduleName,
220
220
  node: newImportDecl,
221
221
  name: identifier,
222
- state: 4 /* ADDED */,
222
+ state: 4 /* ImportState.ADDED */,
223
223
  };
224
224
  }
225
225
  fileImports.push(newImport);
@@ -235,18 +235,18 @@ class ImportManager {
235
235
  const recorder = this._fileSystem.edit(this._fileSystem.resolve(sourceFile.fileName));
236
236
  const lastUnmodifiedImport = fileImports
237
237
  .reverse()
238
- .find(i => i.state === 0 /* UNMODIFIED */);
238
+ .find(i => i.state === 0 /* ImportState.UNMODIFIED */);
239
239
  const importStartIndex = lastUnmodifiedImport
240
240
  ? this._getEndPositionOfNode(lastUnmodifiedImport.node)
241
241
  : 0;
242
242
  fileImports.forEach(importData => {
243
- if (importData.state === 0 /* UNMODIFIED */) {
243
+ if (importData.state === 0 /* ImportState.UNMODIFIED */) {
244
244
  return;
245
245
  }
246
- if (hasFlag(importData, 8 /* DELETED */)) {
246
+ if (hasFlag(importData, 8 /* ImportState.DELETED */)) {
247
247
  // Imports which do not exist in source file, can be just skipped as
248
248
  // we do not need any replacement to delete the import.
249
- if (!hasFlag(importData, 4 /* ADDED */)) {
249
+ if (!hasFlag(importData, 4 /* ImportState.ADDED */)) {
250
250
  recorder.remove(importData.node.getFullStart(), importData.node.getFullWidth());
251
251
  }
252
252
  return;
@@ -259,20 +259,20 @@ class ImportManager {
259
259
  // declaration and insert it at the import start index. Otherwise, we just
260
260
  // update the named bindings to not re-print the whole import (which could
261
261
  // cause unnecessary formatting changes)
262
- if (hasFlag(importData, 4 /* ADDED */)) {
262
+ if (hasFlag(importData, 4 /* ImportState.ADDED */)) {
263
263
  const updatedImport = ts.factory.updateImportDeclaration(importData.node, undefined, undefined, ts.factory.createImportClause(false, undefined, updatedBindings), ts.factory.createStringLiteral(importData.moduleName), undefined);
264
264
  const newImportText = this._printer.printNode(ts.EmitHint.Unspecified, updatedImport, sourceFile);
265
265
  recorder.insertLeft(importStartIndex, importStartIndex === 0 ? `${newImportText}\n` : `\n${newImportText}`);
266
266
  return;
267
267
  }
268
- else if (hasFlag(importData, 2 /* MODIFIED */)) {
268
+ else if (hasFlag(importData, 2 /* ImportState.MODIFIED */)) {
269
269
  const newNamedBindingsText = this._printer.printNode(ts.EmitHint.Unspecified, updatedBindings, sourceFile);
270
270
  recorder.remove(namedBindings.getStart(), namedBindings.getWidth());
271
271
  recorder.insertRight(namedBindings.getStart(), newNamedBindingsText);
272
272
  return;
273
273
  }
274
274
  }
275
- else if (hasFlag(importData, 4 /* ADDED */)) {
275
+ else if (hasFlag(importData, 4 /* ImportState.ADDED */)) {
276
276
  const newImportText = this._printer.printNode(ts.EmitHint.Unspecified, importData.node, sourceFile);
277
277
  recorder.insertLeft(importStartIndex, importStartIndex === 0 ? `${newImportText}\n` : `\n${newImportText}`);
278
278
  return;
@@ -303,10 +303,10 @@ class ImportManager {
303
303
  const fullEnd = importData.node.getFullStart() + importData.node.getFullWidth();
304
304
  // Subtract or add lines based on whether an import has been deleted or removed
305
305
  // before the actual node offset.
306
- if (offset > fullEnd && hasFlag(importData, 8 /* DELETED */)) {
306
+ if (offset > fullEnd && hasFlag(importData, 8 /* ImportState.DELETED */)) {
307
307
  newPosition.line--;
308
308
  }
309
- else if (offset > fullEnd && hasFlag(importData, 4 /* ADDED */)) {
309
+ else if (offset > fullEnd && hasFlag(importData, 4 /* ImportState.ADDED */)) {
310
310
  newPosition.line++;
311
311
  }
312
312
  }
@@ -381,4 +381,4 @@ class ImportManager {
381
381
  }
382
382
  }
383
383
  exports.ImportManager = ImportManager;
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc2NoZW1hdGljcy9uZy11cGRhdGUvbWlncmF0aW9ucy9oYW1tZXItZ2VzdHVyZXMtdjkvaW1wb3J0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gsK0JBQXNDO0FBQ3RDLGlDQUFpQztBQTRCakMsdUVBQXVFO0FBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBb0IsRUFBRSxJQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZGOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWE7SUFPeEIsWUFBb0IsV0FBdUIsRUFBVSxRQUFvQjtRQUFyRCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVk7UUFOekUsc0VBQXNFO1FBQzlELHlCQUFvQixHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1FBRWxFLHNEQUFzRDtRQUM5QyxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBRVUsQ0FBQztJQUU3RTs7Ozs7T0FLRztJQUNLLHVCQUF1QixDQUFDLFVBQXlCO1FBQ3ZELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUUsQ0FBQztTQUMzQztRQUVELE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFD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LG9CQUFvQixDQUFDLEdBQUcsQ0FDM0IsVUFBVSxFQUNWLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQ3pFLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCLENBQUMsSUFBYTtRQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDM0MsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxPQUFPLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBRSxDQUFDLEdBQUcsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUEvZEQsc0NBK2RDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7RmlsZVN5c3RlbX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3NjaGVtYXRpY3MnO1xuaW1wb3J0IHtkaXJuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG5cbi8qKiBFbnVtIGRlc2NyaWJpbmcgdGhlIHBvc3NpYmxlIHN0YXRlcyBvZiBhbiBhbmFseXplZCBpbXBvcnQuICovXG5jb25zdCBlbnVtIEltcG9ydFN0YXRlIHtcbiAgVU5NT0RJRklFRCA9IDBiMCxcbiAgTU9ESUZJRUQgPSAwYjEwLFxuICBBRERFRCA9IDBiMTAwLFxuICBERUxFVEVEID0gMGIxMDAwLFxufVxuXG4vKiogSW50ZXJmYWNlIGRlc2NyaWJpbmcgYW4gaW1wb3J0IHNwZWNpZmllci4gKi9cbmludGVyZmFjZSBJbXBvcnRTcGVjaWZpZXIge1xuICBuYW1lOiB0cy5JZGVudGlmaWVyO1xuICBwcm9wZXJ0eU5hbWU/OiB0cy5JZGVudGlmaWVyO1xufVxuXG4vKiogSW50ZXJmYWNlIGRlc2NyaWJpbmcgYW4gYW5hbHl6ZWQgaW1wb3J0LiAqL1xuaW50ZXJmYWNlIEFuYWx5emVkSW1wb3J0IHtcbiAgbm9kZTogdHMuSW1wb3J0RGVjbGFyYXRpb247XG4gIG1vZHVsZU5hbWU6IHN0cmluZztcbiAgbmFtZT86IHRzLklkZW50aWZpZXI7XG4gIHNwZWNpZmllcnM/OiBJbXBvcnRTcGVjaWZpZXJbXTtcbiAgbmFtZXNwYWNlPzogYm9vbGVhbjtcbiAgc3RhdGU6IEltcG9ydFN0YXRlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgYW4gYW5hbHl6ZWQgaW1wb3J0IGhhcyB0aGUgZ2l2ZW4gaW1wb3J0IGZsYWcgc2V0LiAqL1xuY29uc3QgaGFzRmxhZyA9IChkYXRhOiBBbmFseXplZEltcG9ydCwgZmxhZzogSW1wb3J0U3RhdGUpID0+IChkYXRhLnN0YXRlICYgZmxhZykgIT09IDA7XG5cbi8qKlxuICogSW1wb3J0IG1hbmFnZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIFR5cGVTY3JpcHQgaW1wb3J0cyB3aXRoaW4gc291cmNlXG4gKiBmaWxlcy4gVGhlIG1hbmFnZXIgZW5zdXJlcyB0aGF0IG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucyBhcmUgYXBwbGllZCBwcm9wZXJseVxuICogd2l0aG91dCBzaGlmdGVkIG9mZnNldHMgYW5kIHRoYXQgZXhpc3RpbmcgaW1wb3J0cyBhcmUgcmUtdXNlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEltcG9ydE1hbmFnZXIge1xuICAvKiogTWFwIG9mIHNvdXJjZS1maWxlcyBhbmQgdGhlaXIgcHJldmlvdXNseSB1c2VkIGlkZW50aWZpZXIgbmFtZXMuICovXG4gIHByaXZhdGUgX3VzZWRJZGVudGlmaWVyTmFtZXMgPSBuZXcgTWFwPHRzLlNvdXJjZUZpbGUsIHN0cmluZ1tdPigpO1xuXG4gIC8qKiBNYXAgb2Ygc291cmNlIGZpbGVzIGFuZCB0aGVpciBhbmFseXplZCBpbXBvcnRzLiAqL1xuICBwcml2YXRlIF9pbXBvcnRDYWNoZSA9IG5ldyBNYXA8dHMuU291cmNlRmlsZSwgQW5hbHl6ZWRJbXBvcnRbXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWxlU3lzdGVtOiBGaWxlU3lzdGVtLCBwcml2YXRlIF9wcmludGVyOiB0cy5QcmludGVyKSB7fVxuXG4gIC8qKlxuICAgKiBBbmFseXplcyB0aGUgaW1wb3J0IG9mIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUgaWYgbmVlZGVkLiBJbiBvcmRlciB0byBwZXJmb3JtXG4gICAqIG1vZGlmaWNhdGlvbnMgdG8gaW1wb3J0cyBvZiBhIHNvdXJjZSBmaWxlLCB3ZSBzdG9yZSBhbGwgaW1wb3J0cyBpbiBtZW1vcnkgYW5kXG4gICAqIHVwZGF0ZSB0aGUgc291cmNlIGZpbGUgb25jZSBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4gVGhpcyBpcyBlc3NlbnRpYWwgdG9cbiAgICogZW5zdXJlIHRoYXQgd2UgY2FuIHJlLXVzZSBuZXdseSBhZGRlZCBpbXBvcnRzIGFuZCBub3QgYnJlYWsgZmlsZSBvZmZzZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogQW5hbHl6ZWRJbXBvcnRbXSB7XG4gICAgaWYgKHRoaXMuX2ltcG9ydENhY2hlLmhhcyhzb3VyY2VGaWxlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydENhY2hlLmdldChzb3VyY2VGaWxlKSE7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBBbmFseXplZEltcG9ydFtdID0gW107XG4gICAgZm9yIChsZXQgbm9kZSBvZiBzb3VyY2VGaWxlLnN0YXRlbWVudHMpIHtcbiAgICAgIGlmICghdHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSB8fCAhdHMuaXNTdHJpbmdMaXRlcmFsKG5vZGUubW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG5vZGUubW9kdWxlU3BlY2lmaWVyLnRleHQ7XG5cbiAgICAgIC8vIEhhbmRsZXMgc2lkZS1lZmZlY3QgaW1wb3J0cyB3aGljaCBkbyBuZWl0aGVyIGhhdmUgYSBuYW1lIG9yXG4gICAgICAvLyBzcGVjaWZpZXJzLiBlLmcuIGBpbXBvcnQgXCJteS1wYWNrYWdlXCI7YFxuICAgICAgaWYgKCFub2RlLmltcG9ydENsYXVzZSkge1xuICAgICAgICByZXN1bHQucHVzaCh7bW9kdWxlTmFtZSwgbm9kZSwgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUR9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZXMgaW1wb3J0cyByZXNvbHZpbmcgdG8gZGVmYXVsdCBleHBvcnRzIG9mIGEgbW9kdWxlLlxuICAgICAgLy8gZS5nLiBgaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7YFxuICAgICAgaWYgKCFub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgbmFtZTogbm9kZS5pbXBvcnRDbGF1c2UubmFtZSxcbiAgICAgICAgICBzdGF0ZTogSW1wb3J0U3RhdGUuVU5NT0RJRklFRCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGVzIGltcG9ydHMgd2l0aCBpbmRpdmlkdWFsIHN5bWJvbCBzcGVjaWZpZXJzLlxuICAgICAgLy8gZS5nLiBgaW1wb3J0IHtBLCBCLCBDfSBmcm9tIFwibXktbW9kdWxlXCI7YFxuICAgICAgaWYgKHRzLmlzTmFtZWRJbXBvcnRzKG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgc3BlY2lmaWVyczogbm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncy5lbGVtZW50cy5tYXAoZWwgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGVsLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlcyBuYW1lc3BhY2VkIGltcG9ydHMuIGUuZy4gYGltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIm15LXBrZ1wiO2BcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBuYW1lOiBub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzLm5hbWUsXG4gICAgICAgICAgbmFtZXNwYWNlOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVELFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faW1wb3J0Q2FjaGUuc2V0KHNvdXJjZUZpbGUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gc3BlY2lmaWVyLCB3aGljaCBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcGF0aCxcbiAgICogbWF0Y2hlcyB0aGUgcGFzc2VkIG1vZHVsZSBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNNb2R1bGVTcGVjaWZpZXJNYXRjaGluZyhcbiAgICBiYXNlUGF0aDogc3RyaW5nLFxuICAgIHNwZWNpZmllcjogc3RyaW5nLFxuICAgIG1vZHVsZU5hbWU6IHN0cmluZyxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJylcbiAgICAgID8gcmVzb2x2ZShiYXNlUGF0aCwgc3BlY2lmaWVyKSA9PT0gcmVzb2x2ZShiYXNlUGF0aCwgbW9kdWxlTmFtZSlcbiAgICAgIDogc3BlY2lmaWVyID09PSBtb2R1bGVOYW1lO1xuICB9XG5cbiAgLyoqIERlbGV0ZXMgYSBnaXZlbiBuYW1lZCBiaW5kaW5nIGltcG9ydCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUuICovXG4gIGRlbGV0ZU5hbWVkQmluZGluZ0ltcG9ydChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBzeW1ib2xOYW1lOiBzdHJpbmcsIG1vZHVsZU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNvdXJjZURpciA9IGRpcm5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgY29uc3QgZmlsZUltcG9ydHMgPSB0aGlzLl9hbmFseXplSW1wb3J0c0lmTmVlZGVkKHNvdXJjZUZpbGUpO1xuXG4gICAgZm9yIChsZXQgaW1wb3J0RGF0YSBvZiBmaWxlSW1wb3J0cykge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faXNNb2R1bGVTcGVjaWZpZXJNYXRjaGluZyhzb3VyY2VEaXIsIGltcG9ydERhdGEubW9kdWxlTmFtZSwgbW9kdWxlTmFtZSkgfHxcbiAgICAgICAgIWltcG9ydERhdGEuc3BlY2lmaWVyc1xuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjaWZpZXJJbmRleCA9IGltcG9ydERhdGEuc3BlY2lmaWVycy5maW5kSW5kZXgoXG4gICAgICAgIGQgPT4gKGQucHJvcGVydHlOYW1lIHx8IGQubmFtZSkudGV4dCA9PT0gc3ltYm9sTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoc3BlY2lmaWVySW5kZXggIT09IC0xKSB7XG4gICAgICAgIGltcG9ydERhdGEuc3BlY2lmaWVycy5zcGxpY2Uoc3BlY2lmaWVySW5kZXgsIDEpO1xuICAgICAgICAvLyBpZiB0aGUgaW1wb3J0IGRvZXMgbm8gbG9uZ2VyIGNvbnRhaW4gYW55IHNwZWNpZmllcnMgYWZ0ZXIgdGhlIHJlbW92YWwgb2YgdGhlXG4gICAgICAgIC8vIGdpdmVuIHN5bWJvbCwgd2UgY2FuIGp1c3QgbWFyayB0aGUgd2hvbGUgaW1wb3J0IGZvciBkZWxldGlvbi4gT3RoZXJ3aXNlLCB3ZSBtYXJrXG4gICAgICAgIC8vIGl0IGFzIG1vZGlmaWVkIHNvIHRoYXQgaXQgd2lsbCBiZSByZS1wcmludGVkLlxuICAgICAgICBpZiAoaW1wb3J0RGF0YS5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuREVMRVRFRDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbXBvcnREYXRhLnN0YXRlIHw9IEltcG9ydFN0YXRlLk1PRElGSUVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIERlbGV0ZXMgdGhlIGltcG9ydCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGltcG9ydCBkZWNsYXJhdGlvbiBpZiBmb3VuZC4gKi9cbiAgZGVsZXRlSW1wb3J0QnlEZWNsYXJhdGlvbihkZWNsYXJhdGlvbjogdHMuSW1wb3J0RGVjbGFyYXRpb24pIHtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2FuYWx5emVJbXBvcnRzSWZOZWVkZWQoZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpKTtcbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBpZiAoaW1wb3J0RGF0YS5ub2RlID09PSBkZWNsYXJhdGlvbikge1xuICAgICAgICBpbXBvcnREYXRhLnN0YXRlIHw9IEltcG9ydFN0YXRlLkRFTEVURUQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW1wb3J0IHRvIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBhbmQgcmV0dXJucyB0aGUgVHlwZVNjcmlwdCBleHByZXNzaW9uIHRoYXRcbiAgICogY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBuZXdseSBpbXBvcnRlZCBzeW1ib2wuXG4gICAqXG4gICAqIFdoZW5ldmVyIGFuIGltcG9ydCBpcyBhZGRlZCB0byBhIHNvdXJjZSBmaWxlLCBpdCdzIHJlY29tbWVuZGVkIHRoYXQgdGhlIHJldHVybmVkXG4gICAqIGV4cHJlc3Npb24gaXMgdXNlZCB0byByZWZlcmVuY2UgdGggc3ltYm9sLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzeW1ib2xcbiAgICogY291bGQgYmUgYWxpYXNlZCBpZiBpdCB3b3VsZCBjb2xsaWRlIHdpdGggZXhpc3RpbmcgaW1wb3J0cyBpbiBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZUZpbGUgU291cmNlIGZpbGUgdG8gd2hpY2ggdGhlIGltcG9ydCBzaG91bGQgYmUgYWRkZWQuXG4gICAqIEBwYXJhbSBzeW1ib2xOYW1lIE5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZC4gQ2FuIGJlIG51bGwgaWZcbiAgICogICAgdGhlIGRlZmF1bHQgZXhwb3J0IGlzIHJlcXVlc3RlZC5cbiAgICogQHBhcmFtIG1vZHVsZU5hbWUgTmFtZSBvZiB0aGUgbW9kdWxlIG9mIHdoaWNoIHRoZSBzeW1ib2wgc2hvdWxkIGJlIGltcG9ydGVkLlxuICAgKiBAcGFyYW0gdHlwZUltcG9ydCBXaGV0aGVyIHRoZSBzeW1ib2wgaXMgYSB0eXBlLlxuICAgKiBAcGFyYW0gaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMgTGlzdCBvZiBpZGVudGlmaWVycyB3aGljaCBjYW4gYmUgaWdub3JlZCB3aGVuXG4gICAqICAgIHRoZSBpbXBvcnQgbWFuYWdlciBjaGVja3MgZm9yIGltcG9ydCBjb2xsaXNpb25zLlxuICAgKi9cbiAgYWRkSW1wb3J0VG9Tb3VyY2VGaWxlKFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgc3ltYm9sTmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgdHlwZUltcG9ydCA9IGZhbHNlLFxuICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zOiB0cy5JZGVudGlmaWVyW10gPSBbXSxcbiAgKTogdHMuRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gZGlybmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2FuYWx5emVJbXBvcnRzSWZOZWVkZWQoc291cmNlRmlsZSk7XG5cbiAgICBsZXQgZXhpc3RpbmdJbXBvcnQ6IEFuYWx5emVkSW1wb3J0IHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChsZXQgaW1wb3J0RGF0YSBvZiBmaWxlSW1wb3J0cykge1xuICAgICAgaWYgKCF0aGlzLl9pc01vZHVsZVNwZWNpZmllck1hdGNoaW5nKHNvdXJjZURpciwgaW1wb3J0RGF0YS5tb2R1bGVOYW1lLCBtb2R1bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc3ltYm9sIG5hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpbXBvcnQgaXMgcmVxdWVzdGVkLiBJbiB0aGF0XG4gICAgICAvLyBjYXNlIHdlIHNlYXJjaCBmb3Igbm9uLW5hbWVzcGFjZSBhbmQgbm9uLXNwZWNpZmllciBpbXBvcnRzLlxuICAgICAgaWYgKCFzeW1ib2xOYW1lICYmICFpbXBvcnREYXRhLm5hbWVzcGFjZSAmJiAhaW1wb3J0RGF0YS5zcGVjaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoaW1wb3J0RGF0YS5uYW1lIS50ZXh0KTtcbiAgICAgIH1cblxuICAgICAgLy8gSW4gY2FzZSBhIFwiVHlwZVwiIHN5bWJvbCBpcyBpbXBvcnRlZCwgd2UgY2FuJ3QgdXNlIG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIG9ubHkgZXhwb3J0IHN5bWJvbHMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUgKG5vIHR5cGVzKVxuICAgICAgaWYgKGltcG9ydERhdGEubmFtZXNwYWNlICYmICF0eXBlSW1wb3J0KSB7XG4gICAgICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZVByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihcbiAgICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoaW1wb3J0RGF0YS5uYW1lIS50ZXh0KSxcbiAgICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoc3ltYm9sTmFtZSB8fCAnZGVmYXVsdCcpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpbXBvcnREYXRhLnNwZWNpZmllcnMgJiYgc3ltYm9sTmFtZSkge1xuICAgICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IGltcG9ydERhdGEuc3BlY2lmaWVycy5maW5kKHMgPT5cbiAgICAgICAgICBzLnByb3BlcnR5TmFtZSA/IHMucHJvcGVydHlOYW1lLnRleHQgPT09IHN5bWJvbE5hbWUgOiBzLm5hbWUudGV4dCA9PT0gc3ltYm9sTmFtZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdTcGVjaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKGV4aXN0aW5nU3BlY2lmaWVyLm5hbWUudGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbiBjYXNlIHRoZSBzeW1ib2wgY291bGQgbm90IGJlIGZvdW5kIGluIGFuIGV4aXN0aW5nIGltcG9ydCwgd2VcbiAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uIGFzIGl0IGNhbiBiZSB1cGRhdGVkIHRvIGluY2x1ZGVcbiAgICAgICAgLy8gdGhlIHNwZWNpZmllZCBzeW1ib2wgbmFtZSB3aXRob3V0IGhhdmluZyB0byBjcmVhdGUgYSBuZXcgaW1wb3J0LlxuICAgICAgICBleGlzdGluZ0ltcG9ydCA9IGltcG9ydERhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgaW1wb3J0IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG1vZHVsZSwgd2VcbiAgICAvLyBqdXN0IHVwZGF0ZSB0aGUgaW1wb3J0IHNwZWNpZmllcnMgdG8gYWxzbyBpbXBvcnQgdGhlIHJlcXVlc3RlZCBzeW1ib2wuXG4gICAgaWYgKGV4aXN0aW5nSW1wb3J0KSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eUlkZW50aWZpZXIgPSB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoc3ltYm9sTmFtZSEpO1xuICAgICAgY29uc3QgZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllciA9IHRoaXMuX2dldFVuaXF1ZUlkZW50aWZpZXIoXG4gICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgIHN5bWJvbE5hbWUhLFxuICAgICAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPSBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyLnRleHQgIT09IHN5bWJvbE5hbWU7XG4gICAgICBjb25zdCBpbXBvcnROYW1lID0gbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllciA6IHByb3BlcnR5SWRlbnRpZmllcjtcblxuICAgICAgZXhpc3RpbmdJbXBvcnQuc3BlY2lmaWVycyEucHVzaCh7XG4gICAgICAgIG5hbWU6IGltcG9ydE5hbWUsXG4gICAgICAgIHByb3BlcnR5TmFtZTogbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gcHJvcGVydHlJZGVudGlmaWVyIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBleGlzdGluZ0ltcG9ydC5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5NT0RJRklFRDtcblxuICAgICAgaWYgKGhhc0ZsYWcoZXhpc3RpbmdJbXBvcnQsIEltcG9ydFN0YXRlLkRFTEVURUQpKSB7XG4gICAgICAgIC8vIHVuc2V0IHRoZSBkZWxldGVkIGZsYWcgaWYgdGhlIGltcG9ydCBpcyBwZW5kaW5nIGRlbGV0aW9uLCBidXRcbiAgICAgICAgLy8gY2FuIG5vdyBiZSB1c2VkIGZvciB0aGUgbmV3IGltcG9ydGVkIHN5bWJvbC5cbiAgICAgICAgZXhpc3RpbmdJbXBvcnQuc3RhdGUgJj0gfkltcG9ydFN0YXRlLkRFTEVURUQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbXBvcnROYW1lO1xuICAgIH1cblxuICAgIGxldCBpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IG5ld0ltcG9ydDogQW5hbHl6ZWRJbXBvcnQgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChzeW1ib2xOYW1lKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eUlkZW50aWZpZXIgPSB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoc3ltYm9sTmFtZSk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyID0gdGhpcy5fZ2V0VW5pcXVlSWRlbnRpZmllcihcbiAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgc3ltYm9sTmFtZSxcbiAgICAgICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID0gZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllci50ZXh0ICE9PSBzeW1ib2xOYW1lO1xuICAgICAgaWRlbnRpZmllciA9IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA/IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIgOiBwcm9wZXJ0eUlkZW50aWZpZXI7XG5cbiAgICAgIGNvbnN0IG5ld0ltcG9ydERlY2wgPSB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVJbXBvcnRDbGF1c2UoZmFsc2UsIHVuZGVmaW5lZCwgdHMuZmFjdG9yeS5jcmVhdGVOYW1lZEltcG9ydHMoW10pKSxcbiAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVTdHJpbmdMaXRlcmFsKG1vZHVsZU5hbWUpLFxuICAgICAgKTtcblxuICAgICAgbmV3SW1wb3J0ID0ge1xuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICBub2RlOiBuZXdJbXBvcnREZWNsLFxuICAgICAgICBzcGVjaWZpZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBwcm9wZXJ0eUlkZW50aWZpZXIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuYW1lOiBpZGVudGlmaWVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5BRERFRCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkZW50aWZpZXIgPSB0aGlzLl9nZXRVbmlxdWVJZGVudGlmaWVyKFxuICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAnZGVmYXVsdEV4cG9ydCcsXG4gICAgICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0ltcG9ydERlY2wgPSB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVJbXBvcnRDbGF1c2UoZmFsc2UsIGlkZW50aWZpZXIsIHVuZGVmaW5lZCksXG4gICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlU3RyaW5nTGl0ZXJhbChtb2R1bGVOYW1lKSxcbiAgICAgICk7XG4gICAgICBuZXdJbXBvcnQgPSB7XG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIG5vZGU6IG5ld0ltcG9ydERlY2wsXG4gICAgICAgIG5hbWU6IGlkZW50aWZpZXIsXG4gICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5BRERFRCxcbiAgICAgIH07XG4gICAgfVxuICAgIGZpbGVJbXBvcnRzLnB1c2gobmV3SW1wb3J0KTtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSByZWNvcmRlZCBjaGFuZ2VzIGluIHRoZSB1cGRhdGUgcmVjb3JkZXJzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlcy5cbiAgICogVGhlIGNoYW5nZXMgYXJlIGFwcGxpZWQgc2VwYXJhdGVseSBhZnRlciBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gcmVjb3JkZWQgYmVjYXVzZSBvdGhlcndpc2VcbiAgICogZmlsZSBvZmZzZXRzIHdpbGwgY2hhbmdlIGFuZCB0aGUgc291cmNlIGZpbGVzIHdvdWxkIG5lZWQgdG8gYmUgcmUtcGFyc2VkIGFmdGVyIGVhY2ggY2hhbmdlLlxuICAgKi9cbiAgcmVjb3JkQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9pbXBvcnRDYWNoZS5mb3JFYWNoKChmaWxlSW1wb3J0cywgc291cmNlRmlsZSkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLl9maWxlU3lzdGVtLmVkaXQodGhpcy5fZmlsZVN5c3RlbS5yZXNvbHZlKHNvdXJjZUZpbGUuZmlsZU5hbWUpKTtcbiAgICAgIGNvbnN0IGxhc3RVbm1vZGlmaWVkSW1wb3J0ID0gZmlsZUltcG9ydHNcbiAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAuZmluZChpID0+IGkuc3RhdGUgPT09IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQpO1xuICAgICAgY29uc3QgaW1wb3J0U3RhcnRJbmRleCA9IGxhc3RVbm1vZGlmaWVkSW1wb3J0XG4gICAgICAgID8gdGhpcy5fZ2V0RW5kUG9zaXRpb25PZk5vZGUobGFzdFVubW9kaWZpZWRJbXBvcnQubm9kZSlcbiAgICAgICAgOiAwO1xuXG4gICAgICBmaWxlSW1wb3J0cy5mb3JFYWNoKGltcG9ydERhdGEgPT4ge1xuICAgICAgICBpZiAoaW1wb3J0RGF0YS5zdGF0ZSA9PT0gSW1wb3J0U3RhdGUuVU5NT0RJRklFRCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkRFTEVURUQpKSB7XG4gICAgICAgICAgLy8gSW1wb3J0cyB3aGljaCBkbyBub3QgZXhpc3QgaW4gc291cmNlIGZpbGUsIGNhbiBiZSBqdXN0IHNraXBwZWQgYXNcbiAgICAgICAgICAvLyB3ZSBkbyBub3QgbmVlZCBhbnkgcmVwbGFjZW1lbnQgdG8gZGVsZXRlIHRoZSBpbXBvcnQuXG4gICAgICAgICAgaWYgKCFoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICAgICAgcmVjb3JkZXIucmVtb3ZlKGltcG9ydERhdGEubm9kZS5nZXRGdWxsU3RhcnQoKSwgaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxXaWR0aCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltcG9ydERhdGEuc3BlY2lmaWVycykge1xuICAgICAgICAgIGNvbnN0IG5hbWVkQmluZGluZ3MgPSBpbXBvcnREYXRhLm5vZGUuaW1wb3J0Q2xhdXNlIS5uYW1lZEJpbmRpbmdzIGFzIHRzLk5hbWVkSW1wb3J0cztcbiAgICAgICAgICBjb25zdCBpbXBvcnRTcGVjaWZpZXJzID0gaW1wb3J0RGF0YS5zcGVjaWZpZXJzLm1hcChzID0+XG4gICAgICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydFNwZWNpZmllcihmYWxzZSwgcy5wcm9wZXJ0eU5hbWUsIHMubmFtZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkQmluZGluZ3MgPSB0cy5mYWN0b3J5LnVwZGF0ZU5hbWVkSW1wb3J0cyhuYW1lZEJpbmRpbmdzLCBpbXBvcnRTcGVjaWZpZXJzKTtcblxuICAgICAgICAgIC8vIEluIGNhc2UgYW4gaW1wb3J0IGhhcyBiZWVuIGFkZGVkIG5ld2x5LCB3ZSBuZWVkIHRvIHByaW50IHRoZSB3aG9sZSBpbXBvcnRcbiAgICAgICAgICAvLyBkZWNsYXJhdGlvbiBhbmQgaW5zZXJ0IGl0IGF0IHRoZSBpbXBvcnQgc3RhcnQgaW5kZXguIE90aGVyd2lzZSwgd2UganVzdFxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbmFtZWQgYmluZGluZ3MgdG8gbm90IHJlLXByaW50IHRoZSB3aG9sZSBpbXBvcnQgKHdoaWNoIGNvdWxkXG4gICAgICAgICAgLy8gY2F1c2UgdW5uZWNlc3NhcnkgZm9ybWF0dGluZyBjaGFuZ2VzKVxuICAgICAgICAgIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZEltcG9ydCA9IHRzLmZhY3RvcnkudXBkYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIGltcG9ydERhdGEubm9kZSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0Q2xhdXNlKGZhbHNlLCB1bmRlZmluZWQsIHVwZGF0ZWRCaW5kaW5ncyksXG4gICAgICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlU3RyaW5nTGl0ZXJhbChpbXBvcnREYXRhLm1vZHVsZU5hbWUpLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgbmV3SW1wb3J0VGV4dCA9IHRoaXMuX3ByaW50ZXIucHJpbnROb2RlKFxuICAgICAgICAgICAgICB0cy5FbWl0SGludC5VbnNwZWNpZmllZCxcbiAgICAgICAgICAgICAgdXBkYXRlZEltcG9ydCxcbiAgICAgICAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZWNvcmRlci5pbnNlcnRMZWZ0KFxuICAgICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4LFxuICAgICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4ID09PSAwID8gYCR7bmV3SW1wb3J0VGV4dH1cXG5gIDogYFxcbiR7bmV3SW1wb3J0VGV4dH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuTU9ESUZJRUQpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdOYW1lZEJpbmRpbmdzVGV4dCA9IHRoaXMuX3ByaW50ZXIucHJpbnROb2RlKFxuICAgICAgICAgICAgICB0cy5FbWl0SGludC5VbnNwZWNpZmllZCxcbiAgICAgICAgICAgICAgdXBkYXRlZEJpbmRpbmdzLFxuICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlY29yZGVyLnJlbW92ZShuYW1lZEJpbmRpbmdzLmdldFN0YXJ0KCksIG5hbWVkQmluZGluZ3MuZ2V0V2lkdGgoKSk7XG4gICAgICAgICAgICByZWNvcmRlci5pbnNlcnRSaWdodChuYW1lZEJpbmRpbmdzLmdldFN0YXJ0KCksIG5ld05hbWVkQmluZGluZ3NUZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5BRERFRCkpIHtcbiAgICAgICAgICBjb25zdCBuZXdJbXBvcnRUZXh0ID0gdGhpcy5fcHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICB0cy5FbWl0SGludC5VbnNwZWNpZmllZCxcbiAgICAgICAgICAgIGltcG9ydERhdGEubm9kZSxcbiAgICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWNvcmRlci5pbnNlcnRMZWZ0KFxuICAgICAgICAgICAgaW1wb3J0U3RhcnRJbmRleCxcbiAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXggPT09IDAgPyBgJHtuZXdJbXBvcnRUZXh0fVxcbmAgOiBgXFxuJHtuZXdJbXBvcnRUZXh0fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBzaG91bGQgbmV2ZXIgaGl0IHRoaXMsIGJ1dCB3ZSByYXRoZXIgd2FudCB0byBwcmludCBhIGN1c3RvbSBleGNlcHRpb25cbiAgICAgICAgLy8gaW5zdGVhZCBvZiBqdXN0IHNraXBwaW5nIGltcG9ydHMgc2lsZW50bHkuXG4gICAgICAgIHRocm93IEVycm9yKCdVbmV4cGVjdGVkIGltcG9ydCBtb2RpZmljYXRpb24uJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JyZWN0cyB0aGUgbGluZSBhbmQgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gbm9kZS4gU2luY2Ugbm9kZXMgb2ZcbiAgICogc291cmNlIGZpbGVzIGFyZSBpbW11dGFibGUgYW5kIHdlIHNvbWV0aW1lcyBtYWtlIGNoYW5nZXMgdG8gdGhlIGNvbnRhaW5pbmdcbiAgICogc291cmNlIGZpbGUsIHRoZSBub2RlIHBvc2l0aW9uIG1pZ2h0IHNoaWZ0IChlLmcuIGlmIHdlIGFkZCBhIG5ldyBpbXBvcnQgYmVmb3JlKS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBjb3JyZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGdpdmVuIG5vZGUuIFRoaXNcbiAgICogaXMgaGVscGZ1bCB3aGVuIHByaW50aW5nIG91dCBlcnJvciBtZXNzYWdlcyB3aGljaCBzaG91bGQgcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mXG4gICAqIHNvdXJjZSBmaWxlcy5cbiAgICovXG4gIGNvcnJlY3ROb2RlUG9zaXRpb24obm9kZTogdHMuTm9kZSwgb2Zmc2V0OiBudW1iZXIsIHBvc2l0aW9uOiB0cy5MaW5lQW5kQ2hhcmFjdGVyKSB7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRDYWNoZS5oYXMoc291cmNlRmlsZSkpIHtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQb3NpdGlvbjogdHMuTGluZUFuZENoYXJhY3RlciA9IHsuLi5wb3NpdGlvbn07XG4gICAgY29uc3QgZmlsZUltcG9ydHMgPSB0aGlzLl9pbXBvcnRDYWNoZS5nZXQoc291cmNlRmlsZSkhO1xuXG4gICAgZm9yIChsZXQgaW1wb3J0RGF0YSBvZiBmaWxlSW1wb3J0cykge1xuICAgICAgY29uc3QgZnVsbEVuZCA9IGltcG9ydERhdGEubm9kZS5nZXRGdWxsU3RhcnQoKSArIGltcG9ydERhdGEubm9kZS5nZXRGdWxsV2lkdGgoKTtcbiAgICAgIC8vIFN1YnRyYWN0IG9yIGFkZCBsaW5lcyBiYXNlZCBvbiB3aGV0aGVyIGFuIGltcG9ydCBoYXMgYmVlbiBkZWxldGVkIG9yIHJlbW92ZWRcbiAgICAgIC8vIGJlZm9yZSB0aGUgYWN0dWFsIG5vZGUgb2Zmc2V0LlxuICAgICAgaWYgKG9mZnNldCA+IGZ1bGxFbmQgJiYgaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5ERUxFVEVEKSkge1xuICAgICAgICBuZXdQb3NpdGlvbi5saW5lLS07XG4gICAgICB9IGVsc2UgaWYgKG9mZnNldCA+IGZ1bGxFbmQgJiYgaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5BRERFRCkpIHtcbiAgICAgICAgbmV3UG9zaXRpb24ubGluZSsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3UG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiB1bmlxdWUgaWRlbnRpZmllciBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIHN5bWJvbCBuYW1lLlxuICAgKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byBjaGVjayBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zLlxuICAgKiBAcGFyYW0gc3ltYm9sTmFtZSBOYW1lIG9mIHRoZSBzeW1ib2wgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZ2VuZXJhdGUgYW4gdW5pcXVlIG5hbWUuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgY2hlY2tpbmcgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucyBpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuXG4gICAqL1xuICBwcml2YXRlIF9nZXRVbmlxdWVJZGVudGlmaWVyKFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgc3ltYm9sTmFtZTogc3RyaW5nLFxuICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zOiB0cy5JZGVudGlmaWVyW10sXG4gICk6IHRzLklkZW50aWZpZXIge1xuICAgIGlmICh0aGlzLl9pc1VuaXF1ZUlkZW50aWZpZXJOYW1lKHNvdXJjZUZpbGUsIHN5bWJvbE5hbWUsIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zKSkge1xuICAgICAgdGhpcy5fcmVjb3JkVXNlZElkZW50aWZpZXIoc291cmNlRmlsZSwgc3ltYm9sTmFtZSk7XG4gICAgICByZXR1cm4gdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKHN5bWJvbE5hbWUpO1xuICAgIH1cblxuICAgIGxldCBuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY291bnRlciA9IDE7XG4gICAgZG8ge1xuICAgICAgbmFtZSA9IGAke3N5bWJvbE5hbWV9XyR7Y291bnRlcisrfWA7XG4gICAgfSB3aGlsZSAoIXRoaXMuX2lzVW5pcXVlSWRlbnRpZmllck5hbWUoc291cmNlRmlsZSwgbmFtZSwgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMpKTtcblxuICAgIHRoaXMuX3JlY29yZFVzZWRJZGVudGlmaWVyKHNvdXJjZUZpbGUsIG5hbWUhKTtcbiAgICByZXR1cm4gdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKG5hbWUhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIgbmFtZSBpcyB1c2VkIHdpdGhpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuXG4gICAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIHRvIGNoZWNrIGZvciBpZGVudGlmaWVyIGNvbGxpc2lvbnMuXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGlkZW50aWZpZXIgd2hpY2ggaXMgY2hlY2tlZCBmb3IgaXRzIHVuaXF1ZW5lc3MuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgY2hlY2tpbmcgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucyBpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuXG4gICAqL1xuICBwcml2YXRlIF9pc1VuaXF1ZUlkZW50aWZpZXJOYW1lKFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zOiB0cy5JZGVudGlmaWVyW10sXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuaGFzKHNvdXJjZUZpbGUpICYmXG4gICAgICB0aGlzLl91c2VkSWRlbnRpZmllck5hbWVzLmdldChzb3VyY2VGaWxlKSEuaW5kZXhPZihuYW1lKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHNvdXJjZSBmaWxlIGFuZCBzZWFyY2ggZm9yIGFuIGlkZW50aWZpZXIgbWF0Y2hpbmdcbiAgICAvLyB0aGUgZ2l2ZW4gbmFtZS4gSW4gdGhhdCBjYXNlLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQgdGhpcyBuYW1lXG4gICAgLy8gaXMgdW5pcXVlIGluIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBzY29wZSBhbmQgd2UganVzdCByZXR1cm4gZmFsc2UuXG4gICAgY29uc3Qgbm9kZVF1ZXVlOiB0cy5Ob2RlW10gPSBbc291cmNlRmlsZV07XG4gICAgd2hpbGUgKG5vZGVRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2RlUXVldWUuc2hpZnQoKSE7XG4gICAgICBpZiAoXG4gICAgICAgIHRzLmlzSWRlbnRpZmllcihub2RlKSAmJlxuICAgICAgICBub2RlLnRleHQgPT09IG5hbWUgJiZcbiAgICAgICAgIWlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zLmluY2x1ZGVzKG5vZGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbm9kZVF1ZXVlLnB1c2goLi4ubm9kZS5nZXRDaGlsZHJlbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyB0aGF0IHRoZSBnaXZlbiBpZGVudGlmaWVyIGlzIHVzZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUuIFRoaXNcbiAgICogaXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGRvIG5vdCBhcHBseSBjaGFuZ2VzIHRvIHNvdXJjZSBmaWxlcyBwZXIgY2hhbmdlLCBidXQgc3RpbGxcbiAgICogd2FudCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBuZXdseSBpbXBvcnRlZCBzeW1ib2xzLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjb3JkVXNlZElkZW50aWZpZXIoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgaWRlbnRpZmllck5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuc2V0KFxuICAgICAgc291cmNlRmlsZSxcbiAgICAgICh0aGlzLl91c2VkSWRlbnRpZmllck5hbWVzLmdldChzb3VyY2VGaWxlKSB8fCBbXSkuY29uY2F0KGlkZW50aWZpZXJOYW1lKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIGZ1bGwgZW5kIG9mIGEgZ2l2ZW4gbm9kZS4gQnkgZGVmYXVsdCB0aGUgZW5kIHBvc2l0aW9uIG9mIGEgbm9kZSBpc1xuICAgKiBiZWZvcmUgYWxsIHRyYWlsaW5nIGNvbW1lbnRzLiBUaGlzIGNvdWxkIG1lYW4gdGhhdCBnZW5lcmF0ZWQgaW1wb3J0cyBzaGlmdCBjb21tZW50cy5cbiAgICovXG4gIHByaXZhdGUgX2dldEVuZFBvc2l0aW9uT2ZOb2RlKG5vZGU6IHRzLk5vZGUpIHtcbiAgICBjb25zdCBub2RlRW5kUG9zID0gbm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBjb21tZW50UmFuZ2VzID0gdHMuZ2V0VHJhaWxpbmdDb21tZW50UmFuZ2VzKG5vZGUuZ2V0U291cmNlRmlsZSgpLnRleHQsIG5vZGVFbmRQb3MpO1xuICAgIGlmICghY29tbWVudFJhbmdlcyB8fCAhY29tbWVudFJhbmdlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBub2RlRW5kUG9zO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWVudFJhbmdlc1tjb21tZW50UmFuZ2VzLmxlbmd0aCAtIDFdIS5lbmQ7XG4gIH1cbn1cbiJdfQ==
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc2NoZW1hdGljcy9uZy11cGRhdGUvbWlncmF0aW9ucy9oYW1tZXItZ2VzdHVyZXMtdjkvaW1wb3J0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gsK0JBQXNDO0FBQ3RDLGlDQUFpQztBQTRCakMsdUVBQXVFO0FBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBb0IsRUFBRSxJQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZGOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWE7SUFPeEIsWUFBb0IsV0FBdUIsRUFBVSxRQUFvQjtRQUFyRCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVk7UUFOekUsc0VBQXNFO1FBQzlELHlCQUFvQixHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1FBRWxFLHNEQUFzRDtRQUM5QyxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBRVUsQ0FBQztJQUU3RTs7Ozs7T0FLRztJQUNLLHVCQUF1QixDQUFDLFVBQXlCO1FBQ3ZELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUUsQ0FBQztTQUMzQztRQUVELE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFD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QUMsb0JBQW9CLENBQUMsR0FBRyxDQUMzQixVQUFVLEVBQ1YsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUIsQ0FBQyxJQUFhO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUMzQyxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUNELE9BQU8sYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFFLENBQUMsR0FBRyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQS9kRCxzQ0ErZEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtGaWxlU3lzdGVtfSBmcm9tICdAYW5ndWxhci9jZGsvc2NoZW1hdGljcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcblxuLyoqIEVudW0gZGVzY3JpYmluZyB0aGUgcG9zc2libGUgc3RhdGVzIG9mIGFuIGFuYWx5emVkIGltcG9ydC4gKi9cbmNvbnN0IGVudW0gSW1wb3J0U3RhdGUge1xuICBVTk1PRElGSUVEID0gMGIwLFxuICBNT0RJRklFRCA9IDBiMTAsXG4gIEFEREVEID0gMGIxMDAsXG4gIERFTEVURUQgPSAwYjEwMDAsXG59XG5cbi8qKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhbiBpbXBvcnQgc3BlY2lmaWVyLiAqL1xuaW50ZXJmYWNlIEltcG9ydFNwZWNpZmllciB7XG4gIG5hbWU6IHRzLklkZW50aWZpZXI7XG4gIHByb3BlcnR5TmFtZT86IHRzLklkZW50aWZpZXI7XG59XG5cbi8qKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhbiBhbmFseXplZCBpbXBvcnQuICovXG5pbnRlcmZhY2UgQW5hbHl6ZWRJbXBvcnQge1xuICBub2RlOiB0cy5JbXBvcnREZWNsYXJhdGlvbjtcbiAgbW9kdWxlTmFtZTogc3RyaW5nO1xuICBuYW1lPzogdHMuSWRlbnRpZmllcjtcbiAgc3BlY2lmaWVycz86IEltcG9ydFNwZWNpZmllcltdO1xuICBuYW1lc3BhY2U/OiBib29sZWFuO1xuICBzdGF0ZTogSW1wb3J0U3RhdGU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciBhbiBhbmFseXplZCBpbXBvcnQgaGFzIHRoZSBnaXZlbiBpbXBvcnQgZmxhZyBzZXQuICovXG5jb25zdCBoYXNGbGFnID0gKGRhdGE6IEFuYWx5emVkSW1wb3J0LCBmbGFnOiBJbXBvcnRTdGF0ZSkgPT4gKGRhdGEuc3RhdGUgJiBmbGFnKSAhPT0gMDtcblxuLyoqXG4gKiBJbXBvcnQgbWFuYWdlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBvciByZW1vdmUgVHlwZVNjcmlwdCBpbXBvcnRzIHdpdGhpbiBzb3VyY2VcbiAqIGZpbGVzLiBUaGUgbWFuYWdlciBlbnN1cmVzIHRoYXQgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb25zIGFyZSBhcHBsaWVkIHByb3Blcmx5XG4gKiB3aXRob3V0IHNoaWZ0ZWQgb2Zmc2V0cyBhbmQgdGhhdCBleGlzdGluZyBpbXBvcnRzIGFyZSByZS11c2VkLlxuICovXG5leHBvcnQgY2xhc3MgSW1wb3J0TWFuYWdlciB7XG4gIC8qKiBNYXAgb2Ygc291cmNlLWZpbGVzIGFuZCB0aGVpciBwcmV2aW91c2x5IHVzZWQgaWRlbnRpZmllciBuYW1lcy4gKi9cbiAgcHJpdmF0ZSBfdXNlZElkZW50aWZpZXJOYW1lcyA9IG5ldyBNYXA8dHMuU291cmNlRmlsZSwgc3RyaW5nW10+KCk7XG5cbiAgLyoqIE1hcCBvZiBzb3VyY2UgZmlsZXMgYW5kIHRoZWlyIGFuYWx5emVkIGltcG9ydHMuICovXG4gIHByaXZhdGUgX2ltcG9ydENhY2hlID0gbmV3IE1hcDx0cy5Tb3VyY2VGaWxlLCBBbmFseXplZEltcG9ydFtdPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbGVTeXN0ZW06IEZpbGVTeXN0ZW0sIHByaXZhdGUgX3ByaW50ZXI6IHRzLlByaW50ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEFuYWx5emVzIHRoZSBpbXBvcnQgb2YgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZSBpZiBuZWVkZWQuIEluIG9yZGVyIHRvIHBlcmZvcm1cbiAgICogbW9kaWZpY2F0aW9ucyB0byBpbXBvcnRzIG9mIGEgc291cmNlIGZpbGUsIHdlIHN0b3JlIGFsbCBpbXBvcnRzIGluIG1lbW9yeSBhbmRcbiAgICogdXBkYXRlIHRoZSBzb3VyY2UgZmlsZSBvbmNlIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLiBUaGlzIGlzIGVzc2VudGlhbCB0b1xuICAgKiBlbnN1cmUgdGhhdCB3ZSBjYW4gcmUtdXNlIG5ld2x5IGFkZGVkIGltcG9ydHMgYW5kIG5vdCBicmVhayBmaWxlIG9mZnNldHMuXG4gICAqL1xuICBwcml2YXRlIF9hbmFseXplSW1wb3J0c0lmTmVlZGVkKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBBbmFseXplZEltcG9ydFtdIHtcbiAgICBpZiAodGhpcy5faW1wb3J0Q2FjaGUuaGFzKHNvdXJjZUZpbGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW1wb3J0Q2FjaGUuZ2V0KHNvdXJjZUZpbGUpITtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IEFuYWx5emVkSW1wb3J0W10gPSBbXTtcbiAgICBmb3IgKGxldCBub2RlIG9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cykge1xuICAgICAgaWYgKCF0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHx8ICF0cy5pc1N0cmluZ0xpdGVyYWwobm9kZS5tb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2R1bGVOYW1lID0gbm9kZS5tb2R1bGVTcGVjaWZpZXIudGV4dDtcblxuICAgICAgLy8gSGFuZGxlcyBzaWRlLWVmZmVjdCBpbXBvcnRzIHdoaWNoIGRvIG5laXRoZXIgaGF2ZSBhIG5hbWUgb3JcbiAgICAgIC8vIHNwZWNpZmllcnMuIGUuZy4gYGltcG9ydCBcIm15LXBhY2thZ2VcIjtgXG4gICAgICBpZiAoIW5vZGUuaW1wb3J0Q2xhdXNlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHttb2R1bGVOYW1lLCBub2RlLCBzdGF0ZTogSW1wb3J0U3RhdGUuVU5NT0RJRklFRH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlcyBpbXBvcnRzIHJlc29sdmluZyB0byBkZWZhdWx0IGV4cG9ydHMgb2YgYSBtb2R1bGUuXG4gICAgICAvLyBlLmcuIGBpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtgXG4gICAgICBpZiAoIW5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBuYW1lOiBub2RlLmltcG9ydENsYXVzZS5uYW1lLFxuICAgICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVELFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZXMgaW1wb3J0cyB3aXRoIGluZGl2aWR1YWwgc3ltYm9sIHNwZWNpZmllcnMuXG4gICAgICAvLyBlLmcuIGBpbXBvcnQge0EsIEIsIEN9IGZyb20gXCJteS1tb2R1bGVcIjtgXG4gICAgICBpZiAodHMuaXNOYW1lZEltcG9ydHMobm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBzcGVjaWZpZXJzOiBub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzLmVsZW1lbnRzLm1hcChlbCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogZWwucHJvcGVydHlOYW1lLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdGF0ZTogSW1wb3J0U3RhdGUuVU5NT0RJRklFRCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGVzIG5hbWVzcGFjZWQgaW1wb3J0cy4gZS5nLiBgaW1wb3J0ICogYXMgY29yZSBmcm9tIFwibXktcGtnXCI7YFxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG5hbWU6IG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MubmFtZSxcbiAgICAgICAgICBuYW1lc3BhY2U6IHRydWUsXG4gICAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbXBvcnRDYWNoZS5zZXQoc291cmNlRmlsZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzcGVjaWZpZXIsIHdoaWNoIGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBwYXRoLFxuICAgKiBtYXRjaGVzIHRoZSBwYXNzZWQgbW9kdWxlIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIF9pc01vZHVsZVNwZWNpZmllck1hdGNoaW5nKFxuICAgIGJhc2VQYXRoOiBzdHJpbmcsXG4gICAgc3BlY2lmaWVyOiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgPyByZXNvbHZlKGJhc2VQYXRoLCBzcGVjaWZpZXIpID09PSByZXNvbHZlKGJhc2VQYXRoLCBtb2R1bGVOYW1lKVxuICAgICAgOiBzcGVjaWZpZXIgPT09IG1vZHVsZU5hbWU7XG4gIH1cblxuICAvKiogRGVsZXRlcyBhIGdpdmVuIG5hbWVkIGJpbmRpbmcgaW1wb3J0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZS4gKi9cbiAgZGVsZXRlTmFtZWRCaW5kaW5nSW1wb3J0KHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHN5bWJvbE5hbWU6IHN0cmluZywgbW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gZGlybmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2FuYWx5emVJbXBvcnRzSWZOZWVkZWQoc291cmNlRmlsZSk7XG5cbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLl9pc01vZHVsZVNwZWNpZmllck1hdGNoaW5nKHNvdXJjZURpciwgaW1wb3J0RGF0YS5tb2R1bGVOYW1lLCBtb2R1bGVOYW1lKSB8fFxuICAgICAgICAhaW1wb3J0RGF0YS5zcGVjaWZpZXJzXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmllckluZGV4ID0gaW1wb3J0RGF0YS5zcGVjaWZpZXJzLmZpbmRJbmRleChcbiAgICAgICAgZCA9PiAoZC5wcm9wZXJ0eU5hbWUgfHwgZC5uYW1lKS50ZXh0ID09PSBzeW1ib2xOYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChzcGVjaWZpZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgaW1wb3J0RGF0YS5zcGVjaWZpZXJzLnNwbGljZShzcGVjaWZpZXJJbmRleCwgMSk7XG4gICAgICAgIC8vIGlmIHRoZSBpbXBvcnQgZG9lcyBubyBsb25nZXIgY29udGFpbiBhbnkgc3BlY2lmaWVycyBhZnRlciB0aGUgcmVtb3ZhbCBvZiB0aGVcbiAgICAgICAgLy8gZ2l2ZW4gc3ltYm9sLCB3ZSBjYW4ganVzdCBtYXJrIHRoZSB3aG9sZSBpbXBvcnQgZm9yIGRlbGV0aW9uLiBPdGhlcndpc2UsIHdlIG1hcmtcbiAgICAgICAgLy8gaXQgYXMgbW9kaWZpZWQgc28gdGhhdCBpdCB3aWxsIGJlIHJlLXByaW50ZWQuXG4gICAgICAgIGlmIChpbXBvcnREYXRhLnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaW1wb3J0RGF0YS5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5ERUxFVEVEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuTU9ESUZJRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVsZXRlcyB0aGUgaW1wb3J0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaW1wb3J0IGRlY2xhcmF0aW9uIGlmIGZvdW5kLiAqL1xuICBkZWxldGVJbXBvcnRCeURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiB0cy5JbXBvcnREZWNsYXJhdGlvbikge1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCkpO1xuICAgIGZvciAobGV0IGltcG9ydERhdGEgb2YgZmlsZUltcG9ydHMpIHtcbiAgICAgIGlmIChpbXBvcnREYXRhLm5vZGUgPT09IGRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuREVMRVRFRDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpbXBvcnQgdG8gdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGFuZCByZXR1cm5zIHRoZSBUeXBlU2NyaXB0IGV4cHJlc3Npb24gdGhhdFxuICAgKiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIG5ld2x5IGltcG9ydGVkIHN5bWJvbC5cbiAgICpcbiAgICogV2hlbmV2ZXIgYW4gaW1wb3J0IGlzIGFkZGVkIHRvIGEgc291cmNlIGZpbGUsIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB0aGUgcmV0dXJuZWRcbiAgICogZXhwcmVzc2lvbiBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aCBzeW1ib2wuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHN5bWJvbFxuICAgKiBjb3VsZCBiZSBhbGlhc2VkIGlmIGl0IHdvdWxkIGNvbGxpZGUgd2l0aCBleGlzdGluZyBpbXBvcnRzIGluIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byB3aGljaCB0aGUgaW1wb3J0IHNob3VsZCBiZSBhZGRlZC5cbiAgICogQHBhcmFtIHN5bWJvbE5hbWUgTmFtZSBvZiB0aGUgc3ltYm9sIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBDYW4gYmUgbnVsbCBpZlxuICAgKiAgICB0aGUgZGVmYXVsdCBleHBvcnQgaXMgcmVxdWVzdGVkLlxuICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBOYW1lIG9mIHRoZSBtb2R1bGUgb2Ygd2hpY2ggdGhlIHN5bWJvbCBzaG91bGQgYmUgaW1wb3J0ZWQuXG4gICAqIEBwYXJhbSB0eXBlSW1wb3J0IFdoZXRoZXIgdGhlIHN5bWJvbCBpcyBhIHR5cGUuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgdGhlIGltcG9ydCBtYW5hZ2VyIGNoZWNrcyBmb3IgaW1wb3J0IGNvbGxpc2lvbnMuXG4gICAqL1xuICBhZGRJbXBvcnRUb1NvdXJjZUZpbGUoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICBzeW1ib2xOYW1lOiBzdHJpbmcgfCBudWxsLFxuICAgIG1vZHVsZU5hbWU6IHN0cmluZyxcbiAgICB0eXBlSW1wb3J0ID0gZmFsc2UsXG4gICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSA9IFtdLFxuICApOiB0cy5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBkaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChzb3VyY2VGaWxlKTtcblxuICAgIGxldCBleGlzdGluZ0ltcG9ydDogQW5hbHl6ZWRJbXBvcnQgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzTW9kdWxlU3BlY2lmaWVyTWF0Y2hpbmcoc291cmNlRGlyLCBpbXBvcnREYXRhLm1vZHVsZU5hbWUsIG1vZHVsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBzeW1ib2wgbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGltcG9ydCBpcyByZXF1ZXN0ZWQuIEluIHRoYXRcbiAgICAgIC8vIGNhc2Ugd2Ugc2VhcmNoIGZvciBub24tbmFtZXNwYWNlIGFuZCBub24tc3BlY2lmaWVyIGltcG9ydHMuXG4gICAgICBpZiAoIXN5bWJvbE5hbWUgJiYgIWltcG9ydERhdGEubmFtZXNwYWNlICYmICFpbXBvcnREYXRhLnNwZWNpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihpbXBvcnREYXRhLm5hbWUhLnRleHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBjYXNlIGEgXCJUeXBlXCIgc3ltYm9sIGlzIGltcG9ydGVkLCB3ZSBjYW4ndCB1c2UgbmFtZXNwYWNlIGltcG9ydHNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2Ugb25seSBleHBvcnQgc3ltYm9scyBhdmFpbGFibGUgYXQgcnVudGltZSAobm8gdHlwZXMpXG4gICAgICBpZiAoaW1wb3J0RGF0YS5uYW1lc3BhY2UgJiYgIXR5cGVJbXBvcnQpIHtcbiAgICAgICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKFxuICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihpbXBvcnREYXRhLm5hbWUhLnRleHQpLFxuICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lIHx8ICdkZWZhdWx0JyksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGltcG9ydERhdGEuc3BlY2lmaWVycyAmJiBzeW1ib2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gaW1wb3J0RGF0YS5zcGVjaWZpZXJzLmZpbmQocyA9PlxuICAgICAgICAgIHMucHJvcGVydHlOYW1lID8gcy5wcm9wZXJ0eU5hbWUudGV4dCA9PT0gc3ltYm9sTmFtZSA6IHMubmFtZS50ZXh0ID09PSBzeW1ib2xOYW1lLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChleGlzdGluZ1NwZWNpZmllcikge1xuICAgICAgICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoZXhpc3RpbmdTcGVjaWZpZXIubmFtZS50ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluIGNhc2UgdGhlIHN5bWJvbCBjb3VsZCBub3QgYmUgZm91bmQgaW4gYW4gZXhpc3RpbmcgaW1wb3J0LCB3ZVxuICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24gYXMgaXQgY2FuIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZVxuICAgICAgICAvLyB0aGUgc3BlY2lmaWVkIHN5bWJvbCBuYW1lIHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZSBhIG5ldyBpbXBvcnQuXG4gICAgICAgIGV4aXN0aW5nSW1wb3J0ID0gaW1wb3J0RGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBpbXBvcnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbW9kdWxlLCB3ZVxuICAgIC8vIGp1c3QgdXBkYXRlIHRoZSBpbXBvcnQgc3BlY2lmaWVycyB0byBhbHNvIGltcG9ydCB0aGUgcmVxdWVzdGVkIHN5bWJvbC5cbiAgICBpZiAoZXhpc3RpbmdJbXBvcnQpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5SWRlbnRpZmllciA9IHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lISk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyID0gdGhpcy5fZ2V0VW5pcXVlSWRlbnRpZmllcihcbiAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgc3ltYm9sTmFtZSEsXG4gICAgICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA9IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIudGV4dCAhPT0gc3ltYm9sTmFtZTtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWUgPSBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyIDogcHJvcGVydHlJZGVudGlmaWVyO1xuXG4gICAgICBleGlzdGluZ0ltcG9ydC5zcGVjaWZpZXJzIS5wdXNoKHtcbiAgICAgICAgbmFtZTogaW1wb3J0TmFtZSxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBwcm9wZXJ0eUlkZW50aWZpZXIgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIGV4aXN0aW5nSW1wb3J0LnN0YXRlIHw9IEltcG9ydFN0YXRlLk1PRElGSUVEO1xuXG4gICAgICBpZiAoaGFzRmxhZyhleGlzdGluZ0ltcG9ydCwgSW1wb3J0U3RhdGUuREVMRVRFRCkpIHtcbiAgICAgICAgLy8gdW5zZXQgdGhlIGRlbGV0ZWQgZmxhZyBpZiB0aGUgaW1wb3J0IGlzIHBlbmRpbmcgZGVsZXRpb24sIGJ1dFxuICAgICAgICAvLyBjYW4gbm93IGJlIHVzZWQgZm9yIHRoZSBuZXcgaW1wb3J0ZWQgc3ltYm9sLlxuICAgICAgICBleGlzdGluZ0ltcG9ydC5zdGF0ZSAmPSB+SW1wb3J0U3RhdGUuREVMRVRFRDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltcG9ydE5hbWU7XG4gICAgfVxuXG4gICAgbGV0IGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbmV3SW1wb3J0OiBBbmFseXplZEltcG9ydCB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKHN5bWJvbE5hbWUpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5SWRlbnRpZmllciA9IHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lKTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIgPSB0aGlzLl9nZXRVbmlxdWVJZGVudGlmaWVyKFxuICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICBzeW1ib2xOYW1lLFxuICAgICAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPSBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyLnRleHQgIT09IHN5bWJvbE5hbWU7XG4gICAgICBpZGVudGlmaWVyID0gbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllciA6IHByb3BlcnR5SWRlbnRpZmllcjtcblxuICAgICAgY29uc3QgbmV3SW1wb3J0RGVjbCA9IHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydENsYXVzZShmYWxzZSwgdW5kZWZpbmVkLCB0cy5mYWN0b3J5LmNyZWF0ZU5hbWVkSW1wb3J0cyhbXSkpLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZVN0cmluZ0xpdGVyYWwobW9kdWxlTmFtZSksXG4gICAgICApO1xuXG4gICAgICBuZXdJbXBvcnQgPSB7XG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIG5vZGU6IG5ld0ltcG9ydERlY2wsXG4gICAgICAgIHNwZWNpZmllcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA/IHByb3BlcnR5SWRlbnRpZmllciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5hbWU6IGlkZW50aWZpZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLkFEREVELFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRlbnRpZmllciA9IHRoaXMuX2dldFVuaXF1ZUlkZW50aWZpZXIoXG4gICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICdkZWZhdWx0RXhwb3J0JyxcbiAgICAgICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbmV3SW1wb3J0RGVjbCA9IHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydENsYXVzZShmYWxzZSwgaWRlbnRpZmllciwgdW5kZWZpbmVkKSxcbiAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVTdHJpbmdMaXRlcmFsKG1vZHVsZU5hbWUpLFxuICAgICAgKTtcbiAgICAgIG5ld0ltcG9ydCA9IHtcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgbm9kZTogbmV3SW1wb3J0RGVjbCxcbiAgICAgICAgbmFtZTogaWRlbnRpZmllcixcbiAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLkFEREVELFxuICAgICAgfTtcbiAgICB9XG4gICAgZmlsZUltcG9ydHMucHVzaChuZXdJbXBvcnQpO1xuICAgIHJldHVybiBpZGVudGlmaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIHJlY29yZGVkIGNoYW5nZXMgaW4gdGhlIHVwZGF0ZSByZWNvcmRlcnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzLlxuICAgKiBUaGUgY2hhbmdlcyBhcmUgYXBwbGllZCBzZXBhcmF0ZWx5IGFmdGVyIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiByZWNvcmRlZCBiZWNhdXNlIG90aGVyd2lzZVxuICAgKiBmaWxlIG9mZnNldHMgd2lsbCBjaGFuZ2UgYW5kIHRoZSBzb3VyY2UgZmlsZXMgd291bGQgbmVlZCB0byBiZSByZS1wYXJzZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UuXG4gICAqL1xuICByZWNvcmRDaGFuZ2VzKCkge1xuICAgIHRoaXMuX2ltcG9ydENhY2hlLmZvckVhY2goKGZpbGVJbXBvcnRzLCBzb3VyY2VGaWxlKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuX2ZpbGVTeXN0ZW0uZWRpdCh0aGlzLl9maWxlU3lzdGVtLnJlc29sdmUoc291cmNlRmlsZS5maWxlTmFtZSkpO1xuICAgICAgY29uc3QgbGFzdFVubW9kaWZpZWRJbXBvcnQgPSBmaWxlSW1wb3J0c1xuICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgIC5maW5kKGkgPT4gaS5zdGF0ZSA9PT0gSW1wb3J0U3RhdGUuVU5NT0RJRklFRCk7XG4gICAgICBjb25zdCBpbXBvcnRTdGFydEluZGV4ID0gbGFzdFVubW9kaWZpZWRJbXBvcnRcbiAgICAgICAgPyB0aGlzLl9nZXRFbmRQb3NpdGlvbk9mTm9kZShsYXN0VW5tb2RpZmllZEltcG9ydC5ub2RlKVxuICAgICAgICA6IDA7XG5cbiAgICAgIGZpbGVJbXBvcnRzLmZvckVhY2goaW1wb3J0RGF0YSA9PiB7XG4gICAgICAgIGlmIChpbXBvcnREYXRhLnN0YXRlID09PSBJbXBvcnRTdGF0ZS5VTk1PRElGSUVEKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuREVMRVRFRCkpIHtcbiAgICAgICAgICAvLyBJbXBvcnRzIHdoaWNoIGRvIG5vdCBleGlzdCBpbiBzb3VyY2UgZmlsZSwgY2FuIGJlIGp1c3Qgc2tpcHBlZCBhc1xuICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIGFueSByZXBsYWNlbWVudCB0byBkZWxldGUgdGhlIGltcG9ydC5cbiAgICAgICAgICBpZiAoIWhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgICAgICByZWNvcmRlci5yZW1vdmUoaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxTdGFydCgpLCBpbXBvcnREYXRhLm5vZGUuZ2V0RnVsbFdpZHRoKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1wb3J0RGF0YS5zcGVjaWZpZXJzKSB7XG4gICAgICAgICAgY29uc3QgbmFtZWRCaW5kaW5ncyA9IGltcG9ydERhdGEubm9kZS5pbXBvcnRDbGF1c2UhLm5hbWVkQmluZGluZ3MgYXMgdHMuTmFtZWRJbXBvcnRzO1xuICAgICAgICAgIGNvbnN0IGltcG9ydFNwZWNpZmllcnMgPSBpbXBvcnREYXRhLnNwZWNpZmllcnMubWFwKHMgPT5cbiAgICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0U3BlY2lmaWVyKGZhbHNlLCBzLnByb3BlcnR5TmFtZSwgcy5uYW1lKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRCaW5kaW5ncyA9IHRzLmZhY3RvcnkudXBkYXRlTmFtZWRJbXBvcnRzKG5hbWVkQmluZGluZ3MsIGltcG9ydFNwZWNpZmllcnMpO1xuXG4gICAgICAgICAgLy8gSW4gY2FzZSBhbiBpbXBvcnQgaGFzIGJlZW4gYWRkZWQgbmV3bHksIHdlIG5lZWQgdG8gcHJpbnQgdGhlIHdob2xlIGltcG9ydFxuICAgICAgICAgIC8vIGRlY2xhcmF0aW9uIGFuZCBpbnNlcnQgaXQgYXQgdGhlIGltcG9ydCBzdGFydCBpbmRleC4gT3RoZXJ3aXNlLCB3ZSBqdXN0XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lZCBiaW5kaW5ncyB0byBub3QgcmUtcHJpbnQgdGhlIHdob2xlIGltcG9ydCAod2hpY2ggY291bGRcbiAgICAgICAgICAvLyBjYXVzZSB1bm5lY2Vzc2FyeSBmb3JtYXR0aW5nIGNoYW5nZXMpXG4gICAgICAgICAgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSW1wb3J0ID0gdHMuZmFjdG9yeS51cGRhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgaW1wb3J0RGF0YS5ub2RlLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVJbXBvcnRDbGF1c2UoZmFsc2UsIHVuZGVmaW5lZCwgdXBkYXRlZEJpbmRpbmdzKSxcbiAgICAgICAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVTdHJpbmdMaXRlcmFsKGltcG9ydERhdGEubW9kdWxlTmFtZSksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBuZXdJbXBvcnRUZXh0ID0gdGhpcy5fcHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgICB1cGRhdGVkSW1wb3J0LFxuICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlY29yZGVyLmluc2VydExlZnQoXG4gICAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXggPT09IDAgPyBgJHtuZXdJbXBvcnRUZXh0fVxcbmAgOiBgXFxuJHtuZXdJbXBvcnRUZXh0fWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5NT0RJRklFRCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld05hbWVkQmluZGluZ3NUZXh0ID0gdGhpcy5fcHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgICB1cGRhdGVkQmluZGluZ3MsXG4gICAgICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVjb3JkZXIucmVtb3ZlKG5hbWVkQmluZGluZ3MuZ2V0U3RhcnQoKSwgbmFtZWRCaW5kaW5ncy5nZXRXaWR0aCgpKTtcbiAgICAgICAgICAgIHJlY29yZGVyLmluc2VydFJpZ2h0KG5hbWVkQmluZGluZ3MuZ2V0U3RhcnQoKSwgbmV3TmFtZWRCaW5kaW5nc1RleHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ltcG9ydFRleHQgPSB0aGlzLl9wcmludGVyLnByaW50Tm9kZShcbiAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgaW1wb3J0RGF0YS5ub2RlLFxuICAgICAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlY29yZGVyLmluc2VydExlZnQoXG4gICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4LFxuICAgICAgICAgICAgaW1wb3J0U3RhcnRJbmRleCA9PT0gMCA/IGAke25ld0ltcG9ydFRleHR9XFxuYCA6IGBcXG4ke25ld0ltcG9ydFRleHR9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIHNob3VsZCBuZXZlciBoaXQgdGhpcywgYnV0IHdlIHJhdGhlciB3YW50IHRvIHByaW50IGEgY3VzdG9tIGV4Y2VwdGlvblxuICAgICAgICAvLyBpbnN0ZWFkIG9mIGp1c3Qgc2tpcHBpbmcgaW1wb3J0cyBzaWxlbnRseS5cbiAgICAgICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgaW1wb3J0IG1vZGlmaWNhdGlvbi4nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcnJlY3RzIHRoZSBsaW5lIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgYSBnaXZlbiBub2RlLiBTaW5jZSBub2RlcyBvZlxuICAgKiBzb3VyY2UgZmlsZXMgYXJlIGltbXV0YWJsZSBhbmQgd2Ugc29tZXRpbWVzIG1ha2UgY2hhbmdlcyB0byB0aGUgY29udGFpbmluZ1xuICAgKiBzb3VyY2UgZmlsZSwgdGhlIG5vZGUgcG9zaXRpb24gbWlnaHQgc2hpZnQgKGUuZy4gaWYgd2UgYWRkIGEgbmV3IGltcG9ydCBiZWZvcmUpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGNvcnJlY3RlZCBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gbm9kZS4gVGhpc1xuICAgKiBpcyBoZWxwZnVsIHdoZW4gcHJpbnRpbmcgb3V0IGVycm9yIG1lc3NhZ2VzIHdoaWNoIHNob3VsZCByZWZsZWN0IHRoZSBuZXcgc3RhdGUgb2ZcbiAgICogc291cmNlIGZpbGVzLlxuICAgKi9cbiAgY29ycmVjdE5vZGVQb3NpdGlvbihub2RlOiB0cy5Ob2RlLCBvZmZzZXQ6IG51bWJlciwgcG9zaXRpb246IHRzLkxpbmVBbmRDaGFyYWN0ZXIpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG5cbiAgICBpZiAoIXRoaXMuX2ltcG9ydENhY2hlLmhhcyhzb3VyY2VGaWxlKSkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1Bvc2l0aW9uOiB0cy5MaW5lQW5kQ2hhcmFjdGVyID0gey4uLnBvc2l0aW9ufTtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2ltcG9ydENhY2hlLmdldChzb3VyY2VGaWxlKSE7XG5cbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBjb25zdCBmdWxsRW5kID0gaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxTdGFydCgpICsgaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxXaWR0aCgpO1xuICAgICAgLy8gU3VidHJhY3Qgb3IgYWRkIGxpbmVzIGJhc2VkIG9uIHdoZXRoZXIgYW4gaW1wb3J0IGhhcyBiZWVuIGRlbGV0ZWQgb3IgcmVtb3ZlZFxuICAgICAgLy8gYmVmb3JlIHRoZSBhY3R1YWwgbm9kZSBvZmZzZXQuXG4gICAgICBpZiAob2Zmc2V0ID4gZnVsbEVuZCAmJiBoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkRFTEVURUQpKSB7XG4gICAgICAgIG5ld1Bvc2l0aW9uLmxpbmUtLTtcbiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID4gZnVsbEVuZCAmJiBoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICBuZXdQb3NpdGlvbi5saW5lKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdQb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIHVuaXF1ZSBpZGVudGlmaWVyIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgc3ltYm9sIG5hbWUuXG4gICAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIHRvIGNoZWNrIGZvciBpZGVudGlmaWVyIGNvbGxpc2lvbnMuXG4gICAqIEBwYXJhbSBzeW1ib2xOYW1lIE5hbWUgb2YgdGhlIHN5bWJvbCBmb3Igd2hpY2ggd2Ugd2FudCB0byBnZW5lcmF0ZSBhbiB1bmlxdWUgbmFtZS5cbiAgICogQHBhcmFtIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zIExpc3Qgb2YgaWRlbnRpZmllcnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgd2hlblxuICAgKiAgICBjaGVja2luZyBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zIGluIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgX2dldFVuaXF1ZUlkZW50aWZpZXIoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICBzeW1ib2xOYW1lOiBzdHJpbmcsXG4gICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSxcbiAgKTogdHMuSWRlbnRpZmllciB7XG4gICAgaWYgKHRoaXMuX2lzVW5pcXVlSWRlbnRpZmllck5hbWUoc291cmNlRmlsZSwgc3ltYm9sTmFtZSwgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMpKSB7XG4gICAgICB0aGlzLl9yZWNvcmRVc2VkSWRlbnRpZmllcihzb3VyY2VGaWxlLCBzeW1ib2xOYW1lKTtcbiAgICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoc3ltYm9sTmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb3VudGVyID0gMTtcbiAgICBkbyB7XG4gICAgICBuYW1lID0gYCR7c3ltYm9sTmFtZX1fJHtjb3VudGVyKyt9YDtcbiAgICB9IHdoaWxlICghdGhpcy5faXNVbmlxdWVJZGVudGlmaWVyTmFtZShzb3VyY2VGaWxlLCBuYW1lLCBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucykpO1xuXG4gICAgdGhpcy5fcmVjb3JkVXNlZElkZW50aWZpZXIoc291cmNlRmlsZSwgbmFtZSEpO1xuICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIobmFtZSEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBuYW1lIGlzIHVzZWQgd2l0aGluIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS5cbiAgICogQHBhcmFtIHNvdXJjZUZpbGUgU291cmNlIGZpbGUgdG8gY2hlY2sgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucy5cbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaWRlbnRpZmllciB3aGljaCBpcyBjaGVja2VkIGZvciBpdHMgdW5pcXVlbmVzcy5cbiAgICogQHBhcmFtIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zIExpc3Qgb2YgaWRlbnRpZmllcnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgd2hlblxuICAgKiAgICBjaGVja2luZyBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zIGluIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgX2lzVW5pcXVlSWRlbnRpZmllck5hbWUoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fdXNlZElkZW50aWZpZXJOYW1lcy5oYXMoc291cmNlRmlsZSkgJiZcbiAgICAgIHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuZ2V0KHNvdXJjZUZpbGUpIS5pbmRleE9mKG5hbWUpICE9PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc291cmNlIGZpbGUgYW5kIHNlYXJjaCBmb3IgYW4gaWRlbnRpZmllciBtYXRjaGluZ1xuICAgIC8vIHRoZSBnaXZlbiBuYW1lLiBJbiB0aGF0IGNhc2UsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG5hbWVcbiAgICAvLyBpcyB1bmlxdWUgaW4gdGhlIGdpdmVuIGRlY2xhcmF0aW9uIHNjb3BlIGFuZCB3ZSBqdXN0IHJldHVybiBmYWxzZS5cbiAgICBjb25zdCBub2RlUXVldWU6IHRzLk5vZGVbXSA9IFtzb3VyY2VGaWxlXTtcbiAgICB3aGlsZSAobm9kZVF1ZXVlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVRdWV1ZS5zaGlmdCgpITtcbiAgICAgIGlmIChcbiAgICAgICAgdHMuaXNJZGVudGlmaWVyKG5vZGUpICYmXG4gICAgICAgIG5vZGUudGV4dCA9PT0gbmFtZSAmJlxuICAgICAgICAhaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMuaW5jbHVkZXMobm9kZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBub2RlUXVldWUucHVzaCguLi5ub2RlLmdldENoaWxkcmVuKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgdXNlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZS4gVGhpc1xuICAgKiBpcyBuZWNlc3Nhcnkgc2luY2Ugd2UgZG8gbm90IGFwcGx5IGNoYW5nZXMgdG8gc291cmNlIGZpbGVzIHBlciBjaGFuZ2UsIGJ1dCBzdGlsbFxuICAgKiB3YW50IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG5ld2x5IGltcG9ydGVkIHN5bWJvbHMuXG4gICAqL1xuICBwcml2YXRlIF9yZWNvcmRVc2VkSWRlbnRpZmllcihzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBpZGVudGlmaWVyTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXNlZElkZW50aWZpZXJOYW1lcy5zZXQoXG4gICAgICBzb3VyY2VGaWxlLFxuICAgICAgKHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuZ2V0KHNvdXJjZUZpbGUpIHx8IFtdKS5jb25jYXQoaWRlbnRpZmllck5hbWUpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgZnVsbCBlbmQgb2YgYSBnaXZlbiBub2RlLiBCeSBkZWZhdWx0IHRoZSBlbmQgcG9zaXRpb24gb2YgYSBub2RlIGlzXG4gICAqIGJlZm9yZSBhbGwgdHJhaWxpbmcgY29tbWVudHMuIFRoaXMgY291bGQgbWVhbiB0aGF0IGdlbmVyYXRlZCBpbXBvcnRzIHNoaWZ0IGNvbW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RW5kUG9zaXRpb25PZk5vZGUobm9kZTogdHMuTm9kZSkge1xuICAgIGNvbnN0IG5vZGVFbmRQb3MgPSBub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSB0cy5nZXRUcmFpbGluZ0NvbW1lbnRSYW5nZXMobm9kZS5nZXRTb3VyY2VGaWxlKCkudGV4dCwgbm9kZUVuZFBvcyk7XG4gICAgaWYgKCFjb21tZW50UmFuZ2VzIHx8ICFjb21tZW50UmFuZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5vZGVFbmRQb3M7XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50UmFuZ2VzW2NvbW1lbnRSYW5nZXMubGVuZ3RoIC0gMV0hLmVuZDtcbiAgfVxufVxuIl19