@wavemaker/app-ng-runtime 11.8.0-next.24904 → 11.8.0-next.27301

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 (346) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +5 -5
  2. app-ng-runtime/build-task/esm2022/basic/progress/progress-bar/progress-bar.build.mjs +1 -1
  3. app-ng-runtime/build-task/esm2022/page/page.build.mjs +3 -2
  4. app-ng-runtime/build-task/fesm2022/index.mjs +2 -1
  5. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  6. app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +5 -5
  7. app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +3 -2
  8. app-ng-runtime/components/advanced/carousel/esm2022/carousel.directive.mjs +1 -1
  9. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +2 -1
  10. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
  11. app-ng-runtime/components/advanced/login/bundles/index.umd.js +6 -6
  12. app-ng-runtime/components/advanced/login/esm2022/login.component.mjs +4 -3
  13. app-ng-runtime/components/advanced/login/fesm2022/index.mjs +3 -2
  14. app-ng-runtime/components/advanced/login/fesm2022/index.mjs.map +1 -1
  15. app-ng-runtime/components/base/bundles/index.umd.js +203 -171
  16. app-ng-runtime/components/base/esm2022/directives/show-in-device.directive.mjs +1 -1
  17. app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +12 -11
  18. app-ng-runtime/components/base/esm2022/pipes/wm-pipe.mjs +3 -2
  19. app-ng-runtime/components/base/esm2022/utils/data-utils.mjs +30 -29
  20. app-ng-runtime/components/base/esm2022/utils/form-utils.mjs +47 -41
  21. app-ng-runtime/components/base/esm2022/utils/live-utils.mjs +8 -7
  22. app-ng-runtime/components/base/esm2022/utils/widget-utils.mjs +28 -27
  23. app-ng-runtime/components/base/esm2022/widgets/common/base/base-container.component.mjs +4 -3
  24. app-ng-runtime/components/base/esm2022/widgets/common/base/base-field-validations.mjs +24 -21
  25. app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +12 -11
  26. app-ng-runtime/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +40 -14
  27. app-ng-runtime/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +3 -2
  28. app-ng-runtime/components/base/esm2022/widgets/common/dialog/dialog.service.mjs +3 -2
  29. app-ng-runtime/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +1 -1
  30. app-ng-runtime/components/base/esm2022/widgets/common/partial/partial.directive.mjs +3 -2
  31. app-ng-runtime/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +3 -2
  32. app-ng-runtime/components/base/esm2022/widgets/common/smooth-scroll/smooth-scroll.directive.mjs +6 -5
  33. app-ng-runtime/components/base/esm2022/widgets/framework/deviceview.mjs +1 -1
  34. app-ng-runtime/components/base/esm2022/widgets/framework/property-change-handler.mjs +3 -2
  35. app-ng-runtime/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +4 -3
  36. app-ng-runtime/components/base/fesm2022/index.mjs +206 -173
  37. app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
  38. app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
  39. app-ng-runtime/components/base/utils/data-utils.d.ts +0 -1
  40. app-ng-runtime/components/base/utils/widget-utils.d.ts +2 -2
  41. app-ng-runtime/components/base/widgets/common/base/base-field-validations.d.ts +1 -1
  42. app-ng-runtime/components/base/widgets/common/base/partial-container.directive.d.ts +1 -1
  43. app-ng-runtime/components/basic/default/bundles/index.umd.js +10 -10
  44. app-ng-runtime/components/basic/default/esm2022/label/label.directive.mjs +4 -3
  45. app-ng-runtime/components/basic/default/esm2022/spinner/spinner.component.mjs +6 -5
  46. app-ng-runtime/components/basic/default/fesm2022/index.mjs +7 -6
  47. app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
  48. app-ng-runtime/components/basic/progress/bundles/index.umd.js +13 -13
  49. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +5 -4
  50. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +6 -5
  51. app-ng-runtime/components/basic/progress/esm2022/utils.mjs +3 -3
  52. app-ng-runtime/components/basic/progress/fesm2022/index.mjs +10 -9
  53. app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
  54. app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +15 -10
  55. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +14 -8
  56. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +13 -7
  57. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  58. app-ng-runtime/components/basic/rich-text-editor/rich-text-editor.component.d.ts +2 -2
  59. app-ng-runtime/components/basic/search/bundles/index.umd.js +67 -65
  60. app-ng-runtime/components/basic/search/esm2022/data-provider/data-provider.mjs +1 -1
  61. app-ng-runtime/components/basic/search/esm2022/data-provider/local-data-provider.mjs +26 -23
  62. app-ng-runtime/components/basic/search/esm2022/data-provider/remote-data-provider.mjs +12 -11
  63. app-ng-runtime/components/basic/search/esm2022/search.component.mjs +31 -30
  64. app-ng-runtime/components/basic/search/fesm2022/index.mjs +66 -63
  65. app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
  66. app-ng-runtime/components/basic/tree/bundles/index.umd.js +9 -9
  67. app-ng-runtime/components/basic/tree/esm2022/tree.component.mjs +7 -6
  68. app-ng-runtime/components/basic/tree/fesm2022/index.mjs +6 -5
  69. app-ng-runtime/components/basic/tree/fesm2022/index.mjs.map +1 -1
  70. app-ng-runtime/components/chart/bundles/index.umd.js +72 -63
  71. app-ng-runtime/components/chart/chart.component.d.ts +1 -1
  72. app-ng-runtime/components/chart/chart.utils.d.ts +3 -3
  73. app-ng-runtime/components/chart/esm2022/chart.component.mjs +58 -48
  74. app-ng-runtime/components/chart/esm2022/chart.utils.mjs +14 -13
  75. app-ng-runtime/components/chart/fesm2022/index.mjs +69 -59
  76. app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
  77. app-ng-runtime/components/containers/accordion/bundles/index.umd.js +16 -16
  78. app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +14 -13
  79. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +13 -12
  80. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
  81. app-ng-runtime/components/containers/panel/bundles/index.umd.js +5 -5
  82. app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +3 -2
  83. app-ng-runtime/components/containers/panel/fesm2022/index.mjs +2 -1
  84. app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
  85. app-ng-runtime/components/containers/panel/panel.component.d.ts +1 -1
  86. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +17 -17
  87. app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +15 -14
  88. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +14 -13
  89. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  90. app-ng-runtime/components/data/form/bundles/index.umd.js +75 -75
  91. app-ng-runtime/components/data/form/esm2022/form-action/form-action.directive.mjs +3 -2
  92. app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +10 -9
  93. app-ng-runtime/components/data/form/esm2022/form.component.mjs +54 -53
  94. app-ng-runtime/components/data/form/esm2022/live-filter/live-filter.directive.mjs +3 -2
  95. app-ng-runtime/components/data/form/esm2022/live-form/live-form.directive.mjs +11 -10
  96. app-ng-runtime/components/data/form/fesm2022/index.mjs +77 -76
  97. app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
  98. app-ng-runtime/components/data/form/form.component.d.ts +2 -2
  99. app-ng-runtime/components/data/form/live-form/live-form.directive.d.ts +1 -1
  100. app-ng-runtime/components/data/list/bundles/index.umd.js +692 -687
  101. app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +1 -1
  102. app-ng-runtime/components/data/list/esm2022/list.animator.mjs +5 -3
  103. app-ng-runtime/components/data/list/esm2022/list.component.mjs +687 -682
  104. app-ng-runtime/components/data/list/fesm2022/index.mjs +690 -684
  105. app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
  106. app-ng-runtime/components/data/list/list.component.d.ts +53 -53
  107. app-ng-runtime/components/data/live-table/bundles/index.umd.js +1 -1
  108. app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +2 -2
  109. app-ng-runtime/components/data/live-table/fesm2022/index.mjs +1 -1
  110. app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
  111. app-ng-runtime/components/data/pagination/bundles/index.umd.js +14 -14
  112. app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +12 -11
  113. app-ng-runtime/components/data/pagination/fesm2022/index.mjs +11 -10
  114. app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
  115. app-ng-runtime/components/data/table/bundles/index.umd.js +175 -172
  116. app-ng-runtime/components/data/table/esm2022/table-action/table-action.directive.mjs +3 -2
  117. app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +19 -18
  118. app-ng-runtime/components/data/table/esm2022/table-cud.directive.mjs +7 -6
  119. app-ng-runtime/components/data/table/esm2022/table-filter.directive.mjs +53 -55
  120. app-ng-runtime/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +3 -2
  121. app-ng-runtime/components/data/table/esm2022/table.component.mjs +98 -91
  122. app-ng-runtime/components/data/table/fesm2022/index.mjs +172 -168
  123. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  124. app-ng-runtime/components/data/table/table-column/table-column.directive.d.ts +6 -6
  125. app-ng-runtime/components/data/table/table.component.d.ts +2 -2
  126. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +2 -2
  127. app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +3 -3
  128. app-ng-runtime/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +1 -1
  129. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +1 -1
  130. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  131. app-ng-runtime/components/input/calendar/bundles/index.umd.js +33 -31
  132. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +31 -28
  133. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +30 -27
  134. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  135. app-ng-runtime/components/input/chips/bundles/index.umd.js +29 -28
  136. app-ng-runtime/components/input/chips/chips.component.d.ts +1 -1
  137. app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +27 -25
  138. app-ng-runtime/components/input/chips/fesm2022/index.mjs +26 -24
  139. app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
  140. app-ng-runtime/components/input/default/base-form.component.d.ts +3 -3
  141. app-ng-runtime/components/input/default/bundles/index.umd.js +75 -62
  142. app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +1 -0
  143. app-ng-runtime/components/input/default/dataset-aware-form.component.d.ts +4 -4
  144. app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +14 -8
  145. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +3 -2
  146. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +2 -2
  147. app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +6 -4
  148. app-ng-runtime/components/input/default/esm2022/dataset-aware-form.component.mjs +29 -23
  149. app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +4 -3
  150. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +4 -3
  151. app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +6 -5
  152. app-ng-runtime/components/input/default/esm2022/text/base/base-input.mjs +4 -3
  153. app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +20 -18
  154. app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +2 -2
  155. app-ng-runtime/components/input/default/fesm2022/index.mjs +75 -62
  156. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  157. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +1 -1
  158. app-ng-runtime/components/input/epoch/bundles/index.umd.js +53 -51
  159. app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +34 -31
  160. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +5 -4
  161. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +5 -4
  162. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +7 -6
  163. app-ng-runtime/components/input/epoch/esm2022/picker/picker.component.mjs +1 -1
  164. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +6 -5
  165. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +48 -45
  166. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  167. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +15 -15
  168. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +13 -12
  169. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +12 -11
  170. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  171. app-ng-runtime/components/input/rating/bundles/index.umd.js +12 -12
  172. app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +10 -9
  173. app-ng-runtime/components/input/rating/fesm2022/index.mjs +9 -8
  174. app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
  175. app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +1 -1
  176. app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +2 -2
  177. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +1 -1
  178. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
  179. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +23 -22
  180. app-ng-runtime/components/navigation/menu/esm2022/menu-adapator.component.mjs +3 -2
  181. app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +6 -5
  182. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +8 -7
  183. app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +10 -8
  184. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +20 -18
  185. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  186. app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +12 -1
  187. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +1 -1
  188. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  189. app-ng-runtime/components/prefab/bundles/index.umd.js +6 -6
  190. app-ng-runtime/components/prefab/esm2022/prefab-container/prefab-container.directive.mjs +3 -2
  191. app-ng-runtime/components/prefab/esm2022/prefab.directive.mjs +3 -2
  192. app-ng-runtime/components/prefab/fesm2022/index.mjs +3 -2
  193. app-ng-runtime/components/prefab/fesm2022/index.mjs.map +1 -1
  194. app-ng-runtime/core/bundles/index.umd.js +119 -130
  195. app-ng-runtime/core/esm2022/public_api.mjs +2 -2
  196. app-ng-runtime/core/esm2022/services/field-type.service.mjs +3 -2
  197. app-ng-runtime/core/esm2022/services/field-widget.service.mjs +3 -2
  198. app-ng-runtime/core/esm2022/services/pagination.service.mjs +7 -6
  199. app-ng-runtime/core/esm2022/services/state-persistence.service.mjs +17 -16
  200. app-ng-runtime/core/esm2022/services/utils.service.mjs +3 -2
  201. app-ng-runtime/core/esm2022/services/viewport.service.mjs +3 -2
  202. app-ng-runtime/core/esm2022/utils/build-utils.mjs +5 -4
  203. app-ng-runtime/core/esm2022/utils/expression-parser.mjs +5 -4
  204. app-ng-runtime/core/esm2022/utils/lru-cache.mjs +3 -2
  205. app-ng-runtime/core/esm2022/utils/utils.mjs +79 -82
  206. app-ng-runtime/core/esm2022/utils/watcher.mjs +9 -7
  207. app-ng-runtime/core/fesm2022/index.mjs +117 -123
  208. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  209. app-ng-runtime/core/public_api.d.ts +1 -1
  210. app-ng-runtime/core/services/pagination.service.d.ts +1 -1
  211. app-ng-runtime/core/utils/utils.d.ts +5 -9
  212. app-ng-runtime/http/bundles/index.umd.js +7 -7
  213. app-ng-runtime/http/esm2022/http.service.mjs +5 -4
  214. app-ng-runtime/http/esm2022/wm-http-request.mjs +1 -1
  215. app-ng-runtime/http/esm2022/wm-http-response.mjs +1 -1
  216. app-ng-runtime/http/fesm2022/index.mjs +4 -3
  217. app-ng-runtime/http/fesm2022/index.mjs.map +1 -1
  218. app-ng-runtime/mobile/components/basic/default/bundles/index.umd.js +24 -20
  219. app-ng-runtime/mobile/components/basic/default/esm2022/anchor/anchor.directive.mjs +5 -4
  220. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +12 -8
  221. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-selector.service.mjs +5 -3
  222. app-ng-runtime/mobile/components/basic/default/esm2022/image-cache/image-cache.directive.mjs +3 -2
  223. app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +5 -4
  224. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs +21 -16
  225. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
  226. app-ng-runtime/mobile/components/containers/segmented-control/bundles/index.umd.js +7 -7
  227. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +2 -2
  228. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +4 -3
  229. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs +4 -3
  230. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
  231. app-ng-runtime/mobile/components/data/media-list/bundles/index.umd.js +8 -8
  232. app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.component.mjs +4 -3
  233. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs +3 -2
  234. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
  235. app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +5 -5
  236. app-ng-runtime/mobile/components/page/default/esm2022/page.directive.mjs +3 -2
  237. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs +2 -1
  238. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs.map +1 -1
  239. app-ng-runtime/mobile/components/page/tab-bar/bundles/index.umd.js +9 -9
  240. app-ng-runtime/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +7 -6
  241. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs +6 -5
  242. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
  243. app-ng-runtime/mobile/core/bundles/index.umd.js +25 -25
  244. app-ng-runtime/mobile/core/esm2022/services/device-file-download.service.mjs +5 -4
  245. app-ng-runtime/mobile/core/esm2022/services/device-file-opener.service.mjs +3 -2
  246. app-ng-runtime/mobile/core/esm2022/services/device-file-upload.service.mjs +4 -3
  247. app-ng-runtime/mobile/core/esm2022/services/device-file.service.mjs +6 -5
  248. app-ng-runtime/mobile/core/esm2022/services/device.service.mjs +3 -2
  249. app-ng-runtime/mobile/core/esm2022/services/ext-app-message.service.mjs +5 -4
  250. app-ng-runtime/mobile/core/esm2022/services/network.service.mjs +9 -8
  251. app-ng-runtime/mobile/core/fesm2022/index.mjs +22 -21
  252. app-ng-runtime/mobile/core/fesm2022/index.mjs.map +1 -1
  253. app-ng-runtime/mobile/core/services/ext-app-message.service.d.ts +1 -1
  254. app-ng-runtime/mobile/core/services/network.service.d.ts +7 -1
  255. app-ng-runtime/mobile/offline/bundles/index.umd.js +161 -144
  256. app-ng-runtime/mobile/offline/esm2022/models/local-db-store.mjs +23 -21
  257. app-ng-runtime/mobile/offline/esm2022/services/change-log.service.mjs +7 -6
  258. app-ng-runtime/mobile/offline/esm2022/services/local-db-data-pull.service.mjs +37 -35
  259. app-ng-runtime/mobile/offline/esm2022/services/local-db-management.service.mjs +54 -45
  260. app-ng-runtime/mobile/offline/esm2022/services/local-db.service.mjs +5 -4
  261. app-ng-runtime/mobile/offline/esm2022/services/workers/error-blocker.mjs +4 -3
  262. app-ng-runtime/mobile/offline/esm2022/services/workers/file-handler.mjs +18 -13
  263. app-ng-runtime/mobile/offline/esm2022/services/workers/multi-part-param-transformer.mjs +9 -5
  264. app-ng-runtime/mobile/offline/esm2022/utils/live-variable.utils.mjs +12 -11
  265. app-ng-runtime/mobile/offline/esm2022/utils/query-executor.utils.mjs +5 -4
  266. app-ng-runtime/mobile/offline/esm2022/utils/security.utils.mjs +3 -2
  267. app-ng-runtime/mobile/offline/fesm2022/index.mjs +156 -138
  268. app-ng-runtime/mobile/offline/fesm2022/index.mjs.map +1 -1
  269. app-ng-runtime/mobile/runtime/bundles/index.umd.js +11 -8
  270. app-ng-runtime/mobile/runtime/esm2022/mobile-runtime.module.mjs +3 -2
  271. app-ng-runtime/mobile/runtime/esm2022/services/cookie.service.mjs +6 -2
  272. app-ng-runtime/mobile/runtime/esm2022/services/http-interceptor.service.mjs +4 -3
  273. app-ng-runtime/mobile/runtime/fesm2022/index.mjs +8 -4
  274. app-ng-runtime/mobile/runtime/fesm2022/index.mjs.map +1 -1
  275. app-ng-runtime/mobile/runtime-dynamic/bundles/index.umd.js +2 -2
  276. app-ng-runtime/mobile/runtime-dynamic/esm2022/services/live-sync.service.mjs +3 -3
  277. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs +2 -2
  278. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs.map +1 -1
  279. app-ng-runtime/mobile/variables/bundles/index.umd.js +23 -16
  280. app-ng-runtime/mobile/variables/esm2022/services/camera-service.mjs +2 -2
  281. app-ng-runtime/mobile/variables/esm2022/services/datasync-service.mjs +10 -9
  282. app-ng-runtime/mobile/variables/esm2022/services/file-service.mjs +11 -3
  283. app-ng-runtime/mobile/variables/fesm2022/index.mjs +19 -11
  284. app-ng-runtime/mobile/variables/fesm2022/index.mjs.map +1 -1
  285. app-ng-runtime/oAuth/bundles/index.umd.js +12 -12
  286. app-ng-runtime/oAuth/esm2022/oAuth.service.mjs +4 -3
  287. app-ng-runtime/oAuth/esm2022/oAuth.utils.mjs +8 -7
  288. app-ng-runtime/oAuth/fesm2022/index.mjs +9 -8
  289. app-ng-runtime/oAuth/fesm2022/index.mjs.map +1 -1
  290. app-ng-runtime/package.json +1 -1
  291. app-ng-runtime/runtime/base/bundles/index.umd.js +121 -120
  292. app-ng-runtime/runtime/base/esm2022/components/base-layout.component.mjs +4 -3
  293. app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +14 -13
  294. app-ng-runtime/runtime/base/esm2022/components/base-partial.component.mjs +13 -12
  295. app-ng-runtime/runtime/base/esm2022/components/base-prefab.component.mjs +15 -14
  296. app-ng-runtime/runtime/base/esm2022/components/base-spa-page.component.mjs +14 -13
  297. app-ng-runtime/runtime/base/esm2022/components/custom-toaster.component.mjs +6 -5
  298. app-ng-runtime/runtime/base/esm2022/directives/accessroles.directive.mjs +11 -10
  299. app-ng-runtime/runtime/base/esm2022/guards/page-not-found.guard.mjs +1 -1
  300. app-ng-runtime/runtime/base/esm2022/guards/role.guard.mjs +3 -2
  301. app-ng-runtime/runtime/base/esm2022/services/app-defaults.service.mjs +1 -1
  302. app-ng-runtime/runtime/base/esm2022/services/app.manager.service.mjs +17 -14
  303. app-ng-runtime/runtime/base/esm2022/services/app.service.mjs +7 -6
  304. app-ng-runtime/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +3 -2
  305. app-ng-runtime/runtime/base/esm2022/services/http-interceptor.services.mjs +4 -3
  306. app-ng-runtime/runtime/base/esm2022/services/i18n.service.mjs +12 -10
  307. app-ng-runtime/runtime/base/esm2022/services/navigation.service.mjs +8 -7
  308. app-ng-runtime/runtime/base/esm2022/services/prefab-manager.service.mjs +3 -2
  309. app-ng-runtime/runtime/base/esm2022/services/spinner.service.mjs +7 -6
  310. app-ng-runtime/runtime/base/esm2022/services/toaster.service.mjs +6 -5
  311. app-ng-runtime/runtime/base/esm2022/util/wm-route-reuse-strategy.mjs +6 -7
  312. app-ng-runtime/runtime/base/fesm2022/index.mjs +119 -117
  313. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  314. app-ng-runtime/runtime/base/services/i18n.service.d.ts +1 -1
  315. app-ng-runtime/runtime/dynamic/bundles/index.umd.js +7 -7
  316. app-ng-runtime/runtime/dynamic/esm2022/app/services/component-ref-provider.service.mjs +4 -3
  317. app-ng-runtime/runtime/dynamic/esm2022/main.mjs +3 -2
  318. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs +4 -3
  319. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  320. app-ng-runtime/scripts/jquery-ui/ui/widgets/droppable.js +7 -7
  321. app-ng-runtime/scripts/jquery-ui/ui/widgets/resizable.js +13 -10
  322. app-ng-runtime/scripts/jquery-ui/ui/widgets/sortable.js +7 -7
  323. app-ng-runtime/security/bundles/index.umd.js +14 -14
  324. app-ng-runtime/security/esm2022/security.service.mjs +12 -11
  325. app-ng-runtime/security/fesm2022/index.mjs +11 -10
  326. app-ng-runtime/security/fesm2022/index.mjs.map +1 -1
  327. app-ng-runtime/security/security.service.d.ts +1 -1
  328. app-ng-runtime/swipey/esm2022/swipe.animation.mjs +1 -1
  329. app-ng-runtime/swipey/fesm2022/index.mjs.map +1 -1
  330. app-ng-runtime/transpiler/bundles/index.umd.js +10 -9
  331. app-ng-runtime/transpiler/esm2022/build.mjs +8 -6
  332. app-ng-runtime/transpiler/fesm2022/index.mjs +7 -5
  333. app-ng-runtime/transpiler/fesm2022/index.mjs.map +1 -1
  334. app-ng-runtime/variables/bundles/index.umd.js +155 -145
  335. app-ng-runtime/variables/esm2022/manager/action/login-action.manager.mjs +15 -14
  336. app-ng-runtime/variables/esm2022/manager/action/notification-action.manager.mjs +9 -8
  337. app-ng-runtime/variables/esm2022/manager/variable/base-variable.manager.mjs +3 -2
  338. app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +11 -10
  339. app-ng-runtime/variables/esm2022/service/variables.service.mjs +7 -6
  340. app-ng-runtime/variables/esm2022/util/action/navigation-action.utils.mjs +4 -4
  341. app-ng-runtime/variables/esm2022/util/variable/pagination.utils.mjs +30 -23
  342. app-ng-runtime/variables/esm2022/util/variable/service-variable.utils.mjs +29 -28
  343. app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +75 -70
  344. app-ng-runtime/variables/fesm2022/index.mjs +169 -158
  345. app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
  346. app-ng-runtime/variables/util/variable/service-variable.utils.d.ts +1 -1
@@ -5,6 +5,7 @@ import { getFieldLayoutConfig, Live_Operations, MessageComponent, parseValueByTy
5
5
  import { PrefabDirective } from '@wm/components/prefab';
6
6
  import { ListComponent } from '@wm/components/data/list';
7
7
  import { registerFormProps } from './form.props';
8
+ import { debounce as _debounce, filter, find, findIndex, forEach, get, includes, isArray, isEmpty, isEqual, isUndefined, keys, last, set, some, split } from "lodash-es";
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "@angular/forms";
10
11
  import * as i2 from "@wm/core";
@@ -179,7 +180,7 @@ const getWidgetConfig = (isLiveForm, isLiveFilter, role) => {
179
180
  // Generate the form field with given field definition. Add a grid column wrapper around the form field.
180
181
  const setMarkupForFormField = (field, columnWidth) => {
181
182
  let propsTmpl = '';
182
- _.forEach(field, (value, key) => {
183
+ forEach(field, (value, key) => {
183
184
  propsTmpl = `${propsTmpl} ${key}="${value}"`;
184
185
  });
185
186
  return `<wm-gridcolumn columnwidth="${columnWidth}">
@@ -221,7 +222,7 @@ const setTouchedState = (self, ngForm, fieldName) => {
221
222
  return;
222
223
  }
223
224
  if (ngForm.controls) {
224
- _.forEach(ngForm.controls, (ctrl, fieldName) => {
225
+ forEach(ngForm.controls, (ctrl, fieldName) => {
225
226
  setTouchedState(self, ctrl, fieldName);
226
227
  });
227
228
  }
@@ -313,7 +314,7 @@ export class FormComponent extends StylableComponent {
313
314
  type: ''
314
315
  };
315
316
  this.primaryKey = [];
316
- this._debouncedUpdateFieldSource = _.debounce(this.updateFieldSource, 350);
317
+ this._debouncedUpdateFieldSource = _debounce(this.updateFieldSource, 350);
317
318
  this.validationMessages = [];
318
319
  this._debouncedSubmitForm = debounce(($event) => {
319
320
  // calling submit event in ngZone as change detection is not triggered post the submit callback and actions like notification are not shown
@@ -348,7 +349,7 @@ export class FormComponent extends StylableComponent {
348
349
  ngAfterViewInit() {
349
350
  if (this.parentForm && this.parentForm.ngform && this.isParentList) {
350
351
  // setting formArray control on ngform.
351
- if (!_.get(this.parentForm.ngform.controls, this.parentList.name)) {
352
+ if (!get(this.parentForm.ngform.controls, this.parentList.name)) {
352
353
  this.parentForm.ngform.setControl(this.parentList.name, new FormArray([]));
353
354
  }
354
355
  // pushing the ngform to formArray.
@@ -386,10 +387,10 @@ export class FormComponent extends StylableComponent {
386
387
  * 5. this means form name change applies only when there is single form (immediate child) inside the parentContainer.
387
388
  */
388
389
  const prefabInnerForm = parentContentEl.find('form').first();
389
- if (_.get(prefabInnerForm[0], 'widget.widgetId') === this.widgetId) {
390
+ if (get(prefabInnerForm[0], 'widget.widgetId') === this.widgetId) {
390
391
  // check whether form inside prefab container is inside the list. If true, do not change the name.
391
392
  if (!prefabInnerForm.isParentList && !prefabInnerForm.siblings('form').length) {
392
- binding = _.get(parentContainer, 'name');
393
+ binding = get(parentContainer, 'name');
393
394
  }
394
395
  }
395
396
  }
@@ -425,16 +426,16 @@ export class FormComponent extends StylableComponent {
425
426
  const formEle = this.getNativeElement();
426
427
  const formObjs = formEle.querySelectorAll('.app-form');
427
428
  const validationMsgs = [];
428
- _.forEach(formObjs, e => {
429
+ forEach(formObjs, e => {
429
430
  const formInstance = e.widget;
430
431
  // differentiating the validationMessages prefix based on the formGroupName
431
432
  // as the formName's are same when forms are in list
432
- let formName = _.get(formInstance, 'formGroupName') || formInstance.name;
433
+ let formName = get(formInstance, 'formGroupName') || formInstance.name;
433
434
  if (isDefined(formInstance.formArrayIndex)) {
434
435
  formName = formName + '[' + formInstance.formArrayIndex + ']';
435
436
  }
436
437
  let current = formInstance;
437
- while (_.get(current, 'parentForm')) {
438
+ while (get(current, 'parentForm')) {
438
439
  let parentName = current.parentForm.formGroupName || current.parentForm.name;
439
440
  if (current.parentForm.parentFormArray) {
440
441
  parentName = parentName + '[' + current.parentForm.formArrayIndex + ']';
@@ -457,7 +458,7 @@ export class FormComponent extends StylableComponent {
457
458
  if (!formFields) {
458
459
  return;
459
460
  }
460
- _.forEach(controls, (v, k) => {
461
+ forEach(controls, (v, k) => {
461
462
  const field = formFields.find(e => e.key === k);
462
463
  if (!field || (validateTouch && !v.touched)) {
463
464
  return;
@@ -484,18 +485,18 @@ export class FormComponent extends StylableComponent {
484
485
  this.validationMessages.push({
485
486
  field: k,
486
487
  value: field.value,
487
- errorType: _.keys(v.errors),
488
+ errorType: keys(v.errors),
488
489
  message: field.validationmessage || '',
489
490
  getElement: () => {
490
491
  return field.$element.find('[focus-target]');
491
492
  },
492
- formName: _.last(prefix.split('.')),
493
+ formName: last(prefix.split('.')),
493
494
  fullyQualifiedFormName: prefix
494
495
  });
495
496
  }
496
497
  else {
497
498
  this.validationMessages[index].value = field.value;
498
- this.validationMessages[index].errorType = _.keys(v.errors);
499
+ this.validationMessages[index].errorType = keys(v.errors);
499
500
  }
500
501
  }
501
502
  else if (v.valid && index > -1) {
@@ -504,7 +505,7 @@ export class FormComponent extends StylableComponent {
504
505
  }
505
506
  // This will return a object containing the error details from the list of formFields that are invalid
506
507
  setValidationMsgs(validateTouch) {
507
- if (!this.formFields.length && _.isEmpty(this.ngform.controls)) {
508
+ if (!this.formFields.length && isEmpty(this.ngform.controls)) {
508
509
  return;
509
510
  }
510
511
  this.setValidationOnFields(this, this.name, validateTouch);
@@ -586,10 +587,10 @@ export class FormComponent extends StylableComponent {
586
587
  break;
587
588
  case 'formdata':
588
589
  // For livelist when multiselect is enabled, formdata will be array of objects. In this case consider the last object as formdata.
589
- if (_.isEqual(nv, ov)) {
590
+ if (isEqual(nv, ov)) {
590
591
  break;
591
592
  }
592
- _.isArray(nv) ? this.setFormData(_.last(nv)) : this.setFormData(nv);
593
+ isArray(nv) ? this.setFormData(last(nv)) : this.setFormData(nv);
593
594
  // if dataset on the formFields are not set as the datasourceChange is triggered before the formFields are registered.
594
595
  if (!this.isDataSourceUpdated && this.datasource) {
595
596
  this.onDataSourceChange();
@@ -619,7 +620,7 @@ export class FormComponent extends StylableComponent {
619
620
  const formFields = this.getFormFields();
620
621
  formFields.forEach(field => {
621
622
  // notifying the dataset change to the form-field widget.
622
- if (!field.isDataSetBound && _.get(field.formWidget, 'dataset$')) {
623
+ if (!field.isDataSetBound && get(field.formWidget, 'dataset$')) {
623
624
  field.formWidget.dataset$.next();
624
625
  }
625
626
  });
@@ -668,7 +669,7 @@ export class FormComponent extends StylableComponent {
668
669
  }
669
670
  // if there is an App.onServiceError handler for the app, that message should be used instead of server returned error message
670
671
  checkAppServiceErrorMsg(type) {
671
- const notificationAction = _.get(this.app, 'Actions.appNotification');
672
+ const notificationAction = get(this.app, 'Actions.appNotification');
672
673
  if (notificationAction && type === 'error') {
673
674
  return notificationAction.getMessage();
674
675
  }
@@ -681,7 +682,7 @@ export class FormComponent extends StylableComponent {
681
682
  // Set the classes on the form based on the captionposition and captionwidth properties
682
683
  setLayoutConfig() {
683
684
  let layoutConfig;
684
- layoutConfig = getFieldLayoutConfig(this.captionwidth, this.captionposition, _.get(this.app.selectedViewPort, 'os'));
685
+ layoutConfig = getFieldLayoutConfig(this.captionwidth, this.captionposition, get(this.app.selectedViewPort, 'os'));
685
686
  this._widgetClass = layoutConfig.widgetCls;
686
687
  this._captionClass = layoutConfig.captionCls;
687
688
  $appDigest();
@@ -702,9 +703,9 @@ export class FormComponent extends StylableComponent {
702
703
  this.parentForm.setFormData(this.parentForm.formdata, this.formFields, this.formdata || {});
703
704
  }
704
705
  // WMS-18967: Applying formadata after formfields are ready
705
- if (fieldCount === this.numberOfFields && !_.isEmpty(this.formdata)) {
706
+ if (fieldCount === this.numberOfFields && !isEmpty(this.formdata)) {
706
707
  this.onDataSourceChange();
707
- _.isArray(this.formdata) ? this.setFormData(_.last(this.formdata)) : this.setFormData(this.formdata);
708
+ isArray(this.formdata) ? this.setFormData(last(this.formdata)) : this.setFormData(this.formdata);
708
709
  }
709
710
  }
710
711
  registerActions(formAction) {
@@ -713,8 +714,8 @@ export class FormComponent extends StylableComponent {
713
714
  // Update the dataoutput whenever there is a change in inside form widget value
714
715
  updateFormDataOutput(dataObject) {
715
716
  // Set the values of the widgets inside the live form (other than form fields) in form data
716
- _.forEach(this.ngform.value, (val, key) => {
717
- if (!_.find(this.formFields, { key })) {
717
+ forEach(this.ngform.value, (val, key) => {
718
+ if (!find(this.formFields, { key })) {
718
719
  dataObject[key] = val;
719
720
  }
720
721
  });
@@ -738,20 +739,20 @@ export class FormComponent extends StylableComponent {
738
739
  // This form is having innerform i.e. address, these fields are listed as
739
740
  // {"applicantName": "", "applicantID": "", "address": {"street": ""}}
740
741
  if (field.form.widgetId !== this.widgetId && field.form.formGroupName) {
741
- const fd = _.get(formData, field.form.formGroupName, {});
742
+ const fd = get(formData, field.form.formGroupName, {});
742
743
  fd[fieldName] = fieldValue;
743
- _.set(formData, field.form.formGroupName, fd);
744
+ set(formData, field.form.formGroupName, fd);
744
745
  }
745
- else if ((typeof field.form.formArrayIndex === 'number') && field.form.isParentList && !this.parentForm) { // Fix for [WMS-25806]: use formArrayIndex only if form has a parent form
746
+ else if (this.parentForm && this.parentForm.ngform && field.form.isParentList) { // Fix for [WMS-25806]: use formArrayIndex only if form has a parent form
746
747
  // setting formdata based on formArrayIndex
747
- const fd = _.get(formData, field.form.parentList.name, []);
748
+ const fd = get(formData, field.form.parentList.name, []);
748
749
  fd[field.form.formArrayIndex] = fd[field.form.formArrayIndex] || {};
749
750
  fd[field.form.formArrayIndex][fieldName] = fieldValue;
750
- _.set(formData, field.form.parentList.name, fd);
751
+ set(formData, field.form.parentList.name, fd);
751
752
  }
752
753
  else {
753
754
  // In case of update the field will be already present in form data
754
- _.set(formData, fieldName, fieldValue);
755
+ set(formData, fieldName, fieldValue);
755
756
  }
756
757
  });
757
758
  this.updateFormDataOutput(formData);
@@ -766,7 +767,7 @@ export class FormComponent extends StylableComponent {
766
767
  // FormFields will contain all the fields in parent and inner form also.
767
768
  // This returns the formFields in the form based on the form name.
768
769
  getFormFields() {
769
- return _.filter(this.formFields, formField => {
770
+ return filter(this.formFields, formField => {
770
771
  return formField.form.name === this.name;
771
772
  });
772
773
  }
@@ -777,12 +778,12 @@ export class FormComponent extends StylableComponent {
777
778
  const fd = innerFormdata ? innerFormdata : data;
778
779
  if (fd) {
779
780
  if (fd.hasOwnProperty(key)) {
780
- field.value = _.get(fd, key);
781
+ field.value = get(fd, key);
781
782
  }
782
- else if (_.includes(key, '.')) {
783
+ else if (includes(key, '.')) {
783
784
  // key contains '.' when mapping the fields to child reference i.e. childCol is having key as "parent.childCol"
784
- if (fd.hasOwnProperty(_.split(key, '.')[0])) {
785
- field.value = _.get(fd, key);
785
+ if (fd.hasOwnProperty(split(key, '.')[0])) {
786
+ field.value = get(fd, key);
786
787
  }
787
788
  }
788
789
  // WMS-18906: For default value, do not mark the form as dirty.
@@ -795,11 +796,11 @@ export class FormComponent extends StylableComponent {
795
796
  * if formGroupName is defined which means field is inside the inner form
796
797
  * then set the formdata on the field's form using formGroupName
797
798
  */
798
- if (formGroupName && _.get(data, formGroupName)) {
799
+ if (formGroupName && get(data, formGroupName)) {
799
800
  this.setFormData.call(field.form, data[formGroupName]);
800
801
  }
801
802
  // if formdata is assigned later then on propertyChangeHandler, even inner forms data also needs to be updated.
802
- if (_.get(field.form, 'parentFormArray')) {
803
+ if (get(field.form, 'parentFormArray')) {
803
804
  this.setFormDataFromParentFormData.call(field.form, data);
804
805
  }
805
806
  }
@@ -982,7 +983,7 @@ export class FormComponent extends StylableComponent {
982
983
  template = this.errormessage || error.error || error;
983
984
  $appDigest();
984
985
  return {
985
- 'result': _.get(error, 'error') || error,
986
+ 'result': get(error, 'error') || error,
986
987
  'status': false,
987
988
  'message': template,
988
989
  'type': 'error'
@@ -1009,8 +1010,8 @@ export class FormComponent extends StylableComponent {
1009
1010
  }
1010
1011
  // Method to show/hide the panel header or footer based on the buttons
1011
1012
  showButtons(position) {
1012
- return _.some(this.buttonArray, btn => {
1013
- return _.includes(btn.position, position) && btn.updateMode === this.isUpdateMode;
1013
+ return some(this.buttonArray, btn => {
1014
+ return includes(btn.position, position) && btn.updateMode === this.isUpdateMode;
1014
1015
  });
1015
1016
  }
1016
1017
  // Expand or collapse the panel
@@ -1039,13 +1040,13 @@ export class FormComponent extends StylableComponent {
1039
1040
  if (!form.parentForm) {
1040
1041
  return {};
1041
1042
  }
1042
- if (!form.bindformdata && _.get(form.parentForm, 'formdata') && !_.isEmpty(form.parentForm.formdata)) {
1043
+ if (!form.bindformdata && get(form.parentForm, 'formdata') && !isEmpty(form.parentForm.formdata)) {
1043
1044
  return form.parentForm.formdata;
1044
1045
  }
1045
1046
  return this.getNearestParentFormData(form.parentForm);
1046
1047
  }
1047
1048
  setFormDataFromParentFormData(formdata) {
1048
- if (_.isEmpty(this.formdata) && this.parentForm && formdata) {
1049
+ if (isEmpty(this.formdata) && this.parentForm && formdata) {
1049
1050
  /**
1050
1051
  * If form is inside list,
1051
1052
  * 1. directly applying the formdata to the formArray to update the formdata on list of forms using patchValue.
@@ -1056,9 +1057,9 @@ export class FormComponent extends StylableComponent {
1056
1057
  * If not inside list, just set the formdata on all the formfields including innerForm fields
1057
1058
  */
1058
1059
  if (this.parentFormArray) {
1059
- let childFormArrayData = _.get(formdata, this.parentList.name);
1060
+ let childFormArrayData = get(formdata, this.parentList.name);
1060
1061
  if (childFormArrayData) {
1061
- if (!_.isArray(childFormArrayData)) {
1062
+ if (!isArray(childFormArrayData)) {
1062
1063
  childFormArrayData = [childFormArrayData];
1063
1064
  }
1064
1065
  this.parentFormArray.patchValue(childFormArrayData);
@@ -1068,7 +1069,7 @@ export class FormComponent extends StylableComponent {
1068
1069
  this.setFormData(this.formdata);
1069
1070
  }
1070
1071
  else if (this.isParentList && this.parentForm.formGroupName) {
1071
- const parentFormData = _.get(formdata, this.parentForm.formGroupName);
1072
+ const parentFormData = get(formdata, this.parentForm.formGroupName);
1072
1073
  this.setFormDataFromParentFormData(parentFormData);
1073
1074
  }
1074
1075
  }
@@ -1079,7 +1080,7 @@ export class FormComponent extends StylableComponent {
1079
1080
  }
1080
1081
  // On form data source change. This method is overridden by live form and live filter
1081
1082
  onDataSourceChange() {
1082
- if (_.get(this.formFields, 'length') && !this.bindformdata) {
1083
+ if (get(this.formFields, 'length') && !this.bindformdata) {
1083
1084
  this.isDataSourceUpdated = true;
1084
1085
  /**
1085
1086
  * formdata on the parent form will be set before the inner forms are rendered.
@@ -1111,7 +1112,7 @@ export class FormComponent extends StylableComponent {
1111
1112
  let noOfColumns;
1112
1113
  let $gridLayout;
1113
1114
  // Check if grid layout is present or not for first time
1114
- if (_.isUndefined(this._isGridLayoutPresent)) {
1115
+ if (isUndefined(this._isGridLayoutPresent)) {
1115
1116
  this._isGridLayoutPresent = this.$element.find('.panel-body [wmlayoutgrid]').length > 0;
1116
1117
  }
1117
1118
  if (this._isGridLayoutPresent) {
@@ -1133,7 +1134,7 @@ export class FormComponent extends StylableComponent {
1133
1134
  let userFields;
1134
1135
  let fields = this.metadata ? this.metadata.data || this.metadata : [];
1135
1136
  this.formFields = []; // empty the form fields
1136
- if (_.isEmpty(fields)) {
1137
+ if (isEmpty(fields)) {
1137
1138
  return;
1138
1139
  }
1139
1140
  if (this.onBeforeRenderEvt) {
@@ -1142,7 +1143,7 @@ export class FormComponent extends StylableComponent {
1142
1143
  fields = userFields;
1143
1144
  }
1144
1145
  }
1145
- if (!_.isArray(fields)) {
1146
+ if (!isArray(fields)) {
1146
1147
  return;
1147
1148
  }
1148
1149
  while (fields[colCount]) {
@@ -1228,12 +1229,12 @@ export class FormComponent extends StylableComponent {
1228
1229
  }
1229
1230
  ngOnDestroy() {
1230
1231
  // on form destroy, removing this form from the parentForm too.
1231
- const controls = this.parentForm && _.get(this.parentForm, 'ngform.controls');
1232
+ const controls = this.parentForm && get(this.parentForm, 'ngform.controls');
1232
1233
  if (controls) {
1233
1234
  // when current form is inside the list (i.e. incase of formArray).
1234
- if (_.get(this.parentList, 'name') && controls.hasOwnProperty(this.parentList.name)) {
1235
+ if (get(this.parentList, 'name') && controls.hasOwnProperty(this.parentList.name)) {
1235
1236
  //get the index of current form in the list and remove the FormControl from FormArray
1236
- const index = _.findIndex(this.parentList.getWidgets(this.name), { widgetId: this.widgetId });
1237
+ const index = findIndex(this.parentList.getWidgets(this.name), { widgetId: this.widgetId });
1237
1238
  this.parentForm.ngform.controls[this.parentList.name].removeAt(index);
1238
1239
  }
1239
1240
  // when we have formGroupName set i.e. multiple formInstance with counter appended to formName
@@ -1352,5 +1353,5 @@ export class FormComponent extends StylableComponent {
1352
1353
  type: HostListener,
1353
1354
  args: ['keydown', ['$event']]
1354
1355
  }] }); })();
1355
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormComponent, { className: "FormComponent", filePath: "form.component.ts", lineNumber: 145 }); })();
1356
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2Zvcm0vc3JjL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQUUsTUFBTSxFQUNwQixRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDSCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLDJCQUEyQixFQUMzQixXQUFXLEVBQ1gsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsR0FDbEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1B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a0JBQTdCLFlBQVk7bUJBQUMsT0FBTztZQUlnQixnQkFBZ0I7a0JBQXBELFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOztrRkEzSDFCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBdHRyaWJ1dGUsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9wdGlvbmFsLFxuICAgIFNraXBTZWxmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgICAkYXBwRGlnZXN0LFxuICAgICRpbnZva2VXYXRjaGVycyxcbiAgICAkcGFyc2VFdmVudCxcbiAgICBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsXG4gICAgQXBwLFxuICAgIERhdGFTb3VyY2UsXG4gICAgRGF0YVR5cGUsXG4gICAgZGVib3VuY2UsXG4gICAgRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRGaWxlcyxcbiAgICBnZXRWYWxpZEpTT04sXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgcmVtb3ZlQXR0cixcbiAgICByZW1vdmVDbGFzcyxcbiAgICBzY3JvbGxUb0VsZW1lbnQsXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7XG4gICAgZ2V0RmllbGRMYXlvdXRDb25maWcsXG4gICAgTGl2ZV9PcGVyYXRpb25zLFxuICAgIE1lc3NhZ2VDb21wb25lbnQsXG4gICAgcGFyc2VWYWx1ZUJ5VHlwZSxcbiAgICBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uLFxuICAgIHByb3ZpZGVBc1dpZGdldFJlZixcbiAgICBTdHlsYWJsZUNvbXBvbmVudCxcbiAgICBzdHlsZXIsXG4gICAgV2lkZ2V0UmVmXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtQcmVmYWJEaXJlY3RpdmV9IGZyb20gJ0B3bS9jb21wb25lbnRzL3ByZWZhYic7XG5pbXBvcnQge0xpc3RDb21wb25lbnR9IGZyb20gJ0B3bS9jb21wb25lbnRzL2RhdGEvbGlzdCc7XG5cbmltcG9ydCB7cmVnaXN0ZXJGb3JtUHJvcHN9IGZyb20gJy4vZm9ybS5wcm9wcyc7XG5cbmRlY2xhcmUgY29uc3QgXztcblxuY29uc3QgV0lER0VUX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tZm9ybScsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtZm9ybSd9O1xuY29uc3QgTE9HSU5fRk9STV9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWZvcm0nLCBob3N0Q2xhc3M6ICdhcHAtZm9ybSBhcHAtbG9naW4tZm9ybSd9O1xuY29uc3QgTElWRV9GT1JNX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tbGl2ZWZvcm0nLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWxpdmVmb3JtIGxpdmVmb3JtLWlubGluZSd9O1xuY29uc3QgTElWRV9GSUxURVJfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXZlZmlsdGVyJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1saXZlZmlsdGVyIGNsZWFyZml4IGxpdmVmb3JtLWlubGluZSd9O1xuXG5jb25zdCBnZXRXaWRnZXRDb25maWcgPSAoaXNMaXZlRm9ybSwgaXNMaXZlRmlsdGVyLCByb2xlKSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IFdJREdFVF9DT05GSUc7XG4gICAgaWYgKGlzTGl2ZUZvcm0gIT09IG51bGwpIHtcbiAgICAgICAgY29uZmlnID0gTElWRV9GT1JNX0NPTkZJRztcbiAgICB9IGVsc2UgaWYgKGlzTGl2ZUZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcgPSBMSVZFX0ZJTFRFUl9DT05GSUc7XG4gICAgfSBlbHNlIGlmIChyb2xlID09PSAnYXBwLWxvZ2luJykge1xuICAgICAgICBjb25maWcgPSBMT0dJTl9GT1JNX0NPTkZJRztcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8vIEdlbmVyYXRlIHRoZSBmb3JtIGZpZWxkIHdpdGggZ2l2ZW4gZmllbGQgZGVmaW5pdGlvbi4gQWRkIGEgZ3JpZCBjb2x1bW4gd3JhcHBlciBhcm91bmQgdGhlIGZvcm0gZmllbGQuXG5jb25zdCBzZXRNYXJrdXBGb3JGb3JtRmllbGQgPSAoZmllbGQsIGNvbHVtbldpZHRoKSA9PiAge1xuICAgIGxldCBwcm9wc1RtcGwgPSAnJztcbiAgICBfLmZvckVhY2goZmllbGQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHByb3BzVG1wbCA9IGAke3Byb3BzVG1wbH0gJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGA8d20tZ3JpZGNvbHVtbiBjb2x1bW53aWR0aD1cIiR7Y29sdW1uV2lkdGh9XCI+XG4gICAgICAgICAgICAgICAgICA8d20tZm9ybS1maWVsZCAke3Byb3BzVG1wbH0+PC93bS1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC93bS1ncmlkY29sdW1uPmA7XG59O1xuXG4vLyBGdW5jdGlvbiB0byBmaW5kIG91dCB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50IGluIGZvcm1cbmNvbnN0IGZpbmRJbnZhbGlkRWxlbWVudCA9ICgkZm9ybUVsZSwgbmdGb3JtKSA9PiB7XG4gICAgY29uc3QgJGVsZSA9ICRmb3JtRWxlLmZpbmQoJ2Zvcm0ubmctaW52YWxpZDp2aXNpYmxlLCBbZm9ybUNvbnRyb2xOYW1lXS5uZy1pbnZhbGlkOnZpc2libGUnKS5maXJzdCgpO1xuICAgIGxldCBmb3JtT2JqID0gbmdGb3JtO1xuICAgIC8vIElmIGVsZW1lbnQgaXMgZm9ybSwgZmluZCBvdXQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBpbiB0aGlzIGZvcm1cbiAgICBpZiAoJGVsZS5pcygnZm9ybScpKSB7XG4gICAgICAgIGZvcm1PYmogPSBuZ0Zvcm0gJiYgbmdGb3JtLmNvbnRyb2xzWyRlbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGVsZS5hdHRyKCduYW1lJyldO1xuICAgICAgICBpZiAoZm9ybU9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRJbnZhbGlkRWxlbWVudCgkZWxlLCBmb3JtT2JqKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuZ0Zvcm06IGZvcm1PYmosXG4gICAgICAgICRlbGU6ICRlbGVcbiAgICB9O1xufTtcblxuLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBhY3RpdmUgZWxlbWVudCBtYXJrdXAgYmFzZWQgb24gd2lkZ2V0IHR5cGVcbmNvbnN0IGdldEFjdGl2ZUVsZW1lbnQgPSAoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZGdldFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd2lkZ2V0dHlwZScpO1xuICAgIHN3aXRjaCAod2lkZ2V0VHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3Rvcignc2VsZWN0Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICB9XG59XG5jb25zdCBzZXRUb3VjaGVkU3RhdGUgPSAoc2VsZiwgbmdGb3JtLCBmaWVsZE5hbWUpID0+IHtcbiAgICBpZiAobmdGb3JtLnZhbGlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5nRm9ybS5jb250cm9scykge1xuICAgICAgICBfLmZvckVhY2gobmdGb3JtLmNvbnRyb2xzLCAoY3RybCwgZmllbGROYW1lKSA9PiB7XG4gICAgICAgICAgICBzZXRUb3VjaGVkU3RhdGUoc2VsZiwgY3RybCwgZmllbGROYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBzZWxmLiRlbGVtZW50LmZpbmQoYFt3bWZvcm1maWVsZF1ba2V5PVwiJHtmaWVsZE5hbWV9XCJdYCk7XG4gICAgICAgIGlmICghZWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLiRlbGVtZW50LmZpbmQoYFt3bWZvcm1maWVsZF1bbmFtZT1cIiR7ZmllbGROYW1lfVwiXWApO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRbMF0uc2V0QXR0cmlidXRlKCdfX2Vycm9ybXNnJywgZWxlbWVudFswXS5nZXRBdHRyaWJ1dGUoJ19fdmFsaWRhdGlvbklkJykpO1xuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoZWxlbWVudFswXSk7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgbmdGb3JtLmludmFsaWQpO1xuICAgICAgICBhY3RpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBlbGVtZW50WzBdLmdldEF0dHJpYnV0ZSgnX192YWxpZGF0aW9uSWQnKSk7XG4gICAgICAgIG5nRm9ybS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmb3JtW3dtRm9ybV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKEZvcm1Db21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIHN0YXRpYyAgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJGb3JtUHJvcHMoKTtcbiAgICBAVmlld0NoaWxkKCdkeW5hbWljRm9ybScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGR5bmFtaWNGb3JtUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuICAgIEBWaWV3Q2hpbGQoTWVzc2FnZUNvbXBvbmVudCkgbWVzc2FnZVJlZjtcbiAgICAvLyB0aGlzIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCByZWZzIGluc2lkZSB0aGUgZm9ybS1ncm91cFxuICAgIEBDb250ZW50Q2hpbGRyZW4oV2lkZ2V0UmVmLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBjb21wb25lbnRSZWZzO1xuXG4gICAgYXV0b3VwZGF0ZTtcbiAgICBwdWJsaWMgZm9ybWxheW91dDogYW55O1xuICAgIHB1YmxpYyBpc0RhdGFTb3VyY2VVcGRhdGVkOiBib29sZWFuO1xuICAgIGNhcHRpb25BbGlnbkNsYXNzOiBzdHJpbmc7XG4gICAgdmFsaWRhdGlvbnR5cGU6IHN0cmluZztcbiAgICBjYXB0aW9uYWxpZ246IHN0cmluZztcbiAgICBjYXB0aW9ucG9zaXRpb246IHN0cmluZztcbiAgICBjYXB0aW9uc2l6ZTtcbiAgICBjb2xsYXBzaWJsZTogYm9vbGVhbjtcbiAgICBleHBhbmRlZDogYm9vbGVhbjtcbiAgICBlbFNjb3BlO1xuICAgIF93aWRnZXRDbGFzcyA9ICcnO1xuICAgIGNhcHRpb253aWR0aDogc3RyaW5nO1xuICAgIF9jYXB0aW9uQ2xhc3MgPSAnJztcbiAgICBuZ2Zvcm06IEZvcm1Hcm91cDtcbiAgICBmb3JtRmllbGRzID0gW107XG4gICAgZm9ybWZpZWxkcyA9IHt9O1xuICAgIGZvcm1XaWRnZXRzID0ge307XG4gICAgZmlsdGVyV2lkZ2V0cyA9IHt9O1xuICAgIGJ1dHRvbkFycmF5ID0gW107XG4gICAgZGF0YW91dHB1dCA9IHt9O1xuICAgIGRhdGFzb3VyY2U7XG4gICAgZm9ybWRhdGFzb3VyY2U7XG4gICAgZm9ybWRhdGEgPSB7fTtcbiAgICBpc1NlbGVjdGVkO1xuICAgIHByZXZEYXRhVmFsdWVzO1xuICAgIHByZXZEYXRhT2JqZWN0O1xuICAgIHByZXZmb3JtRmllbGRzO1xuICAgIHN0YXR1c01lc3NhZ2UgPSB7XG4gICAgICAgIGNhcHRpb246ICcnLFxuICAgICAgICB0eXBlOiAnJ1xuICAgIH07XG4gICAgbWVzc2FnZWxheW91dDtcbiAgICBtZXRhZGF0YTtcbiAgICBlcnJvcm1lc3NhZ2U7XG4gICAgb25FcnJvcjtcbiAgICBvblN1Y2Nlc3M7XG4gICAgcHJpbWFyeUtleSA9IFtdO1xuICAgIHBvc3RtZXNzYWdlO1xuICAgIF9saXZlVGFibGVQYXJlbnQ7XG4gICAgdXBkYXRlTW9kZTtcbiAgICBuYW1lO1xuICAgIC8vIExpdmUgRm9ybSBNZXRob2RzXG4gICAgY2xlYXJEYXRhOiBGdW5jdGlvbjtcbiAgICBjYW5jZWw6IEZ1bmN0aW9uO1xuICAgIGRlbGV0ZTogRnVuY3Rpb247XG4gICAgc2F2ZTogRnVuY3Rpb247XG4gICAgc2F2ZUFuZE5ldzogRnVuY3Rpb247XG4gICAgc2F2ZUFuZFZpZXc6IEZ1bmN0aW9uO1xuICAgIHNldFByaW1hcnlLZXk6ICgpID0+IHt9O1xuICAgIGRpYWxvZ0lkOiBzdHJpbmc7XG4gICAgLy8gTGl2ZSBGaWx0ZXJcbiAgICBlbmFibGVlbXB0eWZpbHRlcjtcbiAgICBwYWdlc2l6ZTtcbiAgICByZXN1bHQ7XG4gICAgcGFnaW5hdGlvbjtcbiAgICBjbGVhckZpbHRlcjogRnVuY3Rpb247XG4gICAgYXBwbHlGaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGZpbHRlcjogRnVuY3Rpb247XG4gICAgZmlsdGVyT25EZWZhdWx0OiBGdW5jdGlvbjtcbiAgICBvbk1heERlZmF1bHRWYWx1ZUNoYW5nZTogRnVuY3Rpb247XG4gICAgbnVtYmVyT2ZGaWVsZHM6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFVwZGF0ZUZpZWxkU291cmNlOiBGdW5jdGlvbiA9IF8uZGVib3VuY2UodGhpcy51cGRhdGVGaWVsZFNvdXJjZSwgMzUwKTtcbiAgICBwcml2YXRlIG9wZXJhdGlvblR5cGU7XG4gICAgcHJpdmF0ZSBfaXNMYXlvdXREaWFsb2c7XG4gICAgcHJpdmF0ZSBfZHluYW1pY0NvbnRleHQ7XG4gICAgcHJpdmF0ZSBfaXNHcmlkTGF5b3V0UHJlc2VudDtcbiAgICBwcml2YXRlIHZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgIHByaXZhdGUgZm9ybUdyb3VwTmFtZTtcbiAgICBwcml2YXRlIGZvcm1BcnJheUluZGV4O1xuICAgIHByaXZhdGUgYmluZGluZ1ZhbHVlO1xuICAgIHByaXZhdGUgX2Zvcm1Jc0luTGlzdDtcbiAgICBwcml2YXRlIF90cmlnZ2VyZWRCeVVzZXI6IGJvb2xlYW47XG5cblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFN1Ym1pdEZvcm0gPSBkZWJvdW5jZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIGNhbGxpbmcgc3VibWl0IGV2ZW50IGluIG5nWm9uZSBhcyBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgcG9zdCB0aGUgc3VibWl0IGNhbGxiYWNrIGFuZCBhY3Rpb25zIGxpa2Ugbm90aWZpY2F0aW9uIGFyZSBub3Qgc2hvd25cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9LCAyNTApO1xuXG4gICAgc2V0IGlzTGF5b3V0RGlhbG9nKG52KSB7XG4gICAgICAgIGlmIChudikge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAncGFuZWwgYXBwLXBhbmVsIGxpdmVmb3JtLWlubGluZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzTGF5b3V0RGlhbG9nID0gbnY7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGF5b3V0RGlhbG9nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMYXlvdXREaWFsb2c7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNVcGRhdGVNb2RlO1xuICAgIHNldCBpc1VwZGF0ZU1vZGUobnYpIHtcbiAgICAgICAgdGhpcy5faXNVcGRhdGVNb2RlID0gbnY7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGZpZWxkLnNldFJlYWRPbmx5U3RhdGUobnYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgaXNVcGRhdGVNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVcGRhdGVNb2RlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYWN0aW9uJykgYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBASG9zdExpc3RlbmVyKCdzdWJtaXQnLCBbJyRldmVudCddKSBzdWJtaXQoJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFN1Ym1pdEZvcm0oJGV2ZW50KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdyZXNldCcpIG9uUmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWRCeVVzZXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHRoZSBmb3JtQXJyYXkgY29udHJvbCBvbiB0aGUgcGFyZW50Rm9ybS5cbiAgICBnZXQgcGFyZW50Rm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5nZXQodGhpcy5wYXJlbnRMaXN0Lm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRydWUgb25seSB3aGVuIGNsb3Nlc3QgbGl2ZWxpc3QgaXMgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIGZvcm0uXG4gICAgLy8gY2hlY2tzIGZvciBsaXZlbGlzdCBoYXZpbmcgYW55IGZvcm0gZWxlbWVudHMgd2l0aCBwYXJlbnRGb3JtIG5hbWUuXG4gICAgLy8gSWYgbGl2ZWxpc3QgaXMgbm90IGNvbnRhaW5pbmcgYW55IHBhcmVudEZvcm0gZWxlbWVudHMgdGhlbiBpdCByZXR1cm5zIHRydWUuXG4gICAgZ2V0IGlzUGFyZW50TGlzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0gJiYgIWlzRGVmaW5lZCh0aGlzLl9mb3JtSXNJbkxpc3QpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy4kZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RFbGUgPSBmb3JtRWxlLmNsb3Nlc3QoJy5hcHAtbGl2ZWxpc3RbbmFtZT1cIicgKyB0aGlzLnBhcmVudExpc3QubmFtZSArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChsaXN0RWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1Jc0luTGlzdCA9ICEobGlzdEVsZS5maW5kKCdmb3JtW3dpZGdldC1pZD1cIicgKyB0aGlzLnBhcmVudEZvcm0ud2lkZ2V0SWQgKyAnXCJdJykpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkgPyB0aGlzLl9mb3JtSXNJbkxpc3QgOiB0aGlzLnBhcmVudExpc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIGFwcDogQXBwLFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI6IER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlcixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudExpc3Q6IExpc3RDb21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRGb3JtOiBGb3JtQ29tcG9uZW50LFxuICAgICAgICBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50UHJlZmFiOiBQcmVmYWJEaXJlY3RpdmUsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQYXJ0aWFsOiBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVzdWJtaXQuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVTdWJtaXRFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3N1Ym1pdC5ldmVudCcpIHB1YmxpYyBvblN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnYmVmb3JlcmVuZGVyLmV2ZW50JykgcHVibGljIG9uQmVmb3JlUmVuZGVyRXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBwdWJsaWMgYmluZGRhdGFzZXQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2Zvcm1kYXRhLmJpbmQnKSBwcml2YXRlIGJpbmRmb3JtZGF0YSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRm9ybScpIGlzTGl2ZUZvcm0sXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3dtTGl2ZUZpbHRlcicpIGlzTGl2ZUZpbHRlcixcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YS1yb2xlJykgcm9sZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgna2V5Jykga2V5LFxuICAgICAgICBAQXR0cmlidXRlKCduYW1lJykgbmFtZSxcbiAgICAgICAgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgZ2V0V2lkZ2V0Q29uZmlnKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSksIGV4cGxpY2l0Q29udGV4dCk7XG5cbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRpdGxlIHByb3BlcnR5IGFzIGF0dHJpYnV0ZSBhcyBpdCBpcyBjYXVzaW5nIHVubmVjZXNzYXJ5IHRvb2x0aXBcbiAgICAgICAgcmVtb3ZlQXR0cih0aGlzLm5hdGl2ZUVsZW1lbnQsICd0aXRsZScpO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlhbG9nSWQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaWFsb2dJZCcpO1xuICAgICAgICB0aGlzLm5nZm9ybSA9IGZiLmdyb3VwKHt9KTtcbiAgICAgICAgdGhpcy5iaW5kaW5nVmFsdWUgPSBrZXkgfHwgbmFtZTtcblxuICAgICAgICAvLyBPbiB2YWx1ZSBjaGFuZ2UgaW4gZm9ybSwgdXBkYXRlIHRoZSBkYXRhb3V0cHV0XG4gICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSAgdGhpcy5uZ2Zvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlRGF0YU91dHB1dC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiBvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLmVsU2NvcGUgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuYWRkRXZlbnRzVG9Db250ZXh0KHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWZzLmZvckVhY2goY29tcG9uZW50UmVmID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50UmVmLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgd2lkZ2V0cyBpbnNpZGUgZm9ybSB3aXRoIGZvcm1XaWRnZXRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybVdpZGdldHNbY29tcG9uZW50UmVmLm5hbWVdID0gY29tcG9uZW50UmVmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtICYmIHRoaXMuaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAvLyBzZXR0aW5nIGZvcm1BcnJheSBjb250cm9sIG9uIG5nZm9ybS5cbiAgICAgICAgICAgIGlmICghXy5nZXQodGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5jb250cm9scywgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5zZXRDb250cm9sKHRoaXMucGFyZW50TGlzdC5uYW1lLCBuZXcgRm9ybUFycmF5KFtdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwdXNoaW5nIHRoZSBuZ2Zvcm0gdG8gZm9ybUFycmF5LlxuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtQXJyYXkucHVzaCh0aGlzLm5nZm9ybSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1BcnJheUluZGV4ID0gdGhpcy5wYXJlbnRGb3JtQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZElubmVyTmdGb3JtVG9Gb3JtKHRoaXMuYmluZGluZ1ZhbHVlKTtcbiAgICB9XG5cbiAgICBmaW5kT3BlcmF0aW9uVHlwZSgpIHt9XG5cbiAgICBwcml2YXRlIGFkZElubmVyTmdGb3JtVG9Gb3JtKGJpbmRpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGluZyBhcyBmb3JtQXJyYXkgd2hlbiBwYXJlbnQgaXMgbGlzdC4gSGVuY2UgcmV0dXJuaW5nIGhlcmUgZnJvbSBhZGRpbmcgdG8gcGFyZW50Rm9ybSBhZ2Fpbi5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGFyZW50TGlzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFzc2lnbmluZyB0aGUgY29udHJvbCBuYW1lIG9mIHRoZSBmb3JtIGluc2lkZSB0aGUgcHJlZmFiIHdpdGggdGhlIHByZWZhYiBuYW1lLlxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGhhcHBlbiBvbmx5IHdoZW4gdGhlcmUgaXMgb25seSBvbmUgZm9ybSBpbnNpZGUgcHJlZmFiLlxuICAgICAgICAgICAgLy8gV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhpcyB3aGVuIG11bHRpcGxlIGZvcm1zIGFyZSBpbnNpZGUgcHJlZmFiLlxuICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBoYXMgdG8gYmUgaGFuZGxlZCBieSBlbmQgdXNlciBieSBjaGFuZ2luZyBmb3JtIG5hbWVzIGluIHByZWZhYiBhY2NvcmRpbmcgdG8gdGhlIGRhdGFtb2RlbCBiaW5kaW5nLlxuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGFpbmVyID0gdGhpcy5wYXJlbnRQcmVmYWIgfHwgdGhpcy5wYXJlbnRQYXJ0aWFsO1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDb250ZW50RWw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50UHJlZmFiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRlbnRFbCA9IHBhcmVudENvbnRhaW5lci4kZWxlbWVudC5maW5kKCdbd21wcmVmYWJjb250YWluZXJdJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGVudEVsID0gcGFyZW50Q29udGFpbmVyLiRlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBhc3NpZ25pbmcgdGhlIGZvcm0gbmFtZSB0byB0aGUgcGFyZW50Q29udGFpbmVyIG5hbWUgaS5lLiBwYXJ0aWFsIG5hbWUgb3IgcGVyZmFiIG5hbWUgYnkgZm9sbG93aW5nXG4gICAgICAgICAgICAgICAgICogMS4gcmV0cmlldmluZyBhbGwgdGhlIGZvcm1zIGluIHRoZSBwYXJlbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICAgKiAyLiBjb25zaWRlciB0aGUgZmlyc3QgZm9ybVxuICAgICAgICAgICAgICAgICAqIDMuIGlmIHRoaXMgZm9ybSBpcyBpbnNpZGUgbGlzdCBpLmUuIGFsc28gZmluZCBpZiB0aGlzIGxpc3QgaXMgYWxzbyBpbnNpZGUgdGhlIHBhcmVudENvbnRhaW5lciAocHJlZmFiIC8gcGFydGlhbClcbiAgICAgICAgICAgICAgICAgKiA0LiB0aGVuIGRvIG5vdCBjaGFuZ2UgdGhlIGZvcm0gbmFtZSB3aGVuIGZvcm0gaXMgaW5zaWRlIGxpc3QgYW5kIGFsc28gd2hlbiB0aGVyZSBhcmUgc2libGluZ3MgdG8gdGhlIGZvcm1cbiAgICAgICAgICAgICAgICAgKiA1LiB0aGlzIG1lYW5zIGZvcm0gbmFtZSBjaGFuZ2UgYXBwbGllcyBvbmx5IHdoZW4gdGhlcmUgaXMgc2luZ2xlIGZvcm0gKGltbWVkaWF0ZSBjaGlsZCkgaW5zaWRlIHRoZSBwYXJlbnRDb250YWluZXIuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZmFiSW5uZXJGb3JtID0gcGFyZW50Q29udGVudEVsLmZpbmQoJ2Zvcm0nKS5maXJzdCgpO1xuICAgICAgICAgICAgICAgIGlmIChfLmdldChwcmVmYWJJbm5lckZvcm1bMF0sICd3aWRnZXQud2lkZ2V0SWQnKSA9PT0gdGhpcy53aWRnZXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGZvcm0gaW5zaWRlIHByZWZhYiBjb250YWluZXIgaXMgaW5zaWRlIHRoZSBsaXN0LiBJZiB0cnVlLCBkbyBub3QgY2hhbmdlIHRoZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZhYklubmVyRm9ybS5pc1BhcmVudExpc3QgJiYgIXByZWZhYklubmVyRm9ybS5zaWJsaW5ncygnZm9ybScpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyA9IF8uZ2V0KHBhcmVudENvbnRhaW5lciwgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMTtcbiAgICAgICAgICAgIGxldCBpbm5lckJpbmRpbmcgPSBiaW5kaW5nO1xuICAgICAgICAgICAgLy8gSW5uZXIgZm9ybXMgbWF5IGhhdmUgc2FtZSBuYW1lcy4gSWYgc2FtZSBuYW1lIGlzIHByZXNlbnQsIGFwcGVuZCB1bnFpdWUgaWRlbnRpZmllclxuICAgICAgICAgICAgd2hpbGUgKHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHMuaGFzT3duUHJvcGVydHkoaW5uZXJCaW5kaW5nKSkge1xuICAgICAgICAgICAgICAgIGlubmVyQmluZGluZyA9IGAke2JpbmRpbmd9XyR7Y291bnRlcn1gO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwTmFtZSA9IGlubmVyQmluZGluZztcbiAgICAgICAgICAgIC8vIElmIHBhcmVudCBmb3JtIGlzIHByZXNlbnQsIGFkZCB0aGUgY3VycmVudCBmb3JtIGFzIGFzIGZvcm1Hcm91cCBmb3IgcGFyZW50IGZvcm1cbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uYWRkQ29udHJvbChpbm5lckJpbmRpbmcsIHRoaXMubmdmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4cG9zZSB0aGUgZXZlbnRzIG9uIGNvbnRleHQgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBmb3JtIGFjdGlvbnNcbiAgICBwcml2YXRlIGFkZEV2ZW50c1RvQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuY2FuY2VsID0gKCkgPT4gdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgY29udGV4dC5yZXNldCA9ICgpID0+IHRoaXMucmVzZXQoKTtcbiAgICAgICAgY29udGV4dC5zYXZlID0gZXZ0ID0+IHRoaXMuc2F2ZShldnQpO1xuICAgICAgICBjb250ZXh0LnNhdmVBbmROZXcgPSAoKSA9PiB0aGlzLnNhdmVBbmROZXcoKTtcbiAgICAgICAgY29udGV4dC5zYXZlQW5kVmlldyA9ICgpID0+IHRoaXMuc2F2ZUFuZFZpZXcoKTtcbiAgICAgICAgY29udGV4dC5kZWxldGUgPSAoKSA9PiB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICBjb250ZXh0Lm5ldyA9ICgpID0+IHRoaXMubmV3KCk7XG4gICAgICAgIGNvbnRleHQuZWRpdCA9ICgpID0+IHRoaXMuZWRpdCgpO1xuICAgICAgICBjb250ZXh0LmhpZ2hsaWdodEludmFsaWRGaWVsZHMgPSAoKSA9PiB0aGlzLmhpZ2hsaWdodEludmFsaWRGaWVsZHMoKTtcbiAgICAgICAgY29udGV4dC5maWx0ZXIgPSAoKSA9PiB0aGlzLmZpbHRlcigpO1xuICAgICAgICBjb250ZXh0LmNsZWFyRmlsdGVyID0gKCkgPT4gdGhpcy5jbGVhckZpbHRlcigpO1xuICAgICAgICBjb250ZXh0LnN1Ym1pdCA9IGV2dCA9PiB0aGlzLnN1Ym1pdChldnQpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgYWxsIHRoZSBpbm5lciBmb3JtcyBhbmQgdmFsaWRhdGVzIGVhY2ggZm9ybS5cbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy5nZXROYXRpdmVFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IGZvcm1PYmpzID0gZm9ybUVsZS5xdWVyeVNlbGVjdG9yQWxsKCcuYXBwLWZvcm0nKTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1zZ3MgPSBbXTtcbiAgICAgICAgXy5mb3JFYWNoKGZvcm1PYmpzLCBlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1JbnN0YW5jZSA9IChlIGFzIGFueSkud2lkZ2V0O1xuICAgICAgICAgICAgLy8gZGlmZmVyZW50aWF0aW5nIHRoZSB2YWxpZGF0aW9uTWVzc2FnZXMgcHJlZml4IGJhc2VkIG9uIHRoZSBmb3JtR3JvdXBOYW1lXG4gICAgICAgICAgICAvLyBhcyB0aGUgZm9ybU5hbWUncyBhcmUgc2FtZSB3aGVuIGZvcm1zIGFyZSBpbiBsaXN0XG4gICAgICAgICAgICBsZXQgZm9ybU5hbWUgPSBfLmdldChmb3JtSW5zdGFuY2UsICdmb3JtR3JvdXBOYW1lJykgfHwgZm9ybUluc3RhbmNlLm5hbWU7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGZvcm1JbnN0YW5jZS5mb3JtQXJyYXlJbmRleCkpIHtcbiAgICAgICAgICAgICAgICBmb3JtTmFtZSA9IGZvcm1OYW1lICsgJ1snICsgZm9ybUluc3RhbmNlLmZvcm1BcnJheUluZGV4ICsgJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBmb3JtSW5zdGFuY2U7XG4gICAgICAgICAgICB3aGlsZSAoXy5nZXQoY3VycmVudCwgJ3BhcmVudEZvcm0nKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnROYW1lID0gY3VycmVudC5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUgfHwgY3VycmVudC5wYXJlbnRGb3JtLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQucGFyZW50Rm9ybS5wYXJlbnRGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5hbWUgKyAnWycgKyBjdXJyZW50LnBhcmVudEZvcm0uZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gcGFyZW50TmFtZSArICcuJyArIGZvcm1OYW1lO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEZvcm07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyhmb3JtSW5zdGFuY2UsIGZvcm1OYW1lLCB2YWxpZGF0ZVRvdWNoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB2YWxpZGF0aW9uIG9uIGZvcm1GaWVsZHMuXG4gICAgICogQXBwbGllcyB0byBpbm5lcmZvcm0gYW5kIGFsc28gc2V0cyBpbm5lcmZvcm0gdmFsaWRhdGlvbiBvbiBwYXJlbnQgZm9ybS5cbiAgICAgKiBAcGFyYW0gcHJlZml4IGNvbnRhaW5zIHRoZSBmb3JtIG5hbWUsIHdoaWNoIGFsc28gaW5jbHVkZXMgaXRzIHBhcmVudHMgZm9ybSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVRvdWNoXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uT25GaWVsZHMoZm9ybTogRm9ybUNvbXBvbmVudCwgcHJlZml4OiBzdHJpbmcsIHZhbGlkYXRlVG91Y2g/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5uZ2Zvcm0uY29udHJvbHM7XG4gICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBmb3JtLmZvcm1GaWVsZHM7XG4gICAgICAgIGlmICghZm9ybUZpZWxkcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIF8uZm9yRWFjaChjb250cm9scywgKHYsIGspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZm9ybUZpZWxkcy5maW5kKGUgPT4gZS5rZXkgPT09IGspO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCB8fCAodmFsaWRhdGVUb3VjaCAmJiAhdi50b3VjaGVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKT8uc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLCB2LmludmFsaWQpO1xuICAgICAgICAgICAgLy8gaW52b2tpbmcgdGhlIHByZXBhcmVWYWxpZGF0aW9uIG9uIGJvdGggcGFyZW50IGZvcm0gYW5kIGN1cnJlbnQgZm9ybS5cbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVZhbGlkYXRpb25PYmoodiwgaywgZmllbGQsIHByZWZpeCk7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVWYWxpZGF0aW9uT2JqLmNhbGwoZm9ybSwgdiwgaywgZmllbGQsIHByZWZpeCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFzc2lnbnMgLyB1cGRhdGVzIHZhbGlkYXRpb25NZXNzYWdlcyBiYXNlZCBvbiBhbmd1bGFyIGVycm9ycyBvbiBmaWVsZFxuICAgIHByaXZhdGUgcHJlcGFyZVZhbGlkYXRpb25PYmoodiwgaywgZmllbGQsIHByZWZpeCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmZpbmRJbmRleChlID0+IChlLmZpZWxkID09PSBrICYmIGUuZnVsbHlRdWFsaWZpZWRGb3JtTmFtZSA9PT0gcHJlZml4KSk7XG4gICAgICAgIGlmICh2LmludmFsaWQpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBmaWVsZCBjb250YWlucyB0aGUgZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICogdmFsdWUgY29udGFpbnMgdGhlIGZpZWxkIHZhbHVlXG4gICAgICAgICAgICAgICAgICogZXJyb3JUeXBlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGVycm9yc1xuICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgICAgICAgICAgICAgICAqIGdldEVsZW1lbnQgcmV0dXJucyB0aGUgZWxlbWVudCBoYXZpbmcgZm9jdXMtdGFyZ2V0XG4gICAgICAgICAgICAgICAgICogZm9ybU5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogayxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJvclR5cGU6IF8ua2V5cyh2LmVycm9ycyksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZpZWxkLnZhbGlkYXRpb25tZXNzYWdlIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQuJGVsZW1lbnQuZmluZCgnW2ZvY3VzLXRhcmdldF0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybU5hbWU6IF8ubGFzdChwcmVmaXguc3BsaXQoJy4nKSksXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkRm9ybU5hbWU6IHByZWZpeFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlc1tpbmRleF0udmFsdWUgPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlc1tpbmRleF0uZXJyb3JUeXBlID0gXy5rZXlzKHYuZXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2LnZhbGlkICYmIGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIHdpbGwgcmV0dXJuIGEgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVycm9yIGRldGFpbHMgZnJvbSB0aGUgbGlzdCBvZiBmb3JtRmllbGRzIHRoYXQgYXJlIGludmFsaWRcbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25Nc2dzKHZhbGlkYXRlVG91Y2g/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRmllbGRzLmxlbmd0aCAmJiBfLmlzRW1wdHkodGhpcy5uZ2Zvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uT25GaWVsZHModGhpcywgdGhpcy5uYW1lLCB2YWxpZGF0ZVRvdWNoKTtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uT25Jbm5lckZvcm1zKHZhbGlkYXRlVG91Y2gpO1xuICAgIH1cblxuICAgIC8vIGNoYW5nZSBhbmQgYmx1ciBldmVudHMgYXJlIGFkZGVkIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgcHJvdGVjdGVkIGhhbmRsZUV2ZW50KG5vZGU6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uLCBsb2NhbHM6IGFueSkge1xuICAgICAgICBpZiAoZXZlbnROYW1lICE9PSAnc3VibWl0Jykge1xuICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXZlbnQodGhpcy5uYXRpdmVFbGVtZW50LCBldmVudE5hbWUsIGNhbGxiYWNrLCBsb2NhbHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWVsZFNvdXJjZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybWRhdGFzb3VyY2UgJiYgdGhpcy5mb3JtZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX0FQSV9BV0FSRSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1kYXRhc291cmNlICYmICF0aGlzLmZvcm1kYXRhc291cmNlLnR3b1dheUJpbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmb3JtRmllbGQgPT4ge1xuICAgICAgICAgICAgZm9ybUZpZWxkLnNldEZvcm1XaWRnZXQoJ2RhdGF2YWx1ZXNvdXJjZScsIHRoaXMuZm9ybWRhdGFzb3VyY2UpO1xuICAgICAgICAgICAgZm9ybUZpZWxkLnNldEZvcm1XaWRnZXQoJ2JpbmRkYXRhdmFsdWUnLCBgJHt0aGlzLmJpbmRmb3JtZGF0YX0uJHtmb3JtRmllbGQua2V5fWApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCBsb29wcyB0aHJvdWdoIHRoZSBmb3JtIGZpZWxkcyBhbmQgaGlnaGxpZ2h0cyB0aGUgaW52YWxpZCBmaWVsZHMgYnkgc2V0dGluZyBzdGF0ZSB0byB0b3VjaGVkXG4gICAgaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpIHtcbiAgICAgICAgc2V0VG91Y2hlZFN0YXRlKHRoaXMsIHRoaXMubmdmb3JtLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSB0aGUgZm9ybSBzdWJtaXQgaWYgZm9ybSBpcyBpbiBpbnZhbGlkIHN0YXRlLiBIaWdobGlnaHQgYWxsIHRoZSBpbnZhbGlkIGZpZWxkcyBpZiB2YWxpZGF0aW9uIHR5cGUgaXMgZGVmYXVsdFxuICAgIHZhbGlkYXRlRmllbGRzT25TdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk1zZ3MoKTtcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgZm9ybSBzdWJtaXQgaWYgZm9ybSBpcyBpbiBpbnZhbGlkIHN0YXRlLiBGb3IgZGVsZXRlIG9wZXJhdGlvbiwgZG8gbm90IGNoZWNrIHRoZSB2YWxpZGF0aW9uLlxuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25UeXBlICE9PSAnZGVsZXRlJyAmJiAodGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2h0bWwnIHx8IHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdkZWZhdWx0JylcbiAgICAgICAgICAgICAgICAmJiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS5pbnZhbGlkKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm5nZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbnR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEludmFsaWRGaWVsZHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW52YWxpZCB1bnRvY2hlZCBlbGVtZW50IGFuZCBzZXQgaXQgdG8gdG91Y2hlZC5cbiAgICAgICAgICAgICAgICAvLyBTYWZhcmkgZG9lcyBub3QgZm9ybSB2YWxpZGF0aW9ucy4gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IGVycm9yIGlzIHNob3duIGZvciB1c2VyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlRm9ybSA9IGZpbmRJbnZhbGlkRWxlbWVudCh0aGlzLiRlbGVtZW50LCB0aGlzLm5nZm9ybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgJGludmFsaWRGb3JtID0gZWxlRm9ybS5uZ0Zvcm07XG4gICAgICAgICAgICAgICAgbGV0ICRpbnZhbGlkRWxlICA9IGVsZUZvcm0uJGVsZTtcbiAgICAgICAgICAgICAgICAkaW52YWxpZEVsZSA9ICRpbnZhbGlkRWxlLnBhcmVudCgpLmZpbmQoJ1tmb2N1cy10YXJnZXRdJyk7XG4gICAgICAgICAgICAgICAgaWYgKCRpbnZhbGlkRWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBzYXZlIGNsaWNrIGluIHBhZ2UgbGF5b3V0IGxpdmVmb3JtLCBmb2N1cyBvZiBhdXRvY29tcGxldGUgd2lkZ2V0IG9wZW5zIGZ1bGwtc2NyZWVuIHNlYXJjaC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkaW52YWxpZEVsZS5oYXNDbGFzcygnYXBwLXNlYXJjaC1pbnB1dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW52YWxpZEVsZS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5nRWxlID0gJGludmFsaWRGb3JtICYmICRpbnZhbGlkRm9ybS5jb250cm9sc1skaW52YWxpZEVsZS5hdHRyKCdmb3JtQ29udHJvbE5hbWUnKSB8fCAkaW52YWxpZEVsZS5hdHRyKCduYW1lJyldO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmdFbGUgJiYgbmdFbGUubWFya0FzVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmdFbGUubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92Pykge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbmFsaWduJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25BbGlnbkNsYXNzID0gJ2FsaWduLScgKyBudjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25wb3NpdGlvbic6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb253aWR0aCc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhcHRpb25zaXplJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25zaXplID0gbnY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdub3ZhbGlkYXRlJzpcbiAgICAgICAgICAgICAgICAvLyAgU2V0IHZhbGlkYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgbm92YWxpZGF0ZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LnZhbGlkYXRpb250eXBlID0gKG52ID09PSB0cnVlIHx8IG52ID09PSAndHJ1ZScpID8gJ25vbmUnIDogJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZm9ybWRhdGEnOlxuICAgICAgICAgICAgICAgIC8vIEZvciBsaXZlbGlzdCB3aGVuIG11bHRpc2VsZWN0IGlzIGVuYWJsZWQsIGZvcm1kYXRhIHdpbGwgYmUgYXJyYXkgb2Ygb2JqZWN0cy4gSW4gdGhpcyBjYXNlIGNvbnNpZGVyIHRoZSBsYXN0IG9iamVjdCBhcyBmb3JtZGF0YS5cbiAgICAgICAgICAgICAgICBpZiAoXy5pc0VxdWFsKG52LCBvdikpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF8uaXNBcnJheShudikgPyB0aGlzLnNldEZvcm1EYXRhKF8ubGFzdChudikpIDogdGhpcy5zZXRGb3JtRGF0YShudik7XG4gICAgICAgICAgICAgICAgLy8gaWYgZGF0YXNldCBvbiB0aGUgZm9ybUZpZWxkcyBhcmUgbm90IHNldCBhcyB0aGUgZGF0YXNvdXJjZUNoYW5nZSBpcyB0cmlnZ2VyZWQgYmVmb3JlIHRoZSBmb3JtRmllbGRzIGFyZSByZWdpc3RlcmVkLlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFTb3VyY2VVcGRhdGVkICYmIHRoaXMuZGF0YXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHRtb2RlJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMYXlvdXREaWFsb2cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG52ICYmIG52ID09PSAnRWRpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRoaXMudXBkYXRlTW9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXRhc291cmNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZm9ybWRhdGFzb3VyY2UnOlxuICAgICAgICAgICAgICAgIHRoaXMub25Gb3JtRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWV0YWRhdGEnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGb3JtRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXRhc2V0JzpcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBkYXRhc2V0IGNoYW5nZSB0byB0aGUgZm9ybS1maWVsZCB3aWRnZXQuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQuaXNEYXRhU2V0Qm91bmQgJiYgXy5nZXQoZmllbGQuZm9ybVdpZGdldCwgJ2RhdGFzZXQkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmZvcm1XaWRnZXQuZGF0YXNldCQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXZlbnQgY2FsbGJhY2tzIG9uIHN1Y2Nlc3MvZXJyb3JcbiAgICBvblJlc3VsdENiKGRhdGEsIHN0YXR1cywgZXZlbnQ/KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHskZXZlbnQ6IGV2ZW50LCAkZGF0YTogZGF0YSwgJG9wZXJhdGlvbjogdGhpcy5vcGVyYXRpb25UeXBlfTtcbiAgICAgICAgLy8gd2hldGhlciBzZXJ2aWNlIGNhbGwgc3VjY2VzcyBvciBmYWlsdXJlIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdyZXN1bHQnLCBwYXJhbXMpO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAvLyBpZiBzZXJ2aWNlIGNhbGwgaXMgc3VjY2VzcyBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Y2Nlc3MnLCBwYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgc2VydmljZSBjYWxsIGZhaWxzIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBvciBoaWRlIHRoZSBpbmxpbmUgbWVzc2FnZS8gdG9hc3RlclxuICAgIHRvZ2dsZU1lc3NhZ2Uoc2hvdzogYm9vbGVhbiwgbXNnPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nLCBoZWFkZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlO1xuICAgICAgICBpZiAoc2hvdyAmJiBtc2cpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gKHR5cGUgPT09ICdlcnJvcicgJiYgdGhpcy5lcnJvcm1lc3NhZ2UpID8gdGhpcy5lcnJvcm1lc3NhZ2UgOiBtc2c7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlbGF5b3V0ID09PSAnSW5saW5lJykge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5jaGVja0FwcFNlcnZpY2VFcnJvck1zZyh0eXBlKSB8fCB0ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSB7J2NhcHRpb24nOiB0ZW1wbGF0ZSB8fCAnJywgdHlwZTogdHlwZX07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZVJlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWYuc2hvd01lc3NhZ2UodGhpcy5zdGF0dXNNZXNzYWdlLmNhcHRpb24sIHRoaXMuc3RhdHVzTWVzc2FnZS50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBtZXNzYWdlIGxheW91dCBpcyBpbmxpbmUgb24gc2F2ZSwgc2Nyb2xsIHRoZSB2aWV3IHRvIHRvcCBvZiB0aGUgZm9ybSB0byBzZWUgdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCFpc0VsZW1lbnRJblZpZXdwb3J0KHRoaXMuJGVsZW1lbnRbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvRWxlbWVudCh0aGlzLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeUFwcCh0ZW1wbGF0ZSwgdHlwZSwgaGVhZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZS5jYXB0aW9uID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBBcHAub25TZXJ2aWNlRXJyb3IgaGFuZGxlciBmb3IgdGhlIGFwcCwgdGhhdCBtZXNzYWdlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Ygc2VydmVyIHJldHVybmVkIGVycm9yIG1lc3NhZ2VcbiAgICBjaGVja0FwcFNlcnZpY2VFcnJvck1zZyh0eXBlKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkFjdGlvbiA9IF8uZ2V0KHRoaXMuYXBwLCAnQWN0aW9ucy5hcHBOb3RpZmljYXRpb24nKTtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkFjdGlvbiAmJiB0eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gbm90aWZpY2F0aW9uQWN0aW9uLmdldE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0aGUgaW5saW5lIG1lc3NhZ2UvIHRvYXN0ZXJcbiAgICBjbGVhck1lc3NhZ2UoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBjbGFzc2VzIG9uIHRoZSBmb3JtIGJhc2VkIG9uIHRoZSBjYXB0aW9ucG9zaXRpb24gYW5kIGNhcHRpb253aWR0aCBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBzZXRMYXlvdXRDb25maWcoKSB7XG4gICAgICAgIGxldCBsYXlvdXRDb25maWc7XG4gICAgICAgIGxheW91dENvbmZpZyA9IGdldEZpZWxkTGF5b3V0Q29uZmlnKHRoaXMuY2FwdGlvbndpZHRoLCB0aGlzLmNhcHRpb25wb3NpdGlvbiwgXy5nZXQodGhpcy5hcHAuc2VsZWN0ZWRWaWV3UG9ydCwgJ29zJykpO1xuICAgICAgICB0aGlzLl93aWRnZXRDbGFzcyA9IGxheW91dENvbmZpZy53aWRnZXRDbHM7XG4gICAgICAgIHRoaXMuX2NhcHRpb25DbGFzcyA9IGxheW91dENvbmZpZy5jYXB0aW9uQ2xzO1xuXG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICB9XG5cbiAgICByZWdpc3RlckZvcm1XaWRnZXQod2lkZ2V0KSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB3aWRnZXQubmFtZSB8fCB3aWRnZXQua2V5O1xuICAgICAgICB0aGlzLmZvcm1XaWRnZXRzW25hbWVdID0gd2lkZ2V0O1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRm9ybUZpZWxkcyhmb3JtRmllbGQpIHtcbiAgICAgICAgY29uc3QgZmllbGRDb3VudCA9IHRoaXMuZm9ybUZpZWxkcy5wdXNoKGZvcm1GaWVsZCk7XG4gICAgICAgIHRoaXMuZm9ybWZpZWxkc1tmb3JtRmllbGQua2V5XSA9IGZvcm1GaWVsZDtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvcm1XaWRnZXQoZm9ybUZpZWxkKTtcbiAgICAgICAgdGhpcy5fZGVib3VuY2VkVXBkYXRlRmllbGRTb3VyY2UoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLmZvcm1GaWVsZHMucHVzaChmb3JtRmllbGQpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLmZvcm1maWVsZHNbZm9ybUZpZWxkLmtleV0gPSBmb3JtRmllbGQ7XG4gICAgICAgICAgICAvLyBpbm5lciBmb3JtZmllbGRzIGFyZSBwdXNoZWQgdG8gcGFyZW50Rm9ybSwgcGFzc2luZyBjdXJyZW50IGlubmVyRm9ybSdzIGZvcm1kYXRhIHRvIHNldCBpbm5lckZvcm1kYXRhIHRvIHRoZXNlIGlubmVyRm9ybUZpZWxkc1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLnNldEZvcm1EYXRhKHRoaXMucGFyZW50Rm9ybS5mb3JtZGF0YSwgdGhpcy5mb3JtRmllbGRzLCB0aGlzLmZvcm1kYXRhIHx8IHt9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXTVMtMTg5Njc6IEFwcGx5aW5nIGZvcm1hZGF0YSBhZnRlciBmb3JtZmllbGRzIGFyZSByZWFkeVxuICAgICAgICBpZiAoZmllbGRDb3VudCA9PT0gdGhpcy5udW1iZXJPZkZpZWxkcyAmJiAhXy5pc0VtcHR5KHRoaXMuZm9ybWRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgXy5pc0FycmF5KHRoaXMuZm9ybWRhdGEpID8gdGhpcy5zZXRGb3JtRGF0YShfLmxhc3QodGhpcy5mb3JtZGF0YSkpIDogdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyQWN0aW9ucyhmb3JtQWN0aW9uKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uQXJyYXkucHVzaChmb3JtQWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRhdGFvdXRwdXQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gaW5zaWRlIGZvcm0gd2lkZ2V0IHZhbHVlXG4gICAgdXBkYXRlRm9ybURhdGFPdXRwdXQoZGF0YU9iamVjdCkge1xuICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgd2lkZ2V0cyBpbnNpZGUgdGhlIGxpdmUgZm9ybSAob3RoZXIgdGhhbiBmb3JtIGZpZWxkcykgaW4gZm9ybSBkYXRhXG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLm5nZm9ybS52YWx1ZSwgKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV8uZmluZCh0aGlzLmZvcm1GaWVsZHMsIHtrZXl9KSkge1xuICAgICAgICAgICAgICAgIGRhdGFPYmplY3Rba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGF0YW91dHB1dCA9IGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIG9iamVjdCBtZXJnaW5nIHRoZSBmb3JtIGZpZWxkcyBhbmQgY3VzdG9tIHdpZGdldHMgZGF0YVxuICAgIGNvbnN0cnVjdERhdGFPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhICAgICA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRzKCk7XG4gICAgICAgIC8vIEdldCBhbGwgZm9ybSBmaWVsZHMgYW5kIHByZXBhcmUgZm9ybSBkYXRhIGFzIGtleSB2YWx1ZSBwYWlyc1xuICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgbGV0IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkLmRhdGF2YWx1ZSB8fCBmaWVsZC5fY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSAoZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCBmaWVsZFZhbHVlID09PSAnJykgPyB1bmRlZmluZWQgOiBmaWVsZFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGdldEZpbGVzKHRoaXMubmFtZSwgZmllbGQua2V5ICsgJ19mb3JtV2lkZ2V0JywgZmllbGQubXVsdGlwbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZC5rZXkgfHwgZmllbGQudGFyZ2V0IHx8IGZpZWxkLm5hbWU7XG5cbiAgICAgICAgICAgIC8vIG9uIGN1cnJlbnQgRm9ybSwgd2hlbiBmaWVsZCBpcyBpbm5lckZvcm0gZmllbGQgdGhlbiB3ZSBncm91cCB0aGVzZSBmaWVsZHMgdW5kZXIgbmV3IG9iamVjdCB1c2luZyBmb3JtR3JvdXBOYW1lIGFzIGtleVxuICAgICAgICAgICAgLy8gRm9yIHN1cHBvc2UsIGFwcGxpY2FudE5hbWUsIGFwcGxpY2FudElEIGFyZSBmb3JtZmllbGRzIGluIGN1cnJlbnRGb3JtXG4gICAgICAgICAgICAvLyBUaGlzIGZvcm0gaXMgaGF2aW5nIGlubmVyZm9ybSBpLmUuIGFkZHJlc3MsIHRoZXNlIGZpZWxkcyBhcmUgbGlzdGVkIGFzXG4gICAgICAgICAgICAvLyB7XCJhcHBsaWNhbnROYW1lXCI6IFwiXCIsIFwiYXBwbGljYW50SURcIjogXCJcIiwgXCJhZGRyZXNzXCI6IHtcInN0cmVldFwiOiBcIlwifX1cbiAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtLndpZGdldElkICE9PSB0aGlzLndpZGdldElkICYmIGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gXy5nZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZSwge30pO1xuICAgICAgICAgICAgICAgIGZkW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIF8uc2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKHR5cGVvZiBmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4ID09PSAnbnVtYmVyJykgJiYgZmllbGQuZm9ybS5pc1BhcmVudExpc3QgJiYgIXRoaXMucGFyZW50Rm9ybSkgeyAvLyBGaXggZm9yIFtXTVMtMjU4MDZdOiB1c2UgZm9ybUFycmF5SW5kZXggb25seSBpZiBmb3JtIGhhcyBhIHBhcmVudCBmb3JtXG4gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBmb3JtZGF0YSBiYXNlZCBvbiBmb3JtQXJyYXlJbmRleFxuICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gXy5nZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0ucGFyZW50TGlzdC5uYW1lLCBbXSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGQuZm9ybS5mb3JtQXJyYXlJbmRleF0gPSBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSB8fCB7fTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XVtmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICBfLnNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1cGRhdGUgdGhlIGZpZWxkIHdpbGwgYmUgYWxyZWFkeSBwcmVzZW50IGluIGZvcm0gZGF0YVxuICAgICAgICAgICAgICAgIF8uc2V0KGZvcm1EYXRhLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YU91dHB1dChmb3JtRGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFvdXRwdXQ7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIGlmICh0aGlzLm5nZm9ybS50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25Nc2dzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybUZpZWxkcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBmaWVsZHMgaW4gcGFyZW50IGFuZCBpbm5lciBmb3JtIGFsc28uXG4gICAgLy8gVGhpcyByZXR1cm5zIHRoZSBmb3JtRmllbGRzIGluIHRoZSBmb3JtIGJhc2VkIG9uIHRoZSBmb3JtIG5hbWUuXG4gICAgZ2V0Rm9ybUZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMuZm9ybUZpZWxkcywgZm9ybUZpZWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtRmllbGQuZm9ybS5uYW1lID09PSB0aGlzLm5hbWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEsIGlubmVyRm9ybWRhdGE/KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSB8fCBmaWVsZC5uYW1lO1xuICAgICAgICAvLyBpZiBjdXN0b21maWVsZCBwYXJhbSB2YWx1ZSBpcyBub3QgaW4gdGhlIGZvcm1kYXRhIHRoZW4gZG8gbm90IGFzc2lnbiBmaWVsZCB2YWx1ZVxuICAgICAgICAvLyBhcyBpdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlIHdoaWNoIHdpbGwgYWdhaW4gYmUgb3ZlcnJpZGRlbiBieSB1bmRlZmluZWQuXG4gICAgICAgIGNvbnN0IGZkID0gaW5uZXJGb3JtZGF0YSA/IGlubmVyRm9ybWRhdGEgOiBkYXRhO1xuICAgICAgICBpZiAoZmQpIHtcbiAgICAgICAgICAgIGlmIChmZC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSAgXy5nZXQoZmQsIGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaW5jbHVkZXMoa2V5LCAnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5IGNvbnRhaW5zICcuJyB3aGVuIG1hcHBpbmcgdGhlIGZpZWxkcyB0byBjaGlsZCByZWZlcmVuY2UgaS5lLiBjaGlsZENvbCBpcyBoYXZpbmcga2V5IGFzIFwicGFyZW50LmNoaWxkQ29sXCJcbiAgICAgICAgICAgICAgICBpZiAoZmQuaGFzT3duUHJvcGVydHkoXy5zcGxpdChrZXksICcuJylbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gIF8uZ2V0KGZkLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdNUy0xODkwNjogRm9yIGRlZmF1bHQgdmFsdWUsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGlydHkgJiYgIXRoaXMuX3RyaWdnZXJlZEJ5VXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JtR3JvdXBOYW1lID0gZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogaWYgZm9ybUdyb3VwTmFtZSBpcyBkZWZpbmVkIHdoaWNoIG1lYW5zIGZpZWxkIGlzIGluc2lkZSB0aGUgaW5uZXIgZm9ybVxuICAgICAgICAgKiB0aGVuIHNldCB0aGUgZm9ybWRhdGEgb24gdGhlIGZpZWxkJ3MgZm9ybSB1c2luZyBmb3JtR3JvdXBOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZm9ybUdyb3VwTmFtZSAmJiBfLmdldChkYXRhLCBmb3JtR3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YS5jYWxsKGZpZWxkLmZvcm0sIGRhdGFbZm9ybUdyb3VwTmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZvcm1kYXRhIGlzIGFzc2lnbmVkIGxhdGVyIHRoZW4gb24gcHJvcGVydHlDaGFuZ2VIYW5kbGVyLCBldmVuIGlubmVyIGZvcm1zIGRhdGEgYWxzbyBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAgICBpZiAoXy5nZXQoZmllbGQuZm9ybSwgJ3BhcmVudEZvcm1BcnJheScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YShkYXRhLCBpbm5lckZvcm1GaWVsZHM/LCBpbm5lckZvcm1kYXRhPykge1xuICAgICAgICAvLyB3aGVyZWFzIGZvcm1GaWVsZHMgZXhwbGljaXRseSBwYXNzZWQgY2FuIGNvbnRhaW4gaW5uZXJmb3JtIGZpZWxkcyBhbHNvLlxuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gaW5uZXJGb3JtRmllbGRzIHx8IHRoaXMuZm9ybUZpZWxkcztcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YSk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmllbGRWYWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMuc2V0Q3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgIH1cblxuICAgIHJlc2V0Rm9ybVN0YXRlKCkge1xuICAgICAgICAvLyBjbGVhcmluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIG9uIHJlc2V0LlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGZpZWxkLndpZGdldHR5cGUgPT09ICd1cGxvYWQnIHx8IGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldmZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMucHJldmZvcm1GaWVsZHMgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtRmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdrZXknOiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgICd3aWRnZXR0eXBlJzogZmllbGQud2lkZ2V0dHlwZSxcbiAgICAgICAgICAgICAgICAnb3V0cHV0Zm9ybWF0JzogZmllbGQub3V0cHV0Zm9ybWF0LFxuICAgICAgICAgICAgICAgICd2YWx1ZSc6IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZEYXRhVmFsdWVzKCkge1xuICAgICAgICB0aGlzLnByZXZEYXRhVmFsdWVzID0gdGhpcy5mb3JtRmllbGRzLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geydrZXknOiBvYmoua2V5LCAndmFsdWUnOiBvYmoudmFsdWV9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZWFkb25seUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHNraXBWYWx1ZVNldD8pIHtcbiAgICAgICAgY29uc3QgJGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAkZm9ybUVsZS5maW5kKCdbbmFtZT1cIicgKyBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXRcIl0nKS52YWwoJycpO1xuICAgICAgICBmaWVsZC5fY29udHJvbC5yZXNldCgpO1xuICAgICAgICBpZiAoIXNraXBWYWx1ZVNldCkge1xuICAgICAgICAgICAgZmllbGQuaHJlZiA9ICcnO1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1wdHlEYXRhTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGF2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBmaWVsZC5kZWZhdWx0dmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRPcGVyYXRpb25UeXBlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gbW9kZSB8fCAnaW5zZXJ0JztcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLklOU0VSVDtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtcHR5RGF0YU1vZGVsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5VUERBVEU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2RGF0YU9iamVjdCA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1kYXRhIHx8IHt9KTtcblxuICAgICAgICB0aGlzLnNldFJlYWRvbmx5RmllbGRzKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RlcGVuZHNvbnRhYmxlJyk7XG4gICAgICAgIGlmICghdGFibGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgdGhpcy5hcHAubm90aWZ5KCd3bS1ldmVudCcsIHtldmVudE5hbWUsIHdpZGdldE5hbWU6IHRhYmxlSWR9KTtcbiAgICB9XG5cbiAgICBzdWJtaXRGb3JtKCRldmVudCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUsIGZvcm1EYXRhLCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFzb3VyY2U7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtRGF0YSA9IGdldENsb25lZE9iamVjdCh0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKSk7XG5cbiAgICAgICAgY29uc3QgZ2V0UGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHskZXZlbnQsICRmb3JtRGF0YTogZm9ybURhdGEsICRkYXRhOiBmb3JtRGF0YX07XG4gICAgICAgIH07XG5cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVN1Ym1pdEV2dCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc3VibWl0JywgZ2V0UGFyYW1zKCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25TdWJtaXRFdnQgfHwgZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgLy8gSWYgb24gc3VibWl0IGlzIHRoZXJlIGV4ZWN1dGUgaXQgYW5kIGlmIGl0IHJldHVybnMgdHJ1ZSBkbyBzZXJ2aWNlIHZhcmlhYmxlIGludm9rZSBlbHNlIHJldHVyblxuICAgICAgICAgICAgLy8gSWYgaXRzIGEgc2VydmljZSB2YXJpYWJsZSBjYWxsIHNldElucHV0IGFuZCBhc3NpZ24gZm9ybSBkYXRhIGFuZCBpbnZva2UgdGhlIHNlcnZpY2VcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW0gPSBkYXRhU291cmNlLnBhZ2luYXRpb24gJiYgZGF0YVNvdXJjZS5wYWdpbmF0aW9uLm51bWJlciArIDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHRoaXMub3BlcmF0aW9uVHlwZSA/IHRoaXMub3BlcmF0aW9uVHlwZSA6ICdpbnNlcnQnO1xuICAgICAgICAgICAgICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uKGRhdGFTb3VyY2UsIGZvcm1EYXRhLCB7b3BlcmF0aW9uVHlwZTogb3BlcmF0aW9uVHlwZX0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZS5jYXRlZ29yeSA9PT0gJ3dtLkNydWRWYXJpYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCdyZXNldEVkaXRNb2RlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uTElTVF9SRUNPUkRTLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwVG9nZ2xlU3RhdGUnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uJzogJ2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFnZSc6IGN1cnJlbnRQYWdlTnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJldmVudE1pc3NpbmdPcE1zZyc6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWFsb2dJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChkYXRhLmJvZHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRKU09OKGRhdGEuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNEZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiBkYXRhLmJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiB0aGlzLnBvc3RtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5lcnJvcm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgfHwgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiBfLmdldChlcnJvciwgJ2Vycm9yJykgfHwgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZXNwb25zZS50eXBlID09PSAnZXJyb3InICYmICF0aGlzLm9uRXJyb3IpIHx8IChyZXNwb25zZS50eXBlID09PSAnc3VjY2VzcycgJiYgIXRoaXMub25TdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVNZXNzYWdlKHRydWUsIHJlc3BvbnNlLm1lc3NhZ2UsIHJlc3BvbnNlLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VibWl0JywgZ2V0UGFyYW1zKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2IocmVzcG9uc2UucmVzdWx0LCByZXNwb25zZS5zdGF0dXMsICRldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VibWl0JywgZ2V0UGFyYW1zKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMub25SZXN1bHRDYih7fSwgdHJ1ZSwgJGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25SZXN1bHRDYih7fSwgdHJ1ZSwgJGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb3NlRGlhbG9nKCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xvc2UodGhpcy5kaWFsb2dJZCk7XG4gICAgfVxuXG4gICAgLy8gTWV0aG9kIHRvIHNob3cvaGlkZSB0aGUgcGFuZWwgaGVhZGVyIG9yIGZvb3RlciBiYXNlZCBvbiB0aGUgYnV0dG9uc1xuICAgIHNob3dCdXR0b25zKHBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBfLnNvbWUodGhpcy5idXR0b25BcnJheSwgYnRuID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfLmluY2x1ZGVzKGJ0bi5wb3NpdGlvbiwgcG9zaXRpb24pICYmIGJ0bi51cGRhdGVNb2RlID09PSB0aGlzLmlzVXBkYXRlTW9kZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBwYW5lbFxuICAgIGV4cGFuZENvbGxhcHNlUGFuZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgICAgICAvLyBmbGlwIHRoZSBhY3RpdmUgZmxhZ1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EYXRhU291cmNlVXBkYXRlKHJlc3BvbnNlLCBuZXdGb3JtLCB1cGRhdGVNb2RlKSB7XG4gICAgICAgIGlmIChuZXdGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLm5ldygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSBpc0RlZmluZWQodXBkYXRlTW9kZSkgPyB1cGRhdGVNb2RlIDogdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB0cmFudmVyc2VzIHRocm91Z2ggdGhlIHBhcmVudCBjb250YWluaW5nIGZvcm1kYXRhIGFuZCByZXR1cm5zIHRoZSBwYXJlbnQgZm9ybWRhdGEuXG4gICAgICogQHBhcmFtIGZvcm0sIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgZm9ybSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0pIHtcbiAgICAgICAgaWYgKCFmb3JtLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0uYmluZGZvcm1kYXRhICYmIF8uZ2V0KGZvcm0ucGFyZW50Rm9ybSwgJ2Zvcm1kYXRhJykgJiYgIV8uaXNFbXB0eShmb3JtLnBhcmVudEZvcm0uZm9ybWRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybS5wYXJlbnRGb3JtLmZvcm1kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5lYXJlc3RQYXJlbnRGb3JtRGF0YShmb3JtLnBhcmVudEZvcm0pO1xuICAgIH1cblxuICAgIHNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKF8uaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSAmJiB0aGlzLnBhcmVudEZvcm0gJiYgZm9ybWRhdGEpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgZm9ybSBpcyBpbnNpZGUgbGlzdCxcbiAgICAgICAgICAgICAqIDEuIGRpcmVjdGx5IGFwcGx5aW5nIHRoZSBmb3JtZGF0YSB0byB0aGUgZm9ybUFycmF5IHRvIHVwZGF0ZSB0aGUgZm9ybWRhdGEgb24gbGlzdCBvZiBmb3JtcyB1c2luZyBwYXRjaFZhbHVlLlxuICAgICAgICAgICAgICogMi4gYW5kIGFsc28gc2V0dGluZyBpbmRpdmlkdWFsIGZvcm1kYXRhIHRvIHRoZSBmb3JtIGluc2lkZSBlYWNoIGl0ZW0gYmFzZWQgb24gZm9ybUFycmF5SW5kZXgsIHdoZW4gZm9ybSBpcyBub3QgYm91bmQgdG8gZm9ybWRhdGEuXG4gICAgICAgICAgICAgKiAzLiBleHBsaWNpdGx5IGludm9raW5nIGZvcm1kYXRhIGFzIGZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZm9ybWZpZWxkcyBpbmNsdWRpbmcgaW5uZXJGb3JtJ3MgZmllbGRzXG4gICAgICAgICAgICAgKiAoaWYgd2UgZG8gbm90IGludm9rZSBleHBsaWNpdGx5IHRoZW4gZm9ybUZpZWxkcyB3aWxsIGp1c3QgY29udGFpbiB0aGUgZmllbGRzIGluc2lkZSBjdXJyZW50IGZvcm0gYW5kIG5vdCBpbm5lciBmb3JtIGZpZWxkcylcbiAgICAgICAgICAgICAqIDQuIGlmIGNoaWxkRm9ybUFycmF5RGF0YSBpcyBub3QgYXZhaWxhYmxlIHdlIHdpbGwgY2hlY2sgZm9yIGlubmVyIGZvcm0gZGF0YSB1c2luZyBcImZvcm1Hcm91cE5hbWVcIiBhbmQgd2lsbCBzZXQgdGhlIGlubmVyZm9ybSBkYXRhXG4gICAgICAgICAgICAgKiBJZiBub3QgaW5zaWRlIGxpc3QsIGp1c3Qgc2V0IHRoZSBmb3JtZGF0YSBvbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSBmaWVsZHNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybUFycmF5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkRm9ybUFycmF5RGF0YSA9IF8uZ2V0KGZvcm1kYXRhLCB0aGlzLnBhcmVudExpc3QubmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkRm9ybUFycmF5RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV8uaXNBcnJheShjaGlsZEZvcm1BcnJheURhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEZvcm1BcnJheURhdGEgPSBbY2hpbGRGb3JtQXJyYXlEYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm1BcnJheS5wYXRjaFZhbHVlKGNoaWxkRm9ybUFycmF5RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5iaW5kZm9ybWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWRhdGEgPSBjaGlsZEZvcm1BcnJheURhdGFbdGhpcy5mb3JtQXJyYXlJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQYXJlbnRMaXN0ICYmIHRoaXMucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1EYXRhID0gXy5nZXQoZm9ybWRhdGEsIHRoaXMucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShwYXJlbnRGb3JtRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkRhdGFTb3VyY2VDaGFuZ2UoKSB7XG4gICAgICAgIGlmIChfLmdldCh0aGlzLmZvcm1GaWVsZHMsICdsZW5ndGgnKSAmJiAhdGhpcy5iaW5kZm9ybWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuaXNEYXRhU291cmNlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGZvcm1kYXRhIG9uIHRoZSBwYXJlbnQgZm9ybSB3aWxsIGJlIHNldCBiZWZvcmUgdGhlIGlubmVyIGZvcm1zIGFyZSByZW5kZXJlZC5cbiAgICAgICAgICAgICAqIEhlbmNlIGhhbmRsaW5nIGZvcm1kYXRhIG9uIHRoZSBpbm5lckZvcm1zLCB3aGljaCBtaWdodCBiZSByZW5kZXJlZCBzbG93bHkgKHN1cHBvc2UgcHJlZmFiIHdpdGggZm9ybSlcbiAgICAgICAgICAgICAqIHNldHRpbmcgaW5uZXIgZm9ybSdzIGZvcm1kYXRhIG9idGFpbmVkIGZyb20gcGFyZW50IGZvcm1kYXRhXG4gICAgICAgICAgICAgKiB0aGlzIGFwcGxpZXMgb25seSB3aGVuIGZvcm1kYXRhIGlzIG5vdCBnaXZlbiBvbiB0aGUgaW5uZXIgZm9ybS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSB0aGlzLmdldE5lYXJlc3RQYXJlbnRGb3JtRGF0YSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEoZm9ybWRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBkYXRhIHNvdXJjZSBjaGFuZ2UuIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgbGl2ZSBmb3JtIGFuZCBsaXZlIGZpbHRlclxuICAgIG9uRm9ybURhdGFTb3VyY2VDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRmllbGRTb3VyY2UoKTtcbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGZpZWxkIGRlZmF1bHQgdmFsdWUgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBudikge1xuICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlVmFsdWVCeVR5cGUobnYsIHVuZGVmaW5lZCwgZmllbGQud2lkZ2V0dHlwZSwgZmllbGQudHJhaWxpbmd6ZXJvKTtcbiAgICAgICAgLy8gV01TLTIyNDM0OiBGb3IgZGVmYXVsdCB2YWx1ZSBzZXQgb24gaW5kaXZpZHVhbCBmb3JtIGZpZWxkcywgZG8gbm90IG1hcmsgdGhlIGZvcm0gYXMgZGlydHkuXG4gICAgICAgIGlmICh0aGlzLmRpcnR5ICYmICF0aGlzLl90cmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZmllbGQgdmFsdWUgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZpZWxkVmFsdWVDaGFuZ2UoKSB7XG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb24gdG8gZ2VuZXJhdGUgYW5kIGNvbXBpbGUgdGhlIGZvcm0gZmllbGRzIGZyb20gdGhlIG1ldGFkYXRhXG4gICAgYXN5bmMgZ2VuZXJhdGVGb3JtRmllbGRzKCkge1xuICAgICAgICBsZXQgbm9PZkNvbHVtbnM7XG4gICAgICAgIGxldCAkZ3JpZExheW91dDtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZ3JpZCBsYXlvdXQgaXMgcHJlc2VudCBvciBub3QgZm9yIGZpcnN0IHRpbWVcbiAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzR3JpZExheW91dFByZXNlbnQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5wYW5lbC1ib2R5IFt3bWxheW91dGdyaWRdJykubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIFt3bWxheW91dGdyaWRdJykuZmlyc3QoKTtcbiAgICAgICAgICAgIG5vT2ZDb2x1bW5zID0gTnVtYmVyKCRncmlkTGF5b3V0LmF0dHIoJ2NvbHVtbnMnKSkgfHwgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyAuZHluYW1pYy1mb3JtLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgaWYgKCEkZ3JpZExheW91dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzJykucHJlcGVuZCgnPGRpdiBjbGFzcz1cImR5bmFtaWMtZm9ybS1jb250YWluZXJcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgLmR5bmFtaWMtZm9ybS1jb250YWluZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vT2ZDb2x1bW5zID0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IDEyIC8gbm9PZkNvbHVtbnM7XG4gICAgICAgIGxldCBmaWVsZFRlbXBsYXRlID0gJyc7XG4gICAgICAgIGxldCBjb2xDb3VudCA9IDA7XG4gICAgICAgIGxldCBpbmRleDtcbiAgICAgICAgbGV0IHVzZXJGaWVsZHM7XG4gICAgICAgIGxldCBmaWVsZHMgPSB0aGlzLm1ldGFkYXRhID8gdGhpcy5tZXRhZGF0YS5kYXRhIHx8IHRoaXMubWV0YWRhdGEgOiBbXTtcblxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMgPSBbXTsgLy8gZW1wdHkgdGhlIGZvcm0gZmllbGRzXG5cbiAgICAgICAgaWYgKF8uaXNFbXB0eShmaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVJlbmRlckV2dCkge1xuICAgICAgICAgICAgdXNlckZpZWxkcyA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3JlcmVuZGVyJywgeyRtZXRhZGF0YTogZmllbGRzfSk7XG4gICAgICAgICAgICBpZiAodXNlckZpZWxkcykge1xuICAgICAgICAgICAgICAgIGZpZWxkcyA9IHVzZXJGaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV8uaXNBcnJheShmaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoZmllbGRzW2NvbENvdW50XSkge1xuICAgICAgICAgICAgbGV0IGNvbFRtcGwgPSAnJztcbiAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5vT2ZDb2x1bW5zOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tjb2xDb3VudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29sVG1wbCArPSBzZXRNYXJrdXBGb3JGb3JtRmllbGQoZmllbGRzW2NvbENvdW50XSwgY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2xDb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSArPSBgPHdtLWdyaWRyb3c+JHtjb2xUbXBsfTwvd20tZ3JpZHJvdz5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSB7XG4gICAgICAgICAgICBmaWVsZFRlbXBsYXRlID0gYDx3bS1sYXlvdXRncmlkPiR7ZmllbGRUZW1wbGF0ZX08L3dtLWxheW91dGdyaWQ+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHluYW1pY0Zvcm1SZWYuY2xlYXIoKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2R5bmFtaWNDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dCA9IE9iamVjdC5jcmVhdGUodGhpcy52aWV3UGFyZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2R5bmFtaWNDb250ZXh0LmZvcm0gPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlSZWYgPSBhd2FpdCB0aGlzLmR5bmFtaWNDb21wb25lbnRQcm92aWRlci5nZXRDb21wb25lbnRGYWN0b3J5UmVmKFxuICAgICAgICAgICAgJ2FwcC1mb3JtLWR5bmFtaWMtJyArIHRoaXMud2lkZ2V0SWQsXG4gICAgICAgICAgICBmaWVsZFRlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5vQ2FjaGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHJhbnNwaWxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5keW5hbWljRm9ybVJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeVJlZiwgMCwgdGhpcy5pbmopO1xuICAgICAgICBleHRlbmRQcm90byhjb21wb25lbnQuaW5zdGFuY2UsIHRoaXMuX2R5bmFtaWNDb250ZXh0KTtcbiAgICAgICAgJGdyaWRMYXlvdXRbMF0uYXBwZW5kQ2hpbGQoY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgIH1cblxuICAgIGdldCBtb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25UeXBlIHx8IHRoaXMuZmluZE9wZXJhdGlvblR5cGUoKTtcbiAgICB9XG5cbiAgICBnZXQgZGlydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS5kaXJ0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIHByaXN0aW5lIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1ByaXN0aW5lIG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNQcmlzdGluZSh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gZGlydHkgYnkgaW50ZXJuYWxseSBjYWxsaW5nIGFuZ3VsYXIgbWFya0FzRGlydHkgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc0RpcnR5KHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzRGlydHkoeyBvbmx5U2VsZjogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGludmFsaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS5pbnZhbGlkO1xuICAgIH1cblxuICAgIGdldCB0b3VjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0udG91Y2hlZDtcbiAgICB9XG5cbiAgICBnZXQgdmFsaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS52YWxpZDtcbiAgICB9XG5cbiAgICBnZXQgcHJpc3RpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS5wcmlzdGluZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIHRvdWNoZWQgYnkgaW50ZXJuYWxseSBjYWxsaW5nIGFuZ3VsYXIgbWFya0FzVG91Y2hlZCBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzVG91Y2hlZCh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byB1bnRvdWNoZWQgYnkgaW50ZXJuYWxseSBjYWxsaW5nIGFuZ3VsYXIgbWFya0FzVW50b3VjaGVkIG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNVbnRvdWNoZWQodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoeyBvbmx5U2VsZjogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBleHByZXNzaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZm4gPSAkcGFyc2VFdmVudChleHByZXNzaW9uKTtcbiAgICAgICAgZm4odGhpcy52aWV3UGFyZW50LCBPYmplY3QuYXNzaWduKHRoaXMuY29udGV4dCwgeyRldmVudH0pKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgLy8gb24gZm9ybSBkZXN0cm95LCByZW1vdmluZyB0aGlzIGZvcm0gZnJvbSB0aGUgcGFyZW50Rm9ybSB0b28uXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5wYXJlbnRGb3JtICYmIF8uZ2V0KHRoaXMucGFyZW50Rm9ybSwgJ25nZm9ybS5jb250cm9scycpO1xuICAgICAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gY3VycmVudCBmb3JtIGlzIGluc2lkZSB0aGUgbGlzdCAoaS5lLiBpbmNhc2Ugb2YgZm9ybUFycmF5KS5cbiAgICAgICAgICAgIGlmIChfLmdldCh0aGlzLnBhcmVudExpc3QsICduYW1lJykgJiYgY29udHJvbHMuaGFzT3duUHJvcGVydHkodGhpcy5wYXJlbnRMaXN0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGluZGV4IG9mIGN1cnJlbnQgZm9ybSBpbiB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRoZSBGb3JtQ29udHJvbCBmcm9tIEZvcm1BcnJheVxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gXy5maW5kSW5kZXgodGhpcy5wYXJlbnRMaXN0LmdldFdpZGdldHModGhpcy5uYW1lKSwge3dpZGdldElkOiB0aGlzLndpZGdldElkfSk7XG4gICAgICAgICAgICAgICAgKDxGb3JtQXJyYXk+dGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5jb250cm9sc1t0aGlzLnBhcmVudExpc3QubmFtZV0pLnJlbW92ZUF0KGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBmb3JtR3JvdXBOYW1lIHNldCBpLmUuIG11bHRpcGxlIGZvcm1JbnN0YW5jZSB3aXRoIGNvdW50ZXIgYXBwZW5kZWQgdG8gZm9ybU5hbWVcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cE5hbWUgJiYgY29udHJvbHMuaGFzT3duUHJvcGVydHkodGhpcy5mb3JtR3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLmZvcm1Hcm91cE5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjY29udGVudD48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1sYXlvdXQgPT09ICdwYWdlJzsgdGhlbiBwYWdlTGF5b3V0VGVtcGxhdGUgZWxzZSBkZWZhdWx0VGVtcGxhdGVcIj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiICpuZ0lmPVwiIWlzTGF5b3V0RGlhbG9nICYmICh0aXRsZSB8fCBzdWJoZWFkaW5nIHx8IGljb25jbGFzcyB8fCBzaG93QnV0dG9ucygnaGVhZGVyJykpXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInBhbmVsLXRpdGxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiBwYW5lbC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW25nQ2xhc3NdPVwiaWNvbmNsYXNzXCIgKm5nSWY9XCJpY29uY2xhc3NcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZ1wiIFtpbm5lckhUTUxdPVwidGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIiBbaW5uZXJIVE1MXT1cInN1YmhlYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tYWN0aW9uIHBhbmVsLWFjdGlvbnMgYmFzaWMtYnRuLWdycFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBidXR0b25BcnJheSB8IGZpbHRlciA6ICdwb3NpdGlvbicgOiAnaGVhZGVyJzsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnRuLndpZGdldFR5cGUgPT09ICdidXR0b24nID8gYnV0dG9uUmVmIDogYW5jaG9yUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7YnRuOmJ0bn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJjcmVhdGVDdXN0b21JbmplY3RvcignYWN0aW9uX2hlYWRlcl8nICsgaW5kZXgsIHtidG46YnRufSlcIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFwcC1pY29uIHdpIHBhbmVsLWFjdGlvblwiICpuZ0lmPVwiY29sbGFwc2libGVcIiB0aXRsZT1cIkNvbGxhcHNlL0V4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJleHBhbmRlZCA/ICd3aS1taW51cyc6ICd3aS1wbHVzJ1wiIChjbGljayk9XCJleHBhbmRDb2xsYXBzZVBhbmVsKCk7XCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oMz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm9keVwiIFtuZ0NsYXNzXT1cInsnZm9ybS1lbGVtZW50cyc6IGlzTGF5b3V0RGlhbG9nLCAnZm9ybS1ib2R5JzogIWlzTGF5b3V0RGlhbG9nfVwiIFtjbGFzcy5oaWRkZW5dPVwiIWV4cGFuZGVkXCI+XG4gICAgICAgIDxwIHdtTWVzc2FnZSAqbmdJZj1cIiEhc3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwic3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgY2FwdGlvbi5iaW5kPVwic3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgdHlwZS5iaW5kPVwic3RhdHVzTWVzc2FnZS50eXBlXCI+PC9wPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnZm9ybS1lbGVtZW50cyc6ICFpc0xheW91dERpYWxvZywgJ2Zvcm0tY29udGVudCc6IGlzTGF5b3V0RGlhbG9nfVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1idG4tZ3JwIGZvcm0tYWN0aW9uIHBhbmVsLWZvb3RlciBjbGVhcmZpeFwiIFtuZ0NsYXNzXT1cInsnbW9kYWwtZm9vdGVyJzogaXNMYXlvdXREaWFsb2d9XCIgW2NsYXNzLmhpZGRlbl09XCIhZXhwYW5kZWQgfHwgIXNob3dCdXR0b25zKCdmb290ZXInKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIGJ1dHRvbkFycmF5IHwgZmlsdGVyIDogJ3Bvc2l0aW9uJyA6ICdmb290ZXInOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bi53aWRnZXRUeXBlID09PSAnYnV0dG9uJyA/IGJ1dHRvblJlZiA6IGFuY2hvclJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7YnRuOmJ0bn1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImNyZWF0ZUN1c3RvbUluamVjdG9yKCdhY3Rpb25fZm9vdGVyXycgKyBpbmRleCwge2J0bjpidG59KVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWdlTGF5b3V0VGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uUmVmIGxldC1idG49XCJidG5cIj5cbiAgICA8YnV0dG9uICB3bUJ1dHRvbiBuYW1lPVwie3tidG4ua2V5fX1cIiBjYXB0aW9uLmJpbmQ9XCJidG4uZGlzcGxheU5hbWVcIiBjbGFzcy5iaW5kPVwiYnRuLmNsYXNzXCIgaWNvbmNsYXNzLmJpbmQ9XCJidG4uaWNvbmNsYXNzXCIgc2hvdy5iaW5kPVwiYnRuLnNob3dcIlxuICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VBY3Rpb25FdmVudCgkZXZlbnQsIGJ0bi5hY3Rpb24pXCIgdHlwZS5iaW5kPVwiYnRuLnR5cGVcIiBoaW50LmJpbmQ9XCJidG4udGl0bGVcIiBzaG9ydGN1dGtleS5iaW5kPVwiYnRuLnNob3J0Y3V0a2V5XCIgZGlzYWJsZWQuYmluZD1cIm5nZm9ybS5zdGF0dXMgPT09ICdQRU5ESU5HJyB8fCBidG4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgIHRhYmluZGV4LmJpbmQ9XCJidG4udGFiaW5kZXhcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImJ0bi5kaXNwbGF5TmFtZVwiIFtjbGFzcy5oaWRkZW5dPVwiYnRuLnVwZGF0ZU1vZGUgPyAhaXNVcGRhdGVNb2RlIDogaXNVcGRhdGVNb2RlXCI+PC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FuY2hvclJlZiBsZXQtYnRuPVwiYnRuXCI+XG4gICAgPGEgd21BbmNob3IgbmFtZT1cInt7YnRuLmtleX19XCIgY2FwdGlvbi5iaW5kPVwiYnRuLmRpc3BsYXlOYW1lXCIgY2xhc3MuYmluZD1cImJ0bi5jbGFzc1wiIGljb25jbGFzcy5iaW5kPVwiYnRuLmljb25jbGFzc1wiIHNob3cuYmluZD1cImJ0bi5zaG93XCJcbiAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBidG4uYWN0aW9uKVwiIGhpbnQuYmluZD1cImJ0bi50aXRsZVwiIHNob3J0Y3V0a2V5LmJpbmQ9XCJidG4uc2hvcnRjdXRrZXlcIlxuICAgICAgICAgICAgIGh5cGVybGluay5iaW5kPVwiYnRuLmh5cGVybGlua1wiIHRhcmdldC5iaW5kPVwiYnRuLnRhcmdldFwiXG4gICAgICAgICAgICAgdGFiaW5kZXguYmluZD1cImJ0bi50YWJpbmRleFwiIFtjbGFzcy5oaWRkZW5dPVwiYnRuLnVwZGF0ZU1vZGUgPyAhaXNVcGRhdGVNb2RlIDogaXNVcGRhdGVNb2RlXCI+PC9hPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAjZHluYW1pY0Zvcm0+PC9uZy1jb250YWluZXI+XG4iXX0=
1356
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormComponent, { className: "FormComponent", filePath: "form.component.ts", lineNumber: 159 }); })();
1357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2Zvcm0vc3JjL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQUUsTUFBTSxFQUNwQixRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDSCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLDJCQUEyQixFQUMzQixXQUFXLEVBQ1gsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsR0FDbEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1B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Qjs7c0JBQzlCLFNBQVM7dUJBQUMsY0FBYzs7c0JBQ3hCLFNBQVM7dUJBQUMsb0JBQW9COztzQkFDOUIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsU0FBUzt1QkFBQyxlQUFlOztzQkFDekIsU0FBUzt1QkFBQyxZQUFZOztzQkFDdEIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsU0FBUzt1QkFBQyxXQUFXOztzQkFDckIsU0FBUzt1QkFBQyxLQUFLOztzQkFDZixTQUFTO3VCQUFDLE1BQU07O3NCQUNoQixNQUFNO3VCQUFDLGtCQUFrQjs7c0JBQUcsUUFBUTtxQkFwSzJCLGNBQWM7a0JBQWpGLFNBQVM7bUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDckMsVUFBVTtrQkFBdEMsU0FBUzttQkFBQyxnQkFBZ0I7WUFFc0IsYUFBYTtrQkFBN0QsZUFBZTttQkFBQyxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDO1lBNEd4QixNQUFNO2tCQUE1QixXQUFXO21CQUFDLFFBQVE7WUFFZSxNQUFNO2tCQUF6QyxZQUFZO21CQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUlYLE9BQU87a0JBQTdCLFlBQVk7bUJBQUMsT0FBTztZQUlnQixnQkFBZ0I7a0JBQXBELFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOztrRkEzSDFCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBdHRyaWJ1dGUsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9wdGlvbmFsLFxuICAgIFNraXBTZWxmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgICAkYXBwRGlnZXN0LFxuICAgICRpbnZva2VXYXRjaGVycyxcbiAgICAkcGFyc2VFdmVudCxcbiAgICBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsXG4gICAgQXBwLFxuICAgIERhdGFTb3VyY2UsXG4gICAgRGF0YVR5cGUsXG4gICAgZGVib3VuY2UsXG4gICAgRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRGaWxlcyxcbiAgICBnZXRWYWxpZEpTT04sXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgcmVtb3ZlQXR0cixcbiAgICByZW1vdmVDbGFzcyxcbiAgICBzY3JvbGxUb0VsZW1lbnQsXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7XG4gICAgZ2V0RmllbGRMYXlvdXRDb25maWcsXG4gICAgTGl2ZV9PcGVyYXRpb25zLFxuICAgIE1lc3NhZ2VDb21wb25lbnQsXG4gICAgcGFyc2VWYWx1ZUJ5VHlwZSxcbiAgICBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uLFxuICAgIHByb3ZpZGVBc1dpZGdldFJlZixcbiAgICBTdHlsYWJsZUNvbXBvbmVudCxcbiAgICBzdHlsZXIsXG4gICAgV2lkZ2V0UmVmXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtQcmVmYWJEaXJlY3RpdmV9IGZyb20gJ0B3bS9jb21wb25lbnRzL3ByZWZhYic7XG5pbXBvcnQge0xpc3RDb21wb25lbnR9IGZyb20gJ0B3bS9jb21wb25lbnRzL2RhdGEvbGlzdCc7XG5cbmltcG9ydCB7cmVnaXN0ZXJGb3JtUHJvcHN9IGZyb20gJy4vZm9ybS5wcm9wcyc7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlIGFzIF9kZWJvdW5jZSxcbiAgICBmaWx0ZXIsXG4gICAgZmluZCwgZmluZEluZGV4LFxuICAgIGZvckVhY2gsXG4gICAgZ2V0LFxuICAgIGluY2x1ZGVzLFxuICAgIGlzQXJyYXksXG4gICAgaXNFbXB0eSwgaXNFcXVhbCxcbiAgICBpc1VuZGVmaW5lZCxcbiAgICBrZXlzLFxuICAgIGxhc3QsXG4gICAgc2V0LFxuICAgIHNvbWUsXG4gICAgc3BsaXRcbn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBXSURHRVRfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1mb3JtJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1mb3JtJ307XG5jb25zdCBMT0dJTl9GT1JNX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tZm9ybScsIGhvc3RDbGFzczogJ2FwcC1mb3JtIGFwcC1sb2dpbi1mb3JtJ307XG5jb25zdCBMSVZFX0ZPUk1fQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXZlZm9ybScsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtbGl2ZWZvcm0gbGl2ZWZvcm0taW5saW5lJ307XG5jb25zdCBMSVZFX0ZJTFRFUl9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWxpdmVmaWx0ZXInLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWxpdmVmaWx0ZXIgY2xlYXJmaXggbGl2ZWZvcm0taW5saW5lJ307XG5cbmNvbnN0IGdldFdpZGdldENvbmZpZyA9IChpc0xpdmVGb3JtLCBpc0xpdmVGaWx0ZXIsIHJvbGUpID0+IHtcbiAgICBsZXQgY29uZmlnID0gV0lER0VUX0NPTkZJRztcbiAgICBpZiAoaXNMaXZlRm9ybSAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcgPSBMSVZFX0ZPUk1fQ09ORklHO1xuICAgIH0gZWxzZSBpZiAoaXNMaXZlRmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZyA9IExJVkVfRklMVEVSX0NPTkZJRztcbiAgICB9IGVsc2UgaWYgKHJvbGUgPT09ICdhcHAtbG9naW4nKSB7XG4gICAgICAgIGNvbmZpZyA9IExPR0lOX0ZPUk1fQ09ORklHO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufTtcblxuLy8gR2VuZXJhdGUgdGhlIGZvcm0gZmllbGQgd2l0aCBnaXZlbiBmaWVsZCBkZWZpbml0aW9uLiBBZGQgYSBncmlkIGNvbHVtbiB3cmFwcGVyIGFyb3VuZCB0aGUgZm9ybSBmaWVsZC5cbmNvbnN0IHNldE1hcmt1cEZvckZvcm1GaWVsZCA9IChmaWVsZCwgY29sdW1uV2lkdGgpID0+ICB7XG4gICAgbGV0IHByb3BzVG1wbCA9ICcnO1xuICAgIGZvckVhY2goZmllbGQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHByb3BzVG1wbCA9IGAke3Byb3BzVG1wbH0gJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGA8d20tZ3JpZGNvbHVtbiBjb2x1bW53aWR0aD1cIiR7Y29sdW1uV2lkdGh9XCI+XG4gICAgICAgICAgICAgICAgICA8d20tZm9ybS1maWVsZCAke3Byb3BzVG1wbH0+PC93bS1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC93bS1ncmlkY29sdW1uPmA7XG59O1xuXG4vLyBGdW5jdGlvbiB0byBmaW5kIG91dCB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50IGluIGZvcm1cbmNvbnN0IGZpbmRJbnZhbGlkRWxlbWVudCA9ICgkZm9ybUVsZSwgbmdGb3JtKSA9PiB7XG4gICAgY29uc3QgJGVsZSA9ICRmb3JtRWxlLmZpbmQoJ2Zvcm0ubmctaW52YWxpZDp2aXNpYmxlLCBbZm9ybUNvbnRyb2xOYW1lXS5uZy1pbnZhbGlkOnZpc2libGUnKS5maXJzdCgpO1xuICAgIGxldCBmb3JtT2JqID0gbmdGb3JtO1xuICAgIC8vIElmIGVsZW1lbnQgaXMgZm9ybSwgZmluZCBvdXQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBpbiB0aGlzIGZvcm1cbiAgICBpZiAoJGVsZS5pcygnZm9ybScpKSB7XG4gICAgICAgIGZvcm1PYmogPSBuZ0Zvcm0gJiYgbmdGb3JtLmNvbnRyb2xzWyRlbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGVsZS5hdHRyKCduYW1lJyldO1xuICAgICAgICBpZiAoZm9ybU9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRJbnZhbGlkRWxlbWVudCgkZWxlLCBmb3JtT2JqKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuZ0Zvcm06IGZvcm1PYmosXG4gICAgICAgICRlbGU6ICRlbGVcbiAgICB9O1xufTtcblxuLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBhY3RpdmUgZWxlbWVudCBtYXJrdXAgYmFzZWQgb24gd2lkZ2V0IHR5cGVcbmNvbnN0IGdldEFjdGl2ZUVsZW1lbnQgPSAoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZGdldFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd2lkZ2V0dHlwZScpO1xuICAgIHN3aXRjaCAod2lkZ2V0VHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3Rvcignc2VsZWN0Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICB9XG59XG5jb25zdCBzZXRUb3VjaGVkU3RhdGUgPSAoc2VsZiwgbmdGb3JtLCBmaWVsZE5hbWUpID0+IHtcbiAgICBpZiAobmdGb3JtLnZhbGlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5nRm9ybS5jb250cm9scykge1xuICAgICAgICBmb3JFYWNoKG5nRm9ybS5jb250cm9scywgKGN0cmwsIGZpZWxkTmFtZSkgPT4ge1xuICAgICAgICAgICAgc2V0VG91Y2hlZFN0YXRlKHNlbGYsIGN0cmwsIGZpZWxkTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlbGVtZW50ID0gc2VsZi4kZWxlbWVudC5maW5kKGBbd21mb3JtZmllbGRdW2tleT1cIiR7ZmllbGROYW1lfVwiXWApO1xuICAgICAgICBpZiAoIWVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gc2VsZi4kZWxlbWVudC5maW5kKGBbd21mb3JtZmllbGRdW25hbWU9XCIke2ZpZWxkTmFtZX1cIl1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50WzBdLnNldEF0dHJpYnV0ZSgnX19lcnJvcm1zZycsIGVsZW1lbnRbMF0uZ2V0QXR0cmlidXRlKCdfX3ZhbGlkYXRpb25JZCcpKTtcbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGVsZW1lbnRbMF0pO1xuICAgICAgICBhY3RpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsIG5nRm9ybS5pbnZhbGlkKTtcbiAgICAgICAgYWN0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgZWxlbWVudFswXS5nZXRBdHRyaWJ1dGUoJ19fdmFsaWRhdGlvbklkJykpO1xuICAgICAgICBuZ0Zvcm0ubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9ybVt3bUZvcm1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihGb3JtQ29tcG9uZW50KVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBzdGF0aWMgIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyRm9ybVByb3BzKCk7XG4gICAgQFZpZXdDaGlsZCgnZHluYW1pY0Zvcm0nLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBkeW5hbWljRm9ybVJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgICBAVmlld0NoaWxkKE1lc3NhZ2VDb21wb25lbnQpIG1lc3NhZ2VSZWY7XG4gICAgLy8gdGhpcyBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgcmVmcyBpbnNpZGUgdGhlIGZvcm0tZ3JvdXBcbiAgICBAQ29udGVudENoaWxkcmVuKFdpZGdldFJlZiwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgY29tcG9uZW50UmVmcztcblxuICAgIGF1dG91cGRhdGU7XG4gICAgcHVibGljIGZvcm1sYXlvdXQ6IGFueTtcbiAgICBwdWJsaWMgaXNEYXRhU291cmNlVXBkYXRlZDogYm9vbGVhbjtcbiAgICBjYXB0aW9uQWxpZ25DbGFzczogc3RyaW5nO1xuICAgIHZhbGlkYXRpb250eXBlOiBzdHJpbmc7XG4gICAgY2FwdGlvbmFsaWduOiBzdHJpbmc7XG4gICAgY2FwdGlvbnBvc2l0aW9uOiBzdHJpbmc7XG4gICAgY2FwdGlvbnNpemU7XG4gICAgY29sbGFwc2libGU6IGJvb2xlYW47XG4gICAgZXhwYW5kZWQ6IGJvb2xlYW47XG4gICAgZWxTY29wZTtcbiAgICBfd2lkZ2V0Q2xhc3MgPSAnJztcbiAgICBjYXB0aW9ud2lkdGg6IHN0cmluZztcbiAgICBfY2FwdGlvbkNsYXNzID0gJyc7XG4gICAgbmdmb3JtOiBGb3JtR3JvdXA7XG4gICAgZm9ybUZpZWxkcyA9IFtdO1xuICAgIGZvcm1maWVsZHMgPSB7fTtcbiAgICBmb3JtV2lkZ2V0cyA9IHt9O1xuICAgIGZpbHRlcldpZGdldHMgPSB7fTtcbiAgICBidXR0b25BcnJheSA9IFtdO1xuICAgIGRhdGFvdXRwdXQgPSB7fTtcbiAgICBkYXRhc291cmNlO1xuICAgIGZvcm1kYXRhc291cmNlO1xuICAgIGZvcm1kYXRhID0ge307XG4gICAgaXNTZWxlY3RlZDtcbiAgICBwcmV2RGF0YVZhbHVlcztcbiAgICBwcmV2RGF0YU9iamVjdDtcbiAgICBwcmV2Zm9ybUZpZWxkcztcbiAgICBzdGF0dXNNZXNzYWdlID0ge1xuICAgICAgICBjYXB0aW9uOiAnJyxcbiAgICAgICAgdHlwZTogJydcbiAgICB9O1xuICAgIG1lc3NhZ2VsYXlvdXQ7XG4gICAgbWV0YWRhdGE7XG4gICAgZXJyb3JtZXNzYWdlO1xuICAgIG9uRXJyb3I7XG4gICAgb25TdWNjZXNzO1xuICAgIHByaW1hcnlLZXkgPSBbXTtcbiAgICBwb3N0bWVzc2FnZTtcbiAgICBfbGl2ZVRhYmxlUGFyZW50O1xuICAgIHVwZGF0ZU1vZGU7XG4gICAgbmFtZTtcbiAgICAvLyBMaXZlIEZvcm0gTWV0aG9kc1xuICAgIGNsZWFyRGF0YTogRnVuY3Rpb247XG4gICAgY2FuY2VsOiBGdW5jdGlvbjtcbiAgICBkZWxldGU6IEZ1bmN0aW9uO1xuICAgIHNhdmU6IEZ1bmN0aW9uO1xuICAgIHNhdmVBbmROZXc6IEZ1bmN0aW9uO1xuICAgIHNhdmVBbmRWaWV3OiBGdW5jdGlvbjtcbiAgICBzZXRQcmltYXJ5S2V5OiAoKSA9PiB7fTtcbiAgICBkaWFsb2dJZDogc3RyaW5nO1xuICAgIC8vIExpdmUgRmlsdGVyXG4gICAgZW5hYmxlZW1wdHlmaWx0ZXI7XG4gICAgcGFnZXNpemU7XG4gICAgcmVzdWx0O1xuICAgIHBhZ2luYXRpb247XG4gICAgY2xlYXJGaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGFwcGx5RmlsdGVyOiBGdW5jdGlvbjtcbiAgICBmaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGZpbHRlck9uRGVmYXVsdDogRnVuY3Rpb247XG4gICAgb25NYXhEZWZhdWx0VmFsdWVDaGFuZ2U6IEZ1bmN0aW9uO1xuICAgIG51bWJlck9mRmllbGRzOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9kZWJvdW5jZWRVcGRhdGVGaWVsZFNvdXJjZTogRnVuY3Rpb24gPSBfZGVib3VuY2UodGhpcy51cGRhdGVGaWVsZFNvdXJjZSwgMzUwKTtcbiAgICBwcml2YXRlIG9wZXJhdGlvblR5cGU7XG4gICAgcHJpdmF0ZSBfaXNMYXlvdXREaWFsb2c7XG4gICAgcHJpdmF0ZSBfZHluYW1pY0NvbnRleHQ7XG4gICAgcHJpdmF0ZSBfaXNHcmlkTGF5b3V0UHJlc2VudDtcbiAgICBwcml2YXRlIHZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgIHByaXZhdGUgZm9ybUdyb3VwTmFtZTtcbiAgICBwcml2YXRlIGZvcm1BcnJheUluZGV4O1xuICAgIHByaXZhdGUgYmluZGluZ1ZhbHVlO1xuICAgIHByaXZhdGUgX2Zvcm1Jc0luTGlzdDtcbiAgICBwcml2YXRlIF90cmlnZ2VyZWRCeVVzZXI6IGJvb2xlYW47XG5cblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFN1Ym1pdEZvcm0gPSBkZWJvdW5jZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIGNhbGxpbmcgc3VibWl0IGV2ZW50IGluIG5nWm9uZSBhcyBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgcG9zdCB0aGUgc3VibWl0IGNhbGxiYWNrIGFuZCBhY3Rpb25zIGxpa2Ugbm90aWZpY2F0aW9uIGFyZSBub3Qgc2hvd25cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9LCAyNTApO1xuXG4gICAgc2V0IGlzTGF5b3V0RGlhbG9nKG52KSB7XG4gICAgICAgIGlmIChudikge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAncGFuZWwgYXBwLXBhbmVsIGxpdmVmb3JtLWlubGluZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzTGF5b3V0RGlhbG9nID0gbnY7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGF5b3V0RGlhbG9nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMYXlvdXREaWFsb2c7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNVcGRhdGVNb2RlO1xuICAgIHNldCBpc1VwZGF0ZU1vZGUobnYpIHtcbiAgICAgICAgdGhpcy5faXNVcGRhdGVNb2RlID0gbnY7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGZpZWxkLnNldFJlYWRPbmx5U3RhdGUobnYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgaXNVcGRhdGVNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVcGRhdGVNb2RlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYWN0aW9uJykgYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBASG9zdExpc3RlbmVyKCdzdWJtaXQnLCBbJyRldmVudCddKSBzdWJtaXQoJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFN1Ym1pdEZvcm0oJGV2ZW50KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdyZXNldCcpIG9uUmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWRCeVVzZXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHRoZSBmb3JtQXJyYXkgY29udHJvbCBvbiB0aGUgcGFyZW50Rm9ybS5cbiAgICBnZXQgcGFyZW50Rm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5nZXQodGhpcy5wYXJlbnRMaXN0Lm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRydWUgb25seSB3aGVuIGNsb3Nlc3QgbGl2ZWxpc3QgaXMgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIGZvcm0uXG4gICAgLy8gY2hlY2tzIGZvciBsaXZlbGlzdCBoYXZpbmcgYW55IGZvcm0gZWxlbWVudHMgd2l0aCBwYXJlbnRGb3JtIG5hbWUuXG4gICAgLy8gSWYgbGl2ZWxpc3QgaXMgbm90IGNvbnRhaW5pbmcgYW55IHBhcmVudEZvcm0gZWxlbWVudHMgdGhlbiBpdCByZXR1cm5zIHRydWUuXG4gICAgZ2V0IGlzUGFyZW50TGlzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0gJiYgIWlzRGVmaW5lZCh0aGlzLl9mb3JtSXNJbkxpc3QpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy4kZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RFbGUgPSBmb3JtRWxlLmNsb3Nlc3QoJy5hcHAtbGl2ZWxpc3RbbmFtZT1cIicgKyB0aGlzLnBhcmVudExpc3QubmFtZSArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChsaXN0RWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1Jc0luTGlzdCA9ICEobGlzdEVsZS5maW5kKCdmb3JtW3dpZGdldC1pZD1cIicgKyB0aGlzLnBhcmVudEZvcm0ud2lkZ2V0SWQgKyAnXCJdJykpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkgPyB0aGlzLl9mb3JtSXNJbkxpc3QgOiB0aGlzLnBhcmVudExpc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIGFwcDogQXBwLFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI6IER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlcixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudExpc3Q6IExpc3RDb21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRGb3JtOiBGb3JtQ29tcG9uZW50LFxuICAgICAgICBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50UHJlZmFiOiBQcmVmYWJEaXJlY3RpdmUsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQYXJ0aWFsOiBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVzdWJtaXQuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVTdWJtaXRFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3N1Ym1pdC5ldmVudCcpIHB1YmxpYyBvblN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnYmVmb3JlcmVuZGVyLmV2ZW50JykgcHVibGljIG9uQmVmb3JlUmVuZGVyRXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBwdWJsaWMgYmluZGRhdGFzZXQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2Zvcm1kYXRhLmJpbmQnKSBwcml2YXRlIGJpbmRmb3JtZGF0YSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRm9ybScpIGlzTGl2ZUZvcm0sXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3dtTGl2ZUZpbHRlcicpIGlzTGl2ZUZpbHRlcixcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YS1yb2xlJykgcm9sZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgna2V5Jykga2V5LFxuICAgICAgICBAQXR0cmlidXRlKCduYW1lJykgbmFtZSxcbiAgICAgICAgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgZ2V0V2lkZ2V0Q29uZmlnKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSksIGV4cGxpY2l0Q29udGV4dCk7XG5cbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRpdGxlIHByb3BlcnR5IGFzIGF0dHJpYnV0ZSBhcyBpdCBpcyBjYXVzaW5nIHVubmVjZXNzYXJ5IHRvb2x0aXBcbiAgICAgICAgcmVtb3ZlQXR0cih0aGlzLm5hdGl2ZUVsZW1lbnQsICd0aXRsZScpO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlhbG9nSWQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaWFsb2dJZCcpO1xuICAgICAgICB0aGlzLm5nZm9ybSA9IGZiLmdyb3VwKHt9KTtcbiAgICAgICAgdGhpcy5iaW5kaW5nVmFsdWUgPSBrZXkgfHwgbmFtZTtcblxuICAgICAgICAvLyBPbiB2YWx1ZSBjaGFuZ2UgaW4gZm9ybSwgdXBkYXRlIHRoZSBkYXRhb3V0cHV0XG4gICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSAgdGhpcy5uZ2Zvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlRGF0YU91dHB1dC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiBvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLmVsU2NvcGUgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuYWRkRXZlbnRzVG9Db250ZXh0KHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWZzLmZvckVhY2goY29tcG9uZW50UmVmID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50UmVmLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgd2lkZ2V0cyBpbnNpZGUgZm9ybSB3aXRoIGZvcm1XaWRnZXRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybVdpZGdldHNbY29tcG9uZW50UmVmLm5hbWVdID0gY29tcG9uZW50UmVmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtICYmIHRoaXMuaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAvLyBzZXR0aW5nIGZvcm1BcnJheSBjb250cm9sIG9uIG5nZm9ybS5cbiAgICAgICAgICAgIGlmICghZ2V0KHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHMsIHRoaXMucGFyZW50TGlzdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uc2V0Q29udHJvbCh0aGlzLnBhcmVudExpc3QubmFtZSwgbmV3IEZvcm1BcnJheShbXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHVzaGluZyB0aGUgbmdmb3JtIHRvIGZvcm1BcnJheS5cbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnB1c2godGhpcy5uZ2Zvcm0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtQXJyYXlJbmRleCA9IHRoaXMucGFyZW50Rm9ybUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJbm5lck5nRm9ybVRvRm9ybSh0aGlzLmJpbmRpbmdWYWx1ZSk7XG4gICAgfVxuXG4gICAgZmluZE9wZXJhdGlvblR5cGUoKSB7fVxuXG4gICAgcHJpdmF0ZSBhZGRJbm5lck5nRm9ybVRvRm9ybShiaW5kaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybSkge1xuICAgICAgICAgICAgLy8gaGFuZGxpbmcgYXMgZm9ybUFycmF5IHdoZW4gcGFyZW50IGlzIGxpc3QuIEhlbmNlIHJldHVybmluZyBoZXJlIGZyb20gYWRkaW5nIHRvIHBhcmVudEZvcm0gYWdhaW4uXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BhcmVudExpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhc3NpZ25pbmcgdGhlIGNvbnRyb2wgbmFtZSBvZiB0aGUgZm9ybSBpbnNpZGUgdGhlIHByZWZhYiB3aXRoIHRoZSBwcmVmYWIgbmFtZS5cbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoYXBwZW4gb25seSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGZvcm0gaW5zaWRlIHByZWZhYi5cbiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoaXMgd2hlbiBtdWx0aXBsZSBmb3JtcyBhcmUgaW5zaWRlIHByZWZhYi5cbiAgICAgICAgICAgIC8vIFRoaXMgc2NlbmFyaW8gaGFzIHRvIGJlIGhhbmRsZWQgYnkgZW5kIHVzZXIgYnkgY2hhbmdpbmcgZm9ybSBuYW1lcyBpbiBwcmVmYWIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhbW9kZWwgYmluZGluZy5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9IHRoaXMucGFyZW50UHJlZmFiIHx8IHRoaXMucGFyZW50UGFydGlhbDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q29udGVudEVsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFByZWZhYikge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZW50RWwgPSBwYXJlbnRDb250YWluZXIuJGVsZW1lbnQuZmluZCgnW3dtcHJlZmFiY29udGFpbmVyXScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRlbnRFbCA9IHBhcmVudENvbnRhaW5lci4kZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogYXNzaWduaW5nIHRoZSBmb3JtIG5hbWUgdG8gdGhlIHBhcmVudENvbnRhaW5lciBuYW1lIGkuZS4gcGFydGlhbCBuYW1lIG9yIHBlcmZhYiBuYW1lIGJ5IGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAqIDEuIHJldHJpZXZpbmcgYWxsIHRoZSBmb3JtcyBpbiB0aGUgcGFyZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICogMi4gY29uc2lkZXIgdGhlIGZpcnN0IGZvcm1cbiAgICAgICAgICAgICAgICAgKiAzLiBpZiB0aGlzIGZvcm0gaXMgaW5zaWRlIGxpc3QgaS5lLiBhbHNvIGZpbmQgaWYgdGhpcyBsaXN0IGlzIGFsc28gaW5zaWRlIHRoZSBwYXJlbnRDb250YWluZXIgKHByZWZhYiAvIHBhcnRpYWwpXG4gICAgICAgICAgICAgICAgICogNC4gdGhlbiBkbyBub3QgY2hhbmdlIHRoZSBmb3JtIG5hbWUgd2hlbiBmb3JtIGlzIGluc2lkZSBsaXN0IGFuZCBhbHNvIHdoZW4gdGhlcmUgYXJlIHNpYmxpbmdzIHRvIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICogNS4gdGhpcyBtZWFucyBmb3JtIG5hbWUgY2hhbmdlIGFwcGxpZXMgb25seSB3aGVuIHRoZXJlIGlzIHNpbmdsZSBmb3JtIChpbW1lZGlhdGUgY2hpbGQpIGluc2lkZSB0aGUgcGFyZW50Q29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZhYklubmVyRm9ybSA9IHBhcmVudENvbnRlbnRFbC5maW5kKCdmb3JtJykuZmlyc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0KHByZWZhYklubmVyRm9ybVswXSwgJ3dpZGdldC53aWRnZXRJZCcpID09PSB0aGlzLndpZGdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZm9ybSBpbnNpZGUgcHJlZmFiIGNvbnRhaW5lciBpcyBpbnNpZGUgdGhlIGxpc3QuIElmIHRydWUsIGRvIG5vdCBjaGFuZ2UgdGhlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmFiSW5uZXJGb3JtLmlzUGFyZW50TGlzdCAmJiAhcHJlZmFiSW5uZXJGb3JtLnNpYmxpbmdzKCdmb3JtJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nID0gZ2V0KHBhcmVudENvbnRhaW5lciwgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMTtcbiAgICAgICAgICAgIGxldCBpbm5lckJpbmRpbmcgPSBiaW5kaW5nO1xuICAgICAgICAgICAgLy8gSW5uZXIgZm9ybXMgbWF5IGhhdmUgc2FtZSBuYW1lcy4gSWYgc2FtZSBuYW1lIGlzIHByZXNlbnQsIGFwcGVuZCB1bnFpdWUgaWRlbnRpZmllclxuICAgICAgICAgICAgd2hpbGUgKHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHMuaGFzT3duUHJvcGVydHkoaW5uZXJCaW5kaW5nKSkge1xuICAgICAgICAgICAgICAgIGlubmVyQmluZGluZyA9IGAke2JpbmRpbmd9XyR7Y291bnRlcn1gO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwTmFtZSA9IGlubmVyQmluZGluZztcbiAgICAgICAgICAgIC8vIElmIHBhcmVudCBmb3JtIGlzIHByZXNlbnQsIGFkZCB0aGUgY3VycmVudCBmb3JtIGFzIGFzIGZvcm1Hcm91cCBmb3IgcGFyZW50IGZvcm1cbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uYWRkQ29udHJvbChpbm5lckJpbmRpbmcsIHRoaXMubmdmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4cG9zZSB0aGUgZXZlbnRzIG9uIGNvbnRleHQgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBmb3JtIGFjdGlvbnNcbiAgICBwcml2YXRlIGFkZEV2ZW50c1RvQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuY2FuY2VsID0gKCkgPT4gdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgY29udGV4dC5yZXNldCA9ICgpID0+IHRoaXMucmVzZXQoKTtcbiAgICAgICAgY29udGV4dC5zYXZlID0gZXZ0ID0+IHRoaXMuc2F2ZShldnQpO1xuICAgICAgICBjb250ZXh0LnNhdmVBbmROZXcgPSAoKSA9PiB0aGlzLnNhdmVBbmROZXcoKTtcbiAgICAgICAgY29udGV4dC5zYXZlQW5kVmlldyA9ICgpID0+IHRoaXMuc2F2ZUFuZFZpZXcoKTtcbiAgICAgICAgY29udGV4dC5kZWxldGUgPSAoKSA9PiB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICBjb250ZXh0Lm5ldyA9ICgpID0+IHRoaXMubmV3KCk7XG4gICAgICAgIGNvbnRleHQuZWRpdCA9ICgpID0+IHRoaXMuZWRpdCgpO1xuICAgICAgICBjb250ZXh0LmhpZ2hsaWdodEludmFsaWRGaWVsZHMgPSAoKSA9PiB0aGlzLmhpZ2hsaWdodEludmFsaWRGaWVsZHMoKTtcbiAgICAgICAgY29udGV4dC5maWx0ZXIgPSAoKSA9PiB0aGlzLmZpbHRlcigpO1xuICAgICAgICBjb250ZXh0LmNsZWFyRmlsdGVyID0gKCkgPT4gdGhpcy5jbGVhckZpbHRlcigpO1xuICAgICAgICBjb250ZXh0LnN1Ym1pdCA9IGV2dCA9PiB0aGlzLnN1Ym1pdChldnQpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgYWxsIHRoZSBpbm5lciBmb3JtcyBhbmQgdmFsaWRhdGVzIGVhY2ggZm9ybS5cbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy5nZXROYXRpdmVFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IGZvcm1PYmpzID0gZm9ybUVsZS5xdWVyeVNlbGVjdG9yQWxsKCcuYXBwLWZvcm0nKTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1zZ3MgPSBbXTtcbiAgICAgICAgZm9yRWFjaChmb3JtT2JqcywgZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSAoZSBhcyBhbnkpLndpZGdldDtcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudGlhdGluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIHByZWZpeCBiYXNlZCBvbiB0aGUgZm9ybUdyb3VwTmFtZVxuICAgICAgICAgICAgLy8gYXMgdGhlIGZvcm1OYW1lJ3MgYXJlIHNhbWUgd2hlbiBmb3JtcyBhcmUgaW4gbGlzdFxuICAgICAgICAgICAgbGV0IGZvcm1OYW1lID0gZ2V0KGZvcm1JbnN0YW5jZSwgJ2Zvcm1Hcm91cE5hbWUnKSB8fCBmb3JtSW5zdGFuY2UubmFtZTtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZm9ybUluc3RhbmNlLmZvcm1BcnJheUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gZm9ybU5hbWUgKyAnWycgKyBmb3JtSW5zdGFuY2UuZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGZvcm1JbnN0YW5jZTtcbiAgICAgICAgICAgIHdoaWxlIChnZXQoY3VycmVudCwgJ3BhcmVudEZvcm0nKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnROYW1lID0gY3VycmVudC5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUgfHwgY3VycmVudC5wYXJlbnRGb3JtLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQucGFyZW50Rm9ybS5wYXJlbnRGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5hbWUgKyAnWycgKyBjdXJyZW50LnBhcmVudEZvcm0uZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gcGFyZW50TmFtZSArICcuJyArIGZvcm1OYW1lO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEZvcm07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyhmb3JtSW5zdGFuY2UsIGZvcm1OYW1lLCB2YWxpZGF0ZVRvdWNoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB2YWxpZGF0aW9uIG9uIGZvcm1GaWVsZHMuXG4gICAgICogQXBwbGllcyB0byBpbm5lcmZvcm0gYW5kIGFsc28gc2V0cyBpbm5lcmZvcm0gdmFsaWRhdGlvbiBvbiBwYXJlbnQgZm9ybS5cbiAgICAgKiBAcGFyYW0gcHJlZml4IGNvbnRhaW5zIHRoZSBmb3JtIG5hbWUsIHdoaWNoIGFsc28gaW5jbHVkZXMgaXRzIHBhcmVudHMgZm9ybSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVRvdWNoXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uT25GaWVsZHMoZm9ybTogRm9ybUNvbXBvbmVudCwgcHJlZml4OiBzdHJpbmcsIHZhbGlkYXRlVG91Y2g/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5uZ2Zvcm0uY29udHJvbHM7XG4gICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBmb3JtLmZvcm1GaWVsZHM7XG4gICAgICAgIGlmICghZm9ybUZpZWxkcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvckVhY2goY29udHJvbHMsICh2LCBrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZvcm1GaWVsZHMuZmluZChlID0+IGUua2V5ID09PSBrKTtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgKHZhbGlkYXRlVG91Y2ggJiYgIXYudG91Y2hlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgdi5pbnZhbGlkKTtcbiAgICAgICAgICAgIC8vIGludm9raW5nIHRoZSBwcmVwYXJlVmFsaWRhdGlvbiBvbiBib3RoIHBhcmVudCBmb3JtIGFuZCBjdXJyZW50IGZvcm0uXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVWYWxpZGF0aW9uT2JqKHYsIGssIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlVmFsaWRhdGlvbk9iai5jYWxsKGZvcm0sIHYsIGssIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ25zIC8gdXBkYXRlcyB2YWxpZGF0aW9uTWVzc2FnZXMgYmFzZWQgb24gYW5ndWxhciBlcnJvcnMgb24gZmllbGRcbiAgICBwcml2YXRlIHByZXBhcmVWYWxpZGF0aW9uT2JqKHYsIGssIGZpZWxkLCBwcmVmaXgpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5maW5kSW5kZXgoZSA9PiAoZS5maWVsZCA9PT0gayAmJiBlLmZ1bGx5UXVhbGlmaWVkRm9ybU5hbWUgPT09IHByZWZpeCkpO1xuICAgICAgICBpZiAodi5pbnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogZmllbGQgY29udGFpbnMgdGhlIGZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAqIHZhbHVlIGNvbnRhaW5zIHRoZSBmaWVsZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAqIGVycm9yVHlwZSBjb250YWlucyB0aGUgbGlzdCBvZiBlcnJvcnNcbiAgICAgICAgICAgICAgICAgKiBtZXNzYWdlIGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgKiBnZXRFbGVtZW50IHJldHVybnMgdGhlIGVsZW1lbnQgaGF2aW5nIGZvY3VzLXRhcmdldFxuICAgICAgICAgICAgICAgICAqIGZvcm1OYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvcm1cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGssXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBrZXlzKHYuZXJyb3JzKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmllbGQudmFsaWRhdGlvbm1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC4kZWxlbWVudC5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZTogbGFzdChwcmVmaXguc3BsaXQoJy4nKSksXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkRm9ybU5hbWU6IHByZWZpeFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlc1tpbmRleF0udmFsdWUgPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlc1tpbmRleF0uZXJyb3JUeXBlID0ga2V5cyh2LmVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodi52YWxpZCAmJiBpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIHJldHVybiBhIG9iamVjdCBjb250YWluaW5nIHRoZSBlcnJvciBkZXRhaWxzIGZyb20gdGhlIGxpc3Qgb2YgZm9ybUZpZWxkcyB0aGF0IGFyZSBpbnZhbGlkXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uTXNncyh2YWxpZGF0ZVRvdWNoPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUZpZWxkcy5sZW5ndGggJiYgaXNFbXB0eSh0aGlzLm5nZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyh0aGlzLCB0aGlzLm5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCk7XG4gICAgfVxuXG4gICAgLy8gY2hhbmdlIGFuZCBibHVyIGV2ZW50cyBhcmUgYWRkZWQgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIGlmIChldmVudE5hbWUgIT09ICdzdWJtaXQnKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkU291cmNlKCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtZGF0YXNvdXJjZSAmJiB0aGlzLmZvcm1kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWRhdGFzb3VyY2UgJiYgIXRoaXMuZm9ybWRhdGFzb3VyY2UudHdvV2F5QmluZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZvcm1GaWVsZCA9PiB7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnZGF0YXZhbHVlc291cmNlJywgdGhpcy5mb3JtZGF0YXNvdXJjZSk7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnYmluZGRhdGF2YWx1ZScsIGAke3RoaXMuYmluZGZvcm1kYXRhfS4ke2Zvcm1GaWVsZC5rZXl9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGxvb3BzIHRocm91Z2ggdGhlIGZvcm0gZmllbGRzIGFuZCBoaWdobGlnaHRzIHRoZSBpbnZhbGlkIGZpZWxkcyBieSBzZXR0aW5nIHN0YXRlIHRvIHRvdWNoZWRcbiAgICBoaWdobGlnaHRJbnZhbGlkRmllbGRzKCkge1xuICAgICAgICBzZXRUb3VjaGVkU3RhdGUodGhpcywgdGhpcy5uZ2Zvcm0sICcnKTtcbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuIEhpZ2hsaWdodCBhbGwgdGhlIGludmFsaWQgZmllbGRzIGlmIHZhbGlkYXRpb24gdHlwZSBpcyBkZWZhdWx0XG4gICAgdmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uTXNncygpO1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuIEZvciBkZWxldGUgb3BlcmF0aW9uLCBkbyBub3QgY2hlY2sgdGhlIHZhbGlkYXRpb24uXG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblR5cGUgIT09ICdkZWxldGUnICYmICh0aGlzLnZhbGlkYXRpb250eXBlID09PSAnaHRtbCcgfHwgdGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2RlZmF1bHQnKVxuICAgICAgICAgICAgICAgICYmIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmludmFsaWQpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMubmdmb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIHVudG9jaGVkIGVsZW1lbnQgYW5kIHNldCBpdCB0byB0b3VjaGVkLlxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBkb2VzIG5vdCBmb3JtIHZhbGlkYXRpb25zLiB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgZXJyb3IgaXMgc2hvd24gZm9yIHVzZXJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVGb3JtID0gZmluZEludmFsaWRFbGVtZW50KHRoaXMuJGVsZW1lbnQsIHRoaXMubmdmb3JtKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkaW52YWxpZEZvcm0gPSBlbGVGb3JtLm5nRm9ybTtcbiAgICAgICAgICAgICAgICBsZXQgJGludmFsaWRFbGUgID0gZWxlRm9ybS4kZWxlO1xuICAgICAgICAgICAgICAgICRpbnZhbGlkRWxlID0gJGludmFsaWRFbGUucGFyZW50KCkuZmluZCgnW2ZvY3VzLXRhcmdldF0nKTtcbiAgICAgICAgICAgICAgICBpZiAoJGludmFsaWRFbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHNhdmUgY2xpY2sgaW4gcGFnZSBsYXlvdXQgbGl2ZWZvcm0sIGZvY3VzIG9mIGF1dG9jb21wbGV0ZSB3aWRnZXQgb3BlbnMgZnVsbC1zY3JlZW4gc2VhcmNoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoISRpbnZhbGlkRWxlLmhhc0NsYXNzKCdhcHAtc2VhcmNoLWlucHV0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnZhbGlkRWxlLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmdFbGUgPSAkaW52YWxpZEZvcm0gJiYgJGludmFsaWRGb3JtLmNvbnRyb2xzWyRpbnZhbGlkRWxlLmF0dHIoJ2Zvcm1Db250cm9sTmFtZScpIHx8ICRpbnZhbGlkRWxlLmF0dHIoJ25hbWUnKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZ0VsZSAmJiBuZ0VsZS5tYXJrQXNUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZ0VsZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3Y/KSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9uYWxpZ24nOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbkFsaWduQ2xhc3MgPSAnYWxpZ24tJyArIG52O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbnBvc2l0aW9uJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dENvbmZpZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbndpZHRoJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dENvbmZpZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbnNpemUnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbnNpemUgPSBudjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25vdmFsaWRhdGUnOlxuICAgICAgICAgICAgICAgIC8vICBTZXQgdmFsaWRhdGlvbiB0eXBlIGJhc2VkIG9uIHRoZSBub3ZhbGlkYXRlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsaWRhdGlvbnR5cGUgPSAobnYgPT09IHRydWUgfHwgbnYgPT09ICd0cnVlJykgPyAnbm9uZScgOiAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtZGF0YSc6XG4gICAgICAgICAgICAgICAgLy8gRm9yIGxpdmVsaXN0IHdoZW4gbXVsdGlzZWxlY3QgaXMgZW5hYmxlZCwgZm9ybWRhdGEgd2lsbCBiZSBhcnJheSBvZiBvYmplY3RzLiBJbiB0aGlzIGNhc2UgY29uc2lkZXIgdGhlIGxhc3Qgb2JqZWN0IGFzIGZvcm1kYXRhLlxuICAgICAgICAgICAgICAgIGlmIChpc0VxdWFsKG52LCBvdikpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzQXJyYXkobnYpID8gdGhpcy5zZXRGb3JtRGF0YShsYXN0KG52KSkgOiB0aGlzLnNldEZvcm1EYXRhKG52KTtcbiAgICAgICAgICAgICAgICAvLyBpZiBkYXRhc2V0IG9uIHRoZSBmb3JtRmllbGRzIGFyZSBub3Qgc2V0IGFzIHRoZSBkYXRhc291cmNlQ2hhbmdlIGlzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIGZvcm1GaWVsZHMgYXJlIHJlZ2lzdGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgJiYgdGhpcy5kYXRhc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVmYXVsdG1vZGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xheW91dERpYWxvZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnYgJiYgbnYgPT09ICdFZGl0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdGhpcy51cGRhdGVNb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzb3VyY2UnOlxuICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtZGF0YXNvdXJjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZvcm1EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzZXQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnlpbmcgdGhlIGRhdGFzZXQgY2hhbmdlIHRvIHRoZSBmb3JtLWZpZWxkIHdpZGdldC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5pc0RhdGFTZXRCb3VuZCAmJiBnZXQoZmllbGQuZm9ybVdpZGdldCwgJ2RhdGFzZXQkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmZvcm1XaWRnZXQuZGF0YXNldCQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXZlbnQgY2FsbGJhY2tzIG9uIHN1Y2Nlc3MvZXJyb3JcbiAgICBvblJlc3VsdENiKGRhdGEsIHN0YXR1cywgZXZlbnQ/KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHskZXZlbnQ6IGV2ZW50LCAkZGF0YTogZGF0YSwgJG9wZXJhdGlvbjogdGhpcy5vcGVyYXRpb25UeXBlfTtcbiAgICAgICAgLy8gd2hldGhlciBzZXJ2aWNlIGNhbGwgc3VjY2VzcyBvciBmYWlsdXJlIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdyZXN1bHQnLCBwYXJhbXMpO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAvLyBpZiBzZXJ2aWNlIGNhbGwgaXMgc3VjY2VzcyBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Y2Nlc3MnLCBwYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgc2VydmljZSBjYWxsIGZhaWxzIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBvciBoaWRlIHRoZSBpbmxpbmUgbWVzc2FnZS8gdG9hc3RlclxuICAgIHRvZ2dsZU1lc3NhZ2Uoc2hvdzogYm9vbGVhbiwgbXNnPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nLCBoZWFkZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlO1xuICAgICAgICBpZiAoc2hvdyAmJiBtc2cpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gKHR5cGUgPT09ICdlcnJvcicgJiYgdGhpcy5lcnJvcm1lc3NhZ2UpID8gdGhpcy5lcnJvcm1lc3NhZ2UgOiBtc2c7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlbGF5b3V0ID09PSAnSW5saW5lJykge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5jaGVja0FwcFNlcnZpY2VFcnJvck1zZyh0eXBlKSB8fCB0ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSB7J2NhcHRpb24nOiB0ZW1wbGF0ZSB8fCAnJywgdHlwZTogdHlwZX07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZVJlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWYuc2hvd01lc3NhZ2UodGhpcy5zdGF0dXNNZXNzYWdlLmNhcHRpb24sIHRoaXMuc3RhdHVzTWVzc2FnZS50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBtZXNzYWdlIGxheW91dCBpcyBpbmxpbmUgb24gc2F2ZSwgc2Nyb2xsIHRoZSB2aWV3IHRvIHRvcCBvZiB0aGUgZm9ybSB0byBzZWUgdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCFpc0VsZW1lbnRJblZpZXdwb3J0KHRoaXMuJGVsZW1lbnRbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvRWxlbWVudCh0aGlzLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeUFwcCh0ZW1wbGF0ZSwgdHlwZSwgaGVhZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZS5jYXB0aW9uID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBBcHAub25TZXJ2aWNlRXJyb3IgaGFuZGxlciBmb3IgdGhlIGFwcCwgdGhhdCBtZXNzYWdlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Ygc2VydmVyIHJldHVybmVkIGVycm9yIG1lc3NhZ2VcbiAgICBjaGVja0FwcFNlcnZpY2VFcnJvck1zZyh0eXBlKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkFjdGlvbiA9IGdldCh0aGlzLmFwcCwgJ0FjdGlvbnMuYXBwTm90aWZpY2F0aW9uJyk7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25BY3Rpb24gJiYgdHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbkFjdGlvbi5nZXRNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGlubGluZSBtZXNzYWdlLyB0b2FzdGVyXG4gICAgY2xlYXJNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZU1lc3NhZ2UoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgY2xhc3NlcyBvbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgY2FwdGlvbnBvc2l0aW9uIGFuZCBjYXB0aW9ud2lkdGggcHJvcGVydGllc1xuICAgIHByaXZhdGUgc2V0TGF5b3V0Q29uZmlnKCkge1xuICAgICAgICBsZXQgbGF5b3V0Q29uZmlnO1xuICAgICAgICBsYXlvdXRDb25maWcgPSBnZXRGaWVsZExheW91dENvbmZpZyh0aGlzLmNhcHRpb253aWR0aCwgdGhpcy5jYXB0aW9ucG9zaXRpb24sIGdldCh0aGlzLmFwcC5zZWxlY3RlZFZpZXdQb3J0LCAnb3MnKSk7XG4gICAgICAgIHRoaXMuX3dpZGdldENsYXNzID0gbGF5b3V0Q29uZmlnLndpZGdldENscztcbiAgICAgICAgdGhpcy5fY2FwdGlvbkNsYXNzID0gbGF5b3V0Q29uZmlnLmNhcHRpb25DbHM7XG5cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRm9ybVdpZGdldCh3aWRnZXQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHdpZGdldC5uYW1lIHx8IHdpZGdldC5rZXk7XG4gICAgICAgIHRoaXMuZm9ybVdpZGdldHNbbmFtZV0gPSB3aWRnZXQ7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGb3JtRmllbGRzKGZvcm1GaWVsZCkge1xuICAgICAgICBjb25zdCBmaWVsZENvdW50ID0gdGhpcy5mb3JtRmllbGRzLnB1c2goZm9ybUZpZWxkKTtcbiAgICAgICAgdGhpcy5mb3JtZmllbGRzW2Zvcm1GaWVsZC5rZXldID0gZm9ybUZpZWxkO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9ybVdpZGdldChmb3JtRmllbGQpO1xuICAgICAgICB0aGlzLl9kZWJvdW5jZWRVcGRhdGVGaWVsZFNvdXJjZSgpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uZm9ybUZpZWxkcy5wdXNoKGZvcm1GaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uZm9ybWZpZWxkc1tmb3JtRmllbGQua2V5XSA9IGZvcm1GaWVsZDtcbiAgICAgICAgICAgIC8vIGlubmVyIGZvcm1maWVsZHMgYXJlIHB1c2hlZCB0byBwYXJlbnRGb3JtLCBwYXNzaW5nIGN1cnJlbnQgaW5uZXJGb3JtJ3MgZm9ybWRhdGEgdG8gc2V0IGlubmVyRm9ybWRhdGEgdG8gdGhlc2UgaW5uZXJGb3JtRmllbGRzXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uc2V0Rm9ybURhdGEodGhpcy5wYXJlbnRGb3JtLmZvcm1kYXRhLCB0aGlzLmZvcm1GaWVsZHMsIHRoaXMuZm9ybWRhdGEgfHwge30pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdNUy0xODk2NzogQXBwbHlpbmcgZm9ybWFkYXRhIGFmdGVyIGZvcm1maWVsZHMgYXJlIHJlYWR5XG4gICAgICAgIGlmIChmaWVsZENvdW50ID09PSB0aGlzLm51bWJlck9mRmllbGRzICYmICFpc0VtcHR5KHRoaXMuZm9ybWRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgaXNBcnJheSh0aGlzLmZvcm1kYXRhKSA/IHRoaXMuc2V0Rm9ybURhdGEobGFzdCh0aGlzLmZvcm1kYXRhKSkgOiB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBY3Rpb25zKGZvcm1BY3Rpb24pIHtcbiAgICAgICAgdGhpcy5idXR0b25BcnJheS5wdXNoKGZvcm1BY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YW91dHB1dCB3aGVuZXZlciB0aGVyZSBpcyBhIGNoYW5nZSBpbiBpbnNpZGUgZm9ybSB3aWRnZXQgdmFsdWVcbiAgICB1cGRhdGVGb3JtRGF0YU91dHB1dChkYXRhT2JqZWN0KSB7XG4gICAgICAgIC8vIFNldCB0aGUgdmFsdWVzIG9mIHRoZSB3aWRnZXRzIGluc2lkZSB0aGUgbGl2ZSBmb3JtIChvdGhlciB0aGFuIGZvcm0gZmllbGRzKSBpbiBmb3JtIGRhdGFcbiAgICAgICAgZm9yRWFjaCh0aGlzLm5nZm9ybS52YWx1ZSwgKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbmQodGhpcy5mb3JtRmllbGRzLCB7a2V5fSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGFvdXRwdXQgPSBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBvYmplY3QgbWVyZ2luZyB0aGUgZm9ybSBmaWVsZHMgYW5kIGN1c3RvbSB3aWRnZXRzIGRhdGFcbiAgICBjb25zdHJ1Y3REYXRhT2JqZWN0KCkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSAgICAgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAvLyBHZXQgYWxsIGZvcm0gZmllbGRzIGFuZCBwcmVwYXJlIGZvcm0gZGF0YSBhcyBrZXkgdmFsdWUgcGFpcnNcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGxldCBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZC5kYXRhdmFsdWUgfHwgZmllbGQuX2NvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gKGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gJycpID8gdW5kZWZpbmVkIDogZmllbGRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBnZXRGaWxlcyh0aGlzLm5hbWUsIGZpZWxkLmtleSArICdfZm9ybVdpZGdldCcsIGZpZWxkLm11bHRpcGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmllbGROYW1lID0gZmllbGQua2V5IHx8IGZpZWxkLnRhcmdldCB8fCBmaWVsZC5uYW1lO1xuXG4gICAgICAgICAgICAvLyBvbiBjdXJyZW50IEZvcm0sIHdoZW4gZmllbGQgaXMgaW5uZXJGb3JtIGZpZWxkIHRoZW4gd2UgZ3JvdXAgdGhlc2UgZmllbGRzIHVuZGVyIG5ldyBvYmplY3QgdXNpbmcgZm9ybUdyb3VwTmFtZSBhcyBrZXlcbiAgICAgICAgICAgIC8vIEZvciBzdXBwb3NlLCBhcHBsaWNhbnROYW1lLCBhcHBsaWNhbnRJRCBhcmUgZm9ybWZpZWxkcyBpbiBjdXJyZW50Rm9ybVxuICAgICAgICAgICAgLy8gVGhpcyBmb3JtIGlzIGhhdmluZyBpbm5lcmZvcm0gaS5lLiBhZGRyZXNzLCB0aGVzZSBmaWVsZHMgYXJlIGxpc3RlZCBhc1xuICAgICAgICAgICAgLy8ge1wiYXBwbGljYW50TmFtZVwiOiBcIlwiLCBcImFwcGxpY2FudElEXCI6IFwiXCIsIFwiYWRkcmVzc1wiOiB7XCJzdHJlZXRcIjogXCJcIn19XG4gICAgICAgICAgICBpZiAoZmllbGQuZm9ybS53aWRnZXRJZCAhPT0gdGhpcy53aWRnZXRJZCAmJiBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lLCB7fSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGROYW1lXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgICAgICAgICAgc2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0gJiYgZmllbGQuZm9ybS5pc1BhcmVudExpc3QpIHsgLy8gRml4IGZvciBbV01TLTI1ODA2XTogdXNlIGZvcm1BcnJheUluZGV4IG9ubHkgaWYgZm9ybSBoYXMgYSBwYXJlbnQgZm9ybVxuICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZm9ybWRhdGEgYmFzZWQgb24gZm9ybUFycmF5SW5kZXhcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIFtdKTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSA9IGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdIHx8IHt9O1xuICAgICAgICAgICAgICAgIGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1cGRhdGUgdGhlIGZpZWxkIHdpbGwgYmUgYWxyZWFkeSBwcmVzZW50IGluIGZvcm0gZGF0YVxuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybURhdGFPdXRwdXQoZm9ybURhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhb3V0cHV0O1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGFPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgICAgICBpZiAodGhpcy5uZ2Zvcm0udG91Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uTXNncyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZmllbGRzIGluIHBhcmVudCBhbmQgaW5uZXIgZm9ybSBhbHNvLlxuICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgZm9ybUZpZWxkcyBpbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgZm9ybSBuYW1lLlxuICAgIGdldEZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXIodGhpcy5mb3JtRmllbGRzLCBmb3JtRmllbGQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1GaWVsZC5mb3JtLm5hbWUgPT09IHRoaXMubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YT8pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZmllbGQua2V5IHx8IGZpZWxkLm5hbWU7XG4gICAgICAgIC8vIGlmIGN1c3RvbWZpZWxkIHBhcmFtIHZhbHVlIGlzIG5vdCBpbiB0aGUgZm9ybWRhdGEgdGhlbiBkbyBub3QgYXNzaWduIGZpZWxkIHZhbHVlXG4gICAgICAgIC8vIGFzIGl0IGNhbiBjb250YWluIGRlZmF1bHQgdmFsdWUgd2hpY2ggd2lsbCBhZ2FpbiBiZSBvdmVycmlkZGVuIGJ5IHVuZGVmaW5lZC5cbiAgICAgICAgY29uc3QgZmQgPSBpbm5lckZvcm1kYXRhID8gaW5uZXJGb3JtZGF0YSA6IGRhdGE7XG4gICAgICAgIGlmIChmZCkge1xuICAgICAgICAgICAgaWYgKGZkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGdldChmZCwga2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoa2V5LCAnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5IGNvbnRhaW5zICcuJyB3aGVuIG1hcHBpbmcgdGhlIGZpZWxkcyB0byBjaGlsZCByZWZlcmVuY2UgaS5lLiBjaGlsZENvbCBpcyBoYXZpbmcga2V5IGFzIFwicGFyZW50LmNoaWxkQ29sXCJcbiAgICAgICAgICAgICAgICBpZiAoZmQuaGFzT3duUHJvcGVydHkoc3BsaXQoa2V5LCAnLicpWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGdldChmZCwga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXTVMtMTg5MDY6IEZvciBkZWZhdWx0IHZhbHVlLCBkbyBub3QgbWFyayB0aGUgZm9ybSBhcyBkaXJ0eS5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpcnR5ICYmICF0aGlzLl90cmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybUdyb3VwTmFtZSA9IGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlmIGZvcm1Hcm91cE5hbWUgaXMgZGVmaW5lZCB3aGljaCBtZWFucyBmaWVsZCBpcyBpbnNpZGUgdGhlIGlubmVyIGZvcm1cbiAgICAgICAgICogdGhlbiBzZXQgdGhlIGZvcm1kYXRhIG9uIHRoZSBmaWVsZCdzIGZvcm0gdXNpbmcgZm9ybUdyb3VwTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZvcm1Hcm91cE5hbWUgJiYgZ2V0KGRhdGEsIGZvcm1Hcm91cE5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YVtmb3JtR3JvdXBOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZm9ybWRhdGEgaXMgYXNzaWduZWQgbGF0ZXIgdGhlbiBvbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIsIGV2ZW4gaW5uZXIgZm9ybXMgZGF0YSBhbHNvIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG4gICAgICAgIGlmIChnZXQoZmllbGQuZm9ybSwgJ3BhcmVudEZvcm1BcnJheScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YShkYXRhLCBpbm5lckZvcm1GaWVsZHM/LCBpbm5lckZvcm1kYXRhPykge1xuICAgICAgICAvLyB3aGVyZWFzIGZvcm1GaWVsZHMgZXhwbGljaXRseSBwYXNzZWQgY2FuIGNvbnRhaW4gaW5uZXJmb3JtIGZpZWxkcyBhbHNvLlxuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gaW5uZXJGb3JtRmllbGRzIHx8IHRoaXMuZm9ybUZpZWxkcztcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YSk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmllbGRWYWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMuc2V0Q3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgIH1cblxuICAgIHJlc2V0Rm9ybVN0YXRlKCkge1xuICAgICAgICAvLyBjbGVhcmluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIG9uIHJlc2V0LlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGZpZWxkLndpZGdldHR5cGUgPT09ICd1cGxvYWQnIHx8IGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldmZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMucHJldmZvcm1GaWVsZHMgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtRmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdrZXknOiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgICd3aWRnZXR0eXBlJzogZmllbGQud2lkZ2V0dHlwZSxcbiAgICAgICAgICAgICAgICAnb3V0cHV0Zm9ybWF0JzogZmllbGQub3V0cHV0Zm9ybWF0LFxuICAgICAgICAgICAgICAgICd2YWx1ZSc6IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZEYXRhVmFsdWVzKCkge1xuICAgICAgICB0aGlzLnByZXZEYXRhVmFsdWVzID0gdGhpcy5mb3JtRmllbGRzLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geydrZXknOiBvYmoua2V5LCAndmFsdWUnOiBvYmoudmFsdWV9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZWFkb25seUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHNraXBWYWx1ZVNldD8pIHtcbiAgICAgICAgY29uc3QgJGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAkZm9ybUVsZS5maW5kKCdbbmFtZT1cIicgKyBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXRcIl0nKS52YWwoJycpO1xuICAgICAgICBmaWVsZC5fY29udHJvbC5yZXNldCgpO1xuICAgICAgICBpZiAoIXNraXBWYWx1ZVNldCkge1xuICAgICAgICAgICAgZmllbGQuaHJlZiA9ICcnO1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1wdHlEYXRhTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGF2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBmaWVsZC5kZWZhdWx0dmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRPcGVyYXRpb25UeXBlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gbW9kZSB8fCAnaW5zZXJ0JztcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLklOU0VSVDtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtcHR5RGF0YU1vZGVsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5VUERBVEU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2RGF0YU9iamVjdCA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1kYXRhIHx8IHt9KTtcblxuICAgICAgICB0aGlzLnNldFJlYWRvbmx5RmllbGRzKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RlcGVuZHNvbnRhYmxlJyk7XG4gICAgICAgIGlmICghdGFibGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgdGhpcy5hcHAubm90aWZ5KCd3bS1ldmVudCcsIHtldmVudE5hbWUsIHdpZGdldE5hbWU6IHRhYmxlSWR9KTtcbiAgICB9XG5cbiAgICBzdWJtaXRGb3JtKCRldmVudCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUsIGZvcm1EYXRhLCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFzb3VyY2U7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtRGF0YSA9IGdldENsb25lZE9iamVjdCh0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKSk7XG5cbiAgICAgICAgY29uc3QgZ2V0UGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHskZXZlbnQsICRmb3JtRGF0YTogZm9ybURhdGEsICRkYXRhOiBmb3JtRGF0YX07XG4gICAgICAgIH07XG5cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVN1Ym1pdEV2dCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc3VibWl0JywgZ2V0UGFyYW1zKCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25TdWJtaXRFdnQgfHwgZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgLy8gSWYgb24gc3VibWl0IGlzIHRoZXJlIGV4ZWN1dGUgaXQgYW5kIGlmIGl0IHJldHVybnMgdHJ1ZSBkbyBzZXJ2aWNlIHZhcmlhYmxlIGludm9rZSBlbHNlIHJldHVyblxuICAgICAgICAgICAgLy8gSWYgaXRzIGEgc2VydmljZSB2YXJpYWJsZSBjYWxsIHNldElucHV0IGFuZCBhc3NpZ24gZm9ybSBkYXRhIGFuZCBpbnZva2UgdGhlIHNlcnZpY2VcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW0gPSBkYXRhU291cmNlLnBhZ2luYXRpb24gJiYgZGF0YVNvdXJjZS5wYWdpbmF0aW9uLm51bWJlciArIDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHRoaXMub3BlcmF0aW9uVHlwZSA/IHRoaXMub3BlcmF0aW9uVHlwZSA6ICdpbnNlcnQnO1xuICAgICAgICAgICAgICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uKGRhdGFTb3VyY2UsIGZvcm1EYXRhLCB7b3BlcmF0aW9uVHlwZTogb3BlcmF0aW9uVHlwZX0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZS5jYXRlZ29yeSA9PT0gJ3dtLkNydWRWYXJpYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCdyZXNldEVkaXRNb2RlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uTElTVF9SRUNPUkRTLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwVG9nZ2xlU3RhdGUnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uJzogJ2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFnZSc6IGN1cnJlbnRQYWdlTnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJldmVudE1pc3NpbmdPcE1zZyc6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWFsb2dJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChkYXRhLmJvZHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRKU09OKGRhdGEuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNEZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiBkYXRhLmJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiB0aGlzLnBvc3RtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5lcnJvcm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgfHwgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiBnZXQoZXJyb3IsICdlcnJvcicpIHx8IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJiAhdGhpcy5vbkVycm9yKSB8fCAocmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnICYmICF0aGlzLm9uU3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZSh0cnVlLCByZXNwb25zZS5tZXNzYWdlLCByZXNwb25zZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHJlc3BvbnNlLnJlc3VsdCwgcmVzcG9uc2Uuc3RhdHVzLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZURpYWxvZygpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlKHRoaXMuZGlhbG9nSWQpO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBzaG93L2hpZGUgdGhlIHBhbmVsIGhlYWRlciBvciBmb290ZXIgYmFzZWQgb24gdGhlIGJ1dHRvbnNcbiAgICBzaG93QnV0dG9ucyhwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gc29tZSh0aGlzLmJ1dHRvbkFycmF5LCBidG4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVzKGJ0bi5wb3NpdGlvbiwgcG9zaXRpb24pICYmIGJ0bi51cGRhdGVNb2RlID09PSB0aGlzLmlzVXBkYXRlTW9kZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBwYW5lbFxuICAgIGV4cGFuZENvbGxhcHNlUGFuZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgICAgICAvLyBmbGlwIHRoZSBhY3RpdmUgZmxhZ1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EYXRhU291cmNlVXBkYXRlKHJlc3BvbnNlLCBuZXdGb3JtLCB1cGRhdGVNb2RlKSB7XG4gICAgICAgIGlmIChuZXdGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLm5ldygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSBpc0RlZmluZWQodXBkYXRlTW9kZSkgPyB1cGRhdGVNb2RlIDogdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB0cmFudmVyc2VzIHRocm91Z2ggdGhlIHBhcmVudCBjb250YWluaW5nIGZvcm1kYXRhIGFuZCByZXR1cm5zIHRoZSBwYXJlbnQgZm9ybWRhdGEuXG4gICAgICogQHBhcmFtIGZvcm0sIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgZm9ybSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0pIHtcbiAgICAgICAgaWYgKCFmb3JtLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0uYmluZGZvcm1kYXRhICYmIGdldChmb3JtLnBhcmVudEZvcm0sICdmb3JtZGF0YScpICYmICFpc0VtcHR5KGZvcm0ucGFyZW50Rm9ybS5mb3JtZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtLnBhcmVudEZvcm0uZm9ybWRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0ucGFyZW50Rm9ybSk7XG4gICAgfVxuXG4gICAgc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEoZm9ybWRhdGE6IGFueSkge1xuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSAmJiB0aGlzLnBhcmVudEZvcm0gJiYgZm9ybWRhdGEpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgZm9ybSBpcyBpbnNpZGUgbGlzdCxcbiAgICAgICAgICAgICAqIDEuIGRpcmVjdGx5IGFwcGx5aW5nIHRoZSBmb3JtZGF0YSB0byB0aGUgZm9ybUFycmF5IHRvIHVwZGF0ZSB0aGUgZm9ybWRhdGEgb24gbGlzdCBvZiBmb3JtcyB1c2luZyBwYXRjaFZhbHVlLlxuICAgICAgICAgICAgICogMi4gYW5kIGFsc28gc2V0dGluZyBpbmRpdmlkdWFsIGZvcm1kYXRhIHRvIHRoZSBmb3JtIGluc2lkZSBlYWNoIGl0ZW0gYmFzZWQgb24gZm9ybUFycmF5SW5kZXgsIHdoZW4gZm9ybSBpcyBub3QgYm91bmQgdG8gZm9ybWRhdGEuXG4gICAgICAgICAgICAgKiAzLiBleHBsaWNpdGx5IGludm9raW5nIGZvcm1kYXRhIGFzIGZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZm9ybWZpZWxkcyBpbmNsdWRpbmcgaW5uZXJGb3JtJ3MgZmllbGRzXG4gICAgICAgICAgICAgKiAoaWYgd2UgZG8gbm90IGludm9rZSBleHBsaWNpdGx5IHRoZW4gZm9ybUZpZWxkcyB3aWxsIGp1c3QgY29udGFpbiB0aGUgZmllbGRzIGluc2lkZSBjdXJyZW50IGZvcm0gYW5kIG5vdCBpbm5lciBmb3JtIGZpZWxkcylcbiAgICAgICAgICAgICAqIDQuIGlmIGNoaWxkRm9ybUFycmF5RGF0YSBpcyBub3QgYXZhaWxhYmxlIHdlIHdpbGwgY2hlY2sgZm9yIGlubmVyIGZvcm0gZGF0YSB1c2luZyBcImZvcm1Hcm91cE5hbWVcIiBhbmQgd2lsbCBzZXQgdGhlIGlubmVyZm9ybSBkYXRhXG4gICAgICAgICAgICAgKiBJZiBub3QgaW5zaWRlIGxpc3QsIGp1c3Qgc2V0IHRoZSBmb3JtZGF0YSBvbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSBmaWVsZHNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybUFycmF5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkRm9ybUFycmF5RGF0YSA9IGdldChmb3JtZGF0YSwgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZEZvcm1BcnJheURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGNoaWxkRm9ybUFycmF5RGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRm9ybUFycmF5RGF0YSA9IFtjaGlsZEZvcm1BcnJheURhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnBhdGNoVmFsdWUoY2hpbGRGb3JtQXJyYXlEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpbmRmb3JtZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtZGF0YSA9IGNoaWxkRm9ybUFycmF5RGF0YVt0aGlzLmZvcm1BcnJheUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Rm9ybURhdGEgPSBnZXQoZm9ybWRhdGEsIHRoaXMucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShwYXJlbnRGb3JtRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkRhdGFTb3VyY2VDaGFuZ2UoKSB7XG4gICAgICAgIGlmIChnZXQodGhpcy5mb3JtRmllbGRzLCAnbGVuZ3RoJykgJiYgIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBmb3JtZGF0YSBvbiB0aGUgcGFyZW50IGZvcm0gd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBpbm5lciBmb3JtcyBhcmUgcmVuZGVyZWQuXG4gICAgICAgICAgICAgKiBIZW5jZSBoYW5kbGluZyBmb3JtZGF0YSBvbiB0aGUgaW5uZXJGb3Jtcywgd2hpY2ggbWlnaHQgYmUgcmVuZGVyZWQgc2xvd2x5IChzdXBwb3NlIHByZWZhYiB3aXRoIGZvcm0pXG4gICAgICAgICAgICAgKiBzZXR0aW5nIGlubmVyIGZvcm0ncyBmb3JtZGF0YSBvYnRhaW5lZCBmcm9tIHBhcmVudCBmb3JtZGF0YVxuICAgICAgICAgICAgICogdGhpcyBhcHBsaWVzIG9ubHkgd2hlbiBmb3JtZGF0YSBpcyBub3QgZ2l2ZW4gb24gdGhlIGlubmVyIGZvcm0uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZvcm1EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCBkZWZhdWx0IHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZERlZmF1bHRWYWx1ZUNoYW5nZShmaWVsZCwgbnYpIHtcbiAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZVZhbHVlQnlUeXBlKG52LCB1bmRlZmluZWQsIGZpZWxkLndpZGdldHR5cGUsIGZpZWxkLnRyYWlsaW5nemVybyk7XG4gICAgICAgIC8vIFdNUy0yMjQzNDogRm9yIGRlZmF1bHQgdmFsdWUgc2V0IG9uIGluZGl2aWR1YWwgZm9ybSBmaWVsZHMsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGZpZWxkIHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZFZhbHVlQ2hhbmdlKCkge1xuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuZCBjb21waWxlIHRoZSBmb3JtIGZpZWxkcyBmcm9tIHRoZSBtZXRhZGF0YVxuICAgIGFzeW5jIGdlbmVyYXRlRm9ybUZpZWxkcygpIHtcbiAgICAgICAgbGV0IG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgJGdyaWRMYXlvdXQ7XG4gICAgICAgIC8vIENoZWNrIGlmIGdyaWQgbGF5b3V0IGlzIHByZXNlbnQgb3Igbm90IGZvciBmaXJzdCB0aW1lXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSkge1xuICAgICAgICAgICAgdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLnBhbmVsLWJvZHkgW3dtbGF5b3V0Z3JpZF0nKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSB7XG4gICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgW3dtbGF5b3V0Z3JpZF0nKS5maXJzdCgpO1xuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSBOdW1iZXIoJGdyaWRMYXlvdXQuYXR0cignY29sdW1ucycpKSB8fCAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIC5keW5hbWljLWZvcm0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICBpZiAoISRncmlkTGF5b3V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMnKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwiZHluYW1pYy1mb3JtLWNvbnRhaW5lclwiPjwvZGl2PicpO1xuICAgICAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyAuZHluYW1pYy1mb3JtLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gMTIgLyBub09mQ29sdW1ucztcbiAgICAgICAgbGV0IGZpZWxkVGVtcGxhdGUgPSAnJztcbiAgICAgICAgbGV0IGNvbENvdW50ID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBsZXQgdXNlckZpZWxkcztcbiAgICAgICAgbGV0IGZpZWxkcyA9IHRoaXMubWV0YWRhdGEgPyB0aGlzLm1ldGFkYXRhLmRhdGEgfHwgdGhpcy5tZXRhZGF0YSA6IFtdO1xuXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IFtdOyAvLyBlbXB0eSB0aGUgZm9ybSBmaWVsZHNcblxuICAgICAgICBpZiAoaXNFbXB0eShmaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVJlbmRlckV2dCkge1xuICAgICAgICAgICAgdXNlckZpZWxkcyA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3JlcmVuZGVyJywgeyRtZXRhZGF0YTogZmllbGRzfSk7XG4gICAgICAgICAgICBpZiAodXNlckZpZWxkcykge1xuICAgICAgICAgICAgICAgIGZpZWxkcyA9IHVzZXJGaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGZpZWxkc1tjb2xDb3VudF0pIHtcbiAgICAgICAgICAgIGxldCBjb2xUbXBsID0gJyc7XG4gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBub09mQ29sdW1uczsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbFRtcGwgKz0gc2V0TWFya3VwRm9yRm9ybUZpZWxkKGZpZWxkc1tjb2xDb3VudF0sIGNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgKz0gYDx3bS1ncmlkcm93PiR7Y29sVG1wbH08L3dtLWdyaWRyb3c+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSA9IGA8d20tbGF5b3V0Z3JpZD4ke2ZpZWxkVGVtcGxhdGV9PC93bS1sYXlvdXRncmlkPmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9keW5hbWljQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQgPSBPYmplY3QuY3JlYXRlKHRoaXMudmlld1BhcmVudCk7XG4gICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dC5mb3JtID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5UmVmID0gYXdhaXQgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50RmFjdG9yeVJlZihcbiAgICAgICAgICAgICdhcHAtZm9ybS1keW5hbWljLScgKyB0aGlzLndpZGdldElkLFxuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub0NhY2hlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRyYW5zcGlsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZHluYW1pY0Zvcm1SZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnlSZWYsIDAsIHRoaXMuaW5qKTtcbiAgICAgICAgZXh0ZW5kUHJvdG8oY29tcG9uZW50Lmluc3RhbmNlLCB0aGlzLl9keW5hbWljQ29udGV4dCk7XG4gICAgICAgICRncmlkTGF5b3V0WzBdLmFwcGVuZENoaWxkKGNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHlwZSB8fCB0aGlzLmZpbmRPcGVyYXRpb25UeXBlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uZGlydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBwcmlzdGluZSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNQcmlzdGluZSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzUHJpc3RpbmUodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNQcmlzdGluZSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIGRpcnR5IGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc0RpcnR5IG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNEaXJ0eSh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZDtcbiAgICB9XG5cbiAgICBnZXQgdG91Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnRvdWNoZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0udmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHByaXN0aW5lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0ucHJpc3RpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byB0b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1RvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1RvdWNoZWQodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdW50b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1VudG91Y2hlZCBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzVW50b3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXZlbnQoZXhwcmVzc2lvbik7XG4gICAgICAgIGZuKHRoaXMudmlld1BhcmVudCwgT2JqZWN0LmFzc2lnbih0aGlzLmNvbnRleHQsIHskZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIG9uIGZvcm0gZGVzdHJveSwgcmVtb3ZpbmcgdGhpcyBmb3JtIGZyb20gdGhlIHBhcmVudEZvcm0gdG9vLlxuICAgICAgICBjb25zdCBjb250cm9scyA9IHRoaXMucGFyZW50Rm9ybSAmJiBnZXQodGhpcy5wYXJlbnRGb3JtLCAnbmdmb3JtLmNvbnRyb2xzJyk7XG4gICAgICAgIGlmIChjb250cm9scykge1xuICAgICAgICAgICAgLy8gd2hlbiBjdXJyZW50IGZvcm0gaXMgaW5zaWRlIHRoZSBsaXN0IChpLmUuIGluY2FzZSBvZiBmb3JtQXJyYXkpLlxuICAgICAgICAgICAgaWYgKGdldCh0aGlzLnBhcmVudExpc3QsICduYW1lJykgJiYgY29udHJvbHMuaGFzT3duUHJvcGVydHkodGhpcy5wYXJlbnRMaXN0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGluZGV4IG9mIGN1cnJlbnQgZm9ybSBpbiB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRoZSBGb3JtQ29udHJvbCBmcm9tIEZvcm1BcnJheVxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4KHRoaXMucGFyZW50TGlzdC5nZXRXaWRnZXRzKHRoaXMubmFtZSksIHt3aWRnZXRJZDogdGhpcy53aWRnZXRJZH0pO1xuICAgICAgICAgICAgICAgICg8Rm9ybUFycmF5PnRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHNbdGhpcy5wYXJlbnRMaXN0Lm5hbWVdKS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgZm9ybUdyb3VwTmFtZSBzZXQgaS5lLiBtdWx0aXBsZSBmb3JtSW5zdGFuY2Ugd2l0aCBjb3VudGVyIGFwcGVuZGVkIHRvIGZvcm1OYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBOYW1lICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMuZm9ybUdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2NvbnRlbnQ+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtbGF5b3V0ID09PSAncGFnZSc7IHRoZW4gcGFnZUxheW91dFRlbXBsYXRlIGVsc2UgZGVmYXVsdFRlbXBsYXRlXCI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiAqbmdJZj1cIiFpc0xheW91dERpYWxvZyAmJiAodGl0bGUgfHwgc3ViaGVhZGluZyB8fCBpY29uY2xhc3MgfHwgc2hvd0J1dHRvbnMoJ2hlYWRlcicpKVwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJwYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24gcGFuZWwtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtuZ0NsYXNzXT1cImljb25jbGFzc1wiICpuZ0lmPVwiaWNvbmNsYXNzXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIiBbaW5uZXJIVE1MXT1cInRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW2lubmVySFRNTF09XCJzdWJoZWFkaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbiBwYW5lbC1hY3Rpb25zIGJhc2ljLWJ0bi1ncnBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgYnV0dG9uQXJyYXkgfCBmaWx0ZXIgOiAncG9zaXRpb24nIDogJ2hlYWRlcic7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bi53aWRnZXRUeXBlID09PSAnYnV0dG9uJyA/IGJ1dHRvblJlZiA6IGFuY2hvclJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2J0bjpidG59XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlQ3VzdG9tSW5qZWN0b3IoJ2FjdGlvbl9oZWFkZXJfJyArIGluZGV4LCB7YnRuOmJ0bn0pXCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhcHAtaWNvbiB3aSBwYW5lbC1hY3Rpb25cIiAqbmdJZj1cImNvbGxhcHNpYmxlXCIgdGl0bGU9XCJDb2xsYXBzZS9FeHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZXhwYW5kZWQgPyAnd2ktbWludXMnOiAnd2ktcGx1cydcIiAoY2xpY2spPVwiZXhwYW5kQ29sbGFwc2VQYW5lbCgpO1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaDM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBbbmdDbGFzc109XCJ7J2Zvcm0tZWxlbWVudHMnOiBpc0xheW91dERpYWxvZywgJ2Zvcm0tYm9keSc6ICFpc0xheW91dERpYWxvZ31cIiBbY2xhc3MuaGlkZGVuXT1cIiFleHBhbmRlZFwiPlxuICAgICAgICA8cCB3bU1lc3NhZ2UgKm5nSWY9XCIhIXN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzdGF0dXNNZXNzYWdlLmNhcHRpb25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIGNhcHRpb24uYmluZD1cInN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIHR5cGUuYmluZD1cInN0YXR1c01lc3NhZ2UudHlwZVwiPjwvcD5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2Zvcm0tZWxlbWVudHMnOiAhaXNMYXlvdXREaWFsb2csICdmb3JtLWNvbnRlbnQnOiBpc0xheW91dERpYWxvZ31cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtYnRuLWdycCBmb3JtLWFjdGlvbiBwYW5lbC1mb290ZXIgY2xlYXJmaXhcIiBbbmdDbGFzc109XCJ7J21vZGFsLWZvb3Rlcic6IGlzTGF5b3V0RGlhbG9nfVwiIFtjbGFzcy5oaWRkZW5dPVwiIWV4cGFuZGVkIHx8ICFzaG93QnV0dG9ucygnZm9vdGVyJylcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBidXR0b25BcnJheSB8IGZpbHRlciA6ICdwb3NpdGlvbicgOiAnZm9vdGVyJzsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJidG4ud2lkZ2V0VHlwZSA9PT0gJ2J1dHRvbicgPyBidXR0b25SZWYgOiBhbmNob3JSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2J0bjpidG59XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJjcmVhdGVDdXN0b21JbmplY3RvcignYWN0aW9uX2Zvb3Rlcl8nICsgaW5kZXgsIHtidG46YnRufSlcIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcGFnZUxheW91dFRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvblJlZiBsZXQtYnRuPVwiYnRuXCI+XG4gICAgPGJ1dHRvbiAgd21CdXR0b24gbmFtZT1cInt7YnRuLmtleX19XCIgY2FwdGlvbi5iaW5kPVwiYnRuLmRpc3BsYXlOYW1lXCIgY2xhc3MuYmluZD1cImJ0bi5jbGFzc1wiIGljb25jbGFzcy5iaW5kPVwiYnRuLmljb25jbGFzc1wiIHNob3cuYmluZD1cImJ0bi5zaG93XCJcbiAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBidG4uYWN0aW9uKVwiIHR5cGUuYmluZD1cImJ0bi50eXBlXCIgaGludC5iaW5kPVwiYnRuLnRpdGxlXCIgc2hvcnRjdXRrZXkuYmluZD1cImJ0bi5zaG9ydGN1dGtleVwiIGRpc2FibGVkLmJpbmQ9XCJuZ2Zvcm0uc3RhdHVzID09PSAnUEVORElORycgfHwgYnRuLmRpc2FibGVkXCJcbiAgICAgICAgICAgICB0YWJpbmRleC5iaW5kPVwiYnRuLnRhYmluZGV4XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJidG4uZGlzcGxheU5hbWVcIiBbY2xhc3MuaGlkZGVuXT1cImJ0bi51cGRhdGVNb2RlID8gIWlzVXBkYXRlTW9kZSA6IGlzVXBkYXRlTW9kZVwiPjwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhbmNob3JSZWYgbGV0LWJ0bj1cImJ0blwiPlxuICAgIDxhIHdtQW5jaG9yIG5hbWU9XCJ7e2J0bi5rZXl9fVwiIGNhcHRpb24uYmluZD1cImJ0bi5kaXNwbGF5TmFtZVwiIGNsYXNzLmJpbmQ9XCJidG4uY2xhc3NcIiBpY29uY2xhc3MuYmluZD1cImJ0bi5pY29uY2xhc3NcIiBzaG93LmJpbmQ9XCJidG4uc2hvd1wiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgYnRuLmFjdGlvbilcIiBoaW50LmJpbmQ9XCJidG4udGl0bGVcIiBzaG9ydGN1dGtleS5iaW5kPVwiYnRuLnNob3J0Y3V0a2V5XCJcbiAgICAgICAgICAgICBoeXBlcmxpbmsuYmluZD1cImJ0bi5oeXBlcmxpbmtcIiB0YXJnZXQuYmluZD1cImJ0bi50YXJnZXRcIlxuICAgICAgICAgICAgIHRhYmluZGV4LmJpbmQ9XCJidG4udGFiaW5kZXhcIiBbY2xhc3MuaGlkZGVuXT1cImJ0bi51cGRhdGVNb2RlID8gIWlzVXBkYXRlTW9kZSA6IGlzVXBkYXRlTW9kZVwiPjwvYT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgI2R5bmFtaWNGb3JtPjwvbmctY29udGFpbmVyPlxuIl19