@sapui5/sap.fe.core 1.113.0 → 1.115.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime-dbg.js +68 -5
  4. package/src/sap/fe/core/ActionRuntime.js +1 -1
  5. package/src/sap/fe/core/ActionRuntime.js.map +1 -1
  6. package/src/sap/fe/core/ActionRuntime.ts +120 -4
  7. package/src/sap/fe/core/AppComponent-dbg.js +8 -2
  8. package/src/sap/fe/core/AppComponent.js +1 -1
  9. package/src/sap/fe/core/AppComponent.js.map +1 -1
  10. package/src/sap/fe/core/AppComponent.ts +19 -3
  11. package/src/sap/fe/core/AppStateHandler-dbg.js +14 -10
  12. package/src/sap/fe/core/AppStateHandler.js +1 -1
  13. package/src/sap/fe/core/AppStateHandler.js.map +1 -1
  14. package/src/sap/fe/core/AppStateHandler.ts +17 -11
  15. package/src/sap/fe/core/BaseController-dbg.js +1 -1
  16. package/src/sap/fe/core/BaseController.ts +13 -2
  17. package/src/sap/fe/core/CommonUtils-dbg.js +74 -317
  18. package/src/sap/fe/core/CommonUtils.js +1 -1
  19. package/src/sap/fe/core/CommonUtils.js.map +1 -1
  20. package/src/sap/fe/core/CommonUtils.ts +96 -473
  21. package/src/sap/fe/core/ExtensionAPI-dbg.js +1 -1
  22. package/src/sap/fe/core/ExtensionAPI.ts +2 -2
  23. package/src/sap/fe/core/StateFilterToSelectionVariant-dbg.js +263 -0
  24. package/src/sap/fe/core/StateFilterToSelectionVariant.js +6 -0
  25. package/src/sap/fe/core/StateFilterToSelectionVariant.js.map +1 -0
  26. package/src/sap/fe/core/StateFilterToSelectionVariant.ts +316 -0
  27. package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
  28. package/src/sap/fe/core/TemplateComponent.ts +6 -0
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +10 -3
  30. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +1 -1
  31. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -1
  32. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +8 -1
  33. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +1 -1
  34. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +1 -0
  35. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +8 -8
  36. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -1
  37. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.ts +7 -7
  38. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +1 -1
  39. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +1 -1
  40. package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +68 -36
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  42. package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
  43. package/src/sap/fe/core/controllerextensions/EditFlow.ts +83 -43
  44. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +12 -11
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  46. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +17 -21
  48. package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +233 -133
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  50. package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +260 -145
  52. package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +1 -1
  53. package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -3
  54. package/src/sap/fe/core/controllerextensions/Routing-dbg.js +5 -3
  55. package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -1
  56. package/src/sap/fe/core/controllerextensions/Routing.ts +5 -4
  57. package/src/sap/fe/core/controllerextensions/Share-dbg.js +3 -2
  58. package/src/sap/fe/core/controllerextensions/Share.js +1 -1
  59. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
  60. package/src/sap/fe/core/controllerextensions/Share.ts +2 -1
  61. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +19 -14
  62. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  63. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
  64. package/src/sap/fe/core/controllerextensions/SideEffects.ts +25 -18
  65. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +40 -26
  66. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  67. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
  68. package/src/sap/fe/core/controllerextensions/ViewState.ts +59 -33
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +8 -8
  70. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
  71. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
  72. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +23 -25
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +7 -45
  74. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
  75. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
  76. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +5 -48
  77. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog-dbg.js +2 -2
  78. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  79. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -1
  80. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -3
  81. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +73 -90
  82. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
  83. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
  84. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +88 -101
  85. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +26 -4
  86. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
  87. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
  88. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +29 -3
  89. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +13 -10
  90. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +1 -1
  91. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
  92. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +7 -20
  93. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +64 -4
  94. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +1 -1
  95. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -1
  96. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +91 -8
  97. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +2 -4
  98. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
  99. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
  100. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -5
  101. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +9 -9
  102. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
  103. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
  104. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +8 -8
  105. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -0
  106. package/src/sap/fe/core/controls/CommandExecution-dbg.js +4 -9
  107. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  108. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
  109. package/src/sap/fe/core/controls/CommandExecution.ts +0 -8
  110. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block-dbg.js +335 -0
  111. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +6 -0
  112. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js.map +1 -0
  113. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +336 -0
  114. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  115. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +3 -28
  116. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  117. package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -1
  118. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +8 -29
  119. package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters-dbg.js +435 -0
  120. package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js +6 -0
  121. package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js.map +1 -0
  122. package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.ts +532 -0
  123. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +30 -1
  124. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  125. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
  126. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +38 -0
  127. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -1
  128. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -5
  129. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +36 -4
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  131. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
  132. package/src/sap/fe/core/converters/MetaModelConverter.ts +45 -4
  133. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -3
  134. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  135. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
  136. package/src/sap/fe/core/converters/TemplateConverter.ts +1 -6
  137. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +18 -3
  138. package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  139. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
  140. package/src/sap/fe/core/converters/annotations/DataField.ts +18 -2
  141. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +679 -676
  142. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  143. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
  144. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +32 -20
  145. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  146. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
  147. package/src/sap/fe/core/converters/controls/Common/Chart.ts +30 -18
  148. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +4 -5
  149. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  150. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
  151. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +6 -37
  152. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +100 -72
  153. package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  154. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
  155. package/src/sap/fe/core/converters/controls/Common/Table.ts +146 -99
  156. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +37 -10
  157. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  158. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
  159. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +49 -16
  160. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +47 -18
  161. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  162. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
  163. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +74 -20
  164. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +26 -9
  165. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
  166. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
  167. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -8
  168. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +28 -2
  169. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  170. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
  171. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -9
  172. package/src/sap/fe/core/converters/helpers/InsightsHelpers-dbg.js +39 -0
  173. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +6 -0
  174. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js.map +1 -0
  175. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +45 -0
  176. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +13 -15
  177. package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  178. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
  179. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +18 -54
  180. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +12 -12
  181. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  182. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
  183. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +16 -11
  184. package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +17 -33
  185. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  186. package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -1
  187. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +27 -22
  188. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -11
  189. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  190. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
  191. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -25
  192. package/src/sap/fe/core/fpm/Component-dbg.js +3 -1
  193. package/src/sap/fe/core/fpm/Component.js +1 -1
  194. package/src/sap/fe/core/fpm/Component.js.map +1 -1
  195. package/src/sap/fe/core/fpm/Component.ts +3 -1
  196. package/src/sap/fe/core/fpm/manifest.json +1 -1
  197. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +74 -26
  198. package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
  199. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
  200. package/src/sap/fe/core/helpers/BindingToolkit.ts +116 -33
  201. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +82 -37
  202. package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
  203. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
  204. package/src/sap/fe/core/helpers/DeleteHelper.ts +109 -56
  205. package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +1 -1
  206. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +7 -5
  207. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +13 -3
  208. package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  209. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
  210. package/src/sap/fe/core/helpers/MassEditHelper.ts +28 -18
  211. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +1 -1
  212. package/src/sap/fe/core/helpers/MessageStrip.ts +2 -1
  213. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +1 -1
  214. package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
  215. package/src/sap/fe/core/helpers/RecommendationHelper-dbg.js +71 -0
  216. package/src/sap/fe/core/helpers/RecommendationHelper.js +6 -0
  217. package/src/sap/fe/core/helpers/RecommendationHelper.js.map +1 -0
  218. package/src/sap/fe/core/helpers/RecommendationHelper.ts +94 -0
  219. package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +5 -2
  220. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
  221. package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -1
  222. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +5 -0
  223. package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +24 -2
  224. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  225. package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -1
  226. package/src/sap/fe/core/helpers/StableIdHelper.ts +23 -1
  227. package/src/sap/fe/core/helpers/TitleHelper-dbg.js +239 -0
  228. package/src/sap/fe/core/helpers/TitleHelper.js +6 -0
  229. package/src/sap/fe/core/helpers/TitleHelper.js.map +1 -0
  230. package/src/sap/fe/core/helpers/TitleHelper.ts +295 -0
  231. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +4 -1
  232. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +1 -1
  233. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
  234. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +3 -0
  235. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +41 -17
  236. package/src/sap/fe/core/jsx-runtime/jsx-control.js +1 -1
  237. package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -1
  238. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +45 -21
  239. package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +1 -1
  240. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -0
  241. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +8 -4
  242. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
  243. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
  244. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +7 -2
  245. package/src/sap/fe/core/library-dbg.js +4 -3
  246. package/src/sap/fe/core/library-preload.js +91 -74
  247. package/src/sap/fe/core/library-preload.js.map +1 -1
  248. package/src/sap/fe/core/library.js +1 -1
  249. package/src/sap/fe/core/library.js.map +1 -1
  250. package/src/sap/fe/core/library.ts +1 -1
  251. package/src/sap/fe/core/manifest.json +1 -1
  252. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +4 -3
  253. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  254. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -1
  255. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +3 -2
  256. package/src/sap/fe/core/messagebundle.properties +12 -8
  257. package/src/sap/fe/core/messagebundle_ar.properties +7 -5
  258. package/src/sap/fe/core/messagebundle_bg.properties +7 -5
  259. package/src/sap/fe/core/messagebundle_ca.properties +7 -5
  260. package/src/sap/fe/core/messagebundle_cs.properties +7 -5
  261. package/src/sap/fe/core/messagebundle_cy.properties +7 -5
  262. package/src/sap/fe/core/messagebundle_da.properties +7 -5
  263. package/src/sap/fe/core/messagebundle_de.properties +7 -5
  264. package/src/sap/fe/core/messagebundle_el.properties +7 -5
  265. package/src/sap/fe/core/messagebundle_en.properties +7 -5
  266. package/src/sap/fe/core/messagebundle_en_GB.properties +6 -4
  267. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -4
  268. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +6 -4
  269. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +7 -4
  270. package/src/sap/fe/core/messagebundle_es.properties +7 -5
  271. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -5
  272. package/src/sap/fe/core/messagebundle_et.properties +7 -5
  273. package/src/sap/fe/core/messagebundle_fi.properties +7 -5
  274. package/src/sap/fe/core/messagebundle_fr.properties +7 -5
  275. package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -6
  276. package/src/sap/fe/core/messagebundle_hi.properties +7 -5
  277. package/src/sap/fe/core/messagebundle_hr.properties +7 -5
  278. package/src/sap/fe/core/messagebundle_hu.properties +7 -5
  279. package/src/sap/fe/core/messagebundle_id.properties +7 -5
  280. package/src/sap/fe/core/messagebundle_it.properties +8 -6
  281. package/src/sap/fe/core/messagebundle_iw.properties +7 -5
  282. package/src/sap/fe/core/messagebundle_ja.properties +7 -5
  283. package/src/sap/fe/core/messagebundle_kk.properties +7 -5
  284. package/src/sap/fe/core/messagebundle_ko.properties +7 -5
  285. package/src/sap/fe/core/messagebundle_lt.properties +7 -5
  286. package/src/sap/fe/core/messagebundle_lv.properties +7 -5
  287. package/src/sap/fe/core/messagebundle_ms.properties +7 -5
  288. package/src/sap/fe/core/messagebundle_nl.properties +7 -5
  289. package/src/sap/fe/core/messagebundle_no.properties +7 -5
  290. package/src/sap/fe/core/messagebundle_pl.properties +7 -5
  291. package/src/sap/fe/core/messagebundle_pt.properties +7 -5
  292. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -5
  293. package/src/sap/fe/core/messagebundle_ro.properties +7 -5
  294. package/src/sap/fe/core/messagebundle_ru.properties +7 -5
  295. package/src/sap/fe/core/messagebundle_sh.properties +7 -5
  296. package/src/sap/fe/core/messagebundle_sk.properties +7 -5
  297. package/src/sap/fe/core/messagebundle_sl.properties +7 -5
  298. package/src/sap/fe/core/messagebundle_sv.properties +7 -5
  299. package/src/sap/fe/core/messagebundle_th.properties +7 -5
  300. package/src/sap/fe/core/messagebundle_tr.properties +7 -5
  301. package/src/sap/fe/core/messagebundle_uk.properties +7 -5
  302. package/src/sap/fe/core/messagebundle_vi.properties +7 -5
  303. package/src/sap/fe/core/messagebundle_zh_CN.properties +7 -5
  304. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -5
  305. package/src/sap/fe/core/operationsHelper-dbg.js +1 -1
  306. package/src/sap/fe/core/operationsHelper.ts +1 -1
  307. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +8 -2
  308. package/src/sap/fe/core/rootView/Fcl.controller.js +1 -1
  309. package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -1
  310. package/src/sap/fe/core/rootView/Fcl.controller.ts +8 -1
  311. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +8 -2
  312. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  313. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
  314. package/src/sap/fe/core/rootView/NavContainer.controller.ts +10 -3
  315. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +16 -6
  316. package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
  317. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
  318. package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -4
  319. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +54 -5
  320. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  321. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
  322. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +52 -6
  323. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +31 -14
  324. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  325. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
  326. package/src/sap/fe/core/services/NavigationServiceFactory.ts +15 -1
  327. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +10 -4
  328. package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  329. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
  330. package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -7
  331. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +5 -2
  332. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  333. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
  334. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +9 -5
  335. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +1 -2
  336. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
  337. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +2 -18
  338. package/src/sap/fe/core/templating/CommonFormatters-dbg.js +8 -8
  339. package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
  340. package/src/sap/fe/core/templating/CommonFormatters.ts +9 -9
  341. package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +1 -1
  342. package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
  343. package/src/sap/fe/core/templating/DataFieldFormatters-dbg.js +38 -2
  344. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  345. package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -1
  346. package/src/sap/fe/core/templating/DataFieldFormatters.ts +40 -0
  347. package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +5 -6
  348. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  349. package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -1
  350. package/src/sap/fe/core/templating/FieldControlHelper.ts +13 -11
  351. package/src/sap/fe/core/templating/FilterHelper-dbg.js +13 -1
  352. package/src/sap/fe/core/templating/FilterHelper.js +1 -1
  353. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
  354. package/src/sap/fe/core/templating/FilterHelper.ts +13 -1
  355. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
  356. package/src/sap/fe/core/templating/PropertyHelper.ts +7 -7
  357. package/src/sap/fe/core/templating/UIFormatters-dbg.js +5 -6
  358. package/src/sap/fe/core/templating/UIFormatters.js +1 -1
  359. package/src/sap/fe/core/templating/UIFormatters.js.map +1 -1
  360. package/src/sap/fe/core/templating/UIFormatters.ts +6 -7
  361. package/src/sap/fe/core/type/TypeUtil-dbg.js +2 -2
  362. package/src/sap/fe/core/type/TypeUtil.js +1 -1
  363. package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
  364. package/src/sap/fe/core/type/TypeUtil.ts +2 -2
  365. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +0 -243
  366. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +0 -6
  367. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +0 -1
  368. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +0 -283
  369. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +0 -121
  370. package/src/sap/fe/core/controllerextensions/collaboration/UserDetails.fragment.xml +0 -11
  371. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +0 -59
  372. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +0 -171
  373. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +0 -6
  374. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +0 -1
  375. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +0 -184
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/merge", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticDateOperators", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/type/TypeUtil", "sap/ui/core/Component", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/Device", "sap/ui/mdc/condition/FilterOperatorUtil", "sap/ui/mdc/condition/RangeOperator", "sap/ui/model/Filter", "./controls/AnyElement", "./helpers/MetaModelFunction", "./templating/FilterHelper"], function (Log, uniqueSort, mergeObjects, ConverterContext, MetaModelConverter, BindingToolkit, ModelHelper, SemanticDateOperators, StableIdHelper, TypeUtil, Component, Fragment, XMLPreprocessor, XMLTemplateProcessor, Device, FilterOperatorUtil, RangeOperator, Filter, AnyElement, MetaModelFunction, FilterHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/merge", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticDateOperators", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/fe/core/StateFilterToSelectionVariant", "sap/fe/core/type/TypeUtil", "sap/ui/core/Component", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/Device", "sap/ui/mdc/condition/FilterOperatorUtil", "sap/ui/model/Filter", "./controls/AnyElement", "./helpers/MetaModelFunction", "./templating/FilterHelper"], function (Log, uniqueSort, mergeObjects, ConverterContext, MetaModelConverter, BindingToolkit, ModelHelper, SemanticDateOperators, StableIdHelper, FELibrary, StateFilterToSelectionVariant, TypeUtil, Component, Fragment, XMLPreprocessor, XMLTemplateProcessor, Device, FilterOperatorUtil, Filter, AnyElement, MetaModelFunction, FilterHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -11,6 +11,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
11
11
  var generate = StableIdHelper.generate;
12
12
  var pathInModel = BindingToolkit.pathInModel;
13
13
  var compileExpression = BindingToolkit.compileExpression;
14
+ const ProgrammingModel = FELibrary.ProgrammingModel;
14
15
  function normalizeSearchTerm(sSearchTerm) {
15
16
  if (!sSearchTerm) {
16
17
  return undefined;
@@ -741,335 +742,49 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
741
742
  isEmpty: undefined
742
743
  };
743
744
  }
744
- function addSelectOptionsToConditions(sContextPath, oSelectionVariant, sSelectOptionProp, oConditions, sConditionPath, sConditionProp, oValidProperties, metaModelContext, isParameter, bIsFLPValuePresent, bUseSemanticDateRange, oViewData) {
745
- let aConditions = [],
746
- aSelectOptions,
747
- aValidOperators,
748
- aSemanticDateOperators = [];
749
- if (isParameter || MetaModelFunction.isPropertyFilterable(metaModelContext, sContextPath, sConditionProp, true)) {
750
- const oPropertyMetadata = oValidProperties[sConditionProp];
751
- aSelectOptions = oSelectionVariant.getSelectOption(sSelectOptionProp);
752
- const settings = getFilterConfigurationSetting(oViewData, sConditionProp);
753
- aValidOperators = isParameter ? ["EQ"] : CommonUtils.getOperatorsForProperty(sConditionProp, sContextPath, metaModelContext);
754
- if (bUseSemanticDateRange) {
755
- aSemanticDateOperators = isParameter ? ["EQ"] : CommonUtils.getOperatorsForProperty(sConditionProp, sContextPath, metaModelContext, oPropertyMetadata === null || oPropertyMetadata === void 0 ? void 0 : oPropertyMetadata.$Type, bUseSemanticDateRange, settings);
756
- }
757
- // Create conditions for all the selectOptions of the property
758
- aConditions = isParameter ? CommonUtils.addSelectOptionToConditions(oPropertyMetadata, aValidOperators, aSemanticDateOperators, aConditions, aSelectOptions[0]) : aSelectOptions.reduce(CommonUtils.addSelectOptionToConditions.bind(null, oPropertyMetadata, aValidOperators, aSemanticDateOperators), aConditions);
759
- if (aConditions.length) {
760
- if (sConditionPath) {
761
- oConditions[sConditionPath + sConditionProp] = oConditions.hasOwnProperty(sConditionPath + sConditionProp) ? oConditions[sConditionPath + sConditionProp].concat(aConditions) : aConditions;
762
- } else if (bIsFLPValuePresent) {
763
- // If FLP values are present replace it with FLP values
764
- aConditions.forEach(element => {
765
- element["filtered"] = true;
766
- });
767
- if (oConditions.hasOwnProperty(sConditionProp)) {
768
- oConditions[sConditionProp].forEach(element => {
769
- element["filtered"] = false;
770
- });
771
- oConditions[sConditionProp] = oConditions[sConditionProp].concat(aConditions);
772
- } else {
773
- oConditions[sConditionProp] = aConditions;
774
- }
775
- } else {
776
- oConditions[sConditionProp] = oConditions.hasOwnProperty(sConditionProp) ? oConditions[sConditionProp].concat(aConditions) : aConditions;
777
- }
778
- }
779
- }
780
- }
781
-
782
- /**
783
- * Method to create the semantic dates from filter conditions
784
- *
785
- * @function
786
- * @name createSemanticDatesFromConditions
787
- * @param oCondition Filter field condition
788
- * @param sFilterName Filter Field Path
789
- * @returns The Semantic date conditions
790
- */
791
-
792
- function createSemanticDatesFromConditions(oCondition) {
793
- var _oCondition$values, _oCondition$values2;
794
- return {
795
- high: (oCondition === null || oCondition === void 0 ? void 0 : (_oCondition$values = oCondition.values) === null || _oCondition$values === void 0 ? void 0 : _oCondition$values[0]) || null,
796
- low: (oCondition === null || oCondition === void 0 ? void 0 : (_oCondition$values2 = oCondition.values) === null || _oCondition$values2 === void 0 ? void 0 : _oCondition$values2[1]) || null,
797
- operator: oCondition === null || oCondition === void 0 ? void 0 : oCondition.operator
798
- };
745
+ function addPageContextToSelectionVariant(oSelectionVariant, mPageContext, oView) {
746
+ const oAppComponent = CommonUtils.getAppComponent(oView);
747
+ const oNavigationService = oAppComponent.getNavigationService();
748
+ return oNavigationService.mixAttributesAndSelectionVariant(mPageContext, oSelectionVariant.toJSONString());
799
749
  }
800
750
 
801
751
  /**
802
- * Method to Return the filter configuration
752
+ * Get selection variant based on the filter conditions and the navigation context fields.
803
753
  *
804
- * @function
805
- * @name getFilterConfigurationSetting
806
- * @param oViewData manifest Configuration
807
- * @param sProperty Filter Field Path
808
- * @returns The Filter Field Configuration
754
+ * @param selectionVariant SelectionVariant provided by SAP Fiori elements.
755
+ * @param filters Retrieved filter condition for filter bar and non conflicting properties
756
+ * @param targetInfo Object containing intent-based navigation-related info
757
+ * @param filterBar The filterbar control
758
+ * @returns The selection variant
809
759
  */
810
760
 
811
- function getFilterConfigurationSetting() {
812
- var _oConfig$ComSapVoc, _filterConfig$sProper;
813
- let oViewData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
814
- let sProperty = arguments.length > 1 ? arguments[1] : undefined;
815
- const oConfig = oViewData === null || oViewData === void 0 ? void 0 : oViewData.controlConfiguration;
816
- const filterConfig = oConfig && ((_oConfig$ComSapVoc = oConfig["@com.sap.vocabularies.UI.v1.SelectionFields"]) === null || _oConfig$ComSapVoc === void 0 ? void 0 : _oConfig$ComSapVoc.filterFields);
817
- return filterConfig !== null && filterConfig !== void 0 && filterConfig[sProperty] ? (_filterConfig$sProper = filterConfig[sProperty]) === null || _filterConfig$sProper === void 0 ? void 0 : _filterConfig$sProper.settings : undefined;
818
- }
819
- function addSelectionVariantToConditions(oSelectionVariant, oConditions, oMetaModelContext, sContextPath, bIsFLPValues, bUseSemanticDateRange, oViewData) {
820
- const aSelectOptionsPropertyNames = oSelectionVariant.getSelectOptionsPropertyNames(),
821
- oValidProperties = CommonUtils.getContextPathProperties(oMetaModelContext, sContextPath),
822
- aMetadatProperties = Object.keys(oValidProperties),
823
- oParameterInfo = CommonUtils.getParameterInfo(oMetaModelContext, sContextPath),
824
- sParameterContextPath = oParameterInfo.contextPath,
825
- oValidParameterProperties = oParameterInfo.parameterProperties;
826
- if (sParameterContextPath !== undefined && oValidParameterProperties && Object.keys(oValidParameterProperties).length > 0) {
827
- const aMetadataParameters = Object.keys(oValidParameterProperties);
828
- aMetadataParameters.forEach(function (sMetadataParameter) {
829
- let sSelectOptionName;
830
- if (aSelectOptionsPropertyNames.includes(`$Parameter.${sMetadataParameter}`)) {
831
- sSelectOptionName = `$Parameter.${sMetadataParameter}`;
832
- } else if (aSelectOptionsPropertyNames.includes(sMetadataParameter)) {
833
- sSelectOptionName = sMetadataParameter;
834
- } else if (sMetadataParameter.startsWith("P_") && aSelectOptionsPropertyNames.includes(`$Parameter.${sMetadataParameter.slice(2, sMetadataParameter.length)}`)) {
835
- sSelectOptionName = `$Parameter.${sMetadataParameter.slice(2, sMetadataParameter.length)}`;
836
- } else if (sMetadataParameter.startsWith("P_") && aSelectOptionsPropertyNames.includes(sMetadataParameter.slice(2, sMetadataParameter.length))) {
837
- sSelectOptionName = sMetadataParameter.slice(2, sMetadataParameter.length);
838
- } else if (aSelectOptionsPropertyNames.includes(`$Parameter.P_${sMetadataParameter}`)) {
839
- sSelectOptionName = `$Parameter.P_${sMetadataParameter}`;
840
- } else if (aSelectOptionsPropertyNames.includes(`P_${sMetadataParameter}`)) {
841
- sSelectOptionName = `P_${sMetadataParameter}`;
842
- }
843
- if (sSelectOptionName) {
844
- addSelectOptionsToConditions(sParameterContextPath, oSelectionVariant, sSelectOptionName, oConditions, undefined, sMetadataParameter, oValidParameterProperties, oMetaModelContext, true, bIsFLPValues, bUseSemanticDateRange, oViewData);
845
- }
846
- });
847
- }
848
- aMetadatProperties.forEach(function (sMetadataProperty) {
849
- let sSelectOptionName;
850
- if (aSelectOptionsPropertyNames.includes(sMetadataProperty)) {
851
- sSelectOptionName = sMetadataProperty;
852
- } else if (sMetadataProperty.startsWith("P_") && aSelectOptionsPropertyNames.includes(sMetadataProperty.slice(2, sMetadataProperty.length))) {
853
- sSelectOptionName = sMetadataProperty.slice(2, sMetadataProperty.length);
854
- } else if (aSelectOptionsPropertyNames.includes(`P_${sMetadataProperty}`)) {
855
- sSelectOptionName = `P_${sMetadataProperty}`;
856
- }
857
- if (sSelectOptionName) {
858
- addSelectOptionsToConditions(sContextPath, oSelectionVariant, sSelectOptionName, oConditions, undefined, sMetadataProperty, oValidProperties, oMetaModelContext, false, bIsFLPValues, bUseSemanticDateRange, oViewData);
859
- }
860
- });
861
- aSelectOptionsPropertyNames.forEach(function (sSelectOption) {
862
- if (sSelectOption.indexOf(".") > 0 && !sSelectOption.includes("$Parameter")) {
863
- const sReplacedOption = sSelectOption.replaceAll(".", "/");
864
- const sFullContextPath = `/${sReplacedOption}`.startsWith(sContextPath) ? `/${sReplacedOption}` : `${sContextPath}/${sReplacedOption}`; // check if the full path, eg SalesOrderManage._Item.Material exists in the metamodel
865
- if (oMetaModelContext.getObject(sFullContextPath.replace("P_", ""))) {
866
- _createConditionsForNavProperties(sFullContextPath, sContextPath, oSelectionVariant, sSelectOption, oMetaModelContext, oConditions, bIsFLPValues, bUseSemanticDateRange, oViewData);
867
- }
868
- }
869
- });
870
- return oConditions;
871
- }
872
- function _createConditionsForNavProperties(sFullContextPath, sMainEntitySetPath, oSelectionVariant, sSelectOption, oMetaModelContext, oConditions, bIsFLPValuePresent, bSemanticDateRange, oViewData) {
873
- let aNavObjectNames = sSelectOption.split(".");
874
- // Eg: "SalesOrderManage._Item._Material.Material" or "_Item.Material"
875
- if (`/${sSelectOption.replaceAll(".", "/")}`.startsWith(sMainEntitySetPath)) {
876
- const sFullPath = `/${sSelectOption}`.replaceAll(".", "/"),
877
- sNavPath = sFullPath.replace(`${sMainEntitySetPath}/`, "");
878
- aNavObjectNames = sNavPath.split("/");
879
- }
880
- let sConditionPath = "";
881
- const sPropertyName = aNavObjectNames[aNavObjectNames.length - 1]; // Material from SalesOrderManage._Item.Material
882
- for (let i = 0; i < aNavObjectNames.length - 1; i++) {
883
- if (oMetaModelContext.getObject(`${sMainEntitySetPath}/${aNavObjectNames[i].replace("P_", "")}`).$isCollection) {
884
- sConditionPath = `${sConditionPath + aNavObjectNames[i]}*/`; // _Item*/ in case of 1:n cardinality
885
- } else {
886
- sConditionPath = `${sConditionPath + aNavObjectNames[i]}/`; // _Item/ in case of 1:1 cardinality
887
- }
888
-
889
- sMainEntitySetPath = `${sMainEntitySetPath}/${aNavObjectNames[i]}`;
890
- }
891
- const sNavPropertyPath = sFullContextPath.slice(0, sFullContextPath.lastIndexOf("/")),
892
- oValidProperties = CommonUtils.getContextPathProperties(oMetaModelContext, sNavPropertyPath),
893
- aSelectOptionsPropertyNames = oSelectionVariant.getSelectOptionsPropertyNames();
894
- let sSelectOptionName = sPropertyName;
895
- if (oValidProperties[sPropertyName]) {
896
- sSelectOptionName = sPropertyName;
897
- } else if (sPropertyName.startsWith("P_") && oValidProperties[sPropertyName.replace("P_", "")]) {
898
- sSelectOptionName = sPropertyName.replace("P_", "");
899
- } else if (oValidProperties[`P_${sPropertyName}`] && aSelectOptionsPropertyNames.includes(`P_${sPropertyName}`)) {
900
- sSelectOptionName = `P_${sPropertyName}`;
901
- }
902
- if (sPropertyName.startsWith("P_") && oConditions[sConditionPath + sSelectOptionName]) {
903
- // if there is no SalesOrderManage._Item.Material yet in the oConditions
904
- } else if (!sPropertyName.startsWith("P_") && oConditions[sConditionPath + sSelectOptionName]) {
905
- delete oConditions[sConditionPath + sSelectOptionName];
906
- addSelectOptionsToConditions(sNavPropertyPath, oSelectionVariant, sSelectOption, oConditions, sConditionPath, sSelectOptionName, oValidProperties, oMetaModelContext, false, bIsFLPValuePresent, bSemanticDateRange, oViewData);
907
- } else {
908
- addSelectOptionsToConditions(sNavPropertyPath, oSelectionVariant, sSelectOption, oConditions, sConditionPath, sSelectOptionName, oValidProperties, oMetaModelContext, false, bIsFLPValuePresent, bSemanticDateRange, oViewData);
909
- }
910
- }
911
- function addPageContextToSelectionVariant(oSelectionVariant, mPageContext, oView) {
912
- const oAppComponent = CommonUtils.getAppComponent(oView);
913
- const oNavigationService = oAppComponent.getNavigationService();
914
- return oNavigationService.mixAttributesAndSelectionVariant(mPageContext, oSelectionVariant.toJSONString());
915
- }
916
- function addExternalStateFiltersToSelectionVariant(oSelectionVariant, mFilters, oTargetInfo, oFilterBar) {
917
- let sFilter;
918
- const fnGetSignAndOption = function (sOperator, sLowValue, sHighValue) {
919
- const oSelectOptionState = {
920
- option: "",
921
- sign: "I",
922
- low: sLowValue,
923
- high: sHighValue
924
- };
925
- switch (sOperator) {
926
- case "Contains":
927
- oSelectOptionState.option = "CP";
928
- break;
929
- case "StartsWith":
930
- oSelectOptionState.option = "CP";
931
- oSelectOptionState.low += "*";
932
- break;
933
- case "EndsWith":
934
- oSelectOptionState.option = "CP";
935
- oSelectOptionState.low = `*${oSelectOptionState.low}`;
936
- break;
937
- case "BT":
938
- case "LE":
939
- case "LT":
940
- case "GT":
941
- case "NE":
942
- case "EQ":
943
- oSelectOptionState.option = sOperator;
944
- break;
945
- case "DATE":
946
- oSelectOptionState.option = "EQ";
947
- break;
948
- case "DATERANGE":
949
- oSelectOptionState.option = "BT";
950
- break;
951
- case "FROM":
952
- oSelectOptionState.option = "GE";
953
- break;
954
- case "TO":
955
- oSelectOptionState.option = "LE";
956
- break;
957
- case "EEQ":
958
- oSelectOptionState.option = "EQ";
959
- break;
960
- case "Empty":
961
- oSelectOptionState.option = "EQ";
962
- oSelectOptionState.low = "";
963
- break;
964
- case "NotContains":
965
- oSelectOptionState.option = "CP";
966
- oSelectOptionState.sign = "E";
967
- break;
968
- case "NOTBT":
969
- oSelectOptionState.option = "BT";
970
- oSelectOptionState.sign = "E";
971
- break;
972
- case "NotStartsWith":
973
- oSelectOptionState.option = "CP";
974
- oSelectOptionState.low += "*";
975
- oSelectOptionState.sign = "E";
976
- break;
977
- case "NotEndsWith":
978
- oSelectOptionState.option = "CP";
979
- oSelectOptionState.low = `*${oSelectOptionState.low}`;
980
- oSelectOptionState.sign = "E";
981
- break;
982
- case "NotEmpty":
983
- oSelectOptionState.option = "NE";
984
- oSelectOptionState.low = "";
985
- break;
986
- case "NOTLE":
987
- oSelectOptionState.option = "LE";
988
- oSelectOptionState.sign = "E";
989
- break;
990
- case "NOTGE":
991
- oSelectOptionState.option = "GE";
992
- oSelectOptionState.sign = "E";
993
- break;
994
- case "NOTLT":
995
- oSelectOptionState.option = "LT";
996
- oSelectOptionState.sign = "E";
997
- break;
998
- case "NOTGT":
999
- oSelectOptionState.option = "GT";
1000
- oSelectOptionState.sign = "E";
1001
- break;
1002
- default:
1003
- Log.warning(`${sOperator} is not supported. ${sFilter} could not be added to the navigation context`);
1004
- }
1005
- return oSelectOptionState;
1006
- };
1007
- const oFilterConditions = mFilters.filterConditions;
1008
- const oFiltersWithoutConflict = mFilters.filterConditionsWithoutConflict ? mFilters.filterConditionsWithoutConflict : {};
1009
- const oTablePropertiesWithoutConflict = oTargetInfo.propertiesWithoutConflict ? oTargetInfo.propertiesWithoutConflict : {};
1010
- const addFiltersToSelectionVariant = function (selectionVariant, sFilterName, sPath) {
1011
- const aConditions = oFilterConditions[sFilterName];
1012
- const oPropertyInfo = oFilterBar && oFilterBar.getPropertyHelper().getProperty(sFilterName);
1013
- const oTypeConfig = oPropertyInfo === null || oPropertyInfo === void 0 ? void 0 : oPropertyInfo.typeConfig;
1014
- const oTypeUtil = oFilterBar && oFilterBar.getControlDelegate().getTypeUtil();
1015
- for (const item in aConditions) {
1016
- const oCondition = aConditions[item];
1017
- let option = "",
1018
- sign = "I",
1019
- low = "",
1020
- high = null,
1021
- semanticDates;
1022
- const oOperator = FilterOperatorUtil.getOperator(oCondition.operator);
1023
- if (oOperator instanceof RangeOperator) {
1024
- var _oModelFilter$getFilt;
1025
- semanticDates = CommonUtils.createSemanticDatesFromConditions(oCondition);
1026
- // handling of Date RangeOperators
1027
- const oModelFilter = oOperator.getModelFilter(oCondition, sFilterName, oTypeConfig === null || oTypeConfig === void 0 ? void 0 : oTypeConfig.typeInstance, false, oTypeConfig === null || oTypeConfig === void 0 ? void 0 : oTypeConfig.baseType);
1028
- if (!(oModelFilter !== null && oModelFilter !== void 0 && oModelFilter.getFilters()) && !(oModelFilter !== null && oModelFilter !== void 0 && (_oModelFilter$getFilt = oModelFilter.getFilters()) !== null && _oModelFilter$getFilt !== void 0 && _oModelFilter$getFilt.length)) {
1029
- sign = oOperator.exclude ? "E" : "I";
1030
- low = oTypeUtil.externalizeValue(oModelFilter.getValue1(), oTypeConfig.typeInstance);
1031
- high = oTypeUtil.externalizeValue(oModelFilter.getValue2(), oTypeConfig.typeInstance);
1032
- option = oModelFilter.getOperator();
1033
- }
1034
- } else {
1035
- const aSemanticDateOpsExt = SemanticDateOperators.getSupportedOperations();
1036
- if (aSemanticDateOpsExt.includes(oCondition === null || oCondition === void 0 ? void 0 : oCondition.operator)) {
1037
- semanticDates = CommonUtils.createSemanticDatesFromConditions(oCondition);
1038
- }
1039
- const value1 = oCondition.values[0] && oCondition.values[0].toString() || "";
1040
- const value2 = oCondition.values[1] && oCondition.values[1].toString() || null;
1041
- const oSelectOption = fnGetSignAndOption(oCondition.operator, value1, value2);
1042
- sign = oOperator !== null && oOperator !== void 0 && oOperator.exclude ? "E" : "I";
1043
- low = oSelectOption === null || oSelectOption === void 0 ? void 0 : oSelectOption.low;
1044
- high = oSelectOption === null || oSelectOption === void 0 ? void 0 : oSelectOption.high;
1045
- option = oSelectOption === null || oSelectOption === void 0 ? void 0 : oSelectOption.option;
1046
- }
1047
- if (option && semanticDates) {
1048
- selectionVariant.addSelectOption(sPath ? sPath : sFilterName, sign, option, low, high, undefined, semanticDates);
1049
- } else if (option) {
1050
- selectionVariant.addSelectOption(sPath ? sPath : sFilterName, sign, option, low, high);
1051
- }
1052
- }
1053
- };
1054
- for (sFilter in oFilterConditions) {
761
+ function addExternalStateFiltersToSelectionVariant(inputSelectionVariant, filters, filterBar, targetInfo) {
762
+ const filterConditions = filters.filterConditions;
763
+ const filtersWithoutConflict = filters.filterConditionsWithoutConflict ? filters.filterConditionsWithoutConflict : {};
764
+ const tablePropertiesWithoutConflict = targetInfo !== null && targetInfo !== void 0 && targetInfo.propertiesWithoutConflict ? targetInfo.propertiesWithoutConflict : {};
765
+ const selectionVariantFromFilterbar = StateFilterToSelectionVariant.getSelectionVariantFromConditions(filterConditions, filterBar.getPropertyHelper());
766
+ for (const filterkey in filterConditions) {
1055
767
  // only add the filter values if it is not already present in the SV already
1056
- if (!oSelectionVariant.getSelectOption(sFilter)) {
768
+ const filterSelectOption = selectionVariantFromFilterbar.getSelectOption(filterkey);
769
+ if (!inputSelectionVariant.getSelectOption(filterkey)) {
1057
770
  // TODO : custom filters should be ignored more generically
1058
- if (sFilter === "$editState") {
771
+ if (filterkey === "$editState") {
1059
772
  continue;
1060
773
  }
1061
- addFiltersToSelectionVariant(oSelectionVariant, sFilter);
774
+ if (filterSelectOption) {
775
+ inputSelectionVariant.massAddSelectOption(filterkey, filterSelectOption);
776
+ }
1062
777
  } else {
1063
- if (oTablePropertiesWithoutConflict && sFilter in oTablePropertiesWithoutConflict) {
1064
- addFiltersToSelectionVariant(oSelectionVariant, sFilter, oTablePropertiesWithoutConflict[sFilter]);
778
+ if (tablePropertiesWithoutConflict && filterkey in tablePropertiesWithoutConflict) {
779
+ inputSelectionVariant.massAddSelectOption(tablePropertiesWithoutConflict[filterkey], filterSelectOption);
1065
780
  }
1066
781
  // if property was without conflict in page context then add path from page context to SV
1067
- if (sFilter in oFiltersWithoutConflict) {
1068
- addFiltersToSelectionVariant(oSelectionVariant, sFilter, oFiltersWithoutConflict[sFilter]);
782
+ if (filterkey in filtersWithoutConflict) {
783
+ inputSelectionVariant.massAddSelectOption(filtersWithoutConflict[filterkey], filterSelectOption);
1069
784
  }
1070
785
  }
1071
786
  }
1072
- return oSelectionVariant;
787
+ return inputSelectionVariant;
1073
788
  }
1074
789
  function isStickyEditMode(oControl) {
1075
790
  const bIsStickyMode = ModelHelper.isStickySessionSupported(oControl.getModel().getMetaModel());
@@ -1738,6 +1453,49 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1738
1453
  });
1739
1454
  return aFilters;
1740
1455
  }
1456
+
1457
+ /**
1458
+ * Gets the context of the DraftRoot path.
1459
+ * If a view has been created with the draft Root Path, this method returns its bindingContext.
1460
+ * Where no view is found a new created context is returned.
1461
+ * The new created context request the key of the entity in order to get the Etag of this entity.
1462
+ *
1463
+ * @function
1464
+ * @param programmingModel
1465
+ * @param view
1466
+ * @param appComponent
1467
+ * @name createRootContext
1468
+ * @returns Returns a Promise
1469
+ */
1470
+ async function createRootContext(programmingModel, view, appComponent) {
1471
+ const context = view.getBindingContext();
1472
+ if (context) {
1473
+ const rootContextPath = programmingModel === ProgrammingModel.Draft ? ModelHelper.getDraftRootPath(context) : ModelHelper.getStickyRootPath(context);
1474
+ let simpleRootContext;
1475
+ if (rootContextPath) {
1476
+ var _appComponent$getRoot, _simpleRootContext;
1477
+ // Check if a view matches with the draft root path
1478
+ const existingBindingContextOnPage = (_appComponent$getRoot = appComponent.getRootViewController().getInstancedViews().find(pageView => {
1479
+ var _pageView$getBindingC;
1480
+ return ((_pageView$getBindingC = pageView.getBindingContext()) === null || _pageView$getBindingC === void 0 ? void 0 : _pageView$getBindingC.getPath()) === rootContextPath;
1481
+ })) === null || _appComponent$getRoot === void 0 ? void 0 : _appComponent$getRoot.getBindingContext();
1482
+ if (existingBindingContextOnPage) {
1483
+ return existingBindingContextOnPage;
1484
+ }
1485
+ const internalModel = view.getModel("internal");
1486
+ simpleRootContext = internalModel.getProperty("/simpleRootContext");
1487
+ if (((_simpleRootContext = simpleRootContext) === null || _simpleRootContext === void 0 ? void 0 : _simpleRootContext.getPath()) === rootContextPath) {
1488
+ return simpleRootContext;
1489
+ }
1490
+ const model = context.getModel();
1491
+ simpleRootContext = model.bindContext(rootContextPath).getBoundContext();
1492
+ await CommonUtils.waitForContextRequested(simpleRootContext);
1493
+ // Store this new created context to use it on the next iterations
1494
+ internalModel.setProperty("/simpleRootContext", simpleRootContext);
1495
+ return simpleRootContext;
1496
+ }
1497
+ }
1498
+ }
1741
1499
  const CommonUtils = {
1742
1500
  fireButtonPress: fnFireButtonPress,
1743
1501
  getTargetView: getTargetView,
@@ -1756,7 +1514,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1756
1514
  getOperatorsForProperty: getOperatorsForProperty,
1757
1515
  getOperatorsForDateProperty: getOperatorsForDateProperty,
1758
1516
  getOperatorsForGuidProperty: getOperatorsForGuidProperty,
1759
- addSelectionVariantToConditions: addSelectionVariantToConditions,
1760
1517
  addExternalStateFiltersToSelectionVariant: addExternalStateFiltersToSelectionVariant,
1761
1518
  addPageContextToSelectionVariant: addPageContextToSelectionVariant,
1762
1519
  addDefaultDisplayCurrency: addDefaultDisplayCurrency,
@@ -1790,15 +1547,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/array/uniqueSort", "sap/base/util/
1790
1547
  getTranslatedTextFromExpBindingString: _fntranslatedTextFromExpBindingString,
1791
1548
  addSemanticDatesToConditions: addSemanticDatesToConditions,
1792
1549
  addSelectOptionToConditions: addSelectOptionToConditions,
1793
- createSemanticDatesFromConditions: createSemanticDatesFromConditions,
1794
1550
  updateRelateAppsModel: updateRelateAppsModel,
1795
1551
  getSemanticObjectAnnotations: _getSemanticObjectAnnotations,
1796
1552
  getFiltersInfoForSV: getFiltersInfoForSV,
1797
1553
  getInternalChartNameFromPropertyNameAndKind: getInternalChartNameFromPropertyNameAndKind,
1798
1554
  getChartPropertiesWithoutPrefixes: getChartPropertiesWithoutPrefixes,
1555
+ createRootContext: createRootContext,
1799
1556
  isSmallDevice,
1800
1557
  getConverterContextForPath
1801
1558
  };
1802
1559
  return CommonUtils;
1803
1560
  }, false);
1804
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVTZWFyY2hUZXJtIiwic1NlYXJjaFRlcm0iLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwic3BsaXQiLCJyZWR1Y2UiLCJzTm9ybWFsaXplZCIsInNDdXJyZW50V29yZCIsIndhaXRGb3JDb250ZXh0UmVxdWVzdGVkIiwiYmluZGluZ0NvbnRleHQiLCJtb2RlbCIsImdldE1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZW50aXR5UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImRhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5cyIsIm5hbWUiLCJmbkhhc1RyYW5zaWVudENvbnRleHRzIiwib0xpc3RCaW5kaW5nIiwiYkhhc1RyYW5zaWVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZm9yRWFjaCIsIm9Db250ZXh0IiwiaXNUcmFuc2llbnQiLCJfZ2V0U09JbnRlbnRzIiwib1NoZWxsU2VydmljZUhlbHBlciIsIm9PYmplY3RQYWdlTGF5b3V0Iiwib1NlbWFudGljT2JqZWN0Iiwib1BhcmFtIiwiZ2V0TGlua3MiLCJzZW1hbnRpY09iamVjdCIsInBhcmFtcyIsIl9jcmVhdGVNYXBwaW5ncyIsIm9NYXBwaW5nIiwiYVNPTWFwcGluZ3MiLCJhTWFwcGluZ0tleXMiLCJPYmplY3QiLCJvU2VtYW50aWNNYXBwaW5nIiwiaSIsImxlbmd0aCIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsInB1c2giLCJfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMiLCJhTGlua3MiLCJhRXhjbHVkZWRBY3Rpb25zIiwib1RhcmdldFBhcmFtcyIsImFJdGVtcyIsImFBbGxvd2VkQWN0aW9ucyIsIm9MaW5rIiwic0ludGVudCIsImludGVudCIsInNBY3Rpb24iLCJpbmNsdWRlcyIsInRleHQiLCJ0YXJnZXRTZW1PYmplY3QiLCJ0YXJnZXRBY3Rpb24iLCJ0YXJnZXRQYXJhbXMiLCJpbmRleE9mIiwiX2dldFJlbGF0ZWRJbnRlbnRzIiwib0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMiLCJvQmluZGluZ0NvbnRleHQiLCJhTWFuaWZlc3RTT0l0ZW1zIiwiYWxsb3dlZEFjdGlvbnMiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJtYXBwaW5nIiwibmF2aWdhdGlvbkNvbnRleHRzIiwic2VtYW50aWNPYmplY3RNYXBwaW5nIiwiX2dldFJlbGF0ZWRJbnRlbnRzV2l0aFNlbWFudGljT2JqZWN0c0FuZEFjdGlvbiIsInNlbWFudGljT2JqZWN0QW5kQWN0aW9uIiwiYXBwQ29tcG9uZW50U09JdGVtcyIsImFjdGlvbnMiLCJhY3Rpb24iLCJleGNsdWRlZEFjdGlvbnMiLCJzb01hcHBpbmdzIiwidXBkYXRlUmVsYXRlQXBwc01vZGVsIiwib0VudHJ5IiwiYVNlbUtleXMiLCJvTWV0YU1vZGVsIiwib01ldGFQYXRoIiwiYXBwQ29tcG9uZW50IiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNDdXJyZW50U2VtT2JqIiwic0N1cnJlbnRBY3Rpb24iLCJvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyIsImFSZWxhdGVkQXBwc01lbnVJdGVtcyIsImFNYW5pZmVzdFNPS2V5cyIsImZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcyIsIm9QYXJzZWRVcmwiLCJwYXJzZVNoZWxsSGFzaCIsImRvY3VtZW50IiwibG9jYXRpb24iLCJoYXNoIiwiaiIsInNTZW1LZXkiLCJ2YWx1ZSIsImFUZWNobmljYWxLZXlzIiwiZ2V0T2JqZWN0Iiwia2V5Iiwic09iaktleSIsIm9NYW5pZmVzdERhdGEiLCJnZXRUYXJnZXRWaWV3IiwiZ2V0Vmlld0RhdGEiLCJzZW1hbnRpY09iamVjdEludGVudHMiLCJhZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsImZlRW52aXJvbm1lbnQiLCJnZXRJbnRlbnQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0IiwiYUFubm90YXRpb25zU09JdGVtcyIsInNFbnRpdHlTZXRQYXRoIiwic0VudGl0eVR5cGVQYXRoIiwib0VudGl0eVNldEFubm90YXRpb25zIiwiQ29tbW9uVXRpbHMiLCJnZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwiYkhhc0VudGl0eVNldFNPIiwib0VudGl0eVR5cGVBbm5vdGF0aW9ucyIsImFVbmF2YWlsYWJsZUFjdGlvbnMiLCJhTWFwcGluZ3MiLCJzb0l0ZW1zIiwiY29uY2F0Iiwic2V0UHJvcGVydHkiLCJlcnJvciIsIkxvZyIsIl9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zIiwib0VudGl0eUFubm90YXRpb25zIiwic0Fubm90YXRpb25NYXBwaW5nVGVybSIsInNBbm5vdGF0aW9uQWN0aW9uVGVybSIsInNRdWFsaWZpZXIiLCJmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsInBhdGgiLCJzU2VtYW50aWNLZXlWb2NhYnVsYXJ5IiwicmVxdWVzdE9iamVjdCIsInRoZW4iLCJyZXF1ZXN0ZWRPYmplY3QiLCJjYXRjaCIsIm9FcnJvciIsImZuRmlyZUJ1dHRvblByZXNzIiwib0J1dHRvbiIsImlzQSIsImdldFZpc2libGUiLCJnZXRFbmFibGVkIiwiZmlyZVByZXNzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib0NvbnRyb2wiLCJvT3duZXIiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIkVycm9yIiwiZ2V0Q3VycmVudFBhZ2VWaWV3Iiwib0FwcENvbXBvbmVudCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsImdldFBhcmVudCIsIl9mbkNoZWNrSXNNYXRjaCIsIm9PYmplY3QiLCJvS2V5c1RvQ2hlY2siLCJzS2V5IiwiZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJtZXRhTW9kZWxDb250ZXh0Iiwic0NvbnRleHRQYXRoIiwib0ZpbHRlciIsIm9FbnRpdHlUeXBlIiwib1Byb3BlcnRpZXMiLCJoYXNPd25Qcm9wZXJ0eSIsInRlc3QiLCIka2luZCIsImZuR2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzIiwiYU1hbmRhdG9yeUZpbHRlckZpZWxkcyIsImZuR2V0SUJOQWN0aW9ucyIsImFJQk5BY3Rpb25zIiwiYUFjdGlvbnMiLCJnZXRBY3Rpb25zIiwib0FjdGlvbiIsImdldEFjdGlvbiIsIm9NZW51IiwiZ2V0TWVudSIsImdldEl0ZW1zIiwib0l0ZW0iLCJkYXRhIiwiZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIm9WaWV3Iiwib1BhcmFtcyIsImlzU3RpY2t5IiwiTW9kZWxIZWxwZXIiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJmbkdldExpbmtzIiwib0RhdGEiLCJhS2V5cyIsIm9JQk5BY3Rpb24iLCJzU2VtYW50aWNPYmplY3QiLCJhTGluayIsInNldFZpc2libGUiLCJnZXRJZCIsInNoZWxsTmF2aWdhdGlvbk5vdEF2YWlsYWJsZSIsImdldEFjdGlvblBhdGgiLCJhY3Rpb25Db250ZXh0IiwiYlJldHVybk9ubHlQYXRoIiwiaW5BY3Rpb25OYW1lIiwiYkNoZWNrU3RhdGljVmFsdWUiLCJzQWN0aW9uTmFtZSIsInRvU3RyaW5nIiwic0VudGl0eVR5cGVOYW1lIiwiJFR5cGUiLCJzRW50aXR5TmFtZSIsImdldEVudGl0eVNldE5hbWUiLCJzUHJvcGVydHkiLCJzQmluZGluZ1BhcmFtZXRlciIsInNFbnRpdHlUeXBlIiwib0VudGl0eUNvbnRhaW5lciIsImNvbXB1dGVEaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eUFubm90YXRpb25zIiwib0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyIsIm9UZXh0QW5ub3RhdGlvbiIsIm9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uIiwiJEVudW1NZW1iZXIiLCJfZ2V0RW50aXR5VHlwZSIsIl9yZXF1ZXN0T2JqZWN0Iiwib1NlbGVjdGVkQ29udGV4dCIsIm5CcmFja2V0SW5kZXgiLCJzVGFyZ2V0VHlwZSIsInNsaWNlIiwic0N1cnJlbnRUeXBlIiwiZ2V0QmluZGluZyIsIndhcm5pbmciLCJzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoIiwib1Byb21pc2UiLCJyZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkiLCJ2UHJvcGVydHlWYWx1ZSIsInNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZSIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImFSZXF1ZXN0UHJvbWlzZXMiLCJhbGwiLCJhUmVzdWx0cyIsImFBcHBsaWNhYmxlQ29udGV4dHMiLCJhTm90QXBwbGljYWJsZUNvbnRleHRzIiwiYVJlc3VsdCIsInNldER5bmFtaWNBY3Rpb25Db250ZXh0cyIsInRyYWNlIiwiYUFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZSIsInNEeW5hbWljQWN0aW9uUGF0aFByZWZpeCIsIm9JbnRlcm5hbE1vZGVsIiwiX2dldERlZmF1bHRPcGVyYXRvcnMiLCJzUHJvcGVydHlUeXBlIiwib0RhdGFDbGFzcyIsIlR5cGVVdGlsIiwiZ2V0RGF0YVR5cGVDbGFzc05hbWUiLCJvQmFzZVR5cGUiLCJnZXRCYXNlVHlwZSIsIkZpbHRlck9wZXJhdG9yVXRpbCIsImdldE9wZXJhdG9yc0ZvclR5cGUiLCJfZ2V0UmVzdHJpY3Rpb25zIiwiYURlZmF1bHRPcHMiLCJhRXhwcmVzc2lvbk9wcyIsImZpbHRlciIsInNFbGVtZW50IiwiZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbiIsImFFeHByZXNzaW9ucyIsImFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eSIsIkFsbG93ZWRFeHByZXNzaW9uc1ByaW8iLCJzb3J0IiwiYSIsImIiLCJnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eSIsInNUeXBlIiwiYlVzZVNlbWFudGljRGF0ZVJhbmdlIiwic1NldHRpbmdzIiwib0ZpbHRlclJlc3RyaWN0aW9ucyIsImdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aCIsImFFcXVhbHNPcHMiLCJhU2luZ2xlUmFuZ2VPcHMiLCJhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzIiwiYVNpbmdsZVZhbHVlRGF0ZU9wcyIsImFNdWx0aVJhbmdlT3BzIiwiYVNlYXJjaEV4cHJlc3Npb25PcHMiLCJhU2VtYW50aWNEYXRlT3BzRXh0IiwiU2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiZ2V0U3VwcG9ydGVkT3BlcmF0aW9ucyIsImJTZW1hbnRpY0RhdGVSYW5nZSIsImFTZW1hbnRpY0RhdGVPcHMiLCJvU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJjdXN0b21EYXRhIiwib3BlcmF0b3JDb25maWd1cmF0aW9uIiwiZ2V0RmlsdGVyT3BlcmF0aW9ucyIsImdldFNlbWFudGljRGF0ZU9wZXJhdGlvbnMiLCJhRGVmYXVsdE9wZXJhdG9ycyIsInJlc3RyaWN0aW9ucyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsInNBbGxvd2VkRXhwcmVzc2lvbiIsImFTaW5nbGVWYWx1ZU9wcyIsInNPcGVyYXRvcnMiLCJnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHkiLCJhbGxvd2VkT3BlcmF0b3JzRm9yR3VpZCIsImdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eSIsInByb3BlcnR5VHlwZSIsImdldFBhcmFtZXRlckluZm8iLCJzUGFyYW1ldGVyQ29udGV4dFBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImJSZXN1bHRDb250ZXh0Iiwib1BhcmFtZXRlckluZm8iLCJjb250ZXh0UGF0aCIsInBhcmFtZXRlclByb3BlcnRpZXMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCJhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnMiLCJvUHJvcGVydHlNZXRhZGF0YSIsImFWYWxpZE9wZXJhdG9ycyIsImFTZW1hbnRpY0RhdGVPcGVyYXRvcnMiLCJhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMiLCJvU2VsZWN0T3B0aW9uIiwib0NvbmRpdGlvbiIsImdldENvbmRpdGlvbnMiLCJTZW1hbnRpY0RhdGVzIiwib3BlcmF0b3IiLCJzZW1hbnRpY0RhdGVzIiwiYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9ucyIsIm9TZW1hbnRpY0RhdGVzIiwidmFsdWVzIiwiaGlnaCIsImxvdyIsImlzRW1wdHkiLCJhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zIiwib1NlbGVjdGlvblZhcmlhbnQiLCJzU2VsZWN0T3B0aW9uUHJvcCIsIm9Db25kaXRpb25zIiwic0NvbmRpdGlvblBhdGgiLCJzQ29uZGl0aW9uUHJvcCIsIm9WYWxpZFByb3BlcnRpZXMiLCJpc1BhcmFtZXRlciIsImJJc0ZMUFZhbHVlUHJlc2VudCIsIm9WaWV3RGF0YSIsImFDb25kaXRpb25zIiwiYVNlbGVjdE9wdGlvbnMiLCJNZXRhTW9kZWxGdW5jdGlvbiIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwiZ2V0U2VsZWN0T3B0aW9uIiwic2V0dGluZ3MiLCJnZXRGaWx0ZXJDb25maWd1cmF0aW9uU2V0dGluZyIsImJpbmQiLCJlbGVtZW50IiwiY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zIiwib0NvbmZpZyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiZmlsdGVyQ29uZmlnIiwiZmlsdGVyRmllbGRzIiwiYWRkU2VsZWN0aW9uVmFyaWFudFRvQ29uZGl0aW9ucyIsIm9NZXRhTW9kZWxDb250ZXh0IiwiYklzRkxQVmFsdWVzIiwiYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwiZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJhTWV0YWRhdFByb3BlcnRpZXMiLCJvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzIiwiYU1ldGFkYXRhUGFyYW1ldGVycyIsInNNZXRhZGF0YVBhcmFtZXRlciIsInNTZWxlY3RPcHRpb25OYW1lIiwic3RhcnRzV2l0aCIsInNNZXRhZGF0YVByb3BlcnR5Iiwic1NlbGVjdE9wdGlvbiIsInNSZXBsYWNlZE9wdGlvbiIsInJlcGxhY2VBbGwiLCJzRnVsbENvbnRleHRQYXRoIiwiX2NyZWF0ZUNvbmRpdGlvbnNGb3JOYXZQcm9wZXJ0aWVzIiwic01haW5FbnRpdHlTZXRQYXRoIiwiYU5hdk9iamVjdE5hbWVzIiwic0Z1bGxQYXRoIiwic05hdlBhdGgiLCJzUHJvcGVydHlOYW1lIiwiJGlzQ29sbGVjdGlvbiIsInNOYXZQcm9wZXJ0eVBhdGgiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIm1QYWdlQ29udGV4dCIsIm9OYXZpZ2F0aW9uU2VydmljZSIsImdldE5hdmlnYXRpb25TZXJ2aWNlIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJ0b0pTT05TdHJpbmciLCJhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudCIsIm1GaWx0ZXJzIiwib1RhcmdldEluZm8iLCJvRmlsdGVyQmFyIiwic0ZpbHRlciIsImZuR2V0U2lnbkFuZE9wdGlvbiIsInNPcGVyYXRvciIsInNMb3dWYWx1ZSIsInNIaWdoVmFsdWUiLCJvU2VsZWN0T3B0aW9uU3RhdGUiLCJvcHRpb24iLCJzaWduIiwib0ZpbHRlckNvbmRpdGlvbnMiLCJmaWx0ZXJDb25kaXRpb25zIiwib0ZpbHRlcnNXaXRob3V0Q29uZmxpY3QiLCJmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0Iiwib1RhYmxlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsInNGaWx0ZXJOYW1lIiwic1BhdGgiLCJvUHJvcGVydHlJbmZvIiwiZ2V0UHJvcGVydHlIZWxwZXIiLCJnZXRQcm9wZXJ0eSIsIm9UeXBlQ29uZmlnIiwidHlwZUNvbmZpZyIsIm9UeXBlVXRpbCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsImdldFR5cGVVdGlsIiwiaXRlbSIsIm9PcGVyYXRvciIsImdldE9wZXJhdG9yIiwiUmFuZ2VPcGVyYXRvciIsIm9Nb2RlbEZpbHRlciIsImdldE1vZGVsRmlsdGVyIiwidHlwZUluc3RhbmNlIiwiYmFzZVR5cGUiLCJnZXRGaWx0ZXJzIiwiZXhjbHVkZSIsImV4dGVybmFsaXplVmFsdWUiLCJnZXRWYWx1ZTEiLCJnZXRWYWx1ZTIiLCJ2YWx1ZTEiLCJ2YWx1ZTIiLCJhZGRTZWxlY3RPcHRpb24iLCJpc1N0aWNreUVkaXRNb2RlIiwiYklzU3RpY2t5TW9kZSIsImJVSUVkaXRhYmxlIiwiYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeSIsIm9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHMiLCJhU1ZPcHRpb24iLCJhRGVmYXVsdFNWT3B0aW9uIiwiZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uIiwic1NpZ24iLCJzT3B0aW9uIiwic0xvdyIsInNIaWdoIiwic2V0VXNlckRlZmF1bHRzIiwiYVBhcmFtZXRlcnMiLCJvTW9kZWwiLCJiSXNBY3Rpb24iLCJiSXNDcmVhdGUiLCJvQWN0aW9uRGVmYXVsdFZhbHVlcyIsIm9Db21wb25lbnREYXRhIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJvU2hlbGxTZXJ2aWNlcyIsIm9TdGFydHVwQXBwU3RhdGUiLCJnZXRTdGFydHVwQXBwU3RhdGUiLCJnZXREYXRhIiwiYUV4dGVuZGVkUGFyYW1ldGVycyIsIlNlbGVjdE9wdGlvbnMiLCJvUGFyYW1ldGVyIiwiJE5hbWUiLCJzUGFyYW1ldGVyTmFtZSIsIm9FeHRlbmRlZFBhcmFtZXRlciIsIlByb3BlcnR5TmFtZSIsIm9SYW5nZSIsIlJhbmdlcyIsIlNpZ24iLCJPcHRpb24iLCJMb3ciLCJnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlIiwib0luYm91bmRQYXJhbWV0ZXJzIiwib0luYm91bmRzIiwiYUNyZWF0ZVBhcmFtZXRlcnMiLCJzUGFyYW1ldGVyIiwidXNlRm9yQ3JlYXRlIiwib1JldCIsInNDcmVhdGVQYXJhbWV0ZXIiLCJhVmFsdWVzIiwiY3JlYXRlIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwib091dGJvdW5kIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsInBhcmFtZXRlcnMiLCJzUGFyYW0iLCJmb3JtYXQiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJvQ3Jvc3NOYXYiLCJvSGVhZGVyRmFjZXRJdGVtcyIsInNJZCIsIm9Db250cm9sQ29uZmlnIiwiY29uZmlnIiwic091dGJvdW5kIiwibmF2aWdhdGlvbiIsInRhcmdldE91dGJvdW5kIiwib3V0Ym91bmQiLCJnZW5lcmF0ZSIsInNldFNlbWFudGljT2JqZWN0TWFwcGluZ3MiLCJ2TWFwcGluZ3MiLCJvTWFwcGluZ3MiLCJzTG9jYWxQcm9wZXJ0eSIsInNTZW1hbnRpY09iamVjdFByb3BlcnR5IiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsImZuR2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgiLCJhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMiLCJhU2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyIsInNlbWFudGljT2JqZWN0UGF0aCIsInNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MiLCJmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsIiwiYUdldExpbmtzUHJvbWlzZXMiLCJhU2VtYW50aWNPYmplY3RzIiwic0N1cnJlbnRIYXNoIiwiX29MaW5rIiwiX3NMaW5rSW50ZW50QWN0aW9uIiwiYUZpbmFsTGlua3MiLCJvRmluYWxTZW1hbnRpY09iamVjdHMiLCJiSW50ZW50SGFzQWN0aW9ucyIsImsiLCJvVG1wIiwic0FsdGVybmF0ZVBhdGgiLCJoYXNUYXJnZXRzTm90RmlsdGVyZWQiLCJoYXNUYXJnZXRzIiwiaUxpbmtDb3VudCIsIkhhc1RhcmdldHMiLCJIYXNUYXJnZXRzTm90RmlsdGVyZWQiLCJhc3NpZ24iLCJzU2VtYW50aWNPYmplY3ROYW1lIiwibWVyZ2VPYmplY3RzIiwiZm5HZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJnZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsImZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX29BcHBDb21wb25lbnQiLCJfb1ZpZXciLCJfb01ldGFNb2RlbCIsIl9hU2VtYW50aWNPYmplY3RzRm91bmQiLCJfYVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiX0tleXMiLCJyZWdleFJlc3VsdCIsImluZGV4IiwiZXhlYyIsImdldFNlbWFudGljT2JqZWN0UHJvbWlzZSIsImZuR2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9Db250cm9sbGVyIiwic1BhZ2VNb2RlbCIsIl9mbmZpbmRWYWx1ZXNIZWxwZXIiLCJvYmoiLCJsaXN0IiwiQXJyYXkiLCJjaGlsZHJlbiIsIl9mbmZpbmRWYWx1ZXMiLCJfZm5EZWxldGVEdXBsaWNhdGVTZW1hbnRpY09iamVjdHMiLCJhU2VtYW50aWNPYmplY3RQYXRoIiwiZ2V0VmlldyIsImFTZW1hbnRpY09iamVjdHNQcm9taXNlcyIsImdldE93bmVyQ29tcG9uZW50Iiwib1BhZ2VNb2RlbCIsInN0cmluZ2lmeSIsIl9nZXRPYmplY3QiLCJhU2VtYW50aWNPYmplY3RzRm91bmQiLCJnZXRIYXNoIiwiYVNlbWFudGljT2JqZWN0c0ZvckdldExpbmtzIiwiX29TZW1hbnRpY09iamVjdCIsInNTZW1PYmpFeHByZXNzaW9uIiwiYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwYXRoSW5Nb2RlbCIsIiRQYXRoIiwiZ2V0TGlua3NXaXRoQ2FjaGUiLCJ1cGRhdGVTZW1hbnRpY1RhcmdldHMiLCJnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbiIsIm9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJvUHJvcGVydHkiLCJQcm9wZXJ0eSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImdldEZpbHRlclJlc3RyaWN0aW9ucyIsInNSZXN0cmljdGlvbiIsImFQcm9wcyIsIm1hcCIsIl9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoIiwicGF0aHMiLCJuYXZQYXRoIiwicHJvcHMiLCJuYXZQYXRoUHJlZml4Iiwib3V0UGF0aHMiLCJwYXRoVG9DaGVjayIsIm91dFBhdGgiLCJSZXF1aXJlZFByb3BlcnRpZXMiLCJOb25GaWx0ZXJhYmxlUHJvcGVydGllcyIsIm5hdmlnYXRpb25UZXh0IiwiZnJUZXJtIiwiZW50aXR5VHlwZVBhdGhQYXJ0cyIsImZpbHRlck91dE5hdlByb3BCaW5kaW5nIiwiZW50aXR5VHlwZVBhdGgiLCJqb2luIiwiZW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJlbnRpdHlTZXRQYXRoUGFydHMiLCJpc0NvbnRhaW5tZW50IiwiY29udGFpbm1lbnROYXZQYXRoIiwicmVzdWx0Q29udGV4dENoZWNrIiwicGFyZW50RW50aXR5U2V0UGF0aCIsIm9QYXJlbnRSZXQiLCJvUGFyZW50RlIiLCJjb21wbGV0ZUFsbG93ZWRFeHBzIiwib3V0UHJvcCIsInByb3BQYXRoIiwib3V0UHJvcFBhdGgiLCJvTmF2UmVzdHJpY3Rpb25zIiwiZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm9OYXZGaWx0ZXJSZXN0IiwibmF2UmVzUmVxUHJvcHMiLCJ1bmlxdWVTb3J0IiwibmF2Tm9uRmlsdGVyUHJvcHMiLCJuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QiLCJuYXZBc3NvY1JlcVByb3BzIiwibmF2QXNzb2NOb25GaWx0ZXJQcm9wcyIsInRlbXBsYXRlQ29udHJvbEZyYWdtZW50Iiwic0ZyYWdtZW50TmFtZSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm9PcHRpb25zIiwib01vZGlmaWVyIiwidmlldyIsIm9GcmFnbWVudCIsInRhcmdldHMiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImlzWE1MIiwiRnJhZ21lbnQiLCJsb2FkIiwiaWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsImdldFNpbmdsZXRvblBhdGgiLCJwYXJ0cyIsIkJvb2xlYW4iLCJwcm9wZXJ0eU5hbWUiLCJwb3AiLCJuYXZpZ2F0aW9uUGF0aCIsImVudGl0eVNldCIsInNpbmdsZXRvbk5hbWUiLCJyZXNvbHZlZFBhdGgiLCJwcm9wZXJ0eUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJyZXF1ZXN0VmFsdWUiLCJnZXRQYXJhbWV0ZXJQYXRoIiwic0NvbnRleHQiLCJhQWN0aW9uIiwiX2ZudHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyIsImV4cEJpbmRpbmciLCJjb250cm9sIiwiYW55UmVzb3VyY2VUZXh0IiwiQW55RWxlbWVudCIsImFueVRleHQiLCJhZGREZXBlbmRlbnQiLCJyZXN1bHRUZXh0IiwiZ2V0QW55VGV4dCIsInJlbW92ZURlcGVuZGVudCIsImRlc3Ryb3kiLCJpc1NtYWxsRGV2aWNlIiwic3lzdGVtIiwiZGVza3RvcCIsIkRldmljZSIsInJlc2l6ZSIsIndpZHRoIiwiZ2V0RmlsdGVyc0luZm9Gb3JTViIsInNlbGVjdGlvblZhcmlhbnRQYXRoIiwiaXNDaGFydCIsIm1Qcm9wZXJ0eUZpbHRlcnMiLCJhRmlsdGVycyIsImFQYXRocyIsInNUZXh0IiwiU2VsZWN0aW9uVmFyaWFudCIsIlRleHQiLCJGaWx0ZXIiLCJIaWdoIiwic1Byb3BlcnR5UGF0aCIsImZpbHRlcnMiLCJhbmQiLCJwcm9wZXJ0aWVzIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclBhdGgiLCJzTWV0YVBhdGgiLCJzRW50aXR5U2V0Iiwib0RpYWdub3N0aWNzIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJDb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwiZ2V0SW50ZXJuYWxDaGFydE5hbWVGcm9tUHJvcGVydHlOYW1lQW5kS2luZCIsImtpbmQiLCJnZXRDaGFydFByb3BlcnRpZXNXaXRob3V0UHJlZml4ZXMiLCJmaXJlQnV0dG9uUHJlc3MiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwidXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzIiwiZ2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzIiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJnZXRJQk5BY3Rpb25zIiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIkZpbHRlclJlc3RyaWN0aW9ucyIsIlJFUVVJUkVEX1BST1BFUlRJRVMiLCJOT05fRklMVEVSQUJMRV9QUk9QRVJUSUVTIiwiQUxMT1dFRF9FWFBSRVNTSU9OUyIsImdldFJlbGF0ZWRBcHBzTWVudUl0ZW1zIiwiZ2V0VHJhbnNsYXRlZFRleHRGcm9tRXhwQmluZGluZ1N0cmluZyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29tbW9uVXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBFZG0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJSZXN0cmljdGlvbnNUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZSwgU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgVGV4dEFycmFuZ2VtZW50IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdW5pcXVlU29ydCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9hcnJheS91bmlxdWVTb3J0XCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnREYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIHBhdGhJbk1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNEYXRlT3BlcmF0b3JzIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljRGF0ZU9wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IElTaGVsbFNlcnZpY2VzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NoZWxsU2VydmljZXNGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBEaWFnbm9zdGljcyBmcm9tIFwic2FwL2ZlL2NvcmUvc3VwcG9ydC9EaWFnbm9zdGljc1wiO1xuaW1wb3J0IFR5cGVVdGlsIGZyb20gXCJzYXAvZmUvY29yZS90eXBlL1R5cGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdE9wdGlvbiwgU2VtYW50aWNEYXRlQ29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgTWVudUJ1dHRvbiBmcm9tIFwic2FwL20vTWVudUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIE92ZXJmbG93VG9vbGJhckJ1dHRvbiBmcm9tIFwic2FwL20vT3ZlcmZsb3dUb29sYmFyQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudENvbnRhaW5lciBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgRGV2aWNlLCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgdHlwZSBBY3Rpb25Ub29sYmFyQWN0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2FjdGlvbnRvb2xiYXIvQWN0aW9uVG9vbGJhckFjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE1EQ0NoYXJ0IH0gZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yVXRpbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vRmlsdGVyT3BlcmF0b3JVdGlsXCI7XG5pbXBvcnQgUmFuZ2VPcGVyYXRvciBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vUmFuZ2VPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIE1EQ1RhYmxlIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9jb250ZW50L01EQ1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7XG5cdEV4cGFuZFBhdGhUeXBlLFxuXHRNZXRhTW9kZWxFbnRpdHlUeXBlLFxuXHRNZXRhTW9kZWxFbnVtLFxuXHRNZXRhTW9kZWxOYXZQcm9wZXJ0eSxcblx0TWV0YU1vZGVsUHJvcGVydHksXG5cdE1ldGFNb2RlbFR5cGVcbn0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IEFueUVsZW1lbnQgZnJvbSBcIi4vY29udHJvbHMvQW55RWxlbWVudFwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsRnVuY3Rpb24gZnJvbSBcIi4vaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHsgZ2V0Q29uZGl0aW9ucyB9IGZyb20gXCIuL3RlbXBsYXRpbmcvRmlsdGVySGVscGVyXCI7XG5cbnR5cGUgQ29uZGl0aW9uVHlwZSA9IHtcblx0b3BlcmF0b3I6IHN0cmluZztcblx0dmFsdWVzOiBBcnJheTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblx0dmFsaWRhdGVkPzogc3RyaW5nO1xufTtcblxudHlwZSBNeUluYm94SW50ZW50ID0ge1xuXHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRhY3Rpb246IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaFRlcm0oc1NlYXJjaFRlcm06IHN0cmluZykge1xuXHRpZiAoIXNTZWFyY2hUZXJtKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHJldHVybiBzU2VhcmNoVGVybVxuXHRcdC5yZXBsYWNlKC9cIi9nLCBcIiBcIilcblx0XHQucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpIC8vZXNjYXBlIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLiBDYW4gYmUgcmVtb3ZlZCBpZiBvZGF0YS9iaW5kaW5nIGhhbmRsZXMgYmFja2VuZCBlcnJvcnMgcmVzcG9uZHMuXG5cdFx0LnNwbGl0KC9cXHMrLylcblx0XHQucmVkdWNlKGZ1bmN0aW9uIChzTm9ybWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzQ3VycmVudFdvcmQ6IHN0cmluZykge1xuXHRcdFx0aWYgKHNDdXJyZW50V29yZCAhPT0gXCJcIikge1xuXHRcdFx0XHRzTm9ybWFsaXplZCA9IGAke3NOb3JtYWxpemVkID8gYCR7c05vcm1hbGl6ZWR9IGAgOiBcIlwifVwiJHtzQ3VycmVudFdvcmR9XCJgO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNOb3JtYWxpemVkO1xuXHRcdH0sIHVuZGVmaW5lZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkKGJpbmRpbmdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRjb25zdCBtb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGRhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldENvbnRleHQoZW50aXR5UGF0aCkpO1xuXHRhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUua2V5c1swXT8ubmFtZSk7XG59XG5cbmZ1bmN0aW9uIGZuSGFzVHJhbnNpZW50Q29udGV4dHMob0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdGxldCBiSGFzVHJhbnNpZW50Q29udGV4dHMgPSBmYWxzZTtcblx0aWYgKG9MaXN0QmluZGluZykge1xuXHRcdG9MaXN0QmluZGluZy5nZXRDdXJyZW50Q29udGV4dHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogT0RhdGFWNENvbnRleHQpIHtcblx0XHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdGJIYXNUcmFuc2llbnRDb250ZXh0cyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGJIYXNUcmFuc2llbnRDb250ZXh0cztcbn1cblxuLy8gdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBpbiBlbnRpdHlTZXQgcGF0aCBhbmQgcHJvcGVydHkgcGF0aFxuXG5hc3luYyBmdW5jdGlvbiBfZ2V0U09JbnRlbnRzKFxuXHRvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdG9TZW1hbnRpY09iamVjdDogdW5rbm93bixcblx0b1BhcmFtOiB1bmtub3duXG4pOiBQcm9taXNlPExpbmtEZWZpbml0aW9uW10+IHtcblx0cmV0dXJuIG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3Moe1xuXHRcdHNlbWFudGljT2JqZWN0OiBvU2VtYW50aWNPYmplY3QsXG5cdFx0cGFyYW1zOiBvUGFyYW1cblx0fSkgYXMgUHJvbWlzZTxMaW5rRGVmaW5pdGlvbltdPjtcbn1cblxuLy8gVE8tRE8gYWRkIHRoaXMgYXMgcGFydCBvZiBhcHBseVNlbWFudGljT2JqZWN0bWFwcGluZ3MgbG9naWMgaW4gSW50ZW50QmFzZWRuYXZpZ2F0aW9uIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG5mdW5jdGlvbiBfY3JlYXRlTWFwcGluZ3Mob01hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGNvbnN0IGFTT01hcHBpbmdzID0gW107XG5cdGNvbnN0IGFNYXBwaW5nS2V5cyA9IE9iamVjdC5rZXlzKG9NYXBwaW5nKTtcblx0bGV0IG9TZW1hbnRpY01hcHBpbmc7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYU1hcHBpbmdLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b1NlbWFudGljTWFwcGluZyA9IHtcblx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogYU1hcHBpbmdLZXlzW2ldXG5cdFx0XHR9LFxuXHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogb01hcHBpbmdbYU1hcHBpbmdLZXlzW2ldXVxuXHRcdH07XG5cdFx0YVNPTWFwcGluZ3MucHVzaChvU2VtYW50aWNNYXBwaW5nKTtcblx0fVxuXG5cdHJldHVybiBhU09NYXBwaW5ncztcbn1cbnR5cGUgTGlua0RlZmluaXRpb24gPSB7XG5cdGludGVudDogc3RyaW5nO1xuXHR0ZXh0OiBzdHJpbmc7XG59O1xudHlwZSBTZW1hbnRpY0l0ZW0gPSB7XG5cdHRleHQ6IHN0cmluZztcblx0dGFyZ2V0U2VtT2JqZWN0OiBzdHJpbmc7XG5cdHRhcmdldEFjdGlvbjogc3RyaW5nO1xuXHR0YXJnZXRQYXJhbXM6IHVua25vd247XG59O1xuLyoqXG4gKiBAcGFyYW0gYUxpbmtzXG4gKiBAcGFyYW0gYUV4Y2x1ZGVkQWN0aW9uc1xuICogQHBhcmFtIG9UYXJnZXRQYXJhbXNcbiAqIEBwYXJhbSBhSXRlbXNcbiAqIEBwYXJhbSBhQWxsb3dlZEFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gX2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW10sXG5cdGFFeGNsdWRlZEFjdGlvbnM6IHVua25vd25bXSxcblx0b1RhcmdldFBhcmFtczogdW5rbm93bixcblx0YUl0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUFsbG93ZWRBY3Rpb25zPzogdW5rbm93bltdXG4pIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBvTGluayA9IGFMaW5rc1tpXTtcblx0XHRjb25zdCBzSW50ZW50ID0gb0xpbmsuaW50ZW50O1xuXHRcdGNvbnN0IHNBY3Rpb24gPSBzSW50ZW50LnNwbGl0KFwiLVwiKVsxXS5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKGFBbGxvd2VkQWN0aW9ucyAmJiBhQWxsb3dlZEFjdGlvbnMuaW5jbHVkZXMoc0FjdGlvbikpIHtcblx0XHRcdGFJdGVtcy5wdXNoKHtcblx0XHRcdFx0dGV4dDogb0xpbmsudGV4dCxcblx0XHRcdFx0dGFyZ2V0U2VtT2JqZWN0OiBzSW50ZW50LnNwbGl0KFwiI1wiKVsxXS5zcGxpdChcIi1cIilbMF0sXG5cdFx0XHRcdHRhcmdldEFjdGlvbjogc0FjdGlvbi5zcGxpdChcIn5cIilbMF0sXG5cdFx0XHRcdHRhcmdldFBhcmFtczogb1RhcmdldFBhcmFtc1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICghYUFsbG93ZWRBY3Rpb25zICYmIGFFeGNsdWRlZEFjdGlvbnMgJiYgYUV4Y2x1ZGVkQWN0aW9ucy5pbmRleE9mKHNBY3Rpb24pID09PSAtMSkge1xuXHRcdFx0YUl0ZW1zLnB1c2goe1xuXHRcdFx0XHR0ZXh0OiBvTGluay50ZXh0LFxuXHRcdFx0XHR0YXJnZXRTZW1PYmplY3Q6IHNJbnRlbnQuc3BsaXQoXCIjXCIpWzFdLnNwbGl0KFwiLVwiKVswXSxcblx0XHRcdFx0dGFyZ2V0QWN0aW9uOiBzQWN0aW9uLnNwbGl0KFwiflwiKVswXSxcblx0XHRcdFx0dGFyZ2V0UGFyYW1zOiBvVGFyZ2V0UGFyYW1zXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxudHlwZSBTZW1hbnRpY09iamVjdCA9IHtcblx0YWxsb3dlZEFjdGlvbnM/OiB1bmtub3duW107XG5cdHVuYXZhaWxhYmxlQWN0aW9ucz86IHVua25vd25bXTtcblx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xuXHRtYXBwaW5nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50cyhcblx0b0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFNlbWFudGljT2JqZWN0LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW11cbikge1xuXHRpZiAoYUxpbmtzICYmIGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgYUFsbG93ZWRBY3Rpb25zID0gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMuYWxsb3dlZEFjdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFFeGNsdWRlZEFjdGlvbnMgPSBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgPyBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgOiBbXTtcblx0XHRjb25zdCBhU09NYXBwaW5ncyA9IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLm1hcHBpbmcgPyBfY3JlYXRlTWFwcGluZ3Mob0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMubWFwcGluZykgOiBbXTtcblx0XHRjb25zdCBvVGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU09NYXBwaW5ncyB9O1xuXHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGFFeGNsdWRlZEFjdGlvbnMsIG9UYXJnZXRQYXJhbXMsIGFNYW5pZmVzdFNPSXRlbXMsIGFBbGxvd2VkQWN0aW9ucyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSByZWxhdGVkIGludGVudHMgd2hlbiBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBhcmUgcGFzc2VkIGZyb20gZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKSBvbmx5IGluIGNhc2Ugb2YgTXkgSW5ib3ggaW50ZWdyYXRpb25cbiAqIEBwYXJhbSBzZW1hbnRpY09iamVjdEFuZEFjdGlvbiBUaGlzIHNwZWNpZmllcyB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yIGZldGNoaW5nIHRoZSBpbnRlbnRzXG4gKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IFRoaXMgc2VwY2lmaWVzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHVwZGF0aW5nIHJlbGF0ZWQgYXBwc1xuICogQHBhcmFtIGFwcENvbXBvbmVudFNPSXRlbXMgVGhpcyBpcyBhIGxpc3Qgb2Ygc2VtYW50aWMgaXRlbXMgdXNlZCBmb3IgdXBkYXRpbmcgdGhlIHJlbGF0ZWQgYXBwcyBidXR0b25cbiAqIEBwYXJhbSBhTGlua3MgVGhpcyBpcyBhbiBhcnJheSBjb21wcmlzaW5nIG9mIHJlbGF0ZWQgaW50ZW50c1xuICovXG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24oXG5cdHNlbWFudGljT2JqZWN0QW5kQWN0aW9uOiBNeUluYm94SW50ZW50LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW11cbikge1xuXHRpZiAoYUxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBhY3Rpb25zID0gW3NlbWFudGljT2JqZWN0QW5kQWN0aW9uLmFjdGlvbl07XG5cdFx0Y29uc3QgZXhjbHVkZWRBY3Rpb25zOiBbXSA9IFtdO1xuXHRcdGNvbnN0IHNvTWFwcGluZ3M6IFtdID0gW107XG5cdFx0Y29uc3QgdGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBzb01hcHBpbmdzIH07XG5cdFx0X2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKGFMaW5rcywgZXhjbHVkZWRBY3Rpb25zLCB0YXJnZXRQYXJhbXMsIGFwcENvbXBvbmVudFNPSXRlbXMsIGFjdGlvbnMpO1xuXHR9XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3RDb25maWcgPSB7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0Pjtcbn07XG50eXBlIFJlbGF0ZWRBcHBzQ29uZmlnID0ge1xuXHR0ZXh0OiBzdHJpbmc7XG5cdHRhcmdldFNlbU9iamVjdDogc3RyaW5nO1xuXHR0YXJnZXRBY3Rpb246IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCxcblx0b0VudHJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdGFTZW1LZXlzOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvTWV0YVBhdGg6IHN0cmluZyxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnRcbik6IFByb21pc2U8UmVsYXRlZEFwcHNDb25maWdbXT4ge1xuXHRjb25zdCBvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyA9IGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdGNvbnN0IG9QYXJhbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0bGV0IHNDdXJyZW50U2VtT2JqID0gXCJcIixcblx0XHRzQ3VycmVudEFjdGlvbiA9IFwiXCI7XG5cdGxldCBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucztcblx0bGV0IGFSZWxhdGVkQXBwc01lbnVJdGVtczogUmVsYXRlZEFwcHNDb25maWdbXSA9IFtdO1xuXHRsZXQgYUV4Y2x1ZGVkQWN0aW9uczogdW5rbm93bltdID0gW107XG5cdGxldCBhTWFuaWZlc3RTT0tleXM6IHN0cmluZ1tdO1xuXG5cdGFzeW5jIGZ1bmN0aW9uIGZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcygpIHtcblx0XHRjb25zdCBvUGFyc2VkVXJsID0gb1NoZWxsU2VydmljZUhlbHBlci5wYXJzZVNoZWxsSGFzaChkb2N1bWVudC5sb2NhdGlvbi5oYXNoKTtcblx0XHRzQ3VycmVudFNlbU9iaiA9IG9QYXJzZWRVcmwuc2VtYW50aWNPYmplY3Q7IC8vIEN1cnJlbnQgU2VtYW50aWMgT2JqZWN0XG5cdFx0c0N1cnJlbnRBY3Rpb24gPSBvUGFyc2VkVXJsLmFjdGlvbjtcblx0XHRyZXR1cm4gX2dldFNPSW50ZW50cyhvU2hlbGxTZXJ2aWNlSGVscGVyLCBvT2JqZWN0UGFnZUxheW91dCwgc0N1cnJlbnRTZW1PYmosIG9QYXJhbSk7XG5cdH1cblxuXHR0cnkge1xuXHRcdGlmIChvRW50cnkpIHtcblx0XHRcdGlmIChhU2VtS2V5cyAmJiBhU2VtS2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbUtleXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRjb25zdCBzU2VtS2V5ID0gYVNlbUtleXNbal0uJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHRpZiAoIW9QYXJhbVtzU2VtS2V5XSkge1xuXHRcdFx0XHRcdFx0b1BhcmFtW3NTZW1LZXldID0geyB2YWx1ZTogb0VudHJ5W3NTZW1LZXldIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBmYWxsYmFjayB0byBUZWNobmljYWwgS2V5cyBpZiBubyBTZW1hbnRpYyBLZXkgaXMgcHJlc2VudFxuXHRcdFx0XHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29NZXRhUGF0aH0vJFR5cGUvJEtleWApO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBhVGVjaG5pY2FsS2V5cykge1xuXHRcdFx0XHRcdGNvbnN0IHNPYmpLZXkgPSBhVGVjaG5pY2FsS2V5c1trZXldO1xuXHRcdFx0XHRcdGlmICghb1BhcmFtW3NPYmpLZXldKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1bc09iaktleV0gPSB7IHZhbHVlOiBvRW50cnlbc09iaktleV0gfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTG9naWMgdG8gcmVhZCBhZGRpdGlvbmFsIFNPIGZyb20gbWFuaWZlc3QgYW5kIHVwZGF0ZWQgcmVsYXRlZGFwcHMgbW9kZWxcblxuXHRcdGNvbnN0IG9NYW5pZmVzdERhdGEgPSBnZXRUYXJnZXRWaWV3KG9PYmplY3RQYWdlTGF5b3V0KS5nZXRWaWV3RGF0YSgpIGFzIFNlbWFudGljT2JqZWN0Q29uZmlnO1xuXHRcdGNvbnN0IGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0bGV0IHNlbWFudGljT2JqZWN0SW50ZW50cztcblx0XHRpZiAob01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzKSB7XG5cdFx0XHRhTWFuaWZlc3RTT0tleXMgPSBPYmplY3Qua2V5cyhvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMpO1xuXHRcdFx0Zm9yIChsZXQga2V5ID0gMDsga2V5IDwgYU1hbmlmZXN0U09LZXlzLmxlbmd0aDsga2V5KyspIHtcblx0XHRcdFx0c2VtYW50aWNPYmplY3RJbnRlbnRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRcdF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIGFNYW5pZmVzdFNPS2V5c1trZXldLCBvUGFyYW0pXG5cdFx0XHRcdCk7XG5cdFx0XHRcdF9nZXRSZWxhdGVkSW50ZW50cyhcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYU1hbmlmZXN0U09LZXlzW2tleV1dLFxuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRhTWFuaWZlc3RTT0l0ZW1zLFxuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0SW50ZW50c1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGFwcENvbXBvbmVudFNPSXRlbXMgaXMgdXBkYXRlZCBpbiBjYXNlIG9mIE15IEluYm94IGludGVncmF0aW9uIHdoZW4gc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gYXJlIHBhc3NlZCBmcm9tIGZlRW52aXJvbm1lbnQuZ2V0SW50ZW50KCkgbWV0aG9kXG5cdFx0Ly8gSW4gb3RoZXIgY2FzZXMgaXQgcmVtYWlucyBhcyBhbiBlbXB0eSBsaXN0XG5cdFx0Ly8gV2UgY29uY2F0IHRoaXMgbGlzdCB0b3dhcmRzIHRoZSBlbmQgd2l0aCBhTWFuaWZlc3RTT0l0ZW1zXG5cblx0XHRjb25zdCBhcHBDb21wb25lbnRTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbXBvbmVudERhdGE6IENvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdGlmIChjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQgJiYgY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50LmdldEludGVudCgpKSB7XG5cdFx0XHRjb25zdCBpbnRlbnQ6IE15SW5ib3hJbnRlbnQgPSBjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQuZ2V0SW50ZW50KCk7XG5cdFx0XHRzZW1hbnRpY09iamVjdEludGVudHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIGludGVudC5zZW1hbnRpY09iamVjdCwgb1BhcmFtKVxuXHRcdFx0KTtcblx0XHRcdF9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24oaW50ZW50LCBvQmluZGluZ0NvbnRleHQsIGFwcENvbXBvbmVudFNPSXRlbXMsIHNlbWFudGljT2JqZWN0SW50ZW50cyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvT2JqZWN0UGFnZUxheW91dC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IGFMaW5rcyA9IGF3YWl0IGZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcygpO1xuXHRcdGlmIChhTGlua3MpIHtcblx0XHRcdGlmIChhTGlua3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsZXQgaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0ID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXRQYXJhbXM6IHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM/OiBDb250ZXh0O1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZz86IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXTtcblx0XHRcdFx0fSA9IHt9O1xuXHRcdFx0XHRjb25zdCBhQW5ub3RhdGlvbnNTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSA9IFtdO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IGAke29NZXRhUGF0aH1AYDtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVR5cGVQYXRoID0gYCR7b01ldGFQYXRofS9AYDtcblx0XHRcdFx0Y29uc3Qgb0VudGl0eVNldEFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGgpO1xuXHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMob0VudGl0eVNldEFubm90YXRpb25zLCBzQ3VycmVudFNlbU9iaik7XG5cdFx0XHRcdGlmICghb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYkhhc0VudGl0eVNldFNPKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0VudGl0eVR5cGVBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlUeXBlUGF0aCk7XG5cdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlUeXBlQW5ub3RhdGlvbnMsIHNDdXJyZW50U2VtT2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhRXhjbHVkZWRBY3Rpb25zID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYVVuYXZhaWxhYmxlQWN0aW9ucztcblx0XHRcdFx0Ly9Ta2lwIHNhbWUgYXBwbGljYXRpb24gZnJvbSBSZWxhdGVkIEFwcHNcblx0XHRcdFx0YUV4Y2x1ZGVkQWN0aW9ucy5wdXNoKHNDdXJyZW50QWN0aW9uKTtcblx0XHRcdFx0b1RhcmdldFBhcmFtcy5uYXZpZ2F0aW9uQ29udGV4dHMgPSBvQmluZGluZ0NvbnRleHQ7XG5cdFx0XHRcdG9UYXJnZXRQYXJhbXMuc2VtYW50aWNPYmplY3RNYXBwaW5nID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYU1hcHBpbmdzO1xuXHRcdFx0XHRfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMoYUxpbmtzLCBhRXhjbHVkZWRBY3Rpb25zLCBvVGFyZ2V0UGFyYW1zLCBhQW5ub3RhdGlvbnNTT0l0ZW1zKTtcblxuXHRcdFx0XHRhTWFuaWZlc3RTT0l0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHsgdGFyZ2V0U2VtT2JqZWN0IH0pIHtcblx0XHRcdFx0XHRpZiAoYUFubm90YXRpb25zU09JdGVtc1swXT8udGFyZ2V0U2VtT2JqZWN0ID09PSB0YXJnZXRTZW1PYmplY3QpIHtcblx0XHRcdFx0XHRcdGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyByZW1vdmUgYWxsIGFjdGlvbnMgZnJvbSBjdXJyZW50IGhhc2ggYXBwbGljYXRpb24gaWYgbWFuaWZlc3QgY29udGFpbnMgZW1wdHkgYWxsb3dlZEFjdGlvbnNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0cyAmJlxuXHRcdFx0XHRcdGFBbm5vdGF0aW9uc1NPSXRlbXNbMF0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYUFubm90YXRpb25zU09JdGVtc1swXS50YXJnZXRTZW1PYmplY3RdICYmXG5cdFx0XHRcdFx0ISFvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYUFubm90YXRpb25zU09JdGVtc1swXS50YXJnZXRTZW1PYmplY3RdLmFsbG93ZWRBY3Rpb25zXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc29JdGVtcyA9IGFNYW5pZmVzdFNPSXRlbXMuY29uY2F0KGFwcENvbXBvbmVudFNPSXRlbXMpO1xuXHRcdFx0XHRhUmVsYXRlZEFwcHNNZW51SXRlbXMgPSBpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPyBzb0l0ZW1zIDogc29JdGVtcy5jb25jYXQoYUFubm90YXRpb25zU09JdGVtcyk7XG5cdFx0XHRcdC8vIElmIG5vIGFwcCBpbiBsaXN0LCByZWxhdGVkIGFwcHMgYnV0dG9uIHdpbGwgYmUgaGlkZGVuXG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvdmlzaWJpbGl0eVwiLCBhUmVsYXRlZEFwcHNNZW51SXRlbXMubGVuZ3RoID4gMCk7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvaXRlbXNcIiwgYVJlbGF0ZWRBcHBzTWVudUl0ZW1zKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvdmlzaWJpbGl0eVwiLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvdmlzaWJpbGl0eVwiLCBmYWxzZSk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdExvZy5lcnJvcihcIkNhbm5vdCByZWFkIGxpbmtzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdH1cblx0cmV0dXJuIGFSZWxhdGVkQXBwc01lbnVJdGVtcztcbn1cblxuZnVuY3Rpb24gX2dldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMob0VudGl0eUFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc0N1cnJlbnRTZW1PYmo6IHN0cmluZykge1xuXHRjb25zdCBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyA9IHtcblx0XHRiSGFzRW50aXR5U2V0U086IGZhbHNlLFxuXHRcdGFBbGxvd2VkQWN0aW9uczogW10sXG5cdFx0YVVuYXZhaWxhYmxlQWN0aW9uczogW10gYXMgTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucz5bXSxcblx0XHRhTWFwcGluZ3M6IFtdIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXVxuXHR9O1xuXHRsZXQgc0Fubm90YXRpb25NYXBwaW5nVGVybSwgc0Fubm90YXRpb25BY3Rpb25UZXJtO1xuXHRsZXQgc1F1YWxpZmllcjtcblx0Zm9yIChjb25zdCBrZXkgaW4gb0VudGl0eUFubm90YXRpb25zKSB7XG5cdFx0aWYgKGtleS5pbmRleE9mKENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdCkgPiAtMSAmJiBvRW50aXR5QW5ub3RhdGlvbnNba2V5XSA9PT0gc0N1cnJlbnRTZW1PYmopIHtcblx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmJIYXNFbnRpdHlTZXRTTyA9IHRydWU7XG5cdFx0XHRzQW5ub3RhdGlvbk1hcHBpbmdUZXJtID0gYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdE1hcHBpbmd9YDtcblx0XHRcdHNBbm5vdGF0aW9uQWN0aW9uVGVybSA9IGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YDtcblxuXHRcdFx0aWYgKGtleS5pbmRleE9mKFwiI1wiKSA+IC0xKSB7XG5cdFx0XHRcdHNRdWFsaWZpZXIgPSBrZXkuc3BsaXQoXCIjXCIpWzFdO1xuXHRcdFx0XHRzQW5ub3RhdGlvbk1hcHBpbmdUZXJtID0gYCR7c0Fubm90YXRpb25NYXBwaW5nVGVybX0jJHtzUXVhbGlmaWVyfWA7XG5cdFx0XHRcdHNBbm5vdGF0aW9uQWN0aW9uVGVybSA9IGAke3NBbm5vdGF0aW9uQWN0aW9uVGVybX0jJHtzUXVhbGlmaWVyfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm1dKSB7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncy5jb25jYXQoXG5cdFx0XHRcdFx0b0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm1dIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5cblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbkFjdGlvblRlcm1dKSB7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFVbmF2YWlsYWJsZUFjdGlvbnMgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zLmNvbmNhdChcblx0XHRcdFx0XHRvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25BY3Rpb25UZXJtXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zPlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zO1xufVxuXG5mdW5jdGlvbiBmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZUxheW91dDogT2JqZWN0UGFnZUxheW91dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PYmplY3RQYWdlTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdGNvbnN0IHBhdGggPSAob0JpbmRpbmdDb250ZXh0ICYmIG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpIHx8IFwiXCI7XG5cdGNvbnN0IG9NZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgocGF0aCk7XG5cdC8vIFNlbWFudGljIEtleSBWb2NhYnVsYXJ5XG5cdGNvbnN0IHNTZW1hbnRpY0tleVZvY2FidWxhcnkgPSBgJHtvTWV0YVBhdGh9L2AgKyBgQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleWA7XG5cdC8vU2VtYW50aWMgS2V5c1xuXHRjb25zdCBhU2VtS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNTZW1hbnRpY0tleVZvY2FidWxhcnkpO1xuXHQvLyBVbmF2YWlsYWJsZSBBY3Rpb25zXG5cdGNvbnN0IG9FbnRyeSA9IG9CaW5kaW5nQ29udGV4dD8uZ2V0T2JqZWN0KCk7XG5cdGlmICghb0VudHJ5ICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdG9CaW5kaW5nQ29udGV4dFxuXHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKHJlcXVlc3RlZE9iamVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0cmVxdWVzdGVkT2JqZWN0LFxuXHRcdFx0XHRcdG9PYmplY3RQYWdlTGF5b3V0LFxuXHRcdFx0XHRcdGFTZW1LZXlzLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0b01ldGFQYXRoLFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCB1cGRhdGUgdGhlIHJlbGF0ZWQgYXBwIGRldGFpbHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMudXBkYXRlUmVsYXRlQXBwc01vZGVsKG9CaW5kaW5nQ29udGV4dCwgb0VudHJ5LCBvT2JqZWN0UGFnZUxheW91dCwgYVNlbUtleXMsIG9NZXRhTW9kZWwsIG9NZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBvQnV0dG9uXG4gKi9cbmZ1bmN0aW9uIGZuRmlyZUJ1dHRvblByZXNzKG9CdXR0b246IENvbnRyb2wpIHtcblx0aWYgKFxuXHRcdG9CdXR0b24gJiZcblx0XHRvQnV0dG9uLmlzQTxCdXR0b24gfCBPdmVyZmxvd1Rvb2xiYXJCdXR0b24+KFtcInNhcC5tLkJ1dHRvblwiLCBcInNhcC5tLk92ZXJmbG93VG9vbGJhckJ1dHRvblwiXSkgJiZcblx0XHRvQnV0dG9uLmdldFZpc2libGUoKSAmJlxuXHRcdG9CdXR0b24uZ2V0RW5hYmxlZCgpXG5cdCkge1xuXHRcdG9CdXR0b24uZmlyZVByZXNzKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QXBwQ29tcG9uZW50KG9Db250cm9sOiBDb250cm9sIHwgQ29tcG9uZW50KTogQXBwQ29tcG9uZW50IHtcblx0aWYgKG9Db250cm9sLmlzQTxBcHBDb21wb25lbnQ+KFwic2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50XCIpKSB7XG5cdFx0cmV0dXJuIG9Db250cm9sO1xuXHR9XG5cdGNvbnN0IG9Pd25lciA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvQ29udHJvbCk7XG5cdGlmICghb093bmVyKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgc2hvdWxkIGJlIGEgc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50IGFzIG93bmVyIG9mIHRoZSBjb250cm9sXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBnZXRBcHBDb21wb25lbnQob093bmVyKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50UGFnZVZpZXcob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdHJldHVybiByb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHQ/IHJvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RWaWV3KClcblx0XHQ6IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoKG9BcHBDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpIGFzIE5hdkNvbnRhaW5lcikuZ2V0Q3VycmVudFBhZ2UoKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldFZpZXcob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QgfCBudWxsKTogVmlldyB7XG5cdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5pc0E8Q29tcG9uZW50Q29udGFpbmVyPihcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udHJvbC5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdG9Db250cm9sID0gb0NvbXBvbmVudCAmJiBvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdH1cblx0d2hpbGUgKG9Db250cm9sICYmICFvQ29udHJvbC5pc0E8Vmlldz4oXCJzYXAudWkuY29yZS5tdmMuVmlld1wiKSkge1xuXHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdH1cblx0cmV0dXJuIG9Db250cm9sITtcbn1cblxuZnVuY3Rpb24gX2ZuQ2hlY2tJc01hdGNoKG9PYmplY3Q6IG9iamVjdCwgb0tleXNUb0NoZWNrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0tleXNUb0NoZWNrKSB7XG5cdFx0aWYgKG9LZXlzVG9DaGVja1tzS2V5XSAhPT0gb09iamVjdFtzS2V5IGFzIGtleW9mIHR5cGVvZiBvT2JqZWN0XSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZm5HZXRDb250ZXh0UGF0aFByb3BlcnRpZXMoXG5cdG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0b0ZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4ge1xuXHRjb25zdCBvRW50aXR5VHlwZTogTWV0YU1vZGVsRW50aXR5VHlwZSA9IChtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L2ApIHx8IHt9KSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlLFxuXHRcdG9Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxQcm9wZXJ0eT4gfCBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gb0VudGl0eVR5cGUpIHtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5VHlwZS5oYXNPd25Qcm9wZXJ0eShzS2V5KSAmJlxuXHRcdFx0IS9eXFwkL2kudGVzdChzS2V5KSAmJlxuXHRcdFx0b0VudGl0eVR5cGVbc0tleV0uJGtpbmQgJiZcblx0XHRcdF9mbkNoZWNrSXNNYXRjaChvRW50aXR5VHlwZVtzS2V5XSwgb0ZpbHRlciB8fCB7ICRraW5kOiBcIlByb3BlcnR5XCIgfSlcblx0XHQpIHtcblx0XHRcdG9Qcm9wZXJ0aWVzW3NLZXldID0gb0VudGl0eVR5cGVbc0tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvUHJvcGVydGllcztcbn1cblxuZnVuY3Rpb24gZm5HZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHMob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGxldCBhTWFuZGF0b3J5RmlsdGVyRmllbGRzOiBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPltdID0gW107XG5cdGlmIChvTWV0YU1vZGVsICYmIHNDb250ZXh0UGF0aCkge1xuXHRcdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdGAke3NDb250ZXh0UGF0aH1AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnMvUmVxdWlyZWRQcm9wZXJ0aWVzYFxuXHRcdCkgYXMgRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXTtcblx0fVxuXHRyZXR1cm4gYU1hbmRhdG9yeUZpbHRlckZpZWxkcztcbn1cblxuZnVuY3Rpb24gZm5HZXRJQk5BY3Rpb25zKG9Db250cm9sOiBUYWJsZSB8IE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUsIGFJQk5BY3Rpb25zOiB1bmtub3duW10pIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRBY3Rpb25zKCk7XG5cdGlmIChhQWN0aW9ucykge1xuXHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb24pIHtcblx0XHRcdGlmIChvQWN0aW9uLmlzQTxBY3Rpb25Ub29sYmFyQWN0aW9uPihcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhci5BY3Rpb25Ub29sYmFyQWN0aW9uXCIpKSB7XG5cdFx0XHRcdG9BY3Rpb24gPSBvQWN0aW9uLmdldEFjdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BY3Rpb24uaXNBPE1lbnVCdXR0b24+KFwic2FwLm0uTWVudUJ1dHRvblwiKSkge1xuXHRcdFx0XHRjb25zdCBvTWVudSA9IG9BY3Rpb24uZ2V0TWVudSgpO1xuXHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvTWVudS5nZXRJdGVtcygpO1xuXHRcdFx0XHRhSXRlbXMuZm9yRWFjaCgob0l0ZW0pID0+IHtcblx0XHRcdFx0XHRpZiAob0l0ZW0uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0XHRcdGFJQk5BY3Rpb25zLnB1c2gob0l0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9BY3Rpb24uZGF0YShcIklCTkRhdGFcIikpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMucHVzaChvQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYUlCTkFjdGlvbnM7XG59XG5cbi8qKlxuICogQHBhcmFtIGFJQk5BY3Rpb25zXG4gKiBAcGFyYW0gb1ZpZXdcbiAqL1xuZnVuY3Rpb24gZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9uczogQ29udHJvbFtdLCBvVmlldzogVmlldykge1xuXHRjb25zdCBvUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duIH0+ID0ge307XG5cdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob1ZpZXcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSk7XG5cdGNvbnN0IGZuR2V0TGlua3MgPSBmdW5jdGlvbiAob0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkge1xuXHRcdGlmIChvRGF0YSkge1xuXHRcdFx0Y29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhvRGF0YSk7XG5cdFx0XHRhS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKHNLZXkuaW5kZXhPZihcIl9cIikgIT09IDAgJiYgc0tleS5pbmRleE9mKFwib2RhdGEuY29udGV4dFwiKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRvUGFyYW1zW3NLZXldID0geyB2YWx1ZTogb0RhdGFbc0tleV0gfTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChhSUJOQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGFJQk5BY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9JQk5BY3Rpb24pIHtcblx0XHRcdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0ID0gb0lCTkFjdGlvbi5kYXRhKFwiSUJORGF0YVwiKS5zZW1hbnRpY09iamVjdDtcblx0XHRcdFx0Y29uc3Qgc0FjdGlvbiA9IG9JQk5BY3Rpb24uZGF0YShcIklCTkRhdGFcIikuYWN0aW9uO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0LmdldFNoZWxsU2VydmljZXMoKVxuXHRcdFx0XHRcdC5nZXRMaW5rcyh7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0YWN0aW9uOiBzQWN0aW9uLFxuXHRcdFx0XHRcdFx0cGFyYW1zOiBvUGFyYW1zXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYUxpbmspIHtcblx0XHRcdFx0XHRcdG9JQk5BY3Rpb24uc2V0VmlzaWJsZShvSUJOQWN0aW9uLmdldFZpc2libGUoKSAmJiBhTGluayAmJiBhTGluay5sZW5ndGggPT09IDEpO1xuXHRcdFx0XHRcdFx0aWYgKGlzU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdChvSUJOQWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdG9JQk5BY3Rpb24uZ2V0SWQoKS5zcGxpdChcIi0tXCIpWzFdLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHNoZWxsTmF2aWdhdGlvbk5vdEF2YWlsYWJsZTogIShhTGluayAmJiBhTGluay5sZW5ndGggPT09IDEpXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0aWYgKG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHQob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dClcblx0XHRcdD8ucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmbkdldExpbmtzKG9EYXRhKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgdGhlIGxpbmtzIGZyb20gdGhlIHNoZWxsIHNlcnZpY2VcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmbkdldExpbmtzKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aW9uUGF0aChhY3Rpb25Db250ZXh0OiBDb250ZXh0LCBiUmV0dXJuT25seVBhdGg6IGJvb2xlYW4sIGluQWN0aW9uTmFtZT86IHN0cmluZywgYkNoZWNrU3RhdGljVmFsdWU/OiBib29sZWFuKSB7XG5cdGNvbnN0IHNBY3Rpb25OYW1lOiBzdHJpbmcgPSAhaW5BY3Rpb25OYW1lID8gYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpLnRvU3RyaW5nKCkgOiBpbkFjdGlvbk5hbWU7XG5cdGxldCBzQ29udGV4dFBhdGggPSBhY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9AXCIpWzBdO1xuXHRjb25zdCBzRW50aXR5VHlwZU5hbWUgPSAoYWN0aW9uQ29udGV4dC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kVHlwZTtcblx0Y29uc3Qgc0VudGl0eU5hbWUgPSBnZXRFbnRpdHlTZXROYW1lKGFjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCwgc0VudGl0eVR5cGVOYW1lKTtcblx0aWYgKHNFbnRpdHlOYW1lKSB7XG5cdFx0c0NvbnRleHRQYXRoID0gYC8ke3NFbnRpdHlOYW1lfWA7XG5cdH1cblx0aWYgKGJDaGVja1N0YXRpY1ZhbHVlKSB7XG5cdFx0cmV0dXJuIGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlYCk7XG5cdH1cblx0aWYgKGJSZXR1cm5Pbmx5UGF0aCkge1xuXHRcdHJldHVybiBgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9YDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c0NvbnRleHRQYXRoOiBzQ29udGV4dFBhdGgsXG5cdFx0XHRzUHJvcGVydHk6IGFjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlLyRQYXRoYCksXG5cdFx0XHRzQmluZGluZ1BhcmFtZXRlcjogYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXIvMC8kTmFtZWApXG5cdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRFbnRpdHlTZXROYW1lKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdGZvciAoY29uc3Qga2V5IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRpZiAodHlwZW9mIG9FbnRpdHlDb250YWluZXJba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBvRW50aXR5Q29udGFpbmVyW2tleV0uJFR5cGUgPT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRyZXR1cm4ga2V5O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBjb21wdXRlRGlzcGxheU1vZGUob1Byb3BlcnR5QW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBvQ29sbGVjdGlvbkFubm90YXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0Y29uc3Qgb1RleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRcIl0sXG5cdFx0b1RleHRBcnJhbmdlbWVudEFubm90YXRpb24gPSAob1RleHRBbm5vdGF0aW9uICYmXG5cdFx0XHQoKG9Qcm9wZXJ0eUFubm90YXRpb25zICYmXG5cdFx0XHRcdG9Qcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFwiXSkgfHxcblx0XHRcdFx0KG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0XHRvQ29sbGVjdGlvbkFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFwiXSkpKSBhcyBNZXRhTW9kZWxFbnVtPFRleHRBcnJhbmdlbWVudD47XG5cblx0aWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dE9ubHlcIikge1xuXHRcdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dExhc3RcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVEZXNjcmlwdGlvblwiO1xuXHRcdH0gZWxzZSBpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24uJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0U2VwYXJhdGVcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVcIjtcblx0XHR9XG5cdFx0Ly9EZWZhdWx0IHNob3VsZCBiZSBUZXh0Rmlyc3QgaWYgdGhlcmUgaXMgYSBUZXh0IGFubm90YXRpb24gYW5kIG5laXRoZXIgVGV4dE9ubHkgbm9yIFRleHRMYXN0IGFyZSBzZXRcblx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblZhbHVlXCI7XG5cdH1cblx0cmV0dXJuIG9UZXh0QW5ub3RhdGlvbiA/IFwiRGVzY3JpcHRpb25WYWx1ZVwiIDogXCJWYWx1ZVwiO1xufVxuXG5mdW5jdGlvbiBfZ2V0RW50aXR5VHlwZShvQ29udGV4dDogT0RhdGFWNENvbnRleHQpIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSl9LyRUeXBlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9yZXF1ZXN0T2JqZWN0KHNBY3Rpb246IHN0cmluZywgb1NlbGVjdGVkQ29udGV4dDogT0RhdGFWNENvbnRleHQsIHNQcm9wZXJ0eTogc3RyaW5nKSB7XG5cdGxldCBvQ29udGV4dCA9IG9TZWxlY3RlZENvbnRleHQ7XG5cdGNvbnN0IG5CcmFja2V0SW5kZXggPSBzQWN0aW9uLmluZGV4T2YoXCIoXCIpO1xuXG5cdGlmIChuQnJhY2tldEluZGV4ID4gLTEpIHtcblx0XHRjb25zdCBzVGFyZ2V0VHlwZSA9IHNBY3Rpb24uc2xpY2UobkJyYWNrZXRJbmRleCArIDEsIC0xKTtcblx0XHRsZXQgc0N1cnJlbnRUeXBlID0gX2dldEVudGl0eVR5cGUob0NvbnRleHQpO1xuXG5cdFx0d2hpbGUgKHNDdXJyZW50VHlwZSAhPT0gc1RhcmdldFR5cGUpIHtcblx0XHRcdC8vIEZpbmQgcGFyZW50IGJpbmRpbmcgY29udGV4dCBhbmQgcmV0cmlldmUgZW50aXR5IHR5cGVcblx0XHRcdG9Db250ZXh0ID0gb0NvbnRleHQuZ2V0QmluZGluZygpLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRzQ3VycmVudFR5cGUgPSBfZ2V0RW50aXR5VHlwZShvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIkNhbm5vdCBkZXRlcm1pbmUgdGFyZ2V0IHR5cGUgdG8gcmVxdWVzdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgYm91bmQgYWN0aW9uIGludm9jYXRpb25cIik7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChzUHJvcGVydHkpO1xufVxuXG5leHBvcnQgdHlwZSBfUmVxdWVzdGVkUHJvcGVydHkgPSB7XG5cdHZQcm9wZXJ0eVZhbHVlOiB1bmtub3duO1xuXHRvU2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0O1xuXHRzQWN0aW9uOiBzdHJpbmc7XG5cdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UHJvcGVydHkoXG5cdG9TZWxlY3RlZENvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRzQWN0aW9uOiBzdHJpbmcsXG5cdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8X1JlcXVlc3RlZFByb3BlcnR5PiB7XG5cdGNvbnN0IG9Qcm9taXNlID1cblx0XHRzUHJvcGVydHkgJiYgc1Byb3BlcnR5LmluZGV4T2YoXCIvXCIpID09PSAwXG5cdFx0XHQ/IHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eShzUHJvcGVydHksIG9TZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKSlcblx0XHRcdDogX3JlcXVlc3RPYmplY3Qoc0FjdGlvbiwgb1NlbGVjdGVkQ29udGV4dCwgc1Byb3BlcnR5KTtcblxuXHRyZXR1cm4gb1Byb21pc2UudGhlbihmdW5jdGlvbiAodlByb3BlcnR5VmFsdWU6IHVua25vd24pIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dlByb3BlcnR5VmFsdWU6IHZQcm9wZXJ0eVZhbHVlLFxuXHRcdFx0b1NlbGVjdGVkQ29udGV4dDogb1NlbGVjdGVkQ29udGV4dCxcblx0XHRcdHNBY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoOiBzRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoXG5cdFx0fTtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZShcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0YVJlcXVlc3RQcm9taXNlczogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+W11cbikge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcylcblx0XHQudGhlbihmdW5jdGlvbiAoYVJlc3VsdHMpIHtcblx0XHRcdGlmIChhUmVzdWx0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgYUFwcGxpY2FibGVDb250ZXh0czogdW5rbm93bltdID0gW10sXG5cdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVDb250ZXh0czogdW5rbm93bltdID0gW107XG5cdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKGFSZXN1bHQpIHtcblx0XHRcdFx0XHRpZiAoYVJlc3VsdCkge1xuXHRcdFx0XHRcdFx0aWYgKGFSZXN1bHQudlByb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCkuc2V0UHJvcGVydHkoYVJlc3VsdC5zRHluYW1pY0FjdGlvbkVuYWJsZWRQYXRoLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0YUFwcGxpY2FibGVDb250ZXh0cy5wdXNoKGFSZXN1bHQub1NlbGVjdGVkQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUNvbnRleHRzLnB1c2goYVJlc3VsdC5vU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzZXREeW5hbWljQWN0aW9uQ29udGV4dHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBhUmVzdWx0c1swXS5zQWN0aW9uLCBhQXBwbGljYWJsZUNvbnRleHRzLCBhTm90QXBwbGljYWJsZUNvbnRleHRzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cudHJhY2UoXCJDYW5ub3QgcmV0cmlldmUgcHJvcGVydHkgdmFsdWUgZnJvbSBwYXRoXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvSW50ZXJuYWxNb2RlbENvbnRleHRcbiAqIEBwYXJhbSBzQWN0aW9uXG4gKiBAcGFyYW0gYUFwcGxpY2FibGVcbiAqIEBwYXJhbSBhTm90QXBwbGljYWJsZVxuICovXG5mdW5jdGlvbiBzZXREeW5hbWljQWN0aW9uQ29udGV4dHMoXG5cdG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdHNBY3Rpb246IHN0cmluZyxcblx0YUFwcGxpY2FibGU6IHVua25vd25bXSxcblx0YU5vdEFwcGxpY2FibGU6IHVua25vd25bXVxuKSB7XG5cdGNvbnN0IHNEeW5hbWljQWN0aW9uUGF0aFByZWZpeCA9IGAke29JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2R5bmFtaWNBY3Rpb25zLyR7c0FjdGlvbn1gLFxuXHRcdG9JbnRlcm5hbE1vZGVsID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldE1vZGVsKCk7XG5cdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KGAke3NEeW5hbWljQWN0aW9uUGF0aFByZWZpeH0vYUFwcGxpY2FibGVgLCBhQXBwbGljYWJsZSk7XG5cdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KGAke3NEeW5hbWljQWN0aW9uUGF0aFByZWZpeH0vYU5vdEFwcGxpY2FibGVgLCBhTm90QXBwbGljYWJsZSk7XG59XG5cbmZ1bmN0aW9uIF9nZXREZWZhdWx0T3BlcmF0b3JzKHNQcm9wZXJ0eVR5cGU/OiBzdHJpbmcpIHtcblx0Ly8gbWRjIGRlZmluZXMgdGhlIGZ1bGwgc2V0IG9mIG9wZXJhdGlvbnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBmb3IgZWFjaCBFZG0gVHlwZVxuXHQvLyBUT0RPIFJlcGxhY2Ugd2l0aCBtb2RlbCAvIGludGVybmFsIHdheSBvZiByZXRyaWV2aW5nIHRoZSBhY3R1YWwgbW9kZWwgdHlwZSB1c2VkIGZvciB0aGUgcHJvcGVydHlcblx0Y29uc3Qgb0RhdGFDbGFzcyA9IFR5cGVVdGlsLmdldERhdGFUeXBlQ2xhc3NOYW1lKHNQcm9wZXJ0eVR5cGUpO1xuXHQvLyBUT0RPIG5lZWQgdG8gcGFzcyBwcm9wZXIgZm9ybWF0T3B0aW9ucywgY29uc3RyYWludHMgaGVyZVxuXHRjb25zdCBvQmFzZVR5cGUgPSBUeXBlVXRpbC5nZXRCYXNlVHlwZShvRGF0YUNsYXNzLCB7fSwge30pO1xuXHRyZXR1cm4gRmlsdGVyT3BlcmF0b3JVdGlsLmdldE9wZXJhdG9yc0ZvclR5cGUob0Jhc2VUeXBlKTtcbn1cblxuZnVuY3Rpb24gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wczogc3RyaW5nW10sIGFFeHByZXNzaW9uT3BzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0Ly8gRnJvbSB0aGUgZGVmYXVsdCBzZXQgb2YgT3BlcmF0b3JzIGZvciB0aGUgQmFzZSBUeXBlLCBzZWxlY3QgdGhvc2UgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgQWxsb3dlZCBWYWx1ZS5cblx0Ly8gSW4gY2FzZSB0aGF0IG5vIG9wZXJhdG9ycyBhcmUgZm91bmQsIHJldHVybiB1bmRlZmluZWQgc28gdGhhdCB0aGUgZGVmYXVsdCBzZXQgaXMgdXNlZC5cblx0cmV0dXJuIGFEZWZhdWx0T3BzLmZpbHRlcihmdW5jdGlvbiAoc0VsZW1lbnQpIHtcblx0XHRyZXR1cm4gYUV4cHJlc3Npb25PcHMuaW5kZXhPZihzRWxlbWVudCkgPiAtMTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24oYUV4cHJlc3Npb25zOiBzdHJpbmdbXSkge1xuXHRjb25zdCBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkgPSBDb21tb25VdGlscy5BbGxvd2VkRXhwcmVzc2lvbnNQcmlvO1xuXG5cdGFFeHByZXNzaW9ucy5zb3J0KGZ1bmN0aW9uIChhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuXHRcdHJldHVybiBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkuaW5kZXhPZihhKSAtIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGIpO1xuXHR9KTtcblxuXHRyZXR1cm4gYUV4cHJlc3Npb25zWzBdO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBmZXRjaCB0aGUgY29ycmVjdCBvcGVyYXRvcnMgYmFzZWQgb24gdGhlIGZpbHRlciByZXN0cmljdGlvbnMgdGhhdCBjYW4gYmUgYW5ub3RhdGVkIG9uIGFuIGVudGl0eSBzZXQgb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuICogV2UgcmV0dXJuIHRoZSBjb3JyZWN0IG9wZXJhdG9ycyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJlc3RyaWN0aW9uIGFuZCBhbHNvIGNoZWNrIGZvciB0aGUgb3BlcmF0b3JzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0IHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGVtLlxuICpcbiAqIEBwYXJhbSBzUHJvcGVydHkgU3RyaW5nIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gc0VudGl0eVNldFBhdGggU3RyaW5nIHBhdGggdG8gdGhlIGVudGl0eSBzZXRcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHVzZWQgZHVyaW5nIHRlbXBsYXRpbmdcbiAqIEBwYXJhbSBzVHlwZSBTdHJpbmcgZGF0YSB0eXBlIG9kIHRoZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgZWRtLkRhdGVcbiAqIEBwYXJhbSBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgQm9vbGVhbiBwYXNzZWQgZnJvbSB0aGUgbWFuaWZlc3QgZm9yIHNlbWFudGljIGRhdGUgcmFuZ2VcbiAqIEBwYXJhbSBzU2V0dGluZ3MgU3RyaW5naWZpZWQgb2JqZWN0IG9mIHRoZSBwcm9wZXJ0eSBzZXR0aW5nc1xuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgb3BlcmF0b3JzIGZvciBmaWx0ZXJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZXJhdG9yc0ZvclByb3BlcnR5KFxuXHRzUHJvcGVydHk6IHN0cmluZyxcblx0c0VudGl0eVNldFBhdGg6IHN0cmluZyxcblx0b0NvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLFxuXHRzVHlwZT86IHN0cmluZyxcblx0YlVzZVNlbWFudGljRGF0ZVJhbmdlPzogYm9vbGVhbiB8IHN0cmluZyxcblx0c1NldHRpbmdzPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IG9GaWx0ZXJSZXN0cmljdGlvbnMgPSBDb21tb25VdGlscy5nZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgoc0VudGl0eVNldFBhdGgsIG9Db250ZXh0KTtcblx0Y29uc3QgYUVxdWFsc09wcyA9IFtcIkVRXCJdO1xuXHRjb25zdCBhU2luZ2xlUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0Y29uc3QgYVNpbmdsZVJhbmdlRFRCYXNpY09wcyA9IFtcIkVRXCIsIFwiQlRcIl07XG5cdGNvbnN0IGFTaW5nbGVWYWx1ZURhdGVPcHMgPSBbXG5cdFx0XCJUT0RBWVwiLFxuXHRcdFwiVE9NT1JST1dcIixcblx0XHRcIllFU1RFUkRBWVwiLFxuXHRcdFwiREFURVwiLFxuXHRcdFwiRklSU1REQVlXRUVLXCIsXG5cdFx0XCJMQVNUREFZV0VFS1wiLFxuXHRcdFwiRklSU1REQVlNT05USFwiLFxuXHRcdFwiTEFTVERBWU1PTlRIXCIsXG5cdFx0XCJGSVJTVERBWVFVQVJURVJcIixcblx0XHRcIkxBU1REQVlRVUFSVEVSXCIsXG5cdFx0XCJGSVJTVERBWVlFQVJcIixcblx0XHRcIkxBU1REQVlZRUFSXCJcblx0XTtcblx0Y29uc3QgYU11bHRpUmFuZ2VPcHMgPSBbXCJFUVwiLCBcIkdFXCIsIFwiTEVcIiwgXCJMVFwiLCBcIkdUXCIsIFwiQlRcIiwgXCJORVwiLCBcIk5PVEJUXCIsIFwiTk9UTEVcIiwgXCJOT1RMVFwiLCBcIk5PVEdFXCIsIFwiTk9UR1RcIl07XG5cdGNvbnN0IGFTZWFyY2hFeHByZXNzaW9uT3BzID0gW1wiQ29udGFpbnNcIiwgXCJOb3RDb250YWluc1wiLCBcIlN0YXJ0c1dpdGhcIiwgXCJOb3RTdGFydHNXaXRoXCIsIFwiRW5kc1dpdGhcIiwgXCJOb3RFbmRzV2l0aFwiXTtcblx0Y29uc3QgYVNlbWFudGljRGF0ZU9wc0V4dCA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTdXBwb3J0ZWRPcGVyYXRpb25zKCk7XG5cdGNvbnN0IGJTZW1hbnRpY0RhdGVSYW5nZSA9IGJVc2VTZW1hbnRpY0RhdGVSYW5nZSA9PT0gXCJ0cnVlXCIgfHwgYlVzZVNlbWFudGljRGF0ZVJhbmdlID09PSB0cnVlO1xuXHRsZXQgYVNlbWFudGljRGF0ZU9wczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3Qgb1NldHRpbmdzID0gc1NldHRpbmdzICYmIHR5cGVvZiBzU2V0dGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNTZXR0aW5ncykuY3VzdG9tRGF0YSA6IHNTZXR0aW5ncztcblxuXHRpZiAoKG9Db250ZXh0LmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCkgYXMgdW5rbm93bikgPT09IHRydWUpIHtcblx0XHRyZXR1cm4gYUVxdWFsc09wcztcblx0fVxuXG5cdGlmIChvU2V0dGluZ3MgJiYgb1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbiAmJiBvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRhU2VtYW50aWNEYXRlT3BzID0gU2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldEZpbHRlck9wZXJhdGlvbnMob1NldHRpbmdzLm9wZXJhdG9yQ29uZmlndXJhdGlvbiwgc1R5cGUpO1xuXHR9IGVsc2Uge1xuXHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0U2VtYW50aWNEYXRlT3BlcmF0aW9ucyhzVHlwZSk7XG5cdH1cblx0Ly8gR2V0IHRoZSBkZWZhdWx0IE9wZXJhdG9ycyBmb3IgdGhpcyBQcm9wZXJ0eSBUeXBlXG5cdGxldCBhRGVmYXVsdE9wZXJhdG9ycyA9IF9nZXREZWZhdWx0T3BlcmF0b3JzKHNUeXBlKTtcblx0aWYgKGJTZW1hbnRpY0RhdGVSYW5nZSkge1xuXHRcdGFEZWZhdWx0T3BlcmF0b3JzID0gYVNlbWFudGljRGF0ZU9wc0V4dC5jb25jYXQoYURlZmF1bHRPcGVyYXRvcnMpO1xuXHR9XG5cdGxldCByZXN0cmljdGlvbnM6IHN0cmluZ1tdID0gW107XG5cblx0Ly8gSXMgdGhlcmUgYSBGaWx0ZXIgUmVzdHJpY3Rpb24gZGVmaW5lZCBmb3IgdGhpcyBwcm9wZXJ0eT9cblx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnMgJiYgb0ZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgJiYgb0ZpbHRlclJlc3RyaWN0aW9ucy5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5XSkge1xuXHRcdC8vIEV4dGVuZGluZyB0aGUgZGVmYXVsdCBvcGVyYXRvcnMgbGlzdCB3aXRoIFNlbWFudGljIERhdGUgb3B0aW9ucyBEQVRFUkFOR0UsIERBVEUsIEZST00gYW5kIFRPXG5cdFx0Y29uc3Qgc0FsbG93ZWRFeHByZXNzaW9uID0gQ29tbW9uVXRpbHMuZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldKTtcblx0XHQvLyBJbiBjYXNlIG1vcmUgdGhhbiBvbmUgQWxsb3dlZCBFeHByZXNzaW9ucyBoYXMgYmVlbiBkZWZpbmVkIGZvciBhIHByb3BlcnR5XG5cdFx0Ly8gY2hvb3NlIHRoZSBtb3N0IHJlc3RyaWN0aXZlIEFsbG93ZWQgRXhwcmVzc2lvblxuXG5cdFx0Ly8gTXVsdGlWYWx1ZSBoYXMgc2FtZSBPcGVyYXRvciBhcyBTaW5nbGVWYWx1ZSwgYnV0IHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIChtYXhDb25kaXRpb25zKVxuXHRcdHN3aXRjaCAoc0FsbG93ZWRFeHByZXNzaW9uKSB7XG5cdFx0XHRjYXNlIFwiU2luZ2xlVmFsdWVcIjpcblx0XHRcdFx0Y29uc3QgYVNpbmdsZVZhbHVlT3BzID0gc1R5cGUgPT09IFwiRWRtLkRhdGVcIiAmJiBiU2VtYW50aWNEYXRlUmFuZ2UgPyBhU2luZ2xlVmFsdWVEYXRlT3BzIDogYUVxdWFsc09wcztcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNpbmdsZVZhbHVlT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTXVsdGlWYWx1ZVwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhRXF1YWxzT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU2luZ2xlUmFuZ2VcIjpcblx0XHRcdFx0bGV0IGFFeHByZXNzaW9uT3BzOiBzdHJpbmdbXTtcblx0XHRcdFx0aWYgKGJTZW1hbnRpY0RhdGVSYW5nZSkge1xuXHRcdFx0XHRcdGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVwiKSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTZW1hbnRpY0RhdGVPcHM7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2VtYW50aWNEYXRlT3BzO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZU9wcztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoc1R5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZURUQmFzaWNPcHM7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUV4cHJlc3Npb25PcHMgPSBhU2luZ2xlUmFuZ2VPcHM7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc09wZXJhdG9ycyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFFeHByZXNzaW9uT3BzKTtcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gc09wZXJhdG9ycztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTXVsdGlSYW5nZVwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhTXVsdGlSYW5nZU9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFTZWFyY2hFeHByZXNzaW9uT3BzLmNvbmNhdChhTXVsdGlSYW5nZU9wcykpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvLyBJbiBjYXNlIEFsbG93ZWRFeHByZXNzaW9ucyBpcyBub3QgcmVjb2duaXNlZCwgdW5kZWZpbmVkIGluIHJldHVybiByZXN1bHRzIGluIHRoZSBkZWZhdWx0IHNldCBvZlxuXHRcdC8vIG9wZXJhdG9ycyBmb3IgdGhlIHR5cGUuXG5cdH1cblx0cmV0dXJuIHJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0dXJuIGFsbG93ZWQgb3BlcmF0b3JzIGZvciB0eXBlIEd1aWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHlcbiAqIEByZXR1cm5zIEFsbG93ZWQgb3BlcmF0b3JzIGZvciB0eXBlIEd1aWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5KCk6IHN0cmluZyB7XG5cdGNvbnN0IGFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkID0gW1wiRVFcIiwgXCJORVwiXTtcblx0cmV0dXJuIGFsbG93ZWRPcGVyYXRvcnNGb3JHdWlkLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGdldE9wZXJhdG9yc0ZvckRhdGVQcm9wZXJ0eShwcm9wZXJ0eVR5cGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Ly8gSW4gY2FzZSBBbGxvd2VkRXhwcmVzc2lvbnMgaXMgbm90IHByb3ZpZGVkIGZvciB0eXBlIEVkbS5EYXRlIHRoZW4gYWxsIHRoZSBkZWZhdWx0XG5cdC8vIG9wZXJhdG9ycyBmb3IgdGhlIHR5cGUgc2hvdWxkIGJlIHJldHVybmVkIGV4Y2x1ZGluZyBzZW1hbnRpYyBvcGVyYXRvcnMgZnJvbSB0aGUgbGlzdC5cblx0Y29uc3QgYURlZmF1bHRPcGVyYXRvcnMgPSBfZ2V0RGVmYXVsdE9wZXJhdG9ycyhwcm9wZXJ0eVR5cGUpO1xuXHRjb25zdCBhTXVsdGlSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5FXCIsIFwiTk9UQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0cmV0dXJuIF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcbn1cblxudHlwZSBQYXJhbWV0ZXJJbmZvID0ge1xuXHRjb250ZXh0UGF0aD86IHN0cmluZztcblx0cGFyYW1ldGVyUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5Pjtcbn07XG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJJbmZvKG1ldGFNb2RlbENvbnRleHQ6IE9EYXRhTWV0YU1vZGVsLCBzQ29udGV4dFBhdGg6IHN0cmluZykge1xuXHRjb25zdCBzUGFyYW1ldGVyQ29udGV4dFBhdGggPSBzQ29udGV4dFBhdGguc3Vic3RyaW5nKDAsIHNDb250ZXh0UGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRjb25zdCBiUmVzdWx0Q29udGV4dCA9IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NQYXJhbWV0ZXJDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdGNvbnN0IG9QYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvID0ge307XG5cdGlmIChiUmVzdWx0Q29udGV4dCAmJiBzUGFyYW1ldGVyQ29udGV4dFBhdGggIT09IHNDb250ZXh0UGF0aCkge1xuXHRcdG9QYXJhbWV0ZXJJbmZvLmNvbnRleHRQYXRoID0gc1BhcmFtZXRlckNvbnRleHRQYXRoO1xuXHRcdG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMobWV0YU1vZGVsQ29udGV4dCwgc1BhcmFtZXRlckNvbnRleHRQYXRoKTtcblx0fVxuXHRyZXR1cm4gb1BhcmFtZXRlckluZm87XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGFkZCB0aGUgc2VsZWN0IE9wdGlvbnMgdG8gZmlsdGVyIGNvbmRpdGlvbnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnNcbiAqIEBwYXJhbSBvUHJvcGVydHlNZXRhZGF0YSBQcm9wZXJ0eSBtZXRhZGF0YSBpbmZvcm1hdGlvblxuICogQHBhcmFtIGFWYWxpZE9wZXJhdG9ycyBPcGVyYXRvcnMgZm9yIGFsbCB0aGUgZGF0YSB0eXBlc1xuICogQHBhcmFtIGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMgT3BlcmF0b3JzIGZvciB0aGUgRGF0ZSB0eXBlXG4gKiBAcGFyYW0gYUN1bXVsYXRpdmVDb25kaXRpb25zIEZpbHRlciBjb25kaXRpb25zXG4gKiBAcGFyYW0gb1NlbGVjdE9wdGlvbiBTZWxlY3RvcHRpb24gb2Ygc2VsZWN0aW9uIHZhcmlhbnRcbiAqIEByZXR1cm5zIFRoZSBmaWx0ZXIgY29uZGl0aW9uc1xuICovXG5mdW5jdGlvbiBhZGRTZWxlY3RPcHRpb25Ub0NvbmRpdGlvbnMoXG5cdG9Qcm9wZXJ0eU1ldGFkYXRhOiB1bmtub3duLFxuXHRhVmFsaWRPcGVyYXRvcnM6IHN0cmluZ1tdLFxuXHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzOiBzdHJpbmdbXSxcblx0YUN1bXVsYXRpdmVDb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0b1NlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uXG4pIHtcblx0Y29uc3Qgb0NvbmRpdGlvbiA9IGdldENvbmRpdGlvbnMob1NlbGVjdE9wdGlvbiwgb1Byb3BlcnR5TWV0YWRhdGEpO1xuXHRpZiAoXG5cdFx0b1NlbGVjdE9wdGlvbj8uU2VtYW50aWNEYXRlcyAmJlxuXHRcdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMgJiZcblx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzLmluZGV4T2Yob1NlbGVjdE9wdGlvbj8uU2VtYW50aWNEYXRlcz8ub3BlcmF0b3IpID4gLTFcblx0KSB7XG5cdFx0Y29uc3Qgc2VtYW50aWNEYXRlcyA9IENvbW1vblV0aWxzLmFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMob1NlbGVjdE9wdGlvbj8uU2VtYW50aWNEYXRlcyk7XG5cdFx0aWYgKHNlbWFudGljRGF0ZXMgJiYgT2JqZWN0LmtleXMoc2VtYW50aWNEYXRlcykubGVuZ3RoID4gMCkge1xuXHRcdFx0YUN1bXVsYXRpdmVDb25kaXRpb25zLnB1c2goc2VtYW50aWNEYXRlcyk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9Db25kaXRpb24pIHtcblx0XHRpZiAoYVZhbGlkT3BlcmF0b3JzLmxlbmd0aCA9PT0gMCB8fCBhVmFsaWRPcGVyYXRvcnMuaW5kZXhPZihvQ29uZGl0aW9uLm9wZXJhdG9yKSA+IC0xKSB7XG5cdFx0XHRhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMucHVzaChvQ29uZGl0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFDdW11bGF0aXZlQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gYWRkIHRoZSBzZW1hbnRpYyBkYXRlcyB0byBmaWx0ZXIgY29uZGl0aW9uc1xuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9uc1xuICogQHBhcmFtIG9TZW1hbnRpY0RhdGVzIFNlbWFudGljIGRhdGUgaW5mb21hdGlvblxuICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zIGNvbnRhaW5pbmcgc2VtYW50aWMgZGF0ZXNcbiAqL1xuXG5mdW5jdGlvbiBhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zKG9TZW1hbnRpY0RhdGVzOiBTZW1hbnRpY0RhdGVDb25maWd1cmF0aW9uKTogQ29uZGl0aW9uT2JqZWN0IHtcblx0Y29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcblx0aWYgKG9TZW1hbnRpY0RhdGVzPy5oaWdoKSB7XG5cdFx0dmFsdWVzLnB1c2gob1NlbWFudGljRGF0ZXM/LmhpZ2gpO1xuXHR9XG5cdGlmIChvU2VtYW50aWNEYXRlcz8ubG93KSB7XG5cdFx0dmFsdWVzLnB1c2gob1NlbWFudGljRGF0ZXM/Lmxvdyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR2YWx1ZXM6IHZhbHVlcyxcblx0XHRvcGVyYXRvcjogb1NlbWFudGljRGF0ZXM/Lm9wZXJhdG9yLFxuXHRcdGlzRW1wdHk6IHVuZGVmaW5lZFxuXHR9O1xufVxuXG5mdW5jdGlvbiBhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdHNTZWxlY3RPcHRpb25Qcm9wOiBzdHJpbmcsXG5cdG9Db25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT4sXG5cdHNDb25kaXRpb25QYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHNDb25kaXRpb25Qcm9wOiBzdHJpbmcsXG5cdG9WYWxpZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5Pixcblx0bWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdGlzUGFyYW1ldGVyOiBib29sZWFuLFxuXHRiSXNGTFBWYWx1ZVByZXNlbnQ/OiBib29sZWFuLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuIHwgc3RyaW5nLFxuXHRvVmlld0RhdGE/OiBvYmplY3Rcbikge1xuXHRsZXQgYUNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdID0gW10sXG5cdFx0YVNlbGVjdE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdLFxuXHRcdGFWYWxpZE9wZXJhdG9yczogc3RyaW5nW10sXG5cdFx0YVNlbWFudGljRGF0ZU9wZXJhdG9yczogc3RyaW5nW10gPSBbXTtcblxuXHRpZiAoaXNQYXJhbWV0ZXIgfHwgTWV0YU1vZGVsRnVuY3Rpb24uaXNQcm9wZXJ0eUZpbHRlcmFibGUobWV0YU1vZGVsQ29udGV4dCwgc0NvbnRleHRQYXRoLCBzQ29uZGl0aW9uUHJvcCwgdHJ1ZSkpIHtcblx0XHRjb25zdCBvUHJvcGVydHlNZXRhZGF0YSA9IG9WYWxpZFByb3BlcnRpZXNbc0NvbmRpdGlvblByb3BdO1xuXHRcdGFTZWxlY3RPcHRpb25zID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNTZWxlY3RPcHRpb25Qcm9wKSBhcyBTZWxlY3RPcHRpb25bXTtcblx0XHRjb25zdCBzZXR0aW5ncyA9IGdldEZpbHRlckNvbmZpZ3VyYXRpb25TZXR0aW5nKG9WaWV3RGF0YSwgc0NvbmRpdGlvblByb3ApO1xuXHRcdGFWYWxpZE9wZXJhdG9ycyA9IGlzUGFyYW1ldGVyID8gW1wiRVFcIl0gOiBDb21tb25VdGlscy5nZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eShzQ29uZGl0aW9uUHJvcCwgc0NvbnRleHRQYXRoLCBtZXRhTW9kZWxDb250ZXh0KTtcblx0XHRpZiAoYlVzZVNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzID0gaXNQYXJhbWV0ZXJcblx0XHRcdFx0PyBbXCJFUVwiXVxuXHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldE9wZXJhdG9yc0ZvclByb3BlcnR5KFxuXHRcdFx0XHRcdFx0c0NvbmRpdGlvblByb3AsXG5cdFx0XHRcdFx0XHRzQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5TWV0YWRhdGE/LiRUeXBlLFxuXHRcdFx0XHRcdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0XHRcdFx0c2V0dGluZ3Ncblx0XHRcdFx0ICApO1xuXHRcdH1cblx0XHQvLyBDcmVhdGUgY29uZGl0aW9ucyBmb3IgYWxsIHRoZSBzZWxlY3RPcHRpb25zIG9mIHRoZSBwcm9wZXJ0eVxuXHRcdGFDb25kaXRpb25zID0gaXNQYXJhbWV0ZXJcblx0XHRcdD8gQ29tbW9uVXRpbHMuYWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zKFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eU1ldGFkYXRhLFxuXHRcdFx0XHRcdGFWYWxpZE9wZXJhdG9ycyxcblx0XHRcdFx0XHRhU2VtYW50aWNEYXRlT3BlcmF0b3JzLFxuXHRcdFx0XHRcdGFDb25kaXRpb25zLFxuXHRcdFx0XHRcdGFTZWxlY3RPcHRpb25zWzBdXG5cdFx0XHQgIClcblx0XHRcdDogYVNlbGVjdE9wdGlvbnMucmVkdWNlKFxuXHRcdFx0XHRcdENvbW1vblV0aWxzLmFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9ucy5iaW5kKG51bGwsIG9Qcm9wZXJ0eU1ldGFkYXRhLCBhVmFsaWRPcGVyYXRvcnMsIGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMpLFxuXHRcdFx0XHRcdGFDb25kaXRpb25zXG5cdFx0XHQgICk7XG5cdFx0aWYgKGFDb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0aWYgKHNDb25kaXRpb25QYXRoKSB7XG5cdFx0XHRcdG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc0NvbmRpdGlvblByb3BdID0gb0NvbmRpdGlvbnMuaGFzT3duUHJvcGVydHkoc0NvbmRpdGlvblBhdGggKyBzQ29uZGl0aW9uUHJvcClcblx0XHRcdFx0XHQ/IG9Db25kaXRpb25zW3NDb25kaXRpb25QYXRoICsgc0NvbmRpdGlvblByb3BdLmNvbmNhdChhQ29uZGl0aW9ucylcblx0XHRcdFx0XHQ6IGFDb25kaXRpb25zO1xuXHRcdFx0fSBlbHNlIGlmIChiSXNGTFBWYWx1ZVByZXNlbnQpIHtcblx0XHRcdFx0Ly8gSWYgRkxQIHZhbHVlcyBhcmUgcHJlc2VudCByZXBsYWNlIGl0IHdpdGggRkxQIHZhbHVlc1xuXHRcdFx0XHRhQ29uZGl0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0ZWxlbWVudFtcImZpbHRlcmVkXCJdID0gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvQ29uZGl0aW9ucy5oYXNPd25Qcm9wZXJ0eShzQ29uZGl0aW9uUHJvcCkpIHtcblx0XHRcdFx0XHRvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUHJvcF0uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0ZWxlbWVudFtcImZpbHRlcmVkXCJdID0gZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdID0gb0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdLmNvbmNhdChhQ29uZGl0aW9ucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdID0gYUNvbmRpdGlvbnM7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Db25kaXRpb25zW3NDb25kaXRpb25Qcm9wXSA9IG9Db25kaXRpb25zLmhhc093blByb3BlcnR5KHNDb25kaXRpb25Qcm9wKVxuXHRcdFx0XHRcdD8gb0NvbmRpdGlvbnNbc0NvbmRpdGlvblByb3BdLmNvbmNhdChhQ29uZGl0aW9ucylcblx0XHRcdFx0XHQ6IGFDb25kaXRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIE1ldGhvZCB0byBjcmVhdGUgdGhlIHNlbWFudGljIGRhdGVzIGZyb20gZmlsdGVyIGNvbmRpdGlvbnNcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9uc1xuICogQHBhcmFtIG9Db25kaXRpb24gRmlsdGVyIGZpZWxkIGNvbmRpdGlvblxuICogQHBhcmFtIHNGaWx0ZXJOYW1lIEZpbHRlciBGaWVsZCBQYXRoXG4gKiBAcmV0dXJucyBUaGUgU2VtYW50aWMgZGF0ZSBjb25kaXRpb25zXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU2VtYW50aWNEYXRlc0Zyb21Db25kaXRpb25zKG9Db25kaXRpb246IENvbmRpdGlvblR5cGUpOiBTZW1hbnRpY0RhdGVDb25maWd1cmF0aW9uIHtcblx0cmV0dXJuIHtcblx0XHRoaWdoOiAob0NvbmRpdGlvbj8udmFsdWVzPy5bMF0gYXMgc3RyaW5nKSB8fCBudWxsLFxuXHRcdGxvdzogKG9Db25kaXRpb24/LnZhbHVlcz8uWzFdIGFzIHN0cmluZykgfHwgbnVsbCxcblx0XHRvcGVyYXRvcjogb0NvbmRpdGlvbj8ub3BlcmF0b3Jcblx0fTtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gUmV0dXJuIHRoZSBmaWx0ZXIgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgZ2V0RmlsdGVyQ29uZmlndXJhdGlvblNldHRpbmdcbiAqIEBwYXJhbSBvVmlld0RhdGEgbWFuaWZlc3QgQ29uZmlndXJhdGlvblxuICogQHBhcmFtIHNQcm9wZXJ0eSBGaWx0ZXIgRmllbGQgUGF0aFxuICogQHJldHVybnMgVGhlIEZpbHRlciBGaWVsZCBDb25maWd1cmF0aW9uXG4gKi9cbnR5cGUgVmlld0RhdGEgPSB7XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufTtcbmZ1bmN0aW9uIGdldEZpbHRlckNvbmZpZ3VyYXRpb25TZXR0aW5nKG9WaWV3RGF0YTogVmlld0RhdGEgPSB7fSwgc1Byb3BlcnR5OiBzdHJpbmcpIHtcblx0Y29uc3Qgb0NvbmZpZyA9IG9WaWV3RGF0YT8uY29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbnN0IGZpbHRlckNvbmZpZyA9XG5cdFx0b0NvbmZpZyAmJiAob0NvbmZpZ1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25GaWVsZHNcIl0/LmZpbHRlckZpZWxkcyBhcyBSZWNvcmQ8c3RyaW5nLCB7IHNldHRpbmdzOiBzdHJpbmcgfT4pO1xuXHRyZXR1cm4gZmlsdGVyQ29uZmlnPy5bc1Byb3BlcnR5XSA/IGZpbHRlckNvbmZpZ1tzUHJvcGVydHldPy5zZXR0aW5ncyA6IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGFkZFNlbGVjdGlvblZhcmlhbnRUb0NvbmRpdGlvbnMoXG5cdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRvQ29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+LFxuXHRvTWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHNDb250ZXh0UGF0aDogc3RyaW5nLFxuXHRiSXNGTFBWYWx1ZXM/OiBib29sZWFuLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuLFxuXHRvVmlld0RhdGE/OiBvYmplY3Rcbikge1xuXHRjb25zdCBhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpLFxuXHRcdG9WYWxpZFByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbENvbnRleHQsIHNDb250ZXh0UGF0aCksXG5cdFx0YU1ldGFkYXRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob1ZhbGlkUHJvcGVydGllcyksXG5cdFx0b1BhcmFtZXRlckluZm8gPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJJbmZvKG9NZXRhTW9kZWxDb250ZXh0LCBzQ29udGV4dFBhdGgpLFxuXHRcdHNQYXJhbWV0ZXJDb250ZXh0UGF0aCA9IG9QYXJhbWV0ZXJJbmZvLmNvbnRleHRQYXRoLFxuXHRcdG9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMgPSBvUGFyYW1ldGVySW5mby5wYXJhbWV0ZXJQcm9wZXJ0aWVzO1xuXG5cdGlmIChzUGFyYW1ldGVyQ29udGV4dFBhdGggIT09IHVuZGVmaW5lZCAmJiBvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9WYWxpZFBhcmFtZXRlclByb3BlcnRpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBhTWV0YWRhdGFQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob1ZhbGlkUGFyYW1ldGVyUHJvcGVydGllcyk7XG5cdFx0YU1ldGFkYXRhUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFQYXJhbWV0ZXI6IHN0cmluZykge1xuXHRcdFx0bGV0IHNTZWxlY3RPcHRpb25OYW1lO1xuXHRcdFx0aWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgJFBhcmFtZXRlci4ke3NNZXRhZGF0YVBhcmFtZXRlcn1gKSkge1xuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGAkUGFyYW1ldGVyLiR7c01ldGFkYXRhUGFyYW1ldGVyfWA7XG5cdFx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhzTWV0YWRhdGFQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gc01ldGFkYXRhUGFyYW1ldGVyO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0c01ldGFkYXRhUGFyYW1ldGVyLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJlxuXHRcdFx0XHRhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoYCRQYXJhbWV0ZXIuJHtzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCl9YClcblx0XHRcdCkge1xuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGAkUGFyYW1ldGVyLiR7c01ldGFkYXRhUGFyYW1ldGVyLnNsaWNlKDIsIHNNZXRhZGF0YVBhcmFtZXRlci5sZW5ndGgpfWA7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRzTWV0YWRhdGFQYXJhbWV0ZXIuc3RhcnRzV2l0aChcIlBfXCIpICYmXG5cdFx0XHRcdGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCkpXG5cdFx0XHQpIHtcblx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBzTWV0YWRhdGFQYXJhbWV0ZXIuc2xpY2UoMiwgc01ldGFkYXRhUGFyYW1ldGVyLmxlbmd0aCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgJFBhcmFtZXRlci5QXyR7c01ldGFkYXRhUGFyYW1ldGVyfWApKSB7XG5cdFx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gYCRQYXJhbWV0ZXIuUF8ke3NNZXRhZGF0YVBhcmFtZXRlcn1gO1xuXHRcdFx0fSBlbHNlIGlmIChhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoYFBfJHtzTWV0YWRhdGFQYXJhbWV0ZXJ9YCkpIHtcblx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBgUF8ke3NNZXRhZGF0YVBhcmFtZXRlcn1gO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1NlbGVjdE9wdGlvbk5hbWUpIHtcblx0XHRcdFx0YWRkU2VsZWN0T3B0aW9uc1RvQ29uZGl0aW9ucyhcblx0XHRcdFx0XHRzUGFyYW1ldGVyQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUsXG5cdFx0XHRcdFx0b0NvbmRpdGlvbnMsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdHNNZXRhZGF0YVBhcmFtZXRlcixcblx0XHRcdFx0XHRvVmFsaWRQYXJhbWV0ZXJQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0YklzRkxQVmFsdWVzLFxuXHRcdFx0XHRcdGJVc2VTZW1hbnRpY0RhdGVSYW5nZSxcblx0XHRcdFx0XHRvVmlld0RhdGFcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRhTWV0YWRhdFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc01ldGFkYXRhUHJvcGVydHk6IHN0cmluZykge1xuXHRcdGxldCBzU2VsZWN0T3B0aW9uTmFtZTtcblx0XHRpZiAoYVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKHNNZXRhZGF0YVByb3BlcnR5KSkge1xuXHRcdFx0c1NlbGVjdE9wdGlvbk5hbWUgPSBzTWV0YWRhdGFQcm9wZXJ0eTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0c01ldGFkYXRhUHJvcGVydHkuc3RhcnRzV2l0aChcIlBfXCIpICYmXG5cdFx0XHRhU2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMoc01ldGFkYXRhUHJvcGVydHkuc2xpY2UoMiwgc01ldGFkYXRhUHJvcGVydHkubGVuZ3RoKSlcblx0XHQpIHtcblx0XHRcdHNTZWxlY3RPcHRpb25OYW1lID0gc01ldGFkYXRhUHJvcGVydHkuc2xpY2UoMiwgc01ldGFkYXRhUHJvcGVydHkubGVuZ3RoKTtcblx0XHR9IGVsc2UgaWYgKGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgUF8ke3NNZXRhZGF0YVByb3BlcnR5fWApKSB7XG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGBQXyR7c01ldGFkYXRhUHJvcGVydHl9YDtcblx0XHR9XG5cdFx0aWYgKHNTZWxlY3RPcHRpb25OYW1lKSB7XG5cdFx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0XHRzQ29udGV4dFBhdGgsXG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdFx0b0NvbmRpdGlvbnMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0c01ldGFkYXRhUHJvcGVydHksXG5cdFx0XHRcdG9WYWxpZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9NZXRhTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YklzRkxQVmFsdWVzLFxuXHRcdFx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0XHRcdG9WaWV3RGF0YVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xuXG5cdGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChzU2VsZWN0T3B0aW9uOiBzdHJpbmcpIHtcblx0XHRpZiAoc1NlbGVjdE9wdGlvbi5pbmRleE9mKFwiLlwiKSA+IDAgJiYgIXNTZWxlY3RPcHRpb24uaW5jbHVkZXMoXCIkUGFyYW1ldGVyXCIpKSB7XG5cdFx0XHRjb25zdCBzUmVwbGFjZWRPcHRpb24gPSBzU2VsZWN0T3B0aW9uLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKTtcblx0XHRcdGNvbnN0IHNGdWxsQ29udGV4dFBhdGggPSBgLyR7c1JlcGxhY2VkT3B0aW9ufWAuc3RhcnRzV2l0aChzQ29udGV4dFBhdGgpXG5cdFx0XHRcdD8gYC8ke3NSZXBsYWNlZE9wdGlvbn1gXG5cdFx0XHRcdDogYCR7c0NvbnRleHRQYXRofS8ke3NSZXBsYWNlZE9wdGlvbn1gOyAvLyBjaGVjayBpZiB0aGUgZnVsbCBwYXRoLCBlZyBTYWxlc09yZGVyTWFuYWdlLl9JdGVtLk1hdGVyaWFsIGV4aXN0cyBpbiB0aGUgbWV0YW1vZGVsXG5cdFx0XHRpZiAob01ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KHNGdWxsQ29udGV4dFBhdGgucmVwbGFjZShcIlBfXCIsIFwiXCIpKSkge1xuXHRcdFx0XHRfY3JlYXRlQ29uZGl0aW9uc0Zvck5hdlByb3BlcnRpZXMoXG5cdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRzQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdFx0c1NlbGVjdE9wdGlvbixcblx0XHRcdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvQ29uZGl0aW9ucyxcblx0XHRcdFx0XHRiSXNGTFBWYWx1ZXMsXG5cdFx0XHRcdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0XHRcdG9WaWV3RGF0YVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBvQ29uZGl0aW9ucztcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNvbmRpdGlvbnNGb3JOYXZQcm9wZXJ0aWVzKFxuXHRzRnVsbENvbnRleHRQYXRoOiBzdHJpbmcsXG5cdHNNYWluRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCxcblx0c1NlbGVjdE9wdGlvbjogc3RyaW5nLFxuXHRvTWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdG9Db25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT4sXG5cdGJJc0ZMUFZhbHVlUHJlc2VudD86IGJvb2xlYW4sXG5cdGJTZW1hbnRpY0RhdGVSYW5nZT86IGJvb2xlYW4sXG5cdG9WaWV3RGF0YT86IG9iamVjdFxuKSB7XG5cdGxldCBhTmF2T2JqZWN0TmFtZXMgPSBzU2VsZWN0T3B0aW9uLnNwbGl0KFwiLlwiKTtcblx0Ly8gRWc6IFwiU2FsZXNPcmRlck1hbmFnZS5fSXRlbS5fTWF0ZXJpYWwuTWF0ZXJpYWxcIiBvciBcIl9JdGVtLk1hdGVyaWFsXCJcblx0aWYgKGAvJHtzU2VsZWN0T3B0aW9uLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKX1gLnN0YXJ0c1dpdGgoc01haW5FbnRpdHlTZXRQYXRoKSkge1xuXHRcdGNvbnN0IHNGdWxsUGF0aCA9IGAvJHtzU2VsZWN0T3B0aW9ufWAucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpLFxuXHRcdFx0c05hdlBhdGggPSBzRnVsbFBhdGgucmVwbGFjZShgJHtzTWFpbkVudGl0eVNldFBhdGh9L2AsIFwiXCIpO1xuXHRcdGFOYXZPYmplY3ROYW1lcyA9IHNOYXZQYXRoLnNwbGl0KFwiL1wiKTtcblx0fVxuXHRsZXQgc0NvbmRpdGlvblBhdGggPSBcIlwiO1xuXHRjb25zdCBzUHJvcGVydHlOYW1lID0gYU5hdk9iamVjdE5hbWVzW2FOYXZPYmplY3ROYW1lcy5sZW5ndGggLSAxXTsgLy8gTWF0ZXJpYWwgZnJvbSBTYWxlc09yZGVyTWFuYWdlLl9JdGVtLk1hdGVyaWFsXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYU5hdk9iamVjdE5hbWVzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdGlmIChvTWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c01haW5FbnRpdHlTZXRQYXRofS8ke2FOYXZPYmplY3ROYW1lc1tpXS5yZXBsYWNlKFwiUF9cIiwgXCJcIil9YCkuJGlzQ29sbGVjdGlvbikge1xuXHRcdFx0c0NvbmRpdGlvblBhdGggPSBgJHtzQ29uZGl0aW9uUGF0aCArIGFOYXZPYmplY3ROYW1lc1tpXX0qL2A7IC8vIF9JdGVtKi8gaW4gY2FzZSBvZiAxOm4gY2FyZGluYWxpdHlcblx0XHR9IGVsc2Uge1xuXHRcdFx0c0NvbmRpdGlvblBhdGggPSBgJHtzQ29uZGl0aW9uUGF0aCArIGFOYXZPYmplY3ROYW1lc1tpXX0vYDsgLy8gX0l0ZW0vIGluIGNhc2Ugb2YgMToxIGNhcmRpbmFsaXR5XG5cdFx0fVxuXHRcdHNNYWluRW50aXR5U2V0UGF0aCA9IGAke3NNYWluRW50aXR5U2V0UGF0aH0vJHthTmF2T2JqZWN0TmFtZXNbaV19YDtcblx0fVxuXHRjb25zdCBzTmF2UHJvcGVydHlQYXRoID0gc0Z1bGxDb250ZXh0UGF0aC5zbGljZSgwLCBzRnVsbENvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0b1ZhbGlkUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsQ29udGV4dCwgc05hdlByb3BlcnR5UGF0aCksXG5cdFx0YVNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0bGV0IHNTZWxlY3RPcHRpb25OYW1lID0gc1Byb3BlcnR5TmFtZTtcblx0aWYgKG9WYWxpZFByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IHNQcm9wZXJ0eU5hbWU7XG5cdH0gZWxzZSBpZiAoc1Byb3BlcnR5TmFtZS5zdGFydHNXaXRoKFwiUF9cIikgJiYgb1ZhbGlkUHJvcGVydGllc1tzUHJvcGVydHlOYW1lLnJlcGxhY2UoXCJQX1wiLCBcIlwiKV0pIHtcblx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IHNQcm9wZXJ0eU5hbWUucmVwbGFjZShcIlBfXCIsIFwiXCIpO1xuXHR9IGVsc2UgaWYgKG9WYWxpZFByb3BlcnRpZXNbYFBfJHtzUHJvcGVydHlOYW1lfWBdICYmIGFTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhgUF8ke3NQcm9wZXJ0eU5hbWV9YCkpIHtcblx0XHRzU2VsZWN0T3B0aW9uTmFtZSA9IGBQXyR7c1Byb3BlcnR5TmFtZX1gO1xuXHR9XG5cdGlmIChzUHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJiBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUGF0aCArIHNTZWxlY3RPcHRpb25OYW1lXSkge1xuXHRcdC8vIGlmIHRoZXJlIGlzIG5vIFNhbGVzT3JkZXJNYW5hZ2UuX0l0ZW0uTWF0ZXJpYWwgeWV0IGluIHRoZSBvQ29uZGl0aW9uc1xuXHR9IGVsc2UgaWYgKCFzUHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoXCJQX1wiKSAmJiBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUGF0aCArIHNTZWxlY3RPcHRpb25OYW1lXSkge1xuXHRcdGRlbGV0ZSBvQ29uZGl0aW9uc1tzQ29uZGl0aW9uUGF0aCArIHNTZWxlY3RPcHRpb25OYW1lXTtcblx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0c05hdlByb3BlcnR5UGF0aCxcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0c1NlbGVjdE9wdGlvbixcblx0XHRcdG9Db25kaXRpb25zLFxuXHRcdFx0c0NvbmRpdGlvblBhdGgsXG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdG9WYWxpZFByb3BlcnRpZXMsXG5cdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdGZhbHNlLFxuXHRcdFx0YklzRkxQVmFsdWVQcmVzZW50LFxuXHRcdFx0YlNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0b1ZpZXdEYXRhXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRhZGRTZWxlY3RPcHRpb25zVG9Db25kaXRpb25zKFxuXHRcdFx0c05hdlByb3BlcnR5UGF0aCxcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0c1NlbGVjdE9wdGlvbixcblx0XHRcdG9Db25kaXRpb25zLFxuXHRcdFx0c0NvbmRpdGlvblBhdGgsXG5cdFx0XHRzU2VsZWN0T3B0aW9uTmFtZSxcblx0XHRcdG9WYWxpZFByb3BlcnRpZXMsXG5cdFx0XHRvTWV0YU1vZGVsQ29udGV4dCxcblx0XHRcdGZhbHNlLFxuXHRcdFx0YklzRkxQVmFsdWVQcmVzZW50LFxuXHRcdFx0YlNlbWFudGljRGF0ZVJhbmdlLFxuXHRcdFx0b1ZpZXdEYXRhXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudChvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgbVBhZ2VDb250ZXh0OiB1bmtub3duW10sIG9WaWV3OiBWaWV3KSB7XG5cdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRjb25zdCBvTmF2aWdhdGlvblNlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldE5hdmlnYXRpb25TZXJ2aWNlKCk7XG5cdHJldHVybiBvTmF2aWdhdGlvblNlcnZpY2UubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQobVBhZ2VDb250ZXh0LCBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKSk7XG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVybmFsU3RhdGVGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KFxuXHRvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCxcblx0bUZpbHRlcnM6IHtcblx0XHRmaWx0ZXJDb25kaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3Q+Pjtcblx0XHRmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR9LFxuXHRvVGFyZ2V0SW5mbzoge1xuXHRcdHByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHR9LFxuXHRvRmlsdGVyQmFyPzogRmlsdGVyQmFyXG4pIHtcblx0bGV0IHNGaWx0ZXI6IHN0cmluZztcblx0Y29uc3QgZm5HZXRTaWduQW5kT3B0aW9uID0gZnVuY3Rpb24gKHNPcGVyYXRvcjogc3RyaW5nLCBzTG93VmFsdWU6IHN0cmluZywgc0hpZ2hWYWx1ZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1NlbGVjdE9wdGlvblN0YXRlID0ge1xuXHRcdFx0b3B0aW9uOiBcIlwiLFxuXHRcdFx0c2lnbjogXCJJXCIsXG5cdFx0XHRsb3c6IHNMb3dWYWx1ZSxcblx0XHRcdGhpZ2g6IHNIaWdoVmFsdWVcblx0XHR9O1xuXHRcdHN3aXRjaCAoc09wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiQ29udGFpbnNcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiQ1BcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU3RhcnRzV2l0aFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUubG93ICs9IFwiKlwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFbmRzV2l0aFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUubG93ID0gYCoke29TZWxlY3RPcHRpb25TdGF0ZS5sb3d9YDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdGNhc2UgXCJMRVwiOlxuXHRcdFx0Y2FzZSBcIkxUXCI6XG5cdFx0XHRjYXNlIFwiR1RcIjpcblx0XHRcdGNhc2UgXCJORVwiOlxuXHRcdFx0Y2FzZSBcIkVRXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBzT3BlcmF0b3I7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkRBVEVcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiRVFcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiREFURVJBTkdFXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkJUXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkZST01cIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiR0VcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiVE9cIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiTEVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRUVRXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkVRXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVtcHR5XCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkVRXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgPSBcIlwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RDb250YWluc1wiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJDUFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOT1RCVFwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJCVFwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RTdGFydHNXaXRoXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgKz0gXCIqXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5zaWduID0gXCJFXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdEVuZHNXaXRoXCI6XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5vcHRpb24gPSBcIkNQXCI7XG5cdFx0XHRcdG9TZWxlY3RPcHRpb25TdGF0ZS5sb3cgPSBgKiR7b1NlbGVjdE9wdGlvblN0YXRlLmxvd31gO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUuc2lnbiA9IFwiRVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RFbXB0eVwiOlxuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUub3B0aW9uID0gXCJORVwiO1xuXHRcdFx0XHRvU2VsZWN0T3B0aW9uU3RhdGUubG93ID0gXCJcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UTEVcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiTEVcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UR0VcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiR0VcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UTFRcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiTFRcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTk9UR1RcIjpcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLm9wdGlvbiA9IFwiR1RcIjtcblx0XHRcdFx0b1NlbGVjdE9wdGlvblN0YXRlLnNpZ24gPSBcIkVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cud2FybmluZyhgJHtzT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWQuICR7c0ZpbHRlcn0gY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBuYXZpZ2F0aW9uIGNvbnRleHRgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxlY3RPcHRpb25TdGF0ZTtcblx0fTtcblx0Y29uc3Qgb0ZpbHRlckNvbmRpdGlvbnMgPSBtRmlsdGVycy5maWx0ZXJDb25kaXRpb25zO1xuXHRjb25zdCBvRmlsdGVyc1dpdGhvdXRDb25mbGljdCA9IG1GaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QgPyBtRmlsdGVycy5maWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0IDoge307XG5cdGNvbnN0IG9UYWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgPSBvVGFyZ2V0SW5mby5wcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0ID8gb1RhcmdldEluZm8ucHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA6IHt9O1xuXHRjb25zdCBhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50ID0gZnVuY3Rpb24gKHNlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIHNGaWx0ZXJOYW1lOiBzdHJpbmcsIHNQYXRoPzogc3RyaW5nKSB7XG5cdFx0Y29uc3QgYUNvbmRpdGlvbnMgPSBvRmlsdGVyQ29uZGl0aW9uc1tzRmlsdGVyTmFtZV07XG5cdFx0Y29uc3Qgb1Byb3BlcnR5SW5mbyA9IG9GaWx0ZXJCYXIgJiYgb0ZpbHRlckJhci5nZXRQcm9wZXJ0eUhlbHBlcigpLmdldFByb3BlcnR5KHNGaWx0ZXJOYW1lKTtcblx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IG9Qcm9wZXJ0eUluZm8/LnR5cGVDb25maWc7XG5cdFx0Y29uc3Qgb1R5cGVVdGlsID0gb0ZpbHRlckJhciAmJiBvRmlsdGVyQmFyLmdldENvbnRyb2xEZWxlZ2F0ZSgpLmdldFR5cGVVdGlsKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW0gaW4gYUNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG9Db25kaXRpb24gPSBhQ29uZGl0aW9uc1tpdGVtXTtcblxuXHRcdFx0bGV0IG9wdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gXCJcIixcblx0XHRcdFx0c2lnbiA9IFwiSVwiLFxuXHRcdFx0XHRsb3cgPSBcIlwiLFxuXHRcdFx0XHRoaWdoID0gbnVsbCxcblx0XHRcdFx0c2VtYW50aWNEYXRlcztcblxuXHRcdFx0Y29uc3Qgb09wZXJhdG9yID0gRmlsdGVyT3BlcmF0b3JVdGlsLmdldE9wZXJhdG9yKG9Db25kaXRpb24ub3BlcmF0b3IpO1xuXHRcdFx0aWYgKG9PcGVyYXRvciBpbnN0YW5jZW9mIFJhbmdlT3BlcmF0b3IpIHtcblx0XHRcdFx0c2VtYW50aWNEYXRlcyA9IENvbW1vblV0aWxzLmNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9ucyhvQ29uZGl0aW9uKTtcblx0XHRcdFx0Ly8gaGFuZGxpbmcgb2YgRGF0ZSBSYW5nZU9wZXJhdG9yc1xuXHRcdFx0XHRjb25zdCBvTW9kZWxGaWx0ZXIgPSBvT3BlcmF0b3IuZ2V0TW9kZWxGaWx0ZXIoXG5cdFx0XHRcdFx0b0NvbmRpdGlvbixcblx0XHRcdFx0XHRzRmlsdGVyTmFtZSxcblx0XHRcdFx0XHRvVHlwZUNvbmZpZz8udHlwZUluc3RhbmNlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG9UeXBlQ29uZmlnPy5iYXNlVHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoIW9Nb2RlbEZpbHRlcj8uZ2V0RmlsdGVycygpICYmICFvTW9kZWxGaWx0ZXI/LmdldEZpbHRlcnMoKT8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0c2lnbiA9IG9PcGVyYXRvci5leGNsdWRlID8gXCJFXCIgOiBcIklcIjtcblx0XHRcdFx0XHRsb3cgPSBvVHlwZVV0aWwuZXh0ZXJuYWxpemVWYWx1ZShvTW9kZWxGaWx0ZXIuZ2V0VmFsdWUxKCksIG9UeXBlQ29uZmlnLnR5cGVJbnN0YW5jZSk7XG5cdFx0XHRcdFx0aGlnaCA9IG9UeXBlVXRpbC5leHRlcm5hbGl6ZVZhbHVlKG9Nb2RlbEZpbHRlci5nZXRWYWx1ZTIoKSwgb1R5cGVDb25maWcudHlwZUluc3RhbmNlKTtcblx0XHRcdFx0XHRvcHRpb24gPSBvTW9kZWxGaWx0ZXIuZ2V0T3BlcmF0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYVNlbWFudGljRGF0ZU9wc0V4dCA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTdXBwb3J0ZWRPcGVyYXRpb25zKCk7XG5cdFx0XHRcdGlmIChhU2VtYW50aWNEYXRlT3BzRXh0LmluY2x1ZGVzKG9Db25kaXRpb24/Lm9wZXJhdG9yKSkge1xuXHRcdFx0XHRcdHNlbWFudGljRGF0ZXMgPSBDb21tb25VdGlscy5jcmVhdGVTZW1hbnRpY0RhdGVzRnJvbUNvbmRpdGlvbnMob0NvbmRpdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdmFsdWUxID0gKG9Db25kaXRpb24udmFsdWVzWzBdICYmIG9Db25kaXRpb24udmFsdWVzWzBdLnRvU3RyaW5nKCkpIHx8IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHZhbHVlMiA9IChvQ29uZGl0aW9uLnZhbHVlc1sxXSAmJiBvQ29uZGl0aW9uLnZhbHVlc1sxXS50b1N0cmluZygpKSB8fCBudWxsO1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0T3B0aW9uID0gZm5HZXRTaWduQW5kT3B0aW9uKG9Db25kaXRpb24ub3BlcmF0b3IsIHZhbHVlMSwgdmFsdWUyKTtcblx0XHRcdFx0c2lnbiA9IG9PcGVyYXRvcj8uZXhjbHVkZSA/IFwiRVwiIDogXCJJXCI7XG5cdFx0XHRcdGxvdyA9IG9TZWxlY3RPcHRpb24/Lmxvdztcblx0XHRcdFx0aGlnaCA9IG9TZWxlY3RPcHRpb24/LmhpZ2g7XG5cdFx0XHRcdG9wdGlvbiA9IG9TZWxlY3RPcHRpb24/Lm9wdGlvbjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9wdGlvbiAmJiBzZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQYXRoID8gc1BhdGggOiBzRmlsdGVyTmFtZSwgc2lnbiwgb3B0aW9uLCBsb3csIGhpZ2gsIHVuZGVmaW5lZCwgc2VtYW50aWNEYXRlcyk7XG5cdFx0XHR9IGVsc2UgaWYgKG9wdGlvbikge1xuXHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUGF0aCA/IHNQYXRoIDogc0ZpbHRlck5hbWUsIHNpZ24sIG9wdGlvbiwgbG93LCBoaWdoKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Zm9yIChzRmlsdGVyIGluIG9GaWx0ZXJDb25kaXRpb25zKSB7XG5cdFx0Ly8gb25seSBhZGQgdGhlIGZpbHRlciB2YWx1ZXMgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgU1YgYWxyZWFkeVxuXHRcdGlmICghb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKHNGaWx0ZXIpKSB7XG5cdFx0XHQvLyBUT0RPIDogY3VzdG9tIGZpbHRlcnMgc2hvdWxkIGJlIGlnbm9yZWQgbW9yZSBnZW5lcmljYWxseVxuXHRcdFx0aWYgKHNGaWx0ZXIgPT09IFwiJGVkaXRTdGF0ZVwiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0YWRkRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudChvU2VsZWN0aW9uVmFyaWFudCwgc0ZpbHRlcik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChvVGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0ICYmIHNGaWx0ZXIgaW4gb1RhYmxlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCkge1xuXHRcdFx0XHRhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50LCBzRmlsdGVyLCBvVGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0W3NGaWx0ZXJdKTtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHByb3BlcnR5IHdhcyB3aXRob3V0IGNvbmZsaWN0IGluIHBhZ2UgY29udGV4dCB0aGVuIGFkZCBwYXRoIGZyb20gcGFnZSBjb250ZXh0IHRvIFNWXG5cdFx0XHRpZiAoc0ZpbHRlciBpbiBvRmlsdGVyc1dpdGhvdXRDb25mbGljdCkge1xuXHRcdFx0XHRhZGRGaWx0ZXJzVG9TZWxlY3Rpb25WYXJpYW50KG9TZWxlY3Rpb25WYXJpYW50LCBzRmlsdGVyLCBvRmlsdGVyc1dpdGhvdXRDb25mbGljdFtzRmlsdGVyXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcbn1cblxuZnVuY3Rpb24gaXNTdGlja3lFZGl0TW9kZShvQ29udHJvbDogQ29udHJvbCkge1xuXHRjb25zdCBiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvQ29udHJvbC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgYlVJRWRpdGFibGUgPSBvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdHJldHVybiBiSXNTdGlja3lNb2RlICYmIGJVSUVkaXRhYmxlO1xufVxuXG4vKipcbiAqIEBwYXJhbSBhTWFuZGF0b3J5RmlsdGVyRmllbGRzXG4gKiBAcGFyYW0gb1NlbGVjdGlvblZhcmlhbnRcbiAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzXG4gKi9cbmZ1bmN0aW9uIGFkZERlZmF1bHREaXNwbGF5Q3VycmVuY3koXG5cdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHM6IEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+W10sXG5cdG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzOiBTZWxlY3Rpb25WYXJpYW50XG4pIHtcblx0aWYgKG9TZWxlY3Rpb25WYXJpYW50ICYmIGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMgJiYgYU1hbmRhdG9yeUZpbHRlckZpZWxkcy5sZW5ndGgpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGFTVk9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihcIkRpc3BsYXlDdXJyZW5jeVwiKSxcblx0XHRcdFx0YURlZmF1bHRTVk9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHMgJiYgb1NlbGVjdGlvblZhcmlhbnREZWZhdWx0cy5nZXRTZWxlY3RPcHRpb24oXCJEaXNwbGF5Q3VycmVuY3lcIik7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHNbaV0uJFByb3BlcnR5UGF0aCA9PT0gXCJEaXNwbGF5Q3VycmVuY3lcIiAmJlxuXHRcdFx0XHQoIWFTVk9wdGlvbiB8fCAhYVNWT3B0aW9uLmxlbmd0aCkgJiZcblx0XHRcdFx0YURlZmF1bHRTVk9wdGlvbiAmJlxuXHRcdFx0XHRhRGVmYXVsdFNWT3B0aW9uLmxlbmd0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbiA9IGFEZWZhdWx0U1ZPcHRpb25bMF07XG5cdFx0XHRcdGNvbnN0IHNTaWduID0gZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uW1wiU2lnblwiXTtcblx0XHRcdFx0Y29uc3Qgc09wdGlvbiA9IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbltcIk9wdGlvblwiXTtcblx0XHRcdFx0Y29uc3Qgc0xvdyA9IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbltcIkxvd1wiXTtcblx0XHRcdFx0Y29uc3Qgc0hpZ2ggPSBkaXNwbGF5Q3VycmVuY3lTZWxlY3RPcHRpb25bXCJIaWdoXCJdO1xuXHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJEaXNwbGF5Q3VycmVuY3lcIiwgc1NpZ24sIHNPcHRpb24sIHNMb3csIHNIaWdoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxudHlwZSBVc2VyRGVmYXVsdFBhcmFtZXRlciA9IHtcblx0JE5hbWU6IHN0cmluZztcblx0Z2V0UGF0aD8oKTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHVzZXIgZGVmYXVsdHMgZnJvbSB0aGUgc3RhcnR1cCBhcHAgc3RhdGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIHN0YXJ0dXAgcGFyYW1ldGVyIGFuZCBzZXRzIHRoZW0gdG8gYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudFxuICogQHBhcmFtIGFQYXJhbWV0ZXJzXG4gKiBAcGFyYW0gb01vZGVsXG4gKiBAcGFyYW0gYklzQWN0aW9uXG4gKiBAcGFyYW0gYklzQ3JlYXRlXG4gKiBAcGFyYW0gb0FjdGlvbkRlZmF1bHRWYWx1ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0VXNlckRlZmF1bHRzKFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGFQYXJhbWV0ZXJzOiBVc2VyRGVmYXVsdFBhcmFtZXRlcltdLFxuXHRvTW9kZWw6IEpTT05Nb2RlbCB8IE9EYXRhVjRDb250ZXh0LFxuXHRiSXNBY3Rpb246IGJvb2xlYW4sXG5cdGJJc0NyZWF0ZT86IGJvb2xlYW4sXG5cdG9BY3Rpb25EZWZhdWx0VmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9Db21wb25lbnREYXRhID0gb0FwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzID0gKG9Db21wb25lbnREYXRhICYmIG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fSxcblx0XHRvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRjb25zdCBvU3RhcnR1cEFwcFN0YXRlID0gYXdhaXQgb1NoZWxsU2VydmljZXMuZ2V0U3RhcnR1cEFwcFN0YXRlKG9BcHBDb21wb25lbnQpO1xuXHRjb25zdCBvRGF0YSA9IG9TdGFydHVwQXBwU3RhdGU/LmdldERhdGEoKSB8fCB7fSxcblx0XHRhRXh0ZW5kZWRQYXJhbWV0ZXJzID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fCBbXTtcblx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAob1BhcmFtZXRlcikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eU5hbWUgPSBiSXNBY3Rpb25cblx0XHRcdD8gYC8ke29QYXJhbWV0ZXIuJE5hbWV9YFxuXHRcdFx0OiAob1BhcmFtZXRlci5nZXRQYXRoPy4oKS5zbGljZShvUGFyYW1ldGVyLmdldFBhdGgoKS5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IHNQYXJhbWV0ZXJOYW1lID0gYklzQWN0aW9uID8gc1Byb3BlcnR5TmFtZS5zbGljZSgxKSA6IHNQcm9wZXJ0eU5hbWU7XG5cdFx0aWYgKG9BY3Rpb25EZWZhdWx0VmFsdWVzICYmIGJJc0NyZWF0ZSkge1xuXHRcdFx0aWYgKG9BY3Rpb25EZWZhdWx0VmFsdWVzW3NQYXJhbWV0ZXJOYW1lXSkge1xuXHRcdFx0XHRvTW9kZWwuc2V0UHJvcGVydHkoc1Byb3BlcnR5TmFtZSwgb0FjdGlvbkRlZmF1bHRWYWx1ZXNbc1BhcmFtZXRlck5hbWVdKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV0pIHtcblx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvU3RhcnR1cFBhcmFtZXRlcnNbc1BhcmFtZXRlck5hbWVdWzBdKTtcblx0XHR9IGVsc2UgaWYgKGFFeHRlbmRlZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBvRXh0ZW5kZWRQYXJhbWV0ZXIgb2YgYUV4dGVuZGVkUGFyYW1ldGVycykge1xuXHRcdFx0XHRpZiAob0V4dGVuZGVkUGFyYW1ldGVyLlByb3BlcnR5TmFtZSA9PT0gc1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdFx0XHRjb25zdCBvUmFuZ2UgPSBvRXh0ZW5kZWRQYXJhbWV0ZXIuUmFuZ2VzLmxlbmd0aFxuXHRcdFx0XHRcdFx0PyBvRXh0ZW5kZWRQYXJhbWV0ZXIuUmFuZ2VzW29FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXMubGVuZ3RoIC0gMV1cblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChvUmFuZ2UgJiYgb1JhbmdlLlNpZ24gPT09IFwiSVwiICYmIG9SYW5nZS5PcHRpb24gPT09IFwiRVFcIikge1xuXHRcdFx0XHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9SYW5nZS5Mb3cpOyAvLyBoaWdoIGlzIGlnbm9yZWQgd2hlbiBPcHRpb249RVFcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgdHlwZSBJbmJvdW5kUGFyYW1ldGVyID0ge1xuXHR1c2VGb3JDcmVhdGU6IGJvb2xlYW47XG59O1xuZnVuY3Rpb24gZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZShcblx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+LFxuXHRvSW5ib3VuZFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBJbmJvdW5kUGFyYW1ldGVyPlxuKSB7XG5cdGNvbnN0IG9JbmJvdW5kcyA9IG9JbmJvdW5kUGFyYW1ldGVycyxcblx0XHRhQ3JlYXRlUGFyYW1ldGVycyA9XG5cdFx0XHRvSW5ib3VuZHMgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IE9iamVjdC5rZXlzKG9JbmJvdW5kcykuZmlsdGVyKGZ1bmN0aW9uIChzUGFyYW1ldGVyOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW5ib3VuZHNbc1BhcmFtZXRlcl0udXNlRm9yQ3JlYXRlO1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogW107XG5cdGxldCBvUmV0O1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFDcmVhdGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3Qgc0NyZWF0ZVBhcmFtZXRlciA9IGFDcmVhdGVQYXJhbWV0ZXJzW2ldO1xuXHRcdGNvbnN0IGFWYWx1ZXMgPSBvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW3NDcmVhdGVQYXJhbWV0ZXJdO1xuXHRcdGlmIChhVmFsdWVzICYmIGFWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRvUmV0ID0gb1JldCB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRcdFx0b1JldFtzQ3JlYXRlUGFyYW1ldGVyXSA9IGFWYWx1ZXNbMF07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvUmV0O1xufVxudHlwZSBPdXRib3VuZFBhcmFtZXRlciA9IHtcblx0cGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgT3V0Ym91bmRQYXJhbWV0ZXJWYWx1ZT47XG5cdHNlbWFudGljT2JqZWN0Pzogc3RyaW5nO1xuXHRhY3Rpb24/OiBzdHJpbmc7XG59O1xudHlwZSBPdXRib3VuZFBhcmFtZXRlclZhbHVlID0ge1xuXHR2YWx1ZT86IHtcblx0XHR2YWx1ZT86IHN0cmluZztcblx0XHRmb3JtYXQ/OiBzdHJpbmc7XG5cdH07XG59O1xuZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9PdXRib3VuZDogT3V0Ym91bmRQYXJhbWV0ZXIpIHtcblx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdID0gW107XG5cdGlmIChvT3V0Ym91bmQucGFyYW1ldGVycykge1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob091dGJvdW5kLnBhcmFtZXRlcnMpIHx8IFtdO1xuXHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzUGFyYW06IHN0cmluZykge1xuXHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IG9PdXRib3VuZC5wYXJhbWV0ZXJzW3NQYXJhbV07XG5cdFx0XHRcdGlmIChvTWFwcGluZy52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS5mb3JtYXQgPT09IFwiYmluZGluZ1wiKSB7XG5cdFx0XHRcdFx0Ly8gdXNpbmcgdGhlIGZvcm1hdCBvZiBVSS5NYXBwaW5nXG5cdFx0XHRcdFx0Y29uc3Qgb1NlbWFudGljTWFwcGluZyA9IHtcblx0XHRcdFx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogb01hcHBpbmcudmFsdWUudmFsdWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRTZW1hbnRpY09iamVjdFByb3BlcnR5OiBzUGFyYW1cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKGFTZW1hbnRpY09iamVjdE1hcHBpbmcubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gVG8gY2hlY2sgaWYgdGhlIHNlbWFudGljT2JqZWN0IE1hcHBpbmcgaXMgZG9uZSBmb3IgdGhlIHNhbWUgbG9jYWwgcHJvcGVydHkgbW9yZSB0aGF0IG9uY2UgdGhlbiBmaXJzdCBvbmUgd2lsbCBiZSBjb25zaWRlcmVkXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFTZW1hbnRpY09iamVjdE1hcHBpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKGFTZW1hbnRpY09iamVjdE1hcHBpbmdbaV0uTG9jYWxQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCAhPT0gb1NlbWFudGljTWFwcGluZy5Mb2NhbFByb3BlcnR5LiRQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nLnB1c2gob1NlbWFudGljTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZy5wdXNoKG9TZW1hbnRpY01hcHBpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhU2VtYW50aWNPYmplY3RNYXBwaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1ZpZXdEYXRhOiBWaWV3RGF0YSwgb0Nyb3NzTmF2OiBSZWNvcmQ8c3RyaW5nLCBPdXRib3VuZFBhcmFtZXRlcj4pIHtcblx0Y29uc3Qgb0hlYWRlckZhY2V0SXRlbXM6IFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdGFjdGlvbjogc3RyaW5nO1xuXHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W107XG5cdFx0fVxuXHQ+ID0ge307XG5cdGxldCBzSWQ7XG5cdGNvbnN0IG9Db250cm9sQ29uZmlnID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uIGFzIFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0bmF2aWdhdGlvbj86IHtcblx0XHRcdFx0dGFyZ2V0T3V0Ym91bmQ/OiB7XG5cdFx0XHRcdFx0b3V0Ym91bmQ6IHN0cmluZztcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cdFx0fVxuXHQ+O1xuXHRmb3IgKGNvbnN0IGNvbmZpZyBpbiBvQ29udHJvbENvbmZpZykge1xuXHRcdGlmIChjb25maWcuaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIikgPiAtMSB8fCBjb25maWcuaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzT3V0Ym91bmQgPSBvQ29udHJvbENvbmZpZ1tjb25maWddLm5hdmlnYXRpb24/LnRhcmdldE91dGJvdW5kPy5vdXRib3VuZDtcblx0XHRcdGlmIChzT3V0Ym91bmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvT3V0Ym91bmQgPSBvQ3Jvc3NOYXZbc091dGJvdW5kXTtcblx0XHRcdFx0aWYgKG9PdXRib3VuZC5zZW1hbnRpY09iamVjdCAmJiBvT3V0Ym91bmQuYWN0aW9uKSB7XG5cdFx0XHRcdFx0aWYgKGNvbmZpZy5pbmRleE9mKFwiQ2hhcnRcIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0c0lkID0gZ2VuZXJhdGUoW1wiZmVcIiwgXCJNaWNyb0NoYXJ0TGlua1wiLCBjb25maWddKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0lkID0gZ2VuZXJhdGUoW1wiZmVcIiwgXCJIZWFkZXJEUExpbmtcIiwgY29uZmlnXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob091dGJvdW5kKTtcblx0XHRcdFx0XHRvSGVhZGVyRmFjZXRJdGVtc1tzSWRdID0ge1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9PdXRib3VuZC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdGFjdGlvbjogb091dGJvdW5kLmFjdGlvbixcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNlbWFudGljT2JqZWN0TWFwcGluZ1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDcm9zcyBuYXZpZ2F0aW9uIG91dGJvdW5kIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBmb3IgJHtzT3V0Ym91bmR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9IZWFkZXJGYWNldEl0ZW1zO1xufVxuXG5mdW5jdGlvbiBzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCB2TWFwcGluZ3M6IHVua25vd24pIHtcblx0Y29uc3Qgb01hcHBpbmdzID0gdHlwZW9mIHZNYXBwaW5ncyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uodk1hcHBpbmdzKSA6IHZNYXBwaW5ncztcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvTWFwcGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBzTG9jYWxQcm9wZXJ0eSA9XG5cdFx0XHQob01hcHBpbmdzW2ldW1wiTG9jYWxQcm9wZXJ0eVwiXSAmJiBvTWFwcGluZ3NbaV1bXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXSkgfHxcblx0XHRcdChvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl0gJiZcblx0XHRcdFx0b01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Mb2NhbFByb3BlcnR5XCJdW1wiJFBhdGhcIl0pO1xuXHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdFByb3BlcnR5ID1cblx0XHRcdG9NYXBwaW5nc1tpXVtcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl0gfHwgb01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdGNvbnN0IG9TZWxlY3RPcHRpb24gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oc0xvY2FsUHJvcGVydHkpO1xuXHRcdGlmIChvU2VsZWN0T3B0aW9uKSB7XG5cdFx0XHQvL0NyZWF0ZSBhIG5ldyBTZWxlY3RPcHRpb24gd2l0aCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSBhcyB0aGUgcHJvcGVydHkgTmFtZSBhbmQgcmVtb3ZlIHRoZSBvbGRlciBvbmVcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5tYXNzQWRkU2VsZWN0T3B0aW9uKHNTZW1hbnRpY09iamVjdFByb3BlcnR5LCBvU2VsZWN0T3B0aW9uKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZWxlY3Rpb25WYXJpYW50O1xufVxuXG50eXBlIFNlbWFudGljT2JqZWN0RnJvbVBhdGggPSB7XG5cdHNlbWFudGljT2JqZWN0UGF0aDogc3RyaW5nO1xuXHRzZW1hbnRpY09iamVjdEZvckdldExpbmtzOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmcgfVtdO1xuXHRzZW1hbnRpY09iamVjdDoge1xuXHRcdHNlbWFudGljT2JqZWN0OiB7ICRQYXRoOiBzdHJpbmcgfTtcblx0fTtcblx0dW5hdmFpbGFibGVBY3Rpb25zOiBzdHJpbmdbXTtcbn07XG5hc3luYyBmdW5jdGlvbiBmbkdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzUGF0aDogc3RyaW5nLCBzUXVhbGlmaWVyOiBzdHJpbmcpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+KGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0bGV0IHNTZW1hbnRpY09iamVjdCwgYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zO1xuXHRcdGlmIChzUXVhbGlmaWVyID09PSBcIlwiKSB7XG5cdFx0XHRzU2VtYW50aWNPYmplY3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3R9YCk7XG5cdFx0XHRhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNTZW1hbnRpY09iamVjdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH0jJHtzUXVhbGlmaWVyfWApO1xuXHRcdFx0YVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc30jJHtzUXVhbGlmaWVyfWBcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MgPSBbeyBzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0IH1dO1xuXHRcdGNvbnN0IG9TZW1hbnRpY09iamVjdCA9IHtcblx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3Rcblx0XHR9O1xuXHRcdHJlc29sdmUoe1xuXHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzUGF0aCxcblx0XHRcdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IGFTZW1hbnRpY09iamVjdEZvckdldExpbmtzLFxuXHRcdFx0c2VtYW50aWNPYmplY3Q6IG9TZW1hbnRpY09iamVjdCxcblx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zXG5cdFx0fSk7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsKFxuXHRhR2V0TGlua3NQcm9taXNlczogUHJvbWlzZTxMaW5rRGVmaW5pdGlvbltdW11bXT5bXSxcblx0YVNlbWFudGljT2JqZWN0czogU2VtYW50aWNPYmplY3RbXSxcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0c0N1cnJlbnRIYXNoOiBzdHJpbmdcbikge1xuXHR0eXBlIFNlbWFudGljT2JqZWN0SW5mbyA9IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBIYXNUYXJnZXRzOiBib29sZWFuOyBIYXNUYXJnZXRzTm90RmlsdGVyZWQ6IGJvb2xlYW4gfTtcblx0cmV0dXJuIFByb21pc2UuYWxsKGFHZXRMaW5rc1Byb21pc2VzKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChhVmFsdWVzKSB7XG5cdFx0XHRsZXQgYUxpbmtzOiBMaW5rRGVmaW5pdGlvbltdW11bXSxcblx0XHRcdFx0X29MaW5rLFxuXHRcdFx0XHRfc0xpbmtJbnRlbnRBY3Rpb24sXG5cdFx0XHRcdGFGaW5hbExpbmtzOiBMaW5rRGVmaW5pdGlvbltdW10gPSBbXTtcblx0XHRcdGxldCBvRmluYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0SW5mbz4gPSB7fTtcblx0XHRcdGNvbnN0IGJJbnRlbnRIYXNBY3Rpb25zID0gZnVuY3Rpb24gKHNJbnRlbnQ6IHN0cmluZywgYUFjdGlvbnM/OiB1bmtub3duW10pIHtcblx0XHRcdFx0Zm9yIChjb25zdCBpbnRlbnQgaW4gYUFjdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAoaW50ZW50ID09PSBzSW50ZW50KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCBhVmFsdWVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGFMaW5rcyA9IGFWYWx1ZXNba107XG5cdFx0XHRcdGlmIChhTGlua3MgJiYgYUxpbmtzLmxlbmd0aCA+IDAgJiYgYUxpbmtzWzBdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBvU2VtYW50aWNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0SW5mbz4+ID0ge307XG5cdFx0XHRcdFx0bGV0IG9UbXA6IFNlbWFudGljT2JqZWN0SW5mbztcblx0XHRcdFx0XHRsZXQgc0FsdGVybmF0ZVBhdGg7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGFGaW5hbExpbmtzLnB1c2goW10pO1xuXHRcdFx0XHRcdFx0bGV0IGhhc1RhcmdldHNOb3RGaWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGV0IGhhc1RhcmdldHMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGlMaW5rQ291bnQgPSAwOyBpTGlua0NvdW50IDwgYUxpbmtzW2ldWzBdLmxlbmd0aDsgaUxpbmtDb3VudCsrKSB7XG5cdFx0XHRcdFx0XHRcdF9vTGluayA9IGFMaW5rc1tpXVswXVtpTGlua0NvdW50XTtcblx0XHRcdFx0XHRcdFx0X3NMaW5rSW50ZW50QWN0aW9uID0gX29MaW5rICYmIF9vTGluay5pbnRlbnQuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KFwiLVwiKVsxXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIShfb0xpbmsgJiYgX29MaW5rLmludGVudCAmJiBfb0xpbmsuaW50ZW50LmluZGV4T2Yoc0N1cnJlbnRIYXNoKSA9PT0gMCkpIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNUYXJnZXRzTm90RmlsdGVyZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghYkludGVudEhhc0FjdGlvbnMoX3NMaW5rSW50ZW50QWN0aW9uLCBhU2VtYW50aWNPYmplY3RzW2tdLnVuYXZhaWxhYmxlQWN0aW9ucykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFGaW5hbExpbmtzW2ldLnB1c2goX29MaW5rKTtcblx0XHRcdFx0XHRcdFx0XHRcdGhhc1RhcmdldHMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b1RtcCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IGFTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY09iamVjdHNba10ucGF0aCxcblx0XHRcdFx0XHRcdFx0SGFzVGFyZ2V0czogaGFzVGFyZ2V0cyxcblx0XHRcdFx0XHRcdFx0SGFzVGFyZ2V0c05vdEZpbHRlcmVkOiBoYXNUYXJnZXRzTm90RmlsdGVyZWRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRpZiAob1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdID0ge307XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzQWx0ZXJuYXRlUGF0aCA9IGFTZW1hbnRpY09iamVjdHNba10ucGF0aC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuXHRcdFx0XHRcdFx0aWYgKG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF1bc0FsdGVybmF0ZVBhdGhdID0ge30gYXMgU2VtYW50aWNPYmplY3RJbmZvO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdW3NBbHRlcm5hdGVQYXRoXSA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0sXG5cdFx0XHRcdFx0XHRcdG9UbXBcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHNTZW1hbnRpY09iamVjdE5hbWUgPSBPYmplY3Qua2V5cyhvU2VtYW50aWNPYmplY3QpWzBdO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvRmluYWxTZW1hbnRpY09iamVjdHMpLmluY2x1ZGVzKHNTZW1hbnRpY09iamVjdE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHNbc1NlbWFudGljT2JqZWN0TmFtZV0gPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHNbc1NlbWFudGljT2JqZWN0TmFtZV0sXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFtzU2VtYW50aWNPYmplY3ROYW1lXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0ZpbmFsU2VtYW50aWNPYmplY3RzID0gT2JqZWN0LmFzc2lnbihvRmluYWxTZW1hbnRpY09iamVjdHMsIG9TZW1hbnRpY09iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFGaW5hbExpbmtzID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRmluYWxTZW1hbnRpY09iamVjdHMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFwic2VtYW50aWNzVGFyZ2V0c1wiLFxuXHRcdFx0XHRcdG1lcmdlT2JqZWN0cyhvRmluYWxTZW1hbnRpY09iamVjdHMsIG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbWFudGljc1RhcmdldHNcIikpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBvRmluYWxTZW1hbnRpY09iamVjdHM7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiZm5VcGRhdGVTZW1hbnRpY1RhcmdldHNNb2RlbDogQ2Fubm90IHJlYWQgbGlua3NcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlKFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG9WaWV3OiBWaWV3LFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0c1BhdGg6IHN0cmluZyxcblx0c1F1YWxpZmllcjogc3RyaW5nXG4pIHtcblx0cmV0dXJuIENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoKG9NZXRhTW9kZWwsIHNQYXRoLCBzUXVhbGlmaWVyKTtcbn1cblxuZnVuY3Rpb24gZm5QcmVwYXJlU2VtYW50aWNPYmplY3RzUHJvbWlzZXMoXG5cdF9vQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdF9vVmlldzogVmlldyxcblx0X29NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRfYVNlbWFudGljT2JqZWN0c0ZvdW5kOiBzdHJpbmdbXSxcblx0X2FTZW1hbnRpY09iamVjdHNQcm9taXNlczogUHJvbWlzZTxTZW1hbnRpY09iamVjdEZyb21QYXRoPltdXG4pIHtcblx0bGV0IF9LZXlzOiBzdHJpbmdbXSwgc1BhdGg7XG5cdGxldCBzUXVhbGlmaWVyOiBzdHJpbmcsIHJlZ2V4UmVzdWx0O1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IF9hU2VtYW50aWNPYmplY3RzRm91bmQubGVuZ3RoOyBpKyspIHtcblx0XHRzUGF0aCA9IF9hU2VtYW50aWNPYmplY3RzRm91bmRbaV07XG5cdFx0X0tleXMgPSBPYmplY3Qua2V5cyhfb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBcIikpO1xuXHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBfS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChcblx0XHRcdFx0X0tleXNbaW5kZXhdLmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH1gKSA9PT0gMCAmJlxuXHRcdFx0XHRfS2V5c1tpbmRleF0uaW5kZXhPZihgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0TWFwcGluZ31gKSA9PT0gLTEgJiZcblx0XHRcdFx0X0tleXNbaW5kZXhdLmluZGV4T2YoYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc31gKSA9PT0gLTFcblx0XHRcdCkge1xuXHRcdFx0XHRyZWdleFJlc3VsdCA9IC8jKC4qKS8uZXhlYyhfS2V5c1tpbmRleF0pO1xuXHRcdFx0XHRzUXVhbGlmaWVyID0gcmVnZXhSZXN1bHQgPyByZWdleFJlc3VsdFsxXSA6IFwiXCI7XG5cdFx0XHRcdF9hU2VtYW50aWNPYmplY3RzUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdFByb21pc2UoX29BcHBDb21wb25lbnQsIF9vVmlldywgX29NZXRhTW9kZWwsIHNQYXRoLCBzUXVhbGlmaWVyKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG50eXBlIEludGVybmFsSlNPTk1vZGVsID0ge1xuXHRfZ2V0T2JqZWN0KHZhbDogc3RyaW5nLCBjb250ZXh0PzogQ29udGV4dCk6IG9iamVjdDtcbn07XG5mdW5jdGlvbiBmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwob0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLCBzUGFnZU1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgX2ZuZmluZFZhbHVlc0hlbHBlciA9IGZ1bmN0aW9uIChcblx0XHRvYmo6IHVuZGVmaW5lZCB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRrZXk6IHN0cmluZyxcblx0XHRsaXN0OiBzdHJpbmdbXVxuXHQpIHtcblx0XHRpZiAoIW9iaikge1xuXHRcdFx0cmV0dXJuIGxpc3Q7XG5cdFx0fVxuXHRcdGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuXHRcdFx0b2JqLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRcdFx0bGlzdCA9IGxpc3QuY29uY2F0KF9mbmZpbmRWYWx1ZXNIZWxwZXIoaXRlbSwga2V5LCBbXSkpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbGlzdDtcblx0XHR9XG5cdFx0aWYgKG9ialtrZXldKSB7XG5cdFx0XHRsaXN0LnB1c2gob2JqW2tleV0gYXMgc3RyaW5nKTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIG9iaiA9PSBcIm9iamVjdFwiICYmIG9iaiAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBPYmplY3Qua2V5cyhvYmopO1xuXHRcdFx0aWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGxpc3QgPSBsaXN0LmNvbmNhdChfZm5maW5kVmFsdWVzSGVscGVyKG9ialtjaGlsZHJlbltpXV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleSwgW10pKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbGlzdDtcblx0fTtcblx0Y29uc3QgX2ZuZmluZFZhbHVlcyA9IGZ1bmN0aW9uIChvYmo6IHVuZGVmaW5lZCB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5OiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gX2ZuZmluZFZhbHVlc0hlbHBlcihvYmosIGtleSwgW10pO1xuXHR9O1xuXHRjb25zdCBfZm5EZWxldGVEdXBsaWNhdGVTZW1hbnRpY09iamVjdHMgPSBmdW5jdGlvbiAoYVNlbWFudGljT2JqZWN0UGF0aDogc3RyaW5nW10pIHtcblx0XHRyZXR1cm4gYVNlbWFudGljT2JqZWN0UGF0aC5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcblx0XHRcdHJldHVybiBhU2VtYW50aWNPYmplY3RQYXRoLmluZGV4T2YodmFsdWUpID09PSBpbmRleDtcblx0XHR9KTtcblx0fTtcblx0Y29uc3Qgb1ZpZXcgPSBvQ29udHJvbGxlci5nZXRWaWV3KCk7XG5cdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cblx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdHNQcm9taXNlczogUHJvbWlzZTxTZW1hbnRpY09iamVjdEZyb21QYXRoPltdID0gW107XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250cm9sbGVyLmdldE93bmVyQ29tcG9uZW50KCk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvQ29tcG9uZW50KSBhcyBBcHBDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IG9QYWdlTW9kZWwgPSAob0NvbXBvbmVudC5nZXRNb2RlbChzUGFnZU1vZGVsKSBhcyBKU09OTW9kZWwpLmdldERhdGEoKTtcblx0XHRpZiAoSlNPTi5zdHJpbmdpZnkob1BhZ2VNb2RlbCkgPT09IFwie31cIikge1xuXHRcdFx0b1BhZ2VNb2RlbCA9IChvQ29tcG9uZW50LmdldE1vZGVsKHNQYWdlTW9kZWwpIGFzIHVua25vd24gYXMgSW50ZXJuYWxKU09OTW9kZWwpLl9nZXRPYmplY3QoXCIvXCIsIHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdGxldCBhU2VtYW50aWNPYmplY3RzRm91bmQgPSBfZm5maW5kVmFsdWVzKG9QYWdlTW9kZWwsIFwic2VtYW50aWNPYmplY3RQYXRoXCIpO1xuXHRcdGFTZW1hbnRpY09iamVjdHNGb3VuZCA9IF9mbkRlbGV0ZUR1cGxpY2F0ZVNlbWFudGljT2JqZWN0cyhhU2VtYW50aWNPYmplY3RzRm91bmQpO1xuXHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VIZWxwZXIgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRsZXQgc0N1cnJlbnRIYXNoID0gb1NoZWxsU2VydmljZUhlbHBlci5nZXRIYXNoKCk7XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c0ZvckdldExpbmtzID0gW107XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0czogU2VtYW50aWNPYmplY3RbXSA9IFtdO1xuXHRcdGxldCBfb1NlbWFudGljT2JqZWN0O1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaCAmJiBzQ3VycmVudEhhc2guaW5kZXhPZihcIj9cIikgIT09IC0xKSB7XG5cdFx0XHQvLyBzQ3VycmVudEhhc2ggY2FuIGNvbnRhaW4gcXVlcnkgc3RyaW5nLCBjdXQgaXQgb2ZmIVxuXHRcdFx0c0N1cnJlbnRIYXNoID0gc0N1cnJlbnRIYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0XHR9XG5cblx0XHRmblByZXBhcmVTZW1hbnRpY09iamVjdHNQcm9taXNlcyhvQXBwQ29tcG9uZW50LCBvVmlldywgb01ldGFNb2RlbCwgYVNlbWFudGljT2JqZWN0c0ZvdW5kLCBhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY09iamVjdHNQcm9taXNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0UHJvbWlzZS5hbGwoYVNlbWFudGljT2JqZWN0c1Byb21pc2VzKVxuXHRcdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoYVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IGFHZXRMaW5rc1Byb21pc2VzID0gW107XG5cdFx0XHRcdFx0bGV0IHNTZW1PYmpFeHByZXNzaW9uO1xuXHRcdFx0XHRcdHR5cGUgU2VtYW50aWNPYmplY3RSZXNvbHZlZCA9IHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3RGb3JHZXRMaW5rczogeyBzZW1hbnRpY09iamVjdDogc3RyaW5nIH1bXTtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiB7XG5cdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0dW5hdmFpbGFibGVBY3Rpb25zOiBzdHJpbmdbXTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdHNSZXNvbHZlZDogU2VtYW50aWNPYmplY3RSZXNvbHZlZFtdID0gYVZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QgJiZcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW1lbnQuc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QgPT09IFwib2JqZWN0XCJcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRzU2VtT2JqRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGVsZW1lbnQuc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QuJFBhdGgpKSE7XG5cdFx0XHRcdFx0XHRcdChlbGVtZW50IGFzIHVua25vd24gYXMgU2VtYW50aWNPYmplY3RSZXNvbHZlZCkuc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QgPSBzU2VtT2JqRXhwcmVzc2lvbjtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZW1hbnRpY09iamVjdEZvckdldExpbmtzWzBdLnNlbWFudGljT2JqZWN0ID0gc1NlbU9iakV4cHJlc3Npb247XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChlbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbGVtZW50LnNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgYXMgdW5rbm93biBhcyBTZW1hbnRpY09iamVjdFJlc29sdmVkW107XG5cdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhU2VtYW50aWNPYmplY3RzUmVzb2x2ZWQubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdF9vU2VtYW50aWNPYmplY3QgPSBhU2VtYW50aWNPYmplY3RzUmVzb2x2ZWRbal07XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdF9vU2VtYW50aWNPYmplY3QgJiZcblx0XHRcdFx0XHRcdFx0X29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHQhKF9vU2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3Quc2VtYW50aWNPYmplY3QuaW5kZXhPZihcIntcIikgPT09IDApXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0c0ZvckdldExpbmtzLnB1c2goX29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdEZvckdldExpbmtzKTtcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0cy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogX29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IF9vU2VtYW50aWNPYmplY3QudW5hdmFpbGFibGVBY3Rpb25zLFxuXHRcdFx0XHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY09iamVjdHNSZXNvbHZlZFtqXS5zZW1hbnRpY09iamVjdFBhdGhcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGFHZXRMaW5rc1Byb21pc2VzLnB1c2gob1NoZWxsU2VydmljZUhlbHBlci5nZXRMaW5rc1dpdGhDYWNoZShbX29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdEZvckdldExpbmtzXSkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gQ29tbW9uVXRpbHMudXBkYXRlU2VtYW50aWNUYXJnZXRzKGFHZXRMaW5rc1Byb21pc2VzLCBhU2VtYW50aWNPYmplY3RzLCBvSW50ZXJuYWxNb2RlbENvbnRleHQsIHNDdXJyZW50SGFzaCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiZm5HZXRTZW1hbnRpY1RhcmdldHNGcm9tVGFibGU6IENhbm5vdCBnZXQgU2VtYW50aWMgT2JqZWN0c1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbj86IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4pIHtcblx0Y29uc3QgbUFsbG93ZWRFeHByZXNzaW9uczogX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IHt9O1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHkpIHtcblx0XHRcdGlmIChvUHJvcGVydHkuUHJvcGVydHkgJiYgb1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoXS5wdXNoKG9Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtQWxsb3dlZEV4cHJlc3Npb25zW29Qcm9wZXJ0eS5Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoXSA9IFtvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zIGFzIHN0cmluZ107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gbUFsbG93ZWRFeHByZXNzaW9ucztcbn1cbmZ1bmN0aW9uIGdldEZpbHRlclJlc3RyaWN0aW9ucyhcblx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24/OiBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+LFxuXHRzUmVzdHJpY3Rpb24/OiBcIlJlcXVpcmVkUHJvcGVydGllc1wiIHwgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiXG4pIHtcblx0bGV0IGFQcm9wczogc3RyaW5nW10gPSBbXTtcblx0aWYgKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uICYmIG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbiBhcyBrZXlvZiBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+XSkge1xuXHRcdGFQcm9wcyA9IChcblx0XHRcdG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uW3NSZXN0cmljdGlvbiBhcyBrZXlvZiBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+XSBhcyBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPltdXG5cdFx0KS5tYXAoZnVuY3Rpb24gKG9Qcm9wZXJ0eTogRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD4pIHtcblx0XHRcdHJldHVybiBvUHJvcGVydHkuJFByb3BlcnR5UGF0aDtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gYVByb3BzO1xufVxuXG5mdW5jdGlvbiBfZmV0Y2hQcm9wZXJ0aWVzRm9yTmF2UGF0aChwYXRoczogc3RyaW5nW10sIG5hdlBhdGg6IHN0cmluZywgcHJvcHM6IHN0cmluZ1tdKSB7XG5cdGNvbnN0IG5hdlBhdGhQcmVmaXggPSBuYXZQYXRoICsgXCIvXCI7XG5cdHJldHVybiBwYXRocy5yZWR1Y2UoKG91dFBhdGhzOiBzdHJpbmdbXSwgcGF0aFRvQ2hlY2s6IHN0cmluZykgPT4ge1xuXHRcdGlmIChwYXRoVG9DaGVjay5zdGFydHNXaXRoKG5hdlBhdGhQcmVmaXgpKSB7XG5cdFx0XHRjb25zdCBvdXRQYXRoID0gcGF0aFRvQ2hlY2sucmVwbGFjZShuYXZQYXRoUHJlZml4LCBcIlwiKTtcblx0XHRcdGlmIChvdXRQYXRocy5pbmRleE9mKG91dFBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRvdXRQYXRocy5wdXNoKG91dFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0UGF0aHM7XG5cdH0sIHByb3BzKTtcbn1cbnR5cGUgX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbnR5cGUgX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0UmVxdWlyZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG59O1xuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoKGVudGl0eVBhdGg6IHN0cmluZywgb0NvbnRleHQ6IE9EYXRhTWV0YU1vZGVsKSB7XG5cdGNvbnN0IG9SZXQ6IF9GaWx0ZXJSZXN0cmljdGlvbnMgPSB7XG5cdFx0UmVxdWlyZWRQcm9wZXJ0aWVzOiBbXSxcblx0XHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogW10sXG5cdFx0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zOiB7fVxuXHR9O1xuXHRsZXQgb0ZpbHRlclJlc3RyaWN0aW9ucztcblx0Y29uc3QgbmF2aWdhdGlvblRleHQgPSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCI7XG5cdGNvbnN0IGZyVGVybSA9IFwiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zXCI7XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoUGFydHMgPSBlbnRpdHlQYXRoLnJlcGxhY2VBbGwoXCIlMkZcIiwgXCIvXCIpLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpO1xuXHRjb25zdCBlbnRpdHlUeXBlUGF0aCA9IGAvJHtlbnRpdHlUeXBlUGF0aFBhcnRzLmpvaW4oXCIvXCIpfS9gO1xuXHRjb25zdCBlbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChlbnRpdHlQYXRoLCBvQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldFBhdGhQYXJ0cyA9IGVudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGlzQ29udGFpbm1lbnQgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5VHlwZVBhdGh9JENvbnRhaW5zVGFyZ2V0YCk7XG5cdGNvbnN0IGNvbnRhaW5tZW50TmF2UGF0aCA9ICEhaXNDb250YWlubWVudCAmJiBlbnRpdHlUeXBlUGF0aFBhcnRzW2VudGl0eVR5cGVQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cblx0Ly9MRUFTVCBQUklPUklUWSAtIEZpbHRlciByZXN0cmljdGlvbnMgZGlyZWN0bHkgYXQgRW50aXR5IFNldFxuXHQvL2UuZy4gRlIgaW4gXCJOUy5FbnRpdHlDb250YWluZXIvU2FsZXNPcmRlck1hbmFnZVwiIENvbnRleHRQYXRoOiAvU2FsZXNPcmRlck1hbmFnZVxuXHRpZiAoIWlzQ29udGFpbm1lbnQpIHtcblx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zID0gb0NvbnRleHQuZ2V0T2JqZWN0KGAke2VudGl0eVNldFBhdGh9JHtmclRlcm19YCkgYXMgTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPiB8IHVuZGVmaW5lZDtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRjb25zdCByZXN1bHRDb250ZXh0Q2hlY2sgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5VHlwZVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdFx0aWYgKCFyZXN1bHRDb250ZXh0Q2hlY2spIHtcblx0XHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHR9XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob0ZpbHRlclJlc3RyaWN0aW9ucykgfHwge307XG5cdH1cblxuXHRpZiAoZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Y29uc3QgbmF2UGF0aCA9IGlzQ29udGFpbm1lbnQgPyAoY29udGFpbm1lbnROYXZQYXRoIGFzIHN0cmluZykgOiBlbnRpdHlTZXRQYXRoUGFydHNbZW50aXR5U2V0UGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdC8vIEluIGNhc2Ugb2YgY29udGFpbm1lbnQgd2UgdGFrZSBlbnRpdHlTZXQgcHJvdmlkZWQgYXMgcGFyZW50LiBBbmQgaW4gY2FzZSBvZiBub3JtYWwgd2Ugd291bGQgcmVtb3ZlIHRoZSBsYXN0IG5hdmlnYXRpb24gZnJvbSBlbnRpdHlTZXRQYXRoLlxuXHRcdGNvbnN0IHBhcmVudEVudGl0eVNldFBhdGggPSBpc0NvbnRhaW5tZW50ID8gZW50aXR5U2V0UGF0aCA6IGAvJHtlbnRpdHlTZXRQYXRoUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oYC8ke25hdmlnYXRpb25UZXh0fS9gKX1gO1xuXHRcdC8vVEhJUkQgSElHSEVTVCBQUklPUklUWSAtIFJlYWRpbmcgcHJvcGVydHkgcGF0aCByZXN0cmljdGlvbnMgLSBBbm5vdGF0aW9uIGF0IG1haW4gZW50aXR5IGJ1dCBkaXJlY3RseSBvbiBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGhcblx0XHQvL2UuZy4gUGFyZW50IEN1c3RvbWVyIHdpdGggUHJvcGVydHlQYXRoPVwiU2V0L0NpdHlOYW1lXCIgQ29udGV4dFBhdGg6IEN1c3RvbWVyL1NldFxuXHRcdGNvbnN0IG9QYXJlbnRSZXQ6IF9GaWx0ZXJSZXN0cmljdGlvbnMgPSB7XG5cdFx0XHRSZXF1aXJlZFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtdLFxuXHRcdFx0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zOiB7fVxuXHRcdH07XG5cdFx0aWYgKCFuYXZQYXRoLmluY2x1ZGVzKFwiJTJGXCIpKSB7XG5cdFx0XHRjb25zdCBvUGFyZW50RlIgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7cGFyZW50RW50aXR5U2V0UGF0aH0ke2ZyVGVybX1gKSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSBfZmV0Y2hQcm9wZXJ0aWVzRm9yTmF2UGF0aChcblx0XHRcdFx0Z2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9QYXJlbnRGUiwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW10sXG5cdFx0XHRcdG5hdlBhdGgsXG5cdFx0XHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzIHx8IFtdXG5cdFx0XHQpO1xuXHRcdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKFxuXHRcdFx0XHRnZXRGaWx0ZXJSZXN0cmljdGlvbnMob1BhcmVudEZSLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdLFxuXHRcdFx0XHRuYXZQYXRoLFxuXHRcdFx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIHx8IFtdXG5cdFx0XHQpO1xuXHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0Y29uc3QgY29tcGxldGVBbGxvd2VkRXhwcyA9IGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9QYXJlbnRGUikgfHwge307XG5cdFx0XHRvUGFyZW50UmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IE9iamVjdC5rZXlzKGNvbXBsZXRlQWxsb3dlZEV4cHMpLnJlZHVjZShcblx0XHRcdFx0KG91dFByb3A6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiwgcHJvcFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wUGF0aC5zdGFydHNXaXRoKG5hdlBhdGggKyBcIi9cIikpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG91dFByb3BQYXRoID0gcHJvcFBhdGgucmVwbGFjZShuYXZQYXRoICsgXCIvXCIsIFwiXCIpO1xuXHRcdFx0XHRcdFx0b3V0UHJvcFtvdXRQcm9wUGF0aF0gPSBjb21wbGV0ZUFsbG93ZWRFeHBzW3Byb3BQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG91dFByb3A7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIHx8IHt9LFxuXHRcdFx0b1BhcmVudFJldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgfHwge31cblx0XHQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuXHRcdC8vU0VDT05EIEhJR0hFU1QgcHJpb3JpdHkgLSBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9uc1xuXHRcdC8vZS5nLiBQYXJlbnQgXCIvQ3VzdG9tZXJcIiB3aXRoIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg9XCJTZXRcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3Qgb05hdlJlc3RyaWN0aW9ucyA9IE1ldGFNb2RlbEZ1bmN0aW9uLmdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMob0NvbnRleHQsIHBhcmVudEVudGl0eVNldFBhdGgsIG5hdlBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikpO1xuXHRcdGNvbnN0IG9OYXZGaWx0ZXJSZXN0ID0gb05hdlJlc3RyaWN0aW9ucyAmJiAob05hdlJlc3RyaWN0aW9uc1tcIkZpbHRlclJlc3RyaWN0aW9uc1wiXSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+KTtcblx0XHRjb25zdCBuYXZSZXNSZXFQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvTmF2RmlsdGVyUmVzdCwgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzLmNvbmNhdChuYXZSZXNSZXFQcm9wcykpO1xuXHRcdGNvbnN0IG5hdk5vbkZpbHRlclByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZGaWx0ZXJSZXN0LCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuY29uY2F0KG5hdk5vbkZpbHRlclByb3BzKSk7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyB8fCB7fSxcblx0XHRcdGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9OYXZGaWx0ZXJSZXN0KSB8fCB7fVxuXHRcdCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG5cdFx0Ly9ISUdIRVNUIHByaW9yaXR5IC0gUmVzdHJpY3Rpb25zIGhhdmluZyB0YXJnZXQgd2l0aCBuYXZpZ2F0aW9uIGFzc29jaWF0aW9uIGVudGl0eVxuXHRcdC8vIGUuZy4gRlIgaW4gXCJDdXN0b21lclBhcmFtZXRlcnMvU2V0XCIgQ29udGV4dFBhdGg6IFwiQ3VzdG9tZXIvU2V0XCJcblx0XHRjb25zdCBuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QgPSBvQ29udGV4dC5nZXRPYmplY3QoXG5cdFx0XHRgLyR7ZW50aXR5VHlwZVBhdGhQYXJ0cy5qb2luKFwiL1wiKX0ke2ZyVGVybX1gXG5cdFx0KSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+O1xuXHRcdGNvbnN0IG5hdkFzc29jUmVxUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMobmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0LCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5SZXF1aXJlZFByb3BlcnRpZXMuY29uY2F0KG5hdkFzc29jUmVxUHJvcHMpKTtcblx0XHRjb25zdCBuYXZBc3NvY05vbkZpbHRlclByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCwgXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmNvbmNhdChuYXZBc3NvY05vbkZpbHRlclByb3BzKSk7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gbWVyZ2VPYmplY3RzKFxuXHRcdFx0e30sXG5cdFx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyxcblx0XHRcdGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCkgfHwge31cblx0XHQpIGFzIF9GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG5cdH1cblx0cmV0dXJuIG9SZXQ7XG59XG5cbnR5cGUgUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGJpbmRpbmdDb250ZXh0czogb2JqZWN0O1xuXHRtb2RlbHM6IG9iamVjdDtcbn07XG50eXBlIEJhc2VUcmVlTW9kaWZpZXIgPSB7XG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFxuXHRcdHNGcmFnbWVudE5hbWU6IHN0cmluZyxcblx0XHRtUHJlcHJvY2Vzc29yU2V0dGluZ3M6IFByZXByb2Nlc3NvclNldHRpbmdzLFxuXHRcdG9WaWV3PzogVmlld1xuXHQpOiBQcm9taXNlPFVJNUVsZW1lbnRbXSB8IEVsZW1lbnRbXT47XG5cdHRhcmdldHM6IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFxuXHRzRnJhZ21lbnROYW1lOiBzdHJpbmcsXG5cdG9QcmVwcm9jZXNzb3JTZXR0aW5nczogUHJlcHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9PcHRpb25zOiB7IHZpZXc/OiBWaWV3OyBpc1hNTD86IGJvb2xlYW47IGlkOiBzdHJpbmc7IGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgfSxcblx0b01vZGlmaWVyPzogQmFzZVRyZWVNb2RpZmllclxuKTogUHJvbWlzZTxFbGVtZW50IHwgVUk1RWxlbWVudCB8IEVsZW1lbnRbXSB8IFVJNUVsZW1lbnRbXT4ge1xuXHRvT3B0aW9ucyA9IG9PcHRpb25zIHx8IHt9O1xuXHRpZiAob01vZGlmaWVyKSB7XG5cdFx0cmV0dXJuIG9Nb2RpZmllci50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MsIG9PcHRpb25zLnZpZXcpLnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudCkge1xuXHRcdFx0Ly8gVGhpcyBpcyByZXF1aXJlZCBhcyBGbGV4IHJldHVybnMgYW4gSFRNTENvbGxlY3Rpb24gYXMgdGVtcGxhdGluZyByZXN1bHQgaW4gWE1MIHRpbWUuXG5cdFx0XHRyZXR1cm4gb01vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiICYmIG9GcmFnbWVudC5sZW5ndGggPiAwID8gb0ZyYWdtZW50WzBdIDogb0ZyYWdtZW50O1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG9GcmFnbWVudCA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0WE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIiksXG5cdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5nc1xuXHRcdCk7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSBvRnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0aWYgKCEhb09wdGlvbnMuaXNYTUwgJiYgb0NvbnRyb2wpIHtcblx0XHRcdHJldHVybiBvQ29udHJvbDtcblx0XHR9XG5cdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0aWQ6IG9PcHRpb25zLmlkLFxuXHRcdFx0ZGVmaW5pdGlvbjogb0ZyYWdtZW50IGFzIHVua25vd24gYXMgc3RyaW5nLFxuXHRcdFx0Y29udHJvbGxlcjogb09wdGlvbnMuY29udHJvbGxlclxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNpbmdsZXRvblBhdGgocGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbiksXG5cdFx0cHJvcGVydHlOYW1lID0gcGFydHMucG9wKCkhLFxuXHRcdG5hdmlnYXRpb25QYXRoID0gcGFydHMuam9pbihcIi9cIiksXG5cdFx0ZW50aXR5U2V0ID0gbmF2aWdhdGlvblBhdGggJiYgbWV0YU1vZGVsLmdldE9iamVjdChgLyR7bmF2aWdhdGlvblBhdGh9YCk7XG5cdGlmIChlbnRpdHlTZXQ/LiRraW5kID09PSBcIlNpbmdsZXRvblwiKSB7XG5cdFx0Y29uc3Qgc2luZ2xldG9uTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiBgLyR7c2luZ2xldG9uTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkocGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRpZiAoIXBhdGggfHwgIW1vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0fVxuXHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Ly8gRmluZCB0aGUgdW5kZXJseWluZyBlbnRpdHkgc2V0IGZyb20gdGhlIHByb3BlcnR5IHBhdGggYW5kIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBzaW5nbGV0b24uXG5cdGNvbnN0IHJlc29sdmVkUGF0aCA9IGdldFNpbmdsZXRvblBhdGgocGF0aCwgbWV0YU1vZGVsKTtcblx0aWYgKHJlc29sdmVkUGF0aCkge1xuXHRcdGNvbnN0IHByb3BlcnR5QmluZGluZyA9IG1vZGVsLmJpbmRQcm9wZXJ0eShyZXNvbHZlZFBhdGgpO1xuXHRcdHJldHVybiBwcm9wZXJ0eUJpbmRpbmcucmVxdWVzdFZhbHVlKCk7XG5cdH1cblxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xufVxuXG4vLyBHZXQgdGhlIHBhdGggZm9yIGFjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgaXMgbmVlZGVkIHRvIHJlYWQgdGhlIGFubm90YXRpb25zXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJQYXRoKHNQYXRoOiBzdHJpbmcsIHNQYXJhbWV0ZXI6IHN0cmluZykge1xuXHRsZXQgc0NvbnRleHQ7XG5cdGlmIChzUGF0aC5pbmRleE9mKFwiQCR1aTUub3ZlcmxvYWRcIikgPiAtMSkge1xuXHRcdHNDb250ZXh0ID0gc1BhdGguc3BsaXQoXCJAJHVpNS5vdmVybG9hZFwiKVswXTtcblx0fSBlbHNlIHtcblx0XHQvLyBGb3IgVW5ib3VuZCBBY3Rpb25zIGluIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nc1xuXHRcdGNvbnN0IGFBY3Rpb24gPSBzUGF0aC5zcGxpdChcIi8wXCIpWzBdLnNwbGl0KFwiLlwiKTtcblx0XHRzQ29udGV4dCA9IGAvJHthQWN0aW9uW2FBY3Rpb24ubGVuZ3RoIC0gMV19L2A7XG5cdH1cblx0cmV0dXJuIHNDb250ZXh0ICsgc1BhcmFtZXRlcjtcbn1cblxuLyoqXG4gKiBHZXQgcmVzb2x2ZWQgZXhwcmVzc2lvbiBiaW5kaW5nIHVzZWQgZm9yIHRleHRzIGF0IHJ1bnRpbWUuXG4gKlxuICogQHBhcmFtIGV4cEJpbmRpbmdcbiAqIEBwYXJhbSBjb250cm9sXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Db21tb25VdGlsc1xuICogQHJldHVybnMgQSBzdHJpbmcgYWZ0ZXIgcmVzb2x1dGlvbi5cbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBfZm50cmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nKGV4cEJpbmRpbmc6IHN0cmluZywgY29udHJvbDogQ29udHJvbCkge1xuXHQvLyBUaGUgaWRlYSBoZXJlIGlzIHRvIGNyZWF0ZSBkdW1teSBlbGVtZW50IHdpdGggdGhlIGV4cHJlc2lvbiBiaW5kaW5nLlxuXHQvLyBBZGRpbmcgaXQgYXMgZGVwZW5kZW50IHRvIHRoZSB2aWV3L2NvbnRyb2wgd291bGQgcHJvcGFnYXRlIGFsbCB0aGUgbW9kZWxzIHRvIHRoZSBkdW1teSBlbGVtZW50IGFuZCByZXNvbHZlIHRoZSBiaW5kaW5nLlxuXHQvLyBXZSByZW1vdmUgdGhlIGR1bW15IGVsZW1lbnQgYWZ0ZXIgdGhhdCBhbmQgZGVzdHJveSBpdC5cblxuXHRjb25zdCBhbnlSZXNvdXJjZVRleHQgPSBuZXcgQW55RWxlbWVudCh7IGFueVRleHQ6IGV4cEJpbmRpbmcgfSk7XG5cdGNvbnRyb2wuYWRkRGVwZW5kZW50KGFueVJlc291cmNlVGV4dCk7XG5cdGNvbnN0IHJlc3VsdFRleHQgPSBhbnlSZXNvdXJjZVRleHQuZ2V0QW55VGV4dCgpO1xuXHRjb250cm9sLnJlbW92ZURlcGVuZGVudChhbnlSZXNvdXJjZVRleHQpO1xuXHRhbnlSZXNvdXJjZVRleHQuZGVzdHJveSgpO1xuXG5cdHJldHVybiByZXN1bHRUZXh0O1xufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGEgc21hbGwgc2NyZWVuLlxuICpcbiAqIEByZXR1cm5zIEEgQm9vbGVhbi5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU21hbGxEZXZpY2UoKSB7XG5cdHJldHVybiAhc3lzdGVtLmRlc2t0b3AgfHwgRGV2aWNlLnJlc2l6ZS53aWR0aCA8PSAzMjA7XG59XG4vKipcbiAqIEdldCBmaWx0ZXIgaW5mb3JtYXRpb24gZm9yIGEgU2VsZWN0aW9uVmFyaWFudCBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSBvQ29udHJvbCBUaGUgdGFibGUvY2hhcnQgaW5zdGFuY2VcbiAqIEBwYXJhbSBzZWxlY3Rpb25WYXJpYW50UGF0aCBSZWxhdGl2ZSBTZWxlY3Rpb25WYXJpYW50IGFubm90YXRpb24gcGF0aFxuICogQHBhcmFtIGlzQ2hhcnRcbiAqIEByZXR1cm5zIEluZm9ybWF0aW9uIG9uIGZpbHRlcnNcbiAqICBmaWx0ZXJzOiBhcnJheSBvZiBzYXAudWkubW9kZWwuZmlsdGVyc1xuICogdGV4dDogVGV4dCBwcm9wZXJ0eSBvZiB0aGUgU2VsZWN0aW9uVmFyaWFudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5pbnRlcmZhY2UgSVNlbGVjdGlvbk9wdGlvbiB7XG5cdFByb3BlcnR5TmFtZTogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfTtcblx0UmFuZ2VzOiB7XG5cdFx0W2tleTogc3RyaW5nXToge1xuXHRcdFx0T3B0aW9uOiB7ICRFbnVtTWVtYmVyOiBTdHJpbmcgfTtcblx0XHRcdExvdzogdW5rbm93bjtcblx0XHRcdEhpZ2g6IHVua25vd247XG5cdFx0fTtcblx0fTtcbn1cbmZ1bmN0aW9uIGdldEZpbHRlcnNJbmZvRm9yU1Yob0NvbnRyb2w6IENvbnRyb2wgfCBNRENDaGFydCB8IE1EQ1RhYmxlLCBzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLCBpc0NoYXJ0PzogYm9vbGVhbikge1xuXHRjb25zdCBzRW50aXR5VHlwZVBhdGggPSBvQ29udHJvbC5kYXRhKFwiZW50aXR5VHlwZVwiKSxcblx0XHRvTWV0YU1vZGVsID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db250cm9sIGFzIENvbnRyb2wpLmdldE1ldGFNb2RlbCgpLFxuXHRcdG1Qcm9wZXJ0eUZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIEZpbHRlcltdPiA9IHt9LFxuXHRcdGFGaWx0ZXJzID0gW10sXG5cdFx0YVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgc1RleHQgPSBcIlwiO1xuXHRsZXQgb1NlbGVjdGlvblZhcmlhbnQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5VHlwZVBhdGh9JHtzZWxlY3Rpb25WYXJpYW50UGF0aH1gKTtcblx0Ly8gZm9yIGNoYXJ0IHRoZSBzdHJ1Y3R1cmUgdmFyaWVzIGhlbmNlIHJlYWQgaXQgZnJvbSBtYWluIG9iamVjdFxuXHRpZiAoaXNDaGFydCkge1xuXHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gb1NlbGVjdGlvblZhcmlhbnQuU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXHRpZiAob1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRzVGV4dCA9IG9TZWxlY3Rpb25WYXJpYW50LlRleHQ7XG5cdFx0KG9TZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgfHwgW10pXG5cdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvU2VsZWN0T3B0aW9uOiBJU2VsZWN0aW9uT3B0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBvU2VsZWN0T3B0aW9uICYmIG9TZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lICYmIG9TZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lLiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RPcHRpb246IElTZWxlY3Rpb25PcHRpb24pIHtcblx0XHRcdFx0Y29uc3Qgc1BhdGggPSBvU2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZS4kUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpZiAoIWFQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhUGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBqIGluIG9TZWxlY3RPcHRpb24uUmFuZ2VzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1JhbmdlID0gb1NlbGVjdE9wdGlvbi5SYW5nZXNbal07XG5cdFx0XHRcdFx0bVByb3BlcnR5RmlsdGVyc1tzUGF0aF0gPSAobVByb3BlcnR5RmlsdGVyc1tzUGF0aF0gfHwgW10pLmNvbmNhdChcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoc1BhdGgsIG9SYW5nZS5PcHRpb24/LiRFbnVtTWVtYmVyPy5zcGxpdChcIi9cIikucG9wKCkgYXMgdW5kZWZpbmVkLCBvUmFuZ2UuTG93LCBvUmFuZ2UuSGlnaClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdGZvciAoY29uc3Qgc1Byb3BlcnR5UGF0aCBpbiBtUHJvcGVydHlGaWx0ZXJzKSB7XG5cdFx0XHRhRmlsdGVycy5wdXNoKFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBtUHJvcGVydHlGaWx0ZXJzW3NQcm9wZXJ0eVBhdGhdLFxuXHRcdFx0XHRcdGFuZDogZmFsc2Vcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRwcm9wZXJ0aWVzOiBhUGF0aHMsXG5cdFx0ZmlsdGVyczogYUZpbHRlcnMsXG5cdFx0dGV4dDogc1RleHRcblx0fTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udmVydGVyQ29udGV4dEZvclBhdGgoc01ldGFQYXRoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5U2V0OiBzdHJpbmcsIG9EaWFnbm9zdGljczogRGlhZ25vc3RpY3MpIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNNZXRhUGF0aCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdHJldHVybiBDb252ZXJ0ZXJDb250ZXh0Py5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oc0VudGl0eVNldCwgb0NvbnRleHQgfHwgb01ldGFNb2RlbCwgb0RpYWdub3N0aWNzLCBtZXJnZU9iamVjdHMsIHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIElEIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIHRoZSBpbnRlcm5hbCBjaGFydCBmb3IgdGhlIG1lYXN1cmUgb3IgZGltZW5zaW9uLlxuICogRm9yIHN0YW5kYXJkIGNhc2VzLCB0aGlzIGlzIGp1c3QgdGhlIElEIG9mIHRoZSBwcm9wZXJ0eS5cbiAqIElmIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgYW5vdGhlciBJRCBpbnRlcm5hbGx5IGluc2lkZSB0aGUgY2hhcnQgKGUuZy4gb24gZHVwbGljYXRlIHByb3BlcnR5IElEcykgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJ3cml0dGVuLlxuICogSW4gdGhpcyBjYXNlLCA8Y29kZT5nZXRQcm9wZXJ0eUZyb21OYW1lQW5kS2luZDwvY29kZT4gbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBJRCBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBraW5kIFR5cGUgb2YgdGhlIHByb3BlcnR5IChtZWFzdXJlIG9yIGRpbWVuc2lvbilcbiAqIEByZXR1cm5zIEludGVybmFsIElEIGZvciB0aGUgc2FwLmNoYXJ0LkNoYXJ0XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQobmFtZTogc3RyaW5nLCBraW5kOiBzdHJpbmcpIHtcblx0cmV0dXJuIG5hbWUucmVwbGFjZShcIl9mZV9cIiArIGtpbmQgKyBcIl9cIiwgXCJcIik7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IG9mIGNoYXJ0IHByb3BlcnRpZXMgYnkgcmVtdm9pbmcgX2ZlX2dyb3VwYWJsZSBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYUZpbHRlcnMgQ2hhcnQgZmlsdGVyIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIENoYXJ0IHByb3BlcnRpZXMgd2l0aG91dCBwcmVmaXhlc1xuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5pbnRlcmZhY2UgSUZpbHRlclByb3Age1xuXHRzUGF0aDogc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcnRQcm9wZXJ0aWVzV2l0aG91dFByZWZpeGVzKGFGaWx0ZXJzOiBJRmlsdGVyUHJvcFtdKSB7XG5cdGFGaWx0ZXJzLmZvckVhY2goKGVsZW1lbnQ6IElGaWx0ZXJQcm9wKSA9PiB7XG5cdFx0aWYgKGVsZW1lbnQuc1BhdGggJiYgZWxlbWVudC5zUGF0aC5pbmNsdWRlcyhcImZlX2dyb3VwYWJsZVwiKSkge1xuXHRcdFx0ZWxlbWVudC5zUGF0aCA9IENvbW1vblV0aWxzLmdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQoZWxlbWVudC5zUGF0aCwgXCJncm91cGFibGVcIik7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFGaWx0ZXJzO1xufVxuXG5jb25zdCBDb21tb25VdGlscyA9IHtcblx0ZmlyZUJ1dHRvblByZXNzOiBmbkZpcmVCdXR0b25QcmVzcyxcblx0Z2V0VGFyZ2V0VmlldzogZ2V0VGFyZ2V0Vmlldyxcblx0Z2V0Q3VycmVudFBhZ2VWaWV3OiBnZXRDdXJyZW50UGFnZVZpZXcsXG5cdGhhc1RyYW5zaWVudENvbnRleHQ6IGZuSGFzVHJhbnNpZW50Q29udGV4dHMsXG5cdHVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlsczogZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMsXG5cdGdldEFwcENvbXBvbmVudDogZ2V0QXBwQ29tcG9uZW50LFxuXHRnZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHM6IGZuR2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzLFxuXHRnZXRDb250ZXh0UGF0aFByb3BlcnRpZXM6IGZuR2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzLFxuXHRnZXRQYXJhbWV0ZXJJbmZvOiBnZXRQYXJhbWV0ZXJJbmZvLFxuXHR1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eTogZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSxcblx0Z2V0RW50aXR5U2V0TmFtZTogZ2V0RW50aXR5U2V0TmFtZSxcblx0Z2V0QWN0aW9uUGF0aDogZ2V0QWN0aW9uUGF0aCxcblx0Y29tcHV0ZURpc3BsYXlNb2RlOiBjb21wdXRlRGlzcGxheU1vZGUsXG5cdGlzU3RpY2t5RWRpdE1vZGU6IGlzU3RpY2t5RWRpdE1vZGUsXG5cdGdldE9wZXJhdG9yc0ZvclByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eSxcblx0Z2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHksXG5cdGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eTogZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5LFxuXHRhZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zOiBhZGRTZWxlY3Rpb25WYXJpYW50VG9Db25kaXRpb25zLFxuXHRhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudDogYWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQsXG5cdGFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50OiBhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCxcblx0YWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeTogYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeSxcblx0c2V0VXNlckRlZmF1bHRzOiBzZXRVc2VyRGVmYXVsdHMsXG5cdGdldElCTkFjdGlvbnM6IGZuR2V0SUJOQWN0aW9ucyxcblx0Z2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uOiBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24sXG5cdGdldFNlbWFudGljT2JqZWN0TWFwcGluZzogZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzOiBzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzLFxuXHRnZXRTZW1hbnRpY09iamVjdFByb21pc2U6IGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlLFxuXHRnZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsOiBmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwsXG5cdGdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoOiBmbkdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoLFxuXHR1cGRhdGVTZW1hbnRpY1RhcmdldHM6IGZuVXBkYXRlU2VtYW50aWNUYXJnZXRzTW9kZWwsXG5cdHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkOiB3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCxcblx0Z2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoOiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgsXG5cdGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb246IGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24sXG5cdGdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGU6IGdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGUsXG5cdHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eTogcmVxdWVzdFNpbmdsZXRvblByb3BlcnR5LFxuXHR0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudDogdGVtcGxhdGVDb250cm9sRnJhZ21lbnQsXG5cdEZpbHRlclJlc3RyaWN0aW9uczoge1xuXHRcdFJFUVVJUkVEX1BST1BFUlRJRVM6IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIsXG5cdFx0Tk9OX0ZJTFRFUkFCTEVfUFJPUEVSVElFUzogXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiLFxuXHRcdEFMTE9XRURfRVhQUkVTU0lPTlM6IFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCJcblx0fSxcblx0QWxsb3dlZEV4cHJlc3Npb25zUHJpbzogW1wiU2luZ2xlVmFsdWVcIiwgXCJNdWx0aVZhbHVlXCIsIFwiU2luZ2xlUmFuZ2VcIiwgXCJNdWx0aVJhbmdlXCIsIFwiU2VhcmNoRXhwcmVzc2lvblwiLCBcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIl0sXG5cdG5vcm1hbGl6ZVNlYXJjaFRlcm06IG5vcm1hbGl6ZVNlYXJjaFRlcm0sXG5cdHNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZTogc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRzZXREeW5hbWljQWN0aW9uQ29udGV4dHM6IHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyxcblx0cmVxdWVzdFByb3BlcnR5OiByZXF1ZXN0UHJvcGVydHksXG5cdGdldFBhcmFtZXRlclBhdGg6IGdldFBhcmFtZXRlclBhdGgsXG5cdGdldFJlbGF0ZWRBcHBzTWVudUl0ZW1zOiBfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMsXG5cdGdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmc6IF9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmcsXG5cdGFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnM6IGFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMsXG5cdGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9uczogYWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zLFxuXHRjcmVhdGVTZW1hbnRpY0RhdGVzRnJvbUNvbmRpdGlvbnM6IGNyZWF0ZVNlbWFudGljRGF0ZXNGcm9tQ29uZGl0aW9ucyxcblx0dXBkYXRlUmVsYXRlQXBwc01vZGVsOiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwsXG5cdGdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnM6IF9nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zLFxuXHRnZXRGaWx0ZXJzSW5mb0ZvclNWOiBnZXRGaWx0ZXJzSW5mb0ZvclNWLFxuXHRnZXRJbnRlcm5hbENoYXJ0TmFtZUZyb21Qcm9wZXJ0eU5hbWVBbmRLaW5kOiBnZXRJbnRlcm5hbENoYXJ0TmFtZUZyb21Qcm9wZXJ0eU5hbWVBbmRLaW5kLFxuXHRnZXRDaGFydFByb3BlcnRpZXNXaXRob3V0UHJlZml4ZXM6IGdldENoYXJ0UHJvcGVydGllc1dpdGhvdXRQcmVmaXhlcyxcblx0aXNTbWFsbERldmljZSxcblx0Z2V0Q29udmVydGVyQ29udGV4dEZvclBhdGhcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1vblV0aWxzO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0VBOEVBLFNBQVNBLG1CQUFtQixDQUFDQyxXQUFtQixFQUFFO0lBQ2pELElBQUksQ0FBQ0EsV0FBVyxFQUFFO01BQ2pCLE9BQU9DLFNBQVM7SUFDakI7SUFFQSxPQUFPRCxXQUFXLENBQ2hCRSxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUNsQkEsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUFBLENBQ3ZCQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQ1pDLE1BQU0sQ0FBQyxVQUFVQyxXQUErQixFQUFFQyxZQUFvQixFQUFFO01BQ3hFLElBQUlBLFlBQVksS0FBSyxFQUFFLEVBQUU7UUFDeEJELFdBQVcsR0FBSSxHQUFFQSxXQUFXLEdBQUksR0FBRUEsV0FBWSxHQUFFLEdBQUcsRUFBRyxJQUFHQyxZQUFhLEdBQUU7TUFDekU7TUFDQSxPQUFPRCxXQUFXO0lBQ25CLENBQUMsRUFBRUosU0FBUyxDQUFDO0VB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
1561
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5Iiwibm9ybWFsaXplU2VhcmNoVGVybSIsInNTZWFyY2hUZXJtIiwidW5kZWZpbmVkIiwicmVwbGFjZSIsInNwbGl0IiwicmVkdWNlIiwic05vcm1hbGl6ZWQiLCJzQ3VycmVudFdvcmQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImJpbmRpbmdDb250ZXh0IiwibW9kZWwiLCJnZXRNb2RlbCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImVudGl0eVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJkYXRhTW9kZWwiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJnZXRDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwidGFyZ2V0RW50aXR5VHlwZSIsImtleXMiLCJuYW1lIiwiZm5IYXNUcmFuc2llbnRDb250ZXh0cyIsIm9MaXN0QmluZGluZyIsImJIYXNUcmFuc2llbnRDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImZvckVhY2giLCJvQ29udGV4dCIsImlzVHJhbnNpZW50IiwiX2dldFNPSW50ZW50cyIsIm9TaGVsbFNlcnZpY2VIZWxwZXIiLCJvT2JqZWN0UGFnZUxheW91dCIsIm9TZW1hbnRpY09iamVjdCIsIm9QYXJhbSIsImdldExpbmtzIiwic2VtYW50aWNPYmplY3QiLCJwYXJhbXMiLCJfY3JlYXRlTWFwcGluZ3MiLCJvTWFwcGluZyIsImFTT01hcHBpbmdzIiwiYU1hcHBpbmdLZXlzIiwiT2JqZWN0Iiwib1NlbWFudGljTWFwcGluZyIsImkiLCJsZW5ndGgiLCJMb2NhbFByb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIlNlbWFudGljT2JqZWN0UHJvcGVydHkiLCJwdXNoIiwiX2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zIiwiYUxpbmtzIiwiYUV4Y2x1ZGVkQWN0aW9ucyIsIm9UYXJnZXRQYXJhbXMiLCJhSXRlbXMiLCJhQWxsb3dlZEFjdGlvbnMiLCJvTGluayIsInNJbnRlbnQiLCJpbnRlbnQiLCJzQWN0aW9uIiwiaW5jbHVkZXMiLCJ0ZXh0IiwidGFyZ2V0U2VtT2JqZWN0IiwidGFyZ2V0QWN0aW9uIiwidGFyZ2V0UGFyYW1zIiwiaW5kZXhPZiIsIl9nZXRSZWxhdGVkSW50ZW50cyIsIm9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzIiwib0JpbmRpbmdDb250ZXh0IiwiYU1hbmlmZXN0U09JdGVtcyIsImFsbG93ZWRBY3Rpb25zIiwidW5hdmFpbGFibGVBY3Rpb25zIiwibWFwcGluZyIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIl9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24iLCJzZW1hbnRpY09iamVjdEFuZEFjdGlvbiIsImFwcENvbXBvbmVudFNPSXRlbXMiLCJhY3Rpb25zIiwiYWN0aW9uIiwiZXhjbHVkZWRBY3Rpb25zIiwic29NYXBwaW5ncyIsInVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCIsIm9FbnRyeSIsImFTZW1LZXlzIiwib01ldGFNb2RlbCIsIm9NZXRhUGF0aCIsImFwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzQ3VycmVudFNlbU9iaiIsInNDdXJyZW50QWN0aW9uIiwib1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMiLCJhUmVsYXRlZEFwcHNNZW51SXRlbXMiLCJhTWFuaWZlc3RTT0tleXMiLCJmbkdldFBhcnNlU2hlbGxIYXNoQW5kR2V0TGlua3MiLCJvUGFyc2VkVXJsIiwicGFyc2VTaGVsbEhhc2giLCJkb2N1bWVudCIsImxvY2F0aW9uIiwiaGFzaCIsImoiLCJzU2VtS2V5IiwidmFsdWUiLCJhVGVjaG5pY2FsS2V5cyIsImdldE9iamVjdCIsImtleSIsInNPYmpLZXkiLCJvTWFuaWZlc3REYXRhIiwiZ2V0VGFyZ2V0VmlldyIsImdldFZpZXdEYXRhIiwic2VtYW50aWNPYmplY3RJbnRlbnRzIiwiYWRkaXRpb25hbFNlbWFudGljT2JqZWN0cyIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJmZUVudmlyb25tZW50IiwiZ2V0SW50ZW50IiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCIsImFBbm5vdGF0aW9uc1NPSXRlbXMiLCJzRW50aXR5U2V0UGF0aCIsInNFbnRpdHlUeXBlUGF0aCIsIm9FbnRpdHlTZXRBbm5vdGF0aW9ucyIsIkNvbW1vblV0aWxzIiwiZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyIsImJIYXNFbnRpdHlTZXRTTyIsIm9FbnRpdHlUeXBlQW5ub3RhdGlvbnMiLCJhVW5hdmFpbGFibGVBY3Rpb25zIiwiYU1hcHBpbmdzIiwic29JdGVtcyIsImNvbmNhdCIsInNldFByb3BlcnR5IiwiZXJyb3IiLCJMb2ciLCJfZ2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyIsIm9FbnRpdHlBbm5vdGF0aW9ucyIsInNBbm5vdGF0aW9uTWFwcGluZ1Rlcm0iLCJzQW5ub3RhdGlvbkFjdGlvblRlcm0iLCJzUXVhbGlmaWVyIiwiZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMiLCJwYXRoIiwic1NlbWFudGljS2V5Vm9jYWJ1bGFyeSIsInJlcXVlc3RPYmplY3QiLCJ0aGVuIiwicmVxdWVzdGVkT2JqZWN0IiwiY2F0Y2giLCJvRXJyb3IiLCJmbkZpcmVCdXR0b25QcmVzcyIsIm9CdXR0b24iLCJpc0EiLCJnZXRWaXNpYmxlIiwiZ2V0RW5hYmxlZCIsImZpcmVQcmVzcyIsImdldEFwcENvbXBvbmVudCIsIm9Db250cm9sIiwib093bmVyIiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJFcnJvciIsImdldEN1cnJlbnRQYWdlVmlldyIsIm9BcHBDb21wb25lbnQiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJpc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RWaWV3IiwiZ2V0Um9vdENvbnRhaW5lciIsImdldEN1cnJlbnRQYWdlIiwib0NvbXBvbmVudCIsImdldENvbXBvbmVudEluc3RhbmNlIiwiZ2V0Um9vdENvbnRyb2wiLCJnZXRQYXJlbnQiLCJfZm5DaGVja0lzTWF0Y2giLCJvT2JqZWN0Iiwib0tleXNUb0NoZWNrIiwic0tleSIsImZuR2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzIiwibWV0YU1vZGVsQ29udGV4dCIsInNDb250ZXh0UGF0aCIsIm9GaWx0ZXIiLCJvRW50aXR5VHlwZSIsIm9Qcm9wZXJ0aWVzIiwiaGFzT3duUHJvcGVydHkiLCJ0ZXN0IiwiJGtpbmQiLCJmbkdldE1hbmRhdG9yeUZpbHRlckZpZWxkcyIsImFNYW5kYXRvcnlGaWx0ZXJGaWVsZHMiLCJmbkdldElCTkFjdGlvbnMiLCJhSUJOQWN0aW9ucyIsImFBY3Rpb25zIiwiZ2V0QWN0aW9ucyIsIm9BY3Rpb24iLCJnZXRBY3Rpb24iLCJvTWVudSIsImdldE1lbnUiLCJnZXRJdGVtcyIsIm9JdGVtIiwiZGF0YSIsImZuVXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJvVmlldyIsIm9QYXJhbXMiLCJpc1N0aWNreSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZm5HZXRMaW5rcyIsIm9EYXRhIiwiYUtleXMiLCJvSUJOQWN0aW9uIiwic1NlbWFudGljT2JqZWN0IiwiYUxpbmsiLCJzZXRWaXNpYmxlIiwiZ2V0SWQiLCJzaGVsbE5hdmlnYXRpb25Ob3RBdmFpbGFibGUiLCJnZXRBY3Rpb25QYXRoIiwiYWN0aW9uQ29udGV4dCIsImJSZXR1cm5Pbmx5UGF0aCIsImluQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0FjdGlvbk5hbWUiLCJ0b1N0cmluZyIsInNFbnRpdHlUeXBlTmFtZSIsIiRUeXBlIiwic0VudGl0eU5hbWUiLCJnZXRFbnRpdHlTZXROYW1lIiwic1Byb3BlcnR5Iiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJzRW50aXR5VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsIm9Db2xsZWN0aW9uQW5ub3RhdGlvbnMiLCJvVGV4dEFubm90YXRpb24iLCJvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiIsIiRFbnVtTWVtYmVyIiwiX2dldEVudGl0eVR5cGUiLCJfcmVxdWVzdE9iamVjdCIsIm9TZWxlY3RlZENvbnRleHQiLCJuQnJhY2tldEluZGV4Iiwic1RhcmdldFR5cGUiLCJzbGljZSIsInNDdXJyZW50VHlwZSIsImdldEJpbmRpbmciLCJ3YXJuaW5nIiwic0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5IiwidlByb3BlcnR5VmFsdWUiLCJzZXRDb250ZXh0c0Jhc2VkT25PcGVyYXRpb25BdmFpbGFibGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJhUmVxdWVzdFByb21pc2VzIiwiYWxsIiwiYVJlc3VsdHMiLCJhQXBwbGljYWJsZUNvbnRleHRzIiwiYU5vdEFwcGxpY2FibGVDb250ZXh0cyIsImFSZXN1bHQiLCJzZXREeW5hbWljQWN0aW9uQ29udGV4dHMiLCJ0cmFjZSIsImFBcHBsaWNhYmxlIiwiYU5vdEFwcGxpY2FibGUiLCJzRHluYW1pY0FjdGlvblBhdGhQcmVmaXgiLCJvSW50ZXJuYWxNb2RlbCIsIl9nZXREZWZhdWx0T3BlcmF0b3JzIiwic1Byb3BlcnR5VHlwZSIsIm9EYXRhQ2xhc3MiLCJUeXBlVXRpbCIsImdldERhdGFUeXBlQ2xhc3NOYW1lIiwib0Jhc2VUeXBlIiwiZ2V0QmFzZVR5cGUiLCJGaWx0ZXJPcGVyYXRvclV0aWwiLCJnZXRPcGVyYXRvcnNGb3JUeXBlIiwiX2dldFJlc3RyaWN0aW9ucyIsImFEZWZhdWx0T3BzIiwiYUV4cHJlc3Npb25PcHMiLCJmaWx0ZXIiLCJzRWxlbWVudCIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJBbGxvd2VkRXhwcmVzc2lvbnNQcmlvIiwic29ydCIsImEiLCJiIiwiZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkiLCJzVHlwZSIsImJVc2VTZW1hbnRpY0RhdGVSYW5nZSIsInNTZXR0aW5ncyIsIm9GaWx0ZXJSZXN0cmljdGlvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgiLCJhRXF1YWxzT3BzIiwiYVNpbmdsZVJhbmdlT3BzIiwiYVNpbmdsZVJhbmdlRFRCYXNpY09wcyIsImFTaW5nbGVWYWx1ZURhdGVPcHMiLCJhTXVsdGlSYW5nZU9wcyIsImFTZWFyY2hFeHByZXNzaW9uT3BzIiwiYVNlbWFudGljRGF0ZU9wc0V4dCIsIlNlbWFudGljRGF0ZU9wZXJhdG9ycyIsImdldFN1cHBvcnRlZE9wZXJhdGlvbnMiLCJiU2VtYW50aWNEYXRlUmFuZ2UiLCJhU2VtYW50aWNEYXRlT3BzIiwib1NldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiY3VzdG9tRGF0YSIsIm9wZXJhdG9yQ29uZmlndXJhdGlvbiIsImdldEZpbHRlck9wZXJhdGlvbnMiLCJnZXRTZW1hbnRpY0RhdGVPcGVyYXRpb25zIiwiYURlZmF1bHRPcGVyYXRvcnMiLCJyZXN0cmljdGlvbnMiLCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMiLCJzQWxsb3dlZEV4cHJlc3Npb24iLCJhU2luZ2xlVmFsdWVPcHMiLCJzT3BlcmF0b3JzIiwiZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5IiwiYWxsb3dlZE9wZXJhdG9yc0Zvckd1aWQiLCJnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHkiLCJwcm9wZXJ0eVR5cGUiLCJnZXRQYXJhbWV0ZXJJbmZvIiwic1BhcmFtZXRlckNvbnRleHRQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJiUmVzdWx0Q29udGV4dCIsIm9QYXJhbWV0ZXJJbmZvIiwiY29udGV4dFBhdGgiLCJwYXJhbWV0ZXJQcm9wZXJ0aWVzIiwiZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzIiwiYWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zIiwib1Byb3BlcnR5TWV0YWRhdGEiLCJhVmFsaWRPcGVyYXRvcnMiLCJhU2VtYW50aWNEYXRlT3BlcmF0b3JzIiwiYUN1bXVsYXRpdmVDb25kaXRpb25zIiwib1NlbGVjdE9wdGlvbiIsIm9Db25kaXRpb24iLCJnZXRDb25kaXRpb25zIiwiU2VtYW50aWNEYXRlcyIsIm9wZXJhdG9yIiwic2VtYW50aWNEYXRlcyIsImFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMiLCJvU2VtYW50aWNEYXRlcyIsInZhbHVlcyIsImhpZ2giLCJsb3ciLCJpc0VtcHR5IiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm1QYWdlQ29udGV4dCIsIm9OYXZpZ2F0aW9uU2VydmljZSIsImdldE5hdmlnYXRpb25TZXJ2aWNlIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJ0b0pTT05TdHJpbmciLCJhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudCIsImlucHV0U2VsZWN0aW9uVmFyaWFudCIsImZpbHRlcnMiLCJmaWx0ZXJCYXIiLCJ0YXJnZXRJbmZvIiwiZmlsdGVyQ29uZGl0aW9ucyIsImZpbHRlcnNXaXRob3V0Q29uZmxpY3QiLCJmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0IiwidGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0IiwicHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInNlbGVjdGlvblZhcmlhbnRGcm9tRmlsdGVyYmFyIiwiU3RhdGVGaWx0ZXJUb1NlbGVjdGlvblZhcmlhbnQiLCJnZXRTZWxlY3Rpb25WYXJpYW50RnJvbUNvbmRpdGlvbnMiLCJnZXRQcm9wZXJ0eUhlbHBlciIsImZpbHRlcmtleSIsImZpbHRlclNlbGVjdE9wdGlvbiIsImdldFNlbGVjdE9wdGlvbiIsIm1hc3NBZGRTZWxlY3RPcHRpb24iLCJpc1N0aWNreUVkaXRNb2RlIiwiYklzU3RpY2t5TW9kZSIsImJVSUVkaXRhYmxlIiwiZ2V0UHJvcGVydHkiLCJhZGREZWZhdWx0RGlzcGxheUN1cnJlbmN5Iiwib1NlbGVjdGlvblZhcmlhbnREZWZhdWx0cyIsImFTVk9wdGlvbiIsImFEZWZhdWx0U1ZPcHRpb24iLCJkaXNwbGF5Q3VycmVuY3lTZWxlY3RPcHRpb24iLCJzU2lnbiIsInNPcHRpb24iLCJzTG93Iiwic0hpZ2giLCJhZGRTZWxlY3RPcHRpb24iLCJzZXRVc2VyRGVmYXVsdHMiLCJhUGFyYW1ldGVycyIsIm9Nb2RlbCIsImJJc0FjdGlvbiIsImJJc0NyZWF0ZSIsIm9BY3Rpb25EZWZhdWx0VmFsdWVzIiwib0NvbXBvbmVudERhdGEiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzdGFydHVwUGFyYW1ldGVycyIsIm9TaGVsbFNlcnZpY2VzIiwib1N0YXJ0dXBBcHBTdGF0ZSIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsImdldERhdGEiLCJhRXh0ZW5kZWRQYXJhbWV0ZXJzIiwic2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJvUGFyYW1ldGVyIiwic1Byb3BlcnR5TmFtZSIsIiROYW1lIiwic1BhcmFtZXRlck5hbWUiLCJvRXh0ZW5kZWRQYXJhbWV0ZXIiLCJQcm9wZXJ0eU5hbWUiLCJvUmFuZ2UiLCJSYW5nZXMiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiZ2V0QWRkaXRpb25hbFBhcmFtc0ZvckNyZWF0ZSIsIm9JbmJvdW5kUGFyYW1ldGVycyIsIm9JbmJvdW5kcyIsImFDcmVhdGVQYXJhbWV0ZXJzIiwic1BhcmFtZXRlciIsInVzZUZvckNyZWF0ZSIsIm9SZXQiLCJzQ3JlYXRlUGFyYW1ldGVyIiwiYVZhbHVlcyIsImNyZWF0ZSIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9PdXRib3VuZCIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJwYXJhbWV0ZXJzIiwic1BhcmFtIiwiZm9ybWF0IiwiZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwib1ZpZXdEYXRhIiwib0Nyb3NzTmF2Iiwib0hlYWRlckZhY2V0SXRlbXMiLCJzSWQiLCJvQ29udHJvbENvbmZpZyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiY29uZmlnIiwic091dGJvdW5kIiwibmF2aWdhdGlvbiIsInRhcmdldE91dGJvdW5kIiwib3V0Ym91bmQiLCJnZW5lcmF0ZSIsInNldFNlbWFudGljT2JqZWN0TWFwcGluZ3MiLCJ2TWFwcGluZ3MiLCJvTWFwcGluZ3MiLCJzTG9jYWxQcm9wZXJ0eSIsInNTZW1hbnRpY09iamVjdFByb3BlcnR5IiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwiZm5HZXRTZW1hbnRpY09iamVjdHNGcm9tUGF0aCIsInNQYXRoIiwiYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIiwiYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJzZW1hbnRpY09iamVjdEZvckdldExpbmtzIiwiZm5VcGRhdGVTZW1hbnRpY1RhcmdldHNNb2RlbCIsImFHZXRMaW5rc1Byb21pc2VzIiwiYVNlbWFudGljT2JqZWN0cyIsInNDdXJyZW50SGFzaCIsIl9vTGluayIsIl9zTGlua0ludGVudEFjdGlvbiIsImFGaW5hbExpbmtzIiwib0ZpbmFsU2VtYW50aWNPYmplY3RzIiwiYkludGVudEhhc0FjdGlvbnMiLCJrIiwib1RtcCIsInNBbHRlcm5hdGVQYXRoIiwiaGFzVGFyZ2V0c05vdEZpbHRlcmVkIiwiaGFzVGFyZ2V0cyIsImlMaW5rQ291bnQiLCJIYXNUYXJnZXRzIiwiSGFzVGFyZ2V0c05vdEZpbHRlcmVkIiwiYXNzaWduIiwic1NlbWFudGljT2JqZWN0TmFtZSIsIm1lcmdlT2JqZWN0cyIsImZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlIiwiZ2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgiLCJmblByZXBhcmVTZW1hbnRpY09iamVjdHNQcm9taXNlcyIsIl9vQXBwQ29tcG9uZW50IiwiX29WaWV3IiwiX29NZXRhTW9kZWwiLCJfYVNlbWFudGljT2JqZWN0c0ZvdW5kIiwiX2FTZW1hbnRpY09iamVjdHNQcm9taXNlcyIsIl9LZXlzIiwicmVnZXhSZXN1bHQiLCJpbmRleCIsImV4ZWMiLCJnZXRTZW1hbnRpY09iamVjdFByb21pc2UiLCJmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwiLCJvQ29udHJvbGxlciIsInNQYWdlTW9kZWwiLCJfZm5maW5kVmFsdWVzSGVscGVyIiwib2JqIiwibGlzdCIsIkFycmF5IiwiaXRlbSIsImNoaWxkcmVuIiwiX2ZuZmluZFZhbHVlcyIsIl9mbkRlbGV0ZUR1cGxpY2F0ZVNlbWFudGljT2JqZWN0cyIsImFTZW1hbnRpY09iamVjdFBhdGgiLCJnZXRWaWV3IiwiYVNlbWFudGljT2JqZWN0c1Byb21pc2VzIiwiZ2V0T3duZXJDb21wb25lbnQiLCJvUGFnZU1vZGVsIiwic3RyaW5naWZ5IiwiX2dldE9iamVjdCIsImFTZW1hbnRpY09iamVjdHNGb3VuZCIsImdldEhhc2giLCJhU2VtYW50aWNPYmplY3RzRm9yR2V0TGlua3MiLCJfb1NlbWFudGljT2JqZWN0Iiwic1NlbU9iakV4cHJlc3Npb24iLCJhU2VtYW50aWNPYmplY3RzUmVzb2x2ZWQiLCJlbGVtZW50IiwiY29tcGlsZUV4cHJlc3Npb24iLCJwYXRoSW5Nb2RlbCIsIiRQYXRoIiwiZ2V0TGlua3NXaXRoQ2FjaGUiLCJ1cGRhdGVTZW1hbnRpY1RhcmdldHMiLCJnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbiIsIm9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJvUHJvcGVydHkiLCJQcm9wZXJ0eSIsIkFsbG93ZWRFeHByZXNzaW9ucyIsImdldEZpbHRlclJlc3RyaWN0aW9ucyIsInNSZXN0cmljdGlvbiIsImFQcm9wcyIsIm1hcCIsIl9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoIiwicGF0aHMiLCJuYXZQYXRoIiwicHJvcHMiLCJuYXZQYXRoUHJlZml4Iiwib3V0UGF0aHMiLCJwYXRoVG9DaGVjayIsInN0YXJ0c1dpdGgiLCJvdXRQYXRoIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJuYXZpZ2F0aW9uVGV4dCIsImZyVGVybSIsImVudGl0eVR5cGVQYXRoUGFydHMiLCJyZXBsYWNlQWxsIiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJlbnRpdHlUeXBlUGF0aCIsImpvaW4iLCJlbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsImVudGl0eVNldFBhdGhQYXJ0cyIsImlzQ29udGFpbm1lbnQiLCJjb250YWlubWVudE5hdlBhdGgiLCJyZXN1bHRDb250ZXh0Q2hlY2siLCJwYXJlbnRFbnRpdHlTZXRQYXRoIiwib1BhcmVudFJldCIsIm9QYXJlbnRGUiIsImNvbXBsZXRlQWxsb3dlZEV4cHMiLCJvdXRQcm9wIiwicHJvcFBhdGgiLCJvdXRQcm9wUGF0aCIsIm9OYXZSZXN0cmljdGlvbnMiLCJNZXRhTW9kZWxGdW5jdGlvbiIsImdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJvTmF2RmlsdGVyUmVzdCIsIm5hdlJlc1JlcVByb3BzIiwidW5pcXVlU29ydCIsIm5hdk5vbkZpbHRlclByb3BzIiwibmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0IiwibmF2QXNzb2NSZXFQcm9wcyIsIm5hdkFzc29jTm9uRmlsdGVyUHJvcHMiLCJ0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudCIsInNGcmFnbWVudE5hbWUiLCJvUHJlcHJvY2Vzc29yU2V0dGluZ3MiLCJvT3B0aW9ucyIsIm9Nb2RpZmllciIsInZpZXciLCJvRnJhZ21lbnQiLCJ0YXJnZXRzIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJpc1hNTCIsIkZyYWdtZW50IiwibG9hZCIsImlkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJnZXRTaW5nbGV0b25QYXRoIiwicGFydHMiLCJCb29sZWFuIiwicHJvcGVydHlOYW1lIiwicG9wIiwibmF2aWdhdGlvblBhdGgiLCJlbnRpdHlTZXQiLCJzaW5nbGV0b25OYW1lIiwicmVzb2x2ZWRQYXRoIiwicHJvcGVydHlCaW5kaW5nIiwiYmluZFByb3BlcnR5IiwicmVxdWVzdFZhbHVlIiwiZ2V0UGFyYW1ldGVyUGF0aCIsInNDb250ZXh0IiwiYUFjdGlvbiIsIl9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciLCJleHBCaW5kaW5nIiwiY29udHJvbCIsImFueVJlc291cmNlVGV4dCIsIkFueUVsZW1lbnQiLCJhbnlUZXh0IiwiYWRkRGVwZW5kZW50IiwicmVzdWx0VGV4dCIsImdldEFueVRleHQiLCJyZW1vdmVEZXBlbmRlbnQiLCJkZXN0cm95IiwiaXNTbWFsbERldmljZSIsInN5c3RlbSIsImRlc2t0b3AiLCJEZXZpY2UiLCJyZXNpemUiLCJ3aWR0aCIsImdldEZpbHRlcnNJbmZvRm9yU1YiLCJzZWxlY3Rpb25WYXJpYW50UGF0aCIsImlzQ2hhcnQiLCJtUHJvcGVydHlGaWx0ZXJzIiwiYUZpbHRlcnMiLCJhUGF0aHMiLCJzVGV4dCIsIlNlbGVjdGlvblZhcmlhbnQiLCJUZXh0IiwiRmlsdGVyIiwiSGlnaCIsInNQcm9wZXJ0eVBhdGgiLCJhbmQiLCJwcm9wZXJ0aWVzIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclBhdGgiLCJzTWV0YVBhdGgiLCJzRW50aXR5U2V0Iiwib0RpYWdub3N0aWNzIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJDb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwiZ2V0SW50ZXJuYWxDaGFydE5hbWVGcm9tUHJvcGVydHlOYW1lQW5kS2luZCIsImtpbmQiLCJnZXRDaGFydFByb3BlcnRpZXNXaXRob3V0UHJlZml4ZXMiLCJjcmVhdGVSb290Q29udGV4dCIsInByb2dyYW1taW5nTW9kZWwiLCJjb250ZXh0Iiwicm9vdENvbnRleHRQYXRoIiwiRHJhZnQiLCJnZXREcmFmdFJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJzaW1wbGVSb290Q29udGV4dCIsImV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UiLCJnZXRJbnN0YW5jZWRWaWV3cyIsImZpbmQiLCJwYWdlVmlldyIsImludGVybmFsTW9kZWwiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImZpcmVCdXR0b25QcmVzcyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJ1cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMiLCJnZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHMiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsImdldElCTkFjdGlvbnMiLCJnZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiUkVRVUlSRURfUFJPUEVSVElFUyIsIk5PTl9GSUxURVJBQkxFX1BST1BFUlRJRVMiLCJBTExPV0VEX0VYUFJFU1NJT05TIiwiZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMiLCJnZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDb21tb25VdGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEVkbSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlclJlc3RyaWN0aW9uc1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlLCBTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBUZXh0QXJyYW5nZW1lbnQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB1bmlxdWVTb3J0IGZyb20gXCJzYXAvYmFzZS91dGlsL2FycmF5L3VuaXF1ZVNvcnRcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudERhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIHBhdGhJbk1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNEYXRlT3BlcmF0b3JzIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljRGF0ZU9wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IElTaGVsbFNlcnZpY2VzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NoZWxsU2VydmljZXNGYWN0b3J5XCI7XG5pbXBvcnQgU3RhdGVGaWx0ZXJUb1NlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9jb3JlL1N0YXRlRmlsdGVyVG9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSBEaWFnbm9zdGljcyBmcm9tIFwic2FwL2ZlL2NvcmUvc3VwcG9ydC9EaWFnbm9zdGljc1wiO1xuaW1wb3J0IFR5cGVVdGlsIGZyb20gXCJzYXAvZmUvY29yZS90eXBlL1R5cGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdE9wdGlvbiwgU2VtYW50aWNEYXRlQ29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgTWVudUJ1dHRvbiBmcm9tIFwic2FwL20vTWVudUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIE92ZXJmbG93VG9vbGJhckJ1dHRvbiBmcm9tIFwic2FwL20vT3ZlcmZsb3dUb29sYmFyQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudENvbnRhaW5lciBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgRGV2aWNlLCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgdHlwZSBBY3Rpb25Ub29sYmFyQWN0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2FjdGlvbnRvb2xiYXIvQWN0aW9uVG9vbGJhckFjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE1EQ0NoYXJ0IH0gZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yVXRpbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vRmlsdGVyT3BlcmF0b3JVdGlsXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTURDVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTURDVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCB0eXBlIHtcblx0RXhwYW5kUGF0aFR5cGUsXG5cdE1ldGFNb2RlbEVudGl0eVR5cGUsXG5cdE1ldGFNb2RlbEVudW0sXG5cdE1ldGFNb2RlbE5hdlByb3BlcnR5LFxuXHRNZXRhTW9kZWxQcm9wZXJ0eSxcblx0TWV0YU1vZGVsVHlwZVxufSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQW55RWxlbWVudCBmcm9tIFwiLi9jb250cm9scy9BbnlFbGVtZW50XCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxGdW5jdGlvbiBmcm9tIFwiLi9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBnZXRDb25kaXRpb25zIH0gZnJvbSBcIi4vdGVtcGxhdGluZy9GaWx0ZXJIZWxwZXJcIjtcblxuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXG50eXBlIE15SW5ib3hJbnRlbnQgPSB7XG5cdHNlbWFudGljT2JqZWN0OiBzdHJpbmc7XG5cdGFjdGlvbjogc3RyaW5nO1xufTtcbnR5cGUgRXh0ZXJuYWxGaWx0ZXIgPSB7XG5cdGZpbHRlckNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPjtcblx0ZmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG50eXBlIE5hdmlnYXRpb25JbmZvID0ge1xuXHRwcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaFRlcm0oc1NlYXJjaFRlcm06IHN0cmluZykge1xuXHRpZiAoIXNTZWFyY2hUZXJtKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHJldHVybiBzU2VhcmNoVGVybVxuXHRcdC5yZXBsYWNlKC9cIi9nLCBcIiBcIilcblx0XHQucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpIC8vZXNjYXBlIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLiBDYW4gYmUgcmVtb3ZlZCBpZiBvZGF0YS9iaW5kaW5nIGhhbmRsZXMgYmFja2VuZCBlcnJvcnMgcmVzcG9uZHMuXG5cdFx0LnNwbGl0KC9cXHMrLylcblx0XHQucmVkdWNlKGZ1bmN0aW9uIChzTm9ybWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzQ3VycmVudFdvcmQ6IHN0cmluZykge1xuXHRcdFx0aWYgKHNDdXJyZW50V29yZCAhPT0gXCJcIikge1xuXHRcdFx0XHRzTm9ybWFsaXplZCA9IGAke3NOb3JtYWxpemVkID8gYCR7c05vcm1hbGl6ZWR9IGAgOiBcIlwifVwiJHtzQ3VycmVudFdvcmR9XCJgO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNOb3JtYWxpemVkO1xuXHRcdH0sIHVuZGVmaW5lZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkKGJpbmRpbmdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRjb25zdCBtb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGRhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldENvbnRleHQoZW50aXR5UGF0aCkpO1xuXHRhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUua2V5c1swXT8ubmFtZSk7XG59XG5cbmZ1bmN0aW9uIGZuSGFzVHJhbnNpZW50Q29udGV4dHMob0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdGxldCBiSGFzVHJhbnNpZW50Q29udGV4dHMgPSBmYWxzZTtcblx0aWYgKG9MaXN0QmluZGluZykge1xuXHRcdG9MaXN0QmluZGluZy5nZXRDdXJyZW50Q29udGV4dHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogT0RhdGFWNENvbnRleHQpIHtcblx0XHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdGJIYXNUcmFuc2llbnRDb250ZXh0cyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGJIYXNUcmFuc2llbnRDb250ZXh0cztcbn1cblxuLy8gdGhlcmUgaXMgbm8gbmF2aWdhdGlvbiBpbiBlbnRpdHlTZXQgcGF0aCBhbmQgcHJvcGVydHkgcGF0aFxuXG5hc3luYyBmdW5jdGlvbiBfZ2V0U09JbnRlbnRzKFxuXHRvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdG9TZW1hbnRpY09iamVjdDogdW5rbm93bixcblx0b1BhcmFtOiB1bmtub3duXG4pOiBQcm9taXNlPExpbmtEZWZpbml0aW9uW10+IHtcblx0cmV0dXJuIG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3Moe1xuXHRcdHNlbWFudGljT2JqZWN0OiBvU2VtYW50aWNPYmplY3QsXG5cdFx0cGFyYW1zOiBvUGFyYW1cblx0fSkgYXMgUHJvbWlzZTxMaW5rRGVmaW5pdGlvbltdPjtcbn1cblxuLy8gVE8tRE8gYWRkIHRoaXMgYXMgcGFydCBvZiBhcHBseVNlbWFudGljT2JqZWN0bWFwcGluZ3MgbG9naWMgaW4gSW50ZW50QmFzZWRuYXZpZ2F0aW9uIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG5mdW5jdGlvbiBfY3JlYXRlTWFwcGluZ3Mob01hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGNvbnN0IGFTT01hcHBpbmdzID0gW107XG5cdGNvbnN0IGFNYXBwaW5nS2V5cyA9IE9iamVjdC5rZXlzKG9NYXBwaW5nKTtcblx0bGV0IG9TZW1hbnRpY01hcHBpbmc7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYU1hcHBpbmdLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b1NlbWFudGljTWFwcGluZyA9IHtcblx0XHRcdExvY2FsUHJvcGVydHk6IHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogYU1hcHBpbmdLZXlzW2ldXG5cdFx0XHR9LFxuXHRcdFx0U2VtYW50aWNPYmplY3RQcm9wZXJ0eTogb01hcHBpbmdbYU1hcHBpbmdLZXlzW2ldXVxuXHRcdH07XG5cdFx0YVNPTWFwcGluZ3MucHVzaChvU2VtYW50aWNNYXBwaW5nKTtcblx0fVxuXG5cdHJldHVybiBhU09NYXBwaW5ncztcbn1cbnR5cGUgTGlua0RlZmluaXRpb24gPSB7XG5cdGludGVudDogc3RyaW5nO1xuXHR0ZXh0OiBzdHJpbmc7XG59O1xudHlwZSBTZW1hbnRpY0l0ZW0gPSB7XG5cdHRleHQ6IHN0cmluZztcblx0dGFyZ2V0U2VtT2JqZWN0OiBzdHJpbmc7XG5cdHRhcmdldEFjdGlvbjogc3RyaW5nO1xuXHR0YXJnZXRQYXJhbXM6IHVua25vd247XG59O1xuLyoqXG4gKiBAcGFyYW0gYUxpbmtzXG4gKiBAcGFyYW0gYUV4Y2x1ZGVkQWN0aW9uc1xuICogQHBhcmFtIG9UYXJnZXRQYXJhbXNcbiAqIEBwYXJhbSBhSXRlbXNcbiAqIEBwYXJhbSBhQWxsb3dlZEFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gX2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW10sXG5cdGFFeGNsdWRlZEFjdGlvbnM6IHVua25vd25bXSxcblx0b1RhcmdldFBhcmFtczogdW5rbm93bixcblx0YUl0ZW1zOiBTZW1hbnRpY0l0ZW1bXSxcblx0YUFsbG93ZWRBY3Rpb25zPzogdW5rbm93bltdXG4pIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBvTGluayA9IGFMaW5rc1tpXTtcblx0XHRjb25zdCBzSW50ZW50ID0gb0xpbmsuaW50ZW50O1xuXHRcdGNvbnN0IHNBY3Rpb24gPSBzSW50ZW50LnNwbGl0KFwiLVwiKVsxXS5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKGFBbGxvd2VkQWN0aW9ucyAmJiBhQWxsb3dlZEFjdGlvbnMuaW5jbHVkZXMoc0FjdGlvbikpIHtcblx0XHRcdGFJdGVtcy5wdXNoKHtcblx0XHRcdFx0dGV4dDogb0xpbmsudGV4dCxcblx0XHRcdFx0dGFyZ2V0U2VtT2JqZWN0OiBzSW50ZW50LnNwbGl0KFwiI1wiKVsxXS5zcGxpdChcIi1cIilbMF0sXG5cdFx0XHRcdHRhcmdldEFjdGlvbjogc0FjdGlvbi5zcGxpdChcIn5cIilbMF0sXG5cdFx0XHRcdHRhcmdldFBhcmFtczogb1RhcmdldFBhcmFtc1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICghYUFsbG93ZWRBY3Rpb25zICYmIGFFeGNsdWRlZEFjdGlvbnMgJiYgYUV4Y2x1ZGVkQWN0aW9ucy5pbmRleE9mKHNBY3Rpb24pID09PSAtMSkge1xuXHRcdFx0YUl0ZW1zLnB1c2goe1xuXHRcdFx0XHR0ZXh0OiBvTGluay50ZXh0LFxuXHRcdFx0XHR0YXJnZXRTZW1PYmplY3Q6IHNJbnRlbnQuc3BsaXQoXCIjXCIpWzFdLnNwbGl0KFwiLVwiKVswXSxcblx0XHRcdFx0dGFyZ2V0QWN0aW9uOiBzQWN0aW9uLnNwbGl0KFwiflwiKVswXSxcblx0XHRcdFx0dGFyZ2V0UGFyYW1zOiBvVGFyZ2V0UGFyYW1zXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxudHlwZSBTZW1hbnRpY09iamVjdCA9IHtcblx0YWxsb3dlZEFjdGlvbnM/OiB1bmtub3duW107XG5cdHVuYXZhaWxhYmxlQWN0aW9ucz86IHVua25vd25bXTtcblx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xuXHRtYXBwaW5nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50cyhcblx0b0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFNlbWFudGljT2JqZWN0LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW11cbikge1xuXHRpZiAoYUxpbmtzICYmIGFMaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgYUFsbG93ZWRBY3Rpb25zID0gb0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMuYWxsb3dlZEFjdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFFeGNsdWRlZEFjdGlvbnMgPSBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgPyBvQWRkaXRpb25hbFNlbWFudGljT2JqZWN0cy51bmF2YWlsYWJsZUFjdGlvbnMgOiBbXTtcblx0XHRjb25zdCBhU09NYXBwaW5ncyA9IG9BZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzLm1hcHBpbmcgPyBfY3JlYXRlTWFwcGluZ3Mob0FkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMubWFwcGluZykgOiBbXTtcblx0XHRjb25zdCBvVGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU09NYXBwaW5ncyB9O1xuXHRcdF9nZXRSZWxhdGVkQXBwc01lbnVJdGVtcyhhTGlua3MsIGFFeGNsdWRlZEFjdGlvbnMsIG9UYXJnZXRQYXJhbXMsIGFNYW5pZmVzdFNPSXRlbXMsIGFBbGxvd2VkQWN0aW9ucyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSByZWxhdGVkIGludGVudHMgd2hlbiBzZW1hbnRpYyBvYmplY3QgYW5kIGFjdGlvbiBhcmUgcGFzc2VkIGZyb20gZmVFbnZpcm9ubWVudC5nZXRJbnRlbnQoKSBvbmx5IGluIGNhc2Ugb2YgTXkgSW5ib3ggaW50ZWdyYXRpb25cbiAqIEBwYXJhbSBzZW1hbnRpY09iamVjdEFuZEFjdGlvbiBUaGlzIHNwZWNpZmllcyB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gZm9yIGZldGNoaW5nIHRoZSBpbnRlbnRzXG4gKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IFRoaXMgc2VwY2lmaWVzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHVwZGF0aW5nIHJlbGF0ZWQgYXBwc1xuICogQHBhcmFtIGFwcENvbXBvbmVudFNPSXRlbXMgVGhpcyBpcyBhIGxpc3Qgb2Ygc2VtYW50aWMgaXRlbXMgdXNlZCBmb3IgdXBkYXRpbmcgdGhlIHJlbGF0ZWQgYXBwcyBidXR0b25cbiAqIEBwYXJhbSBhTGlua3MgVGhpcyBpcyBhbiBhcnJheSBjb21wcmlzaW5nIG9mIHJlbGF0ZWQgaW50ZW50c1xuICovXG5cbmZ1bmN0aW9uIF9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24oXG5cdHNlbWFudGljT2JqZWN0QW5kQWN0aW9uOiBNeUluYm94SW50ZW50LFxuXHRvQmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudFNPSXRlbXM6IFNlbWFudGljSXRlbVtdLFxuXHRhTGlua3M6IExpbmtEZWZpbml0aW9uW11cbikge1xuXHRpZiAoYUxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBhY3Rpb25zID0gW3NlbWFudGljT2JqZWN0QW5kQWN0aW9uLmFjdGlvbl07XG5cdFx0Y29uc3QgZXhjbHVkZWRBY3Rpb25zOiBbXSA9IFtdO1xuXHRcdGNvbnN0IHNvTWFwcGluZ3M6IFtdID0gW107XG5cdFx0Y29uc3QgdGFyZ2V0UGFyYW1zID0geyBuYXZpZ2F0aW9uQ29udGV4dHM6IG9CaW5kaW5nQ29udGV4dCwgc2VtYW50aWNPYmplY3RNYXBwaW5nOiBzb01hcHBpbmdzIH07XG5cdFx0X2dldFJlbGF0ZWRBcHBzTWVudUl0ZW1zKGFMaW5rcywgZXhjbHVkZWRBY3Rpb25zLCB0YXJnZXRQYXJhbXMsIGFwcENvbXBvbmVudFNPSXRlbXMsIGFjdGlvbnMpO1xuXHR9XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3RDb25maWcgPSB7XG5cdGFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHM6IFJlY29yZDxzdHJpbmcsIFNlbWFudGljT2JqZWN0Pjtcbn07XG50eXBlIFJlbGF0ZWRBcHBzQ29uZmlnID0ge1xuXHR0ZXh0OiBzdHJpbmc7XG5cdHRhcmdldFNlbU9iamVjdDogc3RyaW5nO1xuXHR0YXJnZXRBY3Rpb246IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiB1cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCxcblx0b0VudHJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcblx0b09iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdGFTZW1LZXlzOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvTWV0YVBhdGg6IHN0cmluZyxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnRcbik6IFByb21pc2U8UmVsYXRlZEFwcHNDb25maWdbXT4ge1xuXHRjb25zdCBvU2hlbGxTZXJ2aWNlSGVscGVyOiBJU2hlbGxTZXJ2aWNlcyA9IGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdGNvbnN0IG9QYXJhbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0bGV0IHNDdXJyZW50U2VtT2JqID0gXCJcIixcblx0XHRzQ3VycmVudEFjdGlvbiA9IFwiXCI7XG5cdGxldCBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucztcblx0bGV0IGFSZWxhdGVkQXBwc01lbnVJdGVtczogUmVsYXRlZEFwcHNDb25maWdbXSA9IFtdO1xuXHRsZXQgYUV4Y2x1ZGVkQWN0aW9uczogdW5rbm93bltdID0gW107XG5cdGxldCBhTWFuaWZlc3RTT0tleXM6IHN0cmluZ1tdO1xuXG5cdGFzeW5jIGZ1bmN0aW9uIGZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcygpIHtcblx0XHRjb25zdCBvUGFyc2VkVXJsID0gb1NoZWxsU2VydmljZUhlbHBlci5wYXJzZVNoZWxsSGFzaChkb2N1bWVudC5sb2NhdGlvbi5oYXNoKTtcblx0XHRzQ3VycmVudFNlbU9iaiA9IG9QYXJzZWRVcmwuc2VtYW50aWNPYmplY3Q7IC8vIEN1cnJlbnQgU2VtYW50aWMgT2JqZWN0XG5cdFx0c0N1cnJlbnRBY3Rpb24gPSBvUGFyc2VkVXJsLmFjdGlvbjtcblx0XHRyZXR1cm4gX2dldFNPSW50ZW50cyhvU2hlbGxTZXJ2aWNlSGVscGVyLCBvT2JqZWN0UGFnZUxheW91dCwgc0N1cnJlbnRTZW1PYmosIG9QYXJhbSk7XG5cdH1cblxuXHR0cnkge1xuXHRcdGlmIChvRW50cnkpIHtcblx0XHRcdGlmIChhU2VtS2V5cyAmJiBhU2VtS2V5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbUtleXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRjb25zdCBzU2VtS2V5ID0gYVNlbUtleXNbal0uJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHRpZiAoIW9QYXJhbVtzU2VtS2V5XSkge1xuXHRcdFx0XHRcdFx0b1BhcmFtW3NTZW1LZXldID0geyB2YWx1ZTogb0VudHJ5W3NTZW1LZXldIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBmYWxsYmFjayB0byBUZWNobmljYWwgS2V5cyBpZiBubyBTZW1hbnRpYyBLZXkgaXMgcHJlc2VudFxuXHRcdFx0XHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29NZXRhUGF0aH0vJFR5cGUvJEtleWApO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBhVGVjaG5pY2FsS2V5cykge1xuXHRcdFx0XHRcdGNvbnN0IHNPYmpLZXkgPSBhVGVjaG5pY2FsS2V5c1trZXldO1xuXHRcdFx0XHRcdGlmICghb1BhcmFtW3NPYmpLZXldKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1bc09iaktleV0gPSB7IHZhbHVlOiBvRW50cnlbc09iaktleV0gfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTG9naWMgdG8gcmVhZCBhZGRpdGlvbmFsIFNPIGZyb20gbWFuaWZlc3QgYW5kIHVwZGF0ZWQgcmVsYXRlZGFwcHMgbW9kZWxcblxuXHRcdGNvbnN0IG9NYW5pZmVzdERhdGEgPSBnZXRUYXJnZXRWaWV3KG9PYmplY3RQYWdlTGF5b3V0KS5nZXRWaWV3RGF0YSgpIGFzIFNlbWFudGljT2JqZWN0Q29uZmlnO1xuXHRcdGNvbnN0IGFNYW5pZmVzdFNPSXRlbXM6IFNlbWFudGljSXRlbVtdID0gW107XG5cdFx0bGV0IHNlbWFudGljT2JqZWN0SW50ZW50cztcblx0XHRpZiAob01hbmlmZXN0RGF0YS5hZGRpdGlvbmFsU2VtYW50aWNPYmplY3RzKSB7XG5cdFx0XHRhTWFuaWZlc3RTT0tleXMgPSBPYmplY3Qua2V5cyhvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHMpO1xuXHRcdFx0Zm9yIChsZXQga2V5ID0gMDsga2V5IDwgYU1hbmlmZXN0U09LZXlzLmxlbmd0aDsga2V5KyspIHtcblx0XHRcdFx0c2VtYW50aWNPYmplY3RJbnRlbnRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRcdF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIGFNYW5pZmVzdFNPS2V5c1trZXldLCBvUGFyYW0pXG5cdFx0XHRcdCk7XG5cdFx0XHRcdF9nZXRSZWxhdGVkSW50ZW50cyhcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYU1hbmlmZXN0U09LZXlzW2tleV1dLFxuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRhTWFuaWZlc3RTT0l0ZW1zLFxuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0SW50ZW50c1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGFwcENvbXBvbmVudFNPSXRlbXMgaXMgdXBkYXRlZCBpbiBjYXNlIG9mIE15IEluYm94IGludGVncmF0aW9uIHdoZW4gc2VtYW50aWMgb2JqZWN0IGFuZCBhY3Rpb24gYXJlIHBhc3NlZCBmcm9tIGZlRW52aXJvbm1lbnQuZ2V0SW50ZW50KCkgbWV0aG9kXG5cdFx0Ly8gSW4gb3RoZXIgY2FzZXMgaXQgcmVtYWlucyBhcyBhbiBlbXB0eSBsaXN0XG5cdFx0Ly8gV2UgY29uY2F0IHRoaXMgbGlzdCB0b3dhcmRzIHRoZSBlbmQgd2l0aCBhTWFuaWZlc3RTT0l0ZW1zXG5cblx0XHRjb25zdCBhcHBDb21wb25lbnRTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbXBvbmVudERhdGE6IENvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdGlmIChjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQgJiYgY29tcG9uZW50RGF0YS5mZUVudmlyb25tZW50LmdldEludGVudCgpKSB7XG5cdFx0XHRjb25zdCBpbnRlbnQ6IE15SW5ib3hJbnRlbnQgPSBjb21wb25lbnREYXRhLmZlRW52aXJvbm1lbnQuZ2V0SW50ZW50KCk7XG5cdFx0XHRzZW1hbnRpY09iamVjdEludGVudHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdF9nZXRTT0ludGVudHMob1NoZWxsU2VydmljZUhlbHBlciwgb09iamVjdFBhZ2VMYXlvdXQsIGludGVudC5zZW1hbnRpY09iamVjdCwgb1BhcmFtKVxuXHRcdFx0KTtcblx0XHRcdF9nZXRSZWxhdGVkSW50ZW50c1dpdGhTZW1hbnRpY09iamVjdHNBbmRBY3Rpb24oaW50ZW50LCBvQmluZGluZ0NvbnRleHQsIGFwcENvbXBvbmVudFNPSXRlbXMsIHNlbWFudGljT2JqZWN0SW50ZW50cyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvT2JqZWN0UGFnZUxheW91dC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IGFMaW5rcyA9IGF3YWl0IGZuR2V0UGFyc2VTaGVsbEhhc2hBbmRHZXRMaW5rcygpO1xuXHRcdGlmIChhTGlua3MpIHtcblx0XHRcdGlmIChhTGlua3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsZXQgaXNTZW1hbnRpY09iamVjdEhhc1NhbWVUYXJnZXRJbk1hbmlmZXN0ID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXRQYXJhbXM6IHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM/OiBDb250ZXh0O1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZz86IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXTtcblx0XHRcdFx0fSA9IHt9O1xuXHRcdFx0XHRjb25zdCBhQW5ub3RhdGlvbnNTT0l0ZW1zOiBTZW1hbnRpY0l0ZW1bXSA9IFtdO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IGAke29NZXRhUGF0aH1AYDtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVR5cGVQYXRoID0gYCR7b01ldGFQYXRofS9AYDtcblx0XHRcdFx0Y29uc3Qgb0VudGl0eVNldEFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGgpO1xuXHRcdFx0XHRvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMob0VudGl0eVNldEFubm90YXRpb25zLCBzQ3VycmVudFNlbU9iaik7XG5cdFx0XHRcdGlmICghb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYkhhc0VudGl0eVNldFNPKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0VudGl0eVR5cGVBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlUeXBlUGF0aCk7XG5cdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdEFubm90YXRpb25zKG9FbnRpdHlUeXBlQW5ub3RhdGlvbnMsIHNDdXJyZW50U2VtT2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhRXhjbHVkZWRBY3Rpb25zID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYVVuYXZhaWxhYmxlQWN0aW9ucztcblx0XHRcdFx0Ly9Ta2lwIHNhbWUgYXBwbGljYXRpb24gZnJvbSBSZWxhdGVkIEFwcHNcblx0XHRcdFx0YUV4Y2x1ZGVkQWN0aW9ucy5wdXNoKHNDdXJyZW50QWN0aW9uKTtcblx0XHRcdFx0b1RhcmdldFBhcmFtcy5uYXZpZ2F0aW9uQ29udGV4dHMgPSBvQmluZGluZ0NvbnRleHQ7XG5cdFx0XHRcdG9UYXJnZXRQYXJhbXMuc2VtYW50aWNPYmplY3RNYXBwaW5nID0gb1NlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMuYU1hcHBpbmdzO1xuXHRcdFx0XHRfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMoYUxpbmtzLCBhRXhjbHVkZWRBY3Rpb25zLCBvVGFyZ2V0UGFyYW1zLCBhQW5ub3RhdGlvbnNTT0l0ZW1zKTtcblxuXHRcdFx0XHRhTWFuaWZlc3RTT0l0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHsgdGFyZ2V0U2VtT2JqZWN0IH0pIHtcblx0XHRcdFx0XHRpZiAoYUFubm90YXRpb25zU09JdGVtc1swXT8udGFyZ2V0U2VtT2JqZWN0ID09PSB0YXJnZXRTZW1PYmplY3QpIHtcblx0XHRcdFx0XHRcdGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyByZW1vdmUgYWxsIGFjdGlvbnMgZnJvbSBjdXJyZW50IGhhc2ggYXBwbGljYXRpb24gaWYgbWFuaWZlc3QgY29udGFpbnMgZW1wdHkgYWxsb3dlZEFjdGlvbnNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9NYW5pZmVzdERhdGEuYWRkaXRpb25hbFNlbWFudGljT2JqZWN0cyAmJlxuXHRcdFx0XHRcdGFBbm5vdGF0aW9uc1NPSXRlbXNbMF0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYUFubm90YXRpb25zU09JdGVtc1swXS50YXJnZXRTZW1PYmplY3RdICYmXG5cdFx0XHRcdFx0ISFvTWFuaWZlc3REYXRhLmFkZGl0aW9uYWxTZW1hbnRpY09iamVjdHNbYUFubm90YXRpb25zU09JdGVtc1swXS50YXJnZXRTZW1PYmplY3RdLmFsbG93ZWRBY3Rpb25zXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGlzU2VtYW50aWNPYmplY3RIYXNTYW1lVGFyZ2V0SW5NYW5pZmVzdCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc29JdGVtcyA9IGFNYW5pZmVzdFNPSXRlbXMuY29uY2F0KGFwcENvbXBvbmVudFNPSXRlbXMpO1xuXHRcdFx0XHRhUmVsYXRlZEFwcHNNZW51SXRlbXMgPSBpc1NlbWFudGljT2JqZWN0SGFzU2FtZVRhcmdldEluTWFuaWZlc3QgPyBzb0l0ZW1zIDogc29JdGVtcy5jb25jYXQoYUFubm90YXRpb25zU09JdGVtcyk7XG5cdFx0XHRcdC8vIElmIG5vIGFwcCBpbiBsaXN0LCByZWxhdGVkIGFwcHMgYnV0dG9uIHdpbGwgYmUgaGlkZGVuXG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvdmlzaWJpbGl0eVwiLCBhUmVsYXRlZEFwcHNNZW51SXRlbXMubGVuZ3RoID4gMCk7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvaXRlbXNcIiwgYVJlbGF0ZWRBcHBzTWVudUl0ZW1zKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvdmlzaWJpbGl0eVwiLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHMvdmlzaWJpbGl0eVwiLCBmYWxzZSk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdExvZy5lcnJvcihcIkNhbm5vdCByZWFkIGxpbmtzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdH1cblx0cmV0dXJuIGFSZWxhdGVkQXBwc01lbnVJdGVtcztcbn1cblxuZnVuY3Rpb24gX2dldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMob0VudGl0eUFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc0N1cnJlbnRTZW1PYmo6IHN0cmluZykge1xuXHRjb25zdCBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucyA9IHtcblx0XHRiSGFzRW50aXR5U2V0U086IGZhbHNlLFxuXHRcdGFBbGxvd2VkQWN0aW9uczogW10sXG5cdFx0YVVuYXZhaWxhYmxlQWN0aW9uczogW10gYXMgTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucz5bXSxcblx0XHRhTWFwcGluZ3M6IFtdIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXVxuXHR9O1xuXHRsZXQgc0Fubm90YXRpb25NYXBwaW5nVGVybSwgc0Fubm90YXRpb25BY3Rpb25UZXJtO1xuXHRsZXQgc1F1YWxpZmllcjtcblx0Zm9yIChjb25zdCBrZXkgaW4gb0VudGl0eUFubm90YXRpb25zKSB7XG5cdFx0aWYgKGtleS5pbmRleE9mKENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdCkgPiAtMSAmJiBvRW50aXR5QW5ub3RhdGlvbnNba2V5XSA9PT0gc0N1cnJlbnRTZW1PYmopIHtcblx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmJIYXNFbnRpdHlTZXRTTyA9IHRydWU7XG5cdFx0XHRzQW5ub3RhdGlvbk1hcHBpbmdUZXJtID0gYEAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdE1hcHBpbmd9YDtcblx0XHRcdHNBbm5vdGF0aW9uQWN0aW9uVGVybSA9IGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnN9YDtcblxuXHRcdFx0aWYgKGtleS5pbmRleE9mKFwiI1wiKSA+IC0xKSB7XG5cdFx0XHRcdHNRdWFsaWZpZXIgPSBrZXkuc3BsaXQoXCIjXCIpWzFdO1xuXHRcdFx0XHRzQW5ub3RhdGlvbk1hcHBpbmdUZXJtID0gYCR7c0Fubm90YXRpb25NYXBwaW5nVGVybX0jJHtzUXVhbGlmaWVyfWA7XG5cdFx0XHRcdHNBbm5vdGF0aW9uQWN0aW9uVGVybSA9IGAke3NBbm5vdGF0aW9uQWN0aW9uVGVybX0jJHtzUXVhbGlmaWVyfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm1dKSB7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncyA9IG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFNYXBwaW5ncy5jb25jYXQoXG5cdFx0XHRcdFx0b0VudGl0eUFubm90YXRpb25zW3NBbm5vdGF0aW9uTWFwcGluZ1Rlcm1dIGFzIE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5cblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9FbnRpdHlBbm5vdGF0aW9uc1tzQW5ub3RhdGlvbkFjdGlvblRlcm1dKSB7XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zLmFVbmF2YWlsYWJsZUFjdGlvbnMgPSBvU2VtYW50aWNPYmplY3RBbm5vdGF0aW9ucy5hVW5hdmFpbGFibGVBY3Rpb25zLmNvbmNhdChcblx0XHRcdFx0XHRvRW50aXR5QW5ub3RhdGlvbnNbc0Fubm90YXRpb25BY3Rpb25UZXJtXSBhcyBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zPlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9TZW1hbnRpY09iamVjdEFubm90YXRpb25zO1xufVxuXG5mdW5jdGlvbiBmblVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZUxheW91dDogT2JqZWN0UGFnZUxheW91dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IChvT2JqZWN0UGFnZUxheW91dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZUxheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRjb25zdCBwYXRoID0gKG9CaW5kaW5nQ29udGV4dCAmJiBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKSB8fCBcIlwiO1xuXHRjb25zdCBvTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhdGgpO1xuXHQvLyBTZW1hbnRpYyBLZXkgVm9jYWJ1bGFyeVxuXHRjb25zdCBzU2VtYW50aWNLZXlWb2NhYnVsYXJ5ID0gYCR7b01ldGFQYXRofS9gICsgYEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlgO1xuXHQvL1NlbWFudGljIEtleXNcblx0Y29uc3QgYVNlbUtleXMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzU2VtYW50aWNLZXlWb2NhYnVsYXJ5KTtcblx0Ly8gVW5hdmFpbGFibGUgQWN0aW9uc1xuXHRjb25zdCBvRW50cnkgPSBvQmluZGluZ0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXHRpZiAoIW9FbnRyeSAmJiBvQmluZGluZ0NvbnRleHQpIHtcblx0XHRvQmluZGluZ0NvbnRleHRcblx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChyZXF1ZXN0ZWRPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBDb21tb25VdGlscy51cGRhdGVSZWxhdGVBcHBzTW9kZWwoXG5cdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdHJlcXVlc3RlZE9iamVjdCxcblx0XHRcdFx0XHRvT2JqZWN0UGFnZUxheW91dCxcblx0XHRcdFx0XHRhU2VtS2V5cyxcblx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdG9NZXRhUGF0aCxcblx0XHRcdFx0XHRhcHBDb21wb25lbnRcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgdXBkYXRlIHRoZSByZWxhdGVkIGFwcCBkZXRhaWxzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZUFwcHNNb2RlbChvQmluZGluZ0NvbnRleHQsIG9FbnRyeSwgb09iamVjdFBhZ2VMYXlvdXQsIGFTZW1LZXlzLCBvTWV0YU1vZGVsLCBvTWV0YVBhdGgsIGFwcENvbXBvbmVudCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gb0J1dHRvblxuICovXG5mdW5jdGlvbiBmbkZpcmVCdXR0b25QcmVzcyhvQnV0dG9uOiBDb250cm9sKSB7XG5cdGlmIChcblx0XHRvQnV0dG9uICYmXG5cdFx0b0J1dHRvbi5pc0E8QnV0dG9uIHwgT3ZlcmZsb3dUb29sYmFyQnV0dG9uPihbXCJzYXAubS5CdXR0b25cIiwgXCJzYXAubS5PdmVyZmxvd1Rvb2xiYXJCdXR0b25cIl0pICYmXG5cdFx0b0J1dHRvbi5nZXRWaXNpYmxlKCkgJiZcblx0XHRvQnV0dG9uLmdldEVuYWJsZWQoKVxuXHQpIHtcblx0XHRvQnV0dG9uLmZpcmVQcmVzcygpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEFwcENvbXBvbmVudChvQ29udHJvbDogQ29udHJvbCB8IENvbXBvbmVudCk6IEFwcENvbXBvbmVudCB7XG5cdGlmIChvQ29udHJvbC5pc0E8QXBwQ29tcG9uZW50PihcInNhcC5mZS5jb3JlLkFwcENvbXBvbmVudFwiKSkge1xuXHRcdHJldHVybiBvQ29udHJvbDtcblx0fVxuXHRjb25zdCBvT3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob0NvbnRyb2wpO1xuXHRpZiAoIW9Pd25lcikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZXJlIHNob3VsZCBiZSBhIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCBhcyBvd25lciBvZiB0aGUgY29udHJvbFwiKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZ2V0QXBwQ29tcG9uZW50KG9Pd25lcik7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2VWaWV3KG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRyZXR1cm4gcm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0OiBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KChvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXIpLmdldEN1cnJlbnRQYWdlKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRWaWV3KG9Db250cm9sOiBNYW5hZ2VkT2JqZWN0IHwgbnVsbCk6IEZFVmlldyB7XG5cdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5pc0E8Q29tcG9uZW50Q29udGFpbmVyPihcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udHJvbC5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuXHRcdG9Db250cm9sID0gb0NvbXBvbmVudCAmJiBvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdH1cblx0d2hpbGUgKG9Db250cm9sICYmICFvQ29udHJvbC5pc0E8RkVWaWV3PihcInNhcC51aS5jb3JlLm12Yy5WaWV3XCIpKSB7XG5cdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0fVxuXHRyZXR1cm4gb0NvbnRyb2whO1xufVxuXG5mdW5jdGlvbiBfZm5DaGVja0lzTWF0Y2gob09iamVjdDogb2JqZWN0LCBvS2V5c1RvQ2hlY2s6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdGZvciAoY29uc3Qgc0tleSBpbiBvS2V5c1RvQ2hlY2spIHtcblx0XHRpZiAob0tleXNUb0NoZWNrW3NLZXldICE9PSBvT2JqZWN0W3NLZXkgYXMga2V5b2YgdHlwZW9mIG9PYmplY3RdKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmbkdldENvbnRleHRQYXRoUHJvcGVydGllcyhcblx0bWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHNDb250ZXh0UGF0aDogc3RyaW5nLFxuXHRvRmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5PiB8IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PiB7XG5cdGNvbnN0IG9FbnRpdHlUeXBlOiBNZXRhTW9kZWxFbnRpdHlUeXBlID0gKG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vYCkgfHwge30pIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUsXG5cdFx0b1Byb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbFByb3BlcnR5PiB8IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PiA9IHt9O1xuXG5cdGZvciAoY29uc3Qgc0tleSBpbiBvRW50aXR5VHlwZSkge1xuXHRcdGlmIChcblx0XHRcdG9FbnRpdHlUeXBlLmhhc093blByb3BlcnR5KHNLZXkpICYmXG5cdFx0XHQhL15cXCQvaS50ZXN0KHNLZXkpICYmXG5cdFx0XHRvRW50aXR5VHlwZVtzS2V5XS4ka2luZCAmJlxuXHRcdFx0X2ZuQ2hlY2tJc01hdGNoKG9FbnRpdHlUeXBlW3NLZXldLCBvRmlsdGVyIHx8IHsgJGtpbmQ6IFwiUHJvcGVydHlcIiB9KVxuXHRcdCkge1xuXHRcdFx0b1Byb3BlcnRpZXNbc0tleV0gPSBvRW50aXR5VHlwZVtzS2V5XTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9Qcm9wZXJ0aWVzO1xufVxuXG5mdW5jdGlvbiBmbkdldE1hbmRhdG9yeUZpbHRlckZpZWxkcyhvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc0NvbnRleHRQYXRoOiBzdHJpbmcpIHtcblx0bGV0IGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHM6IEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+W10gPSBbXTtcblx0aWYgKG9NZXRhTW9kZWwgJiYgc0NvbnRleHRQYXRoKSB7XG5cdFx0YU1hbmRhdG9yeUZpbHRlckZpZWxkcyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0YCR7c0NvbnRleHRQYXRofUBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlclJlc3RyaWN0aW9ucy9SZXF1aXJlZFByb3BlcnRpZXNgXG5cdFx0KSBhcyBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPltdO1xuXHR9XG5cdHJldHVybiBhTWFuZGF0b3J5RmlsdGVyRmllbGRzO1xufVxuXG5mdW5jdGlvbiBmbkdldElCTkFjdGlvbnMob0NvbnRyb2w6IFRhYmxlIHwgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSwgYUlCTkFjdGlvbnM6IHVua25vd25bXSkge1xuXHRjb25zdCBhQWN0aW9ucyA9IG9Db250cm9sICYmIG9Db250cm9sLmdldEFjdGlvbnMoKTtcblx0aWYgKGFBY3Rpb25zKSB7XG5cdFx0YUFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0FjdGlvbikge1xuXHRcdFx0aWYgKG9BY3Rpb24uaXNBPEFjdGlvblRvb2xiYXJBY3Rpb24+KFwic2FwLnVpLm1kYy5hY3Rpb250b29sYmFyLkFjdGlvblRvb2xiYXJBY3Rpb25cIikpIHtcblx0XHRcdFx0b0FjdGlvbiA9IG9BY3Rpb24uZ2V0QWN0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FjdGlvbi5pc0E8TWVudUJ1dHRvbj4oXCJzYXAubS5NZW51QnV0dG9uXCIpKSB7XG5cdFx0XHRcdGNvbnN0IG9NZW51ID0gb0FjdGlvbi5nZXRNZW51KCk7XG5cdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9NZW51LmdldEl0ZW1zKCk7XG5cdFx0XHRcdGFJdGVtcy5mb3JFYWNoKChvSXRlbSkgPT4ge1xuXHRcdFx0XHRcdGlmIChvSXRlbS5kYXRhKFwiSUJORGF0YVwiKSkge1xuXHRcdFx0XHRcdFx0YUlCTkFjdGlvbnMucHVzaChvSXRlbSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAob0FjdGlvbi5kYXRhKFwiSUJORGF0YVwiKSkge1xuXHRcdFx0XHRhSUJOQWN0aW9ucy5wdXNoKG9BY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhSUJOQWN0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0gYUlCTkFjdGlvbnNcbiAqIEBwYXJhbSBvVmlld1xuICovXG5mdW5jdGlvbiBmblVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5KGFJQk5BY3Rpb25zOiBDb250cm9sW10sIG9WaWV3OiBWaWV3KSB7XG5cdGNvbnN0IG9QYXJhbXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd24gfT4gPSB7fTtcblx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdGNvbnN0IGlzU3RpY2t5ID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvVmlldy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgZm5HZXRMaW5rcyA9IGZ1bmN0aW9uIChvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKG9EYXRhKSB7XG5cdFx0XHRjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKG9EYXRhKTtcblx0XHRcdGFLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSB7IHZhbHVlOiBvRGF0YVtzS2V5XSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGFJQk5BY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0YUlCTkFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0lCTkFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3QgPSBvSUJOQWN0aW9uLmRhdGEoXCJJQk5EYXRhXCIpLnNlbWFudGljT2JqZWN0O1xuXHRcdFx0XHRjb25zdCBzQWN0aW9uID0gb0lCTkFjdGlvbi5kYXRhKFwiSUJORGF0YVwiKS5hY3Rpb247XG5cdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHQuZ2V0U2hlbGxTZXJ2aWNlcygpXG5cdFx0XHRcdFx0LmdldExpbmtzKHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IHNBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhTGluaykge1xuXHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5zZXRWaXNpYmxlKG9JQk5BY3Rpb24uZ2V0VmlzaWJsZSgpICYmIGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSk7XG5cdFx0XHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0KG9JQk5BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0b0lCTkFjdGlvbi5nZXRJZCgpLnNwbGl0KFwiLS1cIilbMV0sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0c2hlbGxOYXZpZ2F0aW9uTm90QXZhaWxhYmxlOiAhKGFMaW5rICYmIGFMaW5rLmxlbmd0aCA9PT0gMSlcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0KVxuXHRcdFx0Py5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZuR2V0TGlua3Mob0RhdGEpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGZuR2V0TGlua3MoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRBY3Rpb25QYXRoKGFjdGlvbkNvbnRleHQ6IENvbnRleHQsIGJSZXR1cm5Pbmx5UGF0aDogYm9vbGVhbiwgaW5BY3Rpb25OYW1lPzogc3RyaW5nLCBiQ2hlY2tTdGF0aWNWYWx1ZT86IGJvb2xlYW4pIHtcblx0Y29uc3Qgc0FjdGlvbk5hbWU6IHN0cmluZyA9ICFpbkFjdGlvbk5hbWUgPyBhY3Rpb25Db250ZXh0LmdldE9iamVjdChhY3Rpb25Db250ZXh0LmdldFBhdGgoKSkudG9TdHJpbmcoKSA6IGluQWN0aW9uTmFtZTtcblx0bGV0IHNDb250ZXh0UGF0aCA9IGFjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0BcIilbMF07XG5cdGNvbnN0IHNFbnRpdHlUeXBlTmFtZSA9IChhY3Rpb25Db250ZXh0LmdldE9iamVjdChzQ29udGV4dFBhdGgpIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpLiRUeXBlO1xuXHRjb25zdCBzRW50aXR5TmFtZSA9IGdldEVudGl0eVNldE5hbWUoYWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZU5hbWUpO1xuXHRpZiAoc0VudGl0eU5hbWUpIHtcblx0XHRzQ29udGV4dFBhdGggPSBgLyR7c0VudGl0eU5hbWV9YDtcblx0fVxuXHRpZiAoYkNoZWNrU3RhdGljVmFsdWUpIHtcblx0XHRyZXR1cm4gYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfUBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGVgKTtcblx0fVxuXHRpZiAoYlJldHVybk9ubHlQYXRoKSB7XG5cdFx0cmV0dXJuIGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1gO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzQ29udGV4dFBhdGg6IHNDb250ZXh0UGF0aCxcblx0XHRcdHNQcm9wZXJ0eTogYWN0aW9uQ29udGV4dC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfUBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGUvJFBhdGhgKSxcblx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyOiBhY3Rpb25Db250ZXh0LmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlci8wLyROYW1lYClcblx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEVudGl0eVNldE5hbWUob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlUeXBlOiBzdHJpbmcpIHtcblx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0Zm9yIChjb25zdCBrZXkgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdGlmICh0eXBlb2Ygb0VudGl0eUNvbnRhaW5lcltrZXldID09PSBcIm9iamVjdFwiICYmIG9FbnRpdHlDb250YWluZXJba2V5XS4kVHlwZSA9PT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdHJldHVybiBrZXk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEaXNwbGF5TW9kZShvUHJvcGVydHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9Db2xsZWN0aW9uQW5ub3RhdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRjb25zdCBvVGV4dEFubm90YXRpb24gPSBvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dFwiXSxcblx0XHRvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiA9IChvVGV4dEFubm90YXRpb24gJiZcblx0XHRcdCgob1Byb3BlcnR5QW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50XCJdKSB8fFxuXHRcdFx0XHQob0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyAmJlxuXHRcdFx0XHRcdG9Db2xsZWN0aW9uQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50XCJdKSkpIGFzIE1ldGFNb2RlbEVudW08VGV4dEFycmFuZ2VtZW50PjtcblxuXHRpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24pIHtcblx0XHRpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24uJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0T25seVwiKSB7XG5cdFx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblwiO1xuXHRcdH0gZWxzZSBpZiAob1RleHRBcnJhbmdlbWVudEFubm90YXRpb24uJEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50VHlwZS9UZXh0TGFzdFwiKSB7XG5cdFx0XHRyZXR1cm4gXCJWYWx1ZURlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbi4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRTZXBhcmF0ZVwiKSB7XG5cdFx0XHRyZXR1cm4gXCJWYWx1ZVwiO1xuXHRcdH1cblx0XHQvL0RlZmF1bHQgc2hvdWxkIGJlIFRleHRGaXJzdCBpZiB0aGVyZSBpcyBhIFRleHQgYW5ub3RhdGlvbiBhbmQgbmVpdGhlciBUZXh0T25seSBub3IgVGV4dExhc3QgYXJlIHNldFxuXHRcdHJldHVybiBcIkRlc2NyaXB0aW9uVmFsdWVcIjtcblx0fVxuXHRyZXR1cm4gb1RleHRBbm5vdGF0aW9uID8gXCJEZXNjcmlwdGlvblZhbHVlXCIgOiBcIlZhbHVlXCI7XG59XG5cbmZ1bmN0aW9uIF9nZXRFbnRpdHlUeXBlKG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCkge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKX0vJFR5cGVgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX3JlcXVlc3RPYmplY3Qoc0FjdGlvbjogc3RyaW5nLCBvU2VsZWN0ZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgc1Byb3BlcnR5OiBzdHJpbmcpIHtcblx0bGV0IG9Db250ZXh0ID0gb1NlbGVjdGVkQ29udGV4dDtcblx0Y29uc3QgbkJyYWNrZXRJbmRleCA9IHNBY3Rpb24uaW5kZXhPZihcIihcIik7XG5cblx0aWYgKG5CcmFja2V0SW5kZXggPiAtMSkge1xuXHRcdGNvbnN0IHNUYXJnZXRUeXBlID0gc0FjdGlvbi5zbGljZShuQnJhY2tldEluZGV4ICsgMSwgLTEpO1xuXHRcdGxldCBzQ3VycmVudFR5cGUgPSBfZ2V0RW50aXR5VHlwZShvQ29udGV4dCk7XG5cblx0XHR3aGlsZSAoc0N1cnJlbnRUeXBlICE9PSBzVGFyZ2V0VHlwZSkge1xuXHRcdFx0Ly8gRmluZCBwYXJlbnQgYmluZGluZyBjb250ZXh0IGFuZCByZXRyaWV2ZSBlbnRpdHkgdHlwZVxuXHRcdFx0b0NvbnRleHQgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdHNDdXJyZW50VHlwZSA9IF9nZXRFbnRpdHlUeXBlKG9Db250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiQ2Fubm90IGRldGVybWluZSB0YXJnZXQgdHlwZSB0byByZXF1ZXN0IHByb3BlcnR5IHZhbHVlIGZvciBib3VuZCBhY3Rpb24gaW52b2NhdGlvblwiKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KHNQcm9wZXJ0eSk7XG59XG5cbmV4cG9ydCB0eXBlIF9SZXF1ZXN0ZWRQcm9wZXJ0eSA9IHtcblx0dlByb3BlcnR5VmFsdWU6IHVua25vd247XG5cdG9TZWxlY3RlZENvbnRleHQ6IENvbnRleHQ7XG5cdHNBY3Rpb246IHN0cmluZztcblx0c0R5bmFtaWNBY3Rpb25FbmFibGVkUGF0aDogc3RyaW5nO1xufTtcbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RQcm9wZXJ0eShcblx0b1NlbGVjdGVkQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdHNBY3Rpb246IHN0cmluZyxcblx0c1Byb3BlcnR5OiBzdHJpbmcsXG5cdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxfUmVxdWVzdGVkUHJvcGVydHk+IHtcblx0Y29uc3Qgb1Byb21pc2UgPVxuXHRcdHNQcm9wZXJ0eSAmJiBzUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPT09IDBcblx0XHRcdD8gcmVxdWVzdFNpbmdsZXRvblByb3BlcnR5KHNQcm9wZXJ0eSwgb1NlbGVjdGVkQ29udGV4dC5nZXRNb2RlbCgpKVxuXHRcdFx0OiBfcmVxdWVzdE9iamVjdChzQWN0aW9uLCBvU2VsZWN0ZWRDb250ZXh0LCBzUHJvcGVydHkpO1xuXG5cdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2UHJvcGVydHlWYWx1ZTogdW5rbm93bikge1xuXHRcdHJldHVybiB7XG5cdFx0XHR2UHJvcGVydHlWYWx1ZTogdlByb3BlcnR5VmFsdWUsXG5cdFx0XHRvU2VsZWN0ZWRDb250ZXh0OiBvU2VsZWN0ZWRDb250ZXh0LFxuXHRcdFx0c0FjdGlvbjogc0FjdGlvbixcblx0XHRcdHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGg6IHNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGhcblx0XHR9O1xuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlKFxuXHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRhUmVxdWVzdFByb21pc2VzOiBQcm9taXNlPF9SZXF1ZXN0ZWRQcm9wZXJ0eT5bXVxuKSB7XG5cdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChhUmVzdWx0cykge1xuXHRcdFx0aWYgKGFSZXN1bHRzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBhQXBwbGljYWJsZUNvbnRleHRzOiB1bmtub3duW10gPSBbXSxcblx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUNvbnRleHRzOiB1bmtub3duW10gPSBbXTtcblx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoYVJlc3VsdCkge1xuXHRcdFx0XHRcdGlmIChhUmVzdWx0KSB7XG5cdFx0XHRcdFx0XHRpZiAoYVJlc3VsdC52UHJvcGVydHlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShhUmVzdWx0LnNEeW5hbWljQWN0aW9uRW5hYmxlZFBhdGgsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRhQXBwbGljYWJsZUNvbnRleHRzLnB1c2goYVJlc3VsdC5vU2VsZWN0ZWRDb250ZXh0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlQ29udGV4dHMucHVzaChhUmVzdWx0Lm9TZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIGFSZXN1bHRzWzBdLnNBY3Rpb24sIGFBcHBsaWNhYmxlQ29udGV4dHMsIGFOb3RBcHBsaWNhYmxlQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy50cmFjZShcIkNhbm5vdCByZXRyaWV2ZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHBhdGhcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG9JbnRlcm5hbE1vZGVsQ29udGV4dFxuICogQHBhcmFtIHNBY3Rpb25cbiAqIEBwYXJhbSBhQXBwbGljYWJsZVxuICogQHBhcmFtIGFOb3RBcHBsaWNhYmxlXG4gKi9cbmZ1bmN0aW9uIHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyhcblx0b0ludGVybmFsTW9kZWxDb250ZXh0OiBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0c0FjdGlvbjogc3RyaW5nLFxuXHRhQXBwbGljYWJsZTogdW5rbm93bltdLFxuXHRhTm90QXBwbGljYWJsZTogdW5rbm93bltdXG4pIHtcblx0Y29uc3Qgc0R5bmFtaWNBY3Rpb25QYXRoUHJlZml4ID0gYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vZHluYW1pY0FjdGlvbnMvJHtzQWN0aW9ufWAsXG5cdFx0b0ludGVybmFsTW9kZWwgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0TW9kZWwoKTtcblx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoYCR7c0R5bmFtaWNBY3Rpb25QYXRoUHJlZml4fS9hQXBwbGljYWJsZWAsIGFBcHBsaWNhYmxlKTtcblx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoYCR7c0R5bmFtaWNBY3Rpb25QYXRoUHJlZml4fS9hTm90QXBwbGljYWJsZWAsIGFOb3RBcHBsaWNhYmxlKTtcbn1cblxuZnVuY3Rpb24gX2dldERlZmF1bHRPcGVyYXRvcnMoc1Byb3BlcnR5VHlwZT86IHN0cmluZykge1xuXHQvLyBtZGMgZGVmaW5lcyB0aGUgZnVsbCBzZXQgb2Ygb3BlcmF0aW9ucyB0aGF0IGFyZSBtZWFuaW5nZnVsIGZvciBlYWNoIEVkbSBUeXBlXG5cdC8vIFRPRE8gUmVwbGFjZSB3aXRoIG1vZGVsIC8gaW50ZXJuYWwgd2F5IG9mIHJldHJpZXZpbmcgdGhlIGFjdHVhbCBtb2RlbCB0eXBlIHVzZWQgZm9yIHRoZSBwcm9wZXJ0eVxuXHRjb25zdCBvRGF0YUNsYXNzID0gVHlwZVV0aWwuZ2V0RGF0YVR5cGVDbGFzc05hbWUoc1Byb3BlcnR5VHlwZSk7XG5cdC8vIFRPRE8gbmVlZCB0byBwYXNzIHByb3BlciBmb3JtYXRPcHRpb25zLCBjb25zdHJhaW50cyBoZXJlXG5cdGNvbnN0IG9CYXNlVHlwZSA9IFR5cGVVdGlsLmdldEJhc2VUeXBlKG9EYXRhQ2xhc3MsIHt9LCB7fSk7XG5cdHJldHVybiBGaWx0ZXJPcGVyYXRvclV0aWwuZ2V0T3BlcmF0b3JzRm9yVHlwZShvQmFzZVR5cGUpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BzOiBzdHJpbmdbXSwgYUV4cHJlc3Npb25PcHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuXHQvLyBGcm9tIHRoZSBkZWZhdWx0IHNldCBvZiBPcGVyYXRvcnMgZm9yIHRoZSBCYXNlIFR5cGUsIHNlbGVjdCB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBBbGxvd2VkIFZhbHVlLlxuXHQvLyBJbiBjYXNlIHRoYXQgbm8gb3BlcmF0b3JzIGFyZSBmb3VuZCwgcmV0dXJuIHVuZGVmaW5lZCBzbyB0aGF0IHRoZSBkZWZhdWx0IHNldCBpcyB1c2VkLlxuXHRyZXR1cm4gYURlZmF1bHRPcHMuZmlsdGVyKGZ1bmN0aW9uIChzRWxlbWVudCkge1xuXHRcdHJldHVybiBhRXhwcmVzc2lvbk9wcy5pbmRleE9mKHNFbGVtZW50KSA+IC0xO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihhRXhwcmVzc2lvbnM6IHN0cmluZ1tdKSB7XG5cdGNvbnN0IGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eSA9IENvbW1vblV0aWxzLkFsbG93ZWRFeHByZXNzaW9uc1ByaW87XG5cblx0YUV4cHJlc3Npb25zLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGEpIC0gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYik7XG5cdH0pO1xuXG5cdHJldHVybiBhRXhwcmVzc2lvbnNbMF07XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGZldGNoIHRoZSBjb3JyZWN0IG9wZXJhdG9ycyBiYXNlZCBvbiB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyB0aGF0IGNhbiBiZSBhbm5vdGF0ZWQgb24gYW4gZW50aXR5IHNldCBvciBhIG5hdmlnYXRpb24gcHJvcGVydHkuXG4gKiBXZSByZXR1cm4gdGhlIGNvcnJlY3Qgb3BlcmF0b3JzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVzdHJpY3Rpb24gYW5kIGFsc28gY2hlY2sgZm9yIHRoZSBvcGVyYXRvcnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZW0uXG4gKlxuICogQHBhcmFtIHNQcm9wZXJ0eSBTdHJpbmcgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBzRW50aXR5U2V0UGF0aCBTdHJpbmcgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdXNlZCBkdXJpbmcgdGVtcGxhdGluZ1xuICogQHBhcmFtIHNUeXBlIFN0cmluZyBkYXRhIHR5cGUgb2QgdGhlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSBlZG0uRGF0ZVxuICogQHBhcmFtIGJVc2VTZW1hbnRpY0RhdGVSYW5nZSBCb29sZWFuIHBhc3NlZCBmcm9tIHRoZSBtYW5pZmVzdCBmb3Igc2VtYW50aWMgZGF0ZSByYW5nZVxuICogQHBhcmFtIHNTZXR0aW5ncyBTdHJpbmdpZmllZCBvYmplY3Qgb2YgdGhlIHByb3BlcnR5IHNldHRpbmdzXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBvcGVyYXRvcnMgZm9yIGZpbHRlcmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yUHJvcGVydHkoXG5cdHNQcm9wZXJ0eTogc3RyaW5nLFxuXHRzRW50aXR5U2V0UGF0aDogc3RyaW5nLFxuXHRvQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsXG5cdHNUeXBlPzogc3RyaW5nLFxuXHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U/OiBib29sZWFuIHwgc3RyaW5nLFxuXHRzU2V0dGluZ3M/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgb0ZpbHRlclJlc3RyaWN0aW9ucyA9IENvbW1vblV0aWxzLmdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChzRW50aXR5U2V0UGF0aCwgb0NvbnRleHQpO1xuXHRjb25zdCBhRXF1YWxzT3BzID0gW1wiRVFcIl07XG5cdGNvbnN0IGFTaW5nbGVSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRjb25zdCBhU2luZ2xlUmFuZ2VEVEJhc2ljT3BzID0gW1wiRVFcIiwgXCJCVFwiXTtcblx0Y29uc3QgYVNpbmdsZVZhbHVlRGF0ZU9wcyA9IFtcblx0XHRcIlRPREFZXCIsXG5cdFx0XCJUT01PUlJPV1wiLFxuXHRcdFwiWUVTVEVSREFZXCIsXG5cdFx0XCJEQVRFXCIsXG5cdFx0XCJGSVJTVERBWVdFRUtcIixcblx0XHRcIkxBU1REQVlXRUVLXCIsXG5cdFx0XCJGSVJTVERBWU1PTlRIXCIsXG5cdFx0XCJMQVNUREFZTU9OVEhcIixcblx0XHRcIkZJUlNUREFZUVVBUlRFUlwiLFxuXHRcdFwiTEFTVERBWVFVQVJURVJcIixcblx0XHRcIkZJUlNUREFZWUVBUlwiLFxuXHRcdFwiTEFTVERBWVlFQVJcIlxuXHRdO1xuXHRjb25zdCBhTXVsdGlSYW5nZU9wcyA9IFtcIkVRXCIsIFwiR0VcIiwgXCJMRVwiLCBcIkxUXCIsIFwiR1RcIiwgXCJCVFwiLCBcIk5FXCIsIFwiTk9UQlRcIiwgXCJOT1RMRVwiLCBcIk5PVExUXCIsIFwiTk9UR0VcIiwgXCJOT1RHVFwiXTtcblx0Y29uc3QgYVNlYXJjaEV4cHJlc3Npb25PcHMgPSBbXCJDb250YWluc1wiLCBcIk5vdENvbnRhaW5zXCIsIFwiU3RhcnRzV2l0aFwiLCBcIk5vdFN0YXJ0c1dpdGhcIiwgXCJFbmRzV2l0aFwiLCBcIk5vdEVuZHNXaXRoXCJdO1xuXHRjb25zdCBhU2VtYW50aWNEYXRlT3BzRXh0ID0gU2VtYW50aWNEYXRlT3BlcmF0b3JzLmdldFN1cHBvcnRlZE9wZXJhdGlvbnMoKTtcblx0Y29uc3QgYlNlbWFudGljRGF0ZVJhbmdlID0gYlVzZVNlbWFudGljRGF0ZVJhbmdlID09PSBcInRydWVcIiB8fCBiVXNlU2VtYW50aWNEYXRlUmFuZ2UgPT09IHRydWU7XG5cdGxldCBhU2VtYW50aWNEYXRlT3BzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBvU2V0dGluZ3MgPSBzU2V0dGluZ3MgJiYgdHlwZW9mIHNTZXR0aW5ncyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uoc1NldHRpbmdzKS5jdXN0b21EYXRhIDogc1NldHRpbmdzO1xuXG5cdGlmICgob0NvbnRleHQuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKSBhcyB1bmtub3duKSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiBhRXF1YWxzT3BzO1xuXHR9XG5cblx0aWYgKG9TZXR0aW5ncyAmJiBvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uICYmIG9TZXR0aW5ncy5vcGVyYXRvckNvbmZpZ3VyYXRpb24ubGVuZ3RoID4gMCkge1xuXHRcdGFTZW1hbnRpY0RhdGVPcHMgPSBTZW1hbnRpY0RhdGVPcGVyYXRvcnMuZ2V0RmlsdGVyT3BlcmF0aW9ucyhvU2V0dGluZ3Mub3BlcmF0b3JDb25maWd1cmF0aW9uLCBzVHlwZSk7XG5cdH0gZWxzZSB7XG5cdFx0YVNlbWFudGljRGF0ZU9wcyA9IFNlbWFudGljRGF0ZU9wZXJhdG9ycy5nZXRTZW1hbnRpY0RhdGVPcGVyYXRpb25zKHNUeXBlKTtcblx0fVxuXHQvLyBHZXQgdGhlIGRlZmF1bHQgT3BlcmF0b3JzIGZvciB0aGlzIFByb3BlcnR5IFR5cGVcblx0bGV0IGFEZWZhdWx0T3BlcmF0b3JzID0gX2dldERlZmF1bHRPcGVyYXRvcnMoc1R5cGUpO1xuXHRpZiAoYlNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0YURlZmF1bHRPcGVyYXRvcnMgPSBhU2VtYW50aWNEYXRlT3BzRXh0LmNvbmNhdChhRGVmYXVsdE9wZXJhdG9ycyk7XG5cdH1cblx0bGV0IHJlc3RyaWN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuXHQvLyBJcyB0aGVyZSBhIEZpbHRlciBSZXN0cmljdGlvbiBkZWZpbmVkIGZvciB0aGlzIHByb3BlcnR5P1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9ucyAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zLkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHldKSB7XG5cdFx0Ly8gRXh0ZW5kaW5nIHRoZSBkZWZhdWx0IG9wZXJhdG9ycyBsaXN0IHdpdGggU2VtYW50aWMgRGF0ZSBvcHRpb25zIERBVEVSQU5HRSwgREFURSwgRlJPTSBhbmQgVE9cblx0XHRjb25zdCBzQWxsb3dlZEV4cHJlc3Npb24gPSBDb21tb25VdGlscy5nZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uKG9GaWx0ZXJSZXN0cmljdGlvbnMuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eV0pO1xuXHRcdC8vIEluIGNhc2UgbW9yZSB0aGFuIG9uZSBBbGxvd2VkIEV4cHJlc3Npb25zIGhhcyBiZWVuIGRlZmluZWQgZm9yIGEgcHJvcGVydHlcblx0XHQvLyBjaG9vc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUgQWxsb3dlZCBFeHByZXNzaW9uXG5cblx0XHQvLyBNdWx0aVZhbHVlIGhhcyBzYW1lIE9wZXJhdG9yIGFzIFNpbmdsZVZhbHVlLCBidXQgdGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgKG1heENvbmRpdGlvbnMpXG5cdFx0c3dpdGNoIChzQWxsb3dlZEV4cHJlc3Npb24pIHtcblx0XHRcdGNhc2UgXCJTaW5nbGVWYWx1ZVwiOlxuXHRcdFx0XHRjb25zdCBhU2luZ2xlVmFsdWVPcHMgPSBzVHlwZSA9PT0gXCJFZG0uRGF0ZVwiICYmIGJTZW1hbnRpY0RhdGVSYW5nZSA/IGFTaW5nbGVWYWx1ZURhdGVPcHMgOiBhRXF1YWxzT3BzO1xuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhU2luZ2xlVmFsdWVPcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVZhbHVlXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFFcXVhbHNPcHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTaW5nbGVSYW5nZVwiOlxuXHRcdFx0XHRsZXQgYUV4cHJlc3Npb25PcHM6IHN0cmluZ1tdO1xuXHRcdFx0XHRpZiAoYlNlbWFudGljRGF0ZVJhbmdlKSB7XG5cdFx0XHRcdFx0aWYgKHNUeXBlID09PSBcIkVkbS5EYXRlXCIpIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNlbWFudGljRGF0ZU9wcztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNUeXBlID09PSBcIkVkbS5EYXRlVGltZU9mZnNldFwiKSB7XG5cdFx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTZW1hbnRpY0RhdGVPcHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlT3BzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChzVHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIikge1xuXHRcdFx0XHRcdGFFeHByZXNzaW9uT3BzID0gYVNpbmdsZVJhbmdlRFRCYXNpY09wcztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRXhwcmVzc2lvbk9wcyA9IGFTaW5nbGVSYW5nZU9wcztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzT3BlcmF0b3JzID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYUV4cHJlc3Npb25PcHMpO1xuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBzT3BlcmF0b3JzO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNdWx0aVJhbmdlXCI6XG5cdFx0XHRcdHJlc3RyaWN0aW9ucyA9IF9nZXRSZXN0cmljdGlvbnMoYURlZmF1bHRPcGVyYXRvcnMsIGFNdWx0aVJhbmdlT3BzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdFx0XHRyZXN0cmljdGlvbnMgPSBfZ2V0UmVzdHJpY3Rpb25zKGFEZWZhdWx0T3BlcmF0b3JzLCBhU2VhcmNoRXhwcmVzc2lvbk9wcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdFx0cmVzdHJpY3Rpb25zID0gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYVNlYXJjaEV4cHJlc3Npb25PcHMuY29uY2F0KGFNdWx0aVJhbmdlT3BzKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2UgQWxsb3dlZEV4cHJlc3Npb25zIGlzIG5vdCByZWNvZ25pc2VkLCB1bmRlZmluZWQgaW4gcmV0dXJuIHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgc2V0IG9mXG5cdFx0Ly8gb3BlcmF0b3JzIGZvciB0aGUgdHlwZS5cblx0fVxuXHRyZXR1cm4gcmVzdHJpY3Rpb25zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byByZXR1cm4gYWxsb3dlZCBvcGVyYXRvcnMgZm9yIHR5cGUgR3VpZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eVxuICogQHJldHVybnMgQWxsb3dlZCBvcGVyYXRvcnMgZm9yIHR5cGUgR3VpZFxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRvcnNGb3JHdWlkUHJvcGVydHkoKTogc3RyaW5nIHtcblx0Y29uc3QgYWxsb3dlZE9wZXJhdG9yc0Zvckd1aWQgPSBbXCJFUVwiLCBcIk5FXCJdO1xuXHRyZXR1cm4gYWxsb3dlZE9wZXJhdG9yc0Zvckd1aWQudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5KHByb3BlcnR5VHlwZTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHQvLyBJbiBjYXNlIEFsbG93ZWRFeHByZXNzaW9ucyBpcyBub3QgcHJvdmlkZWQgZm9yIHR5cGUgRWRtLkRhdGUgdGhlbiBhbGwgdGhlIGRlZmF1bHRcblx0Ly8gb3BlcmF0b3JzIGZvciB0aGUgdHlwZSBzaG91bGQgYmUgcmV0dXJuZWQgZXhjbHVkaW5nIHNlbWFudGljIG9wZXJhdG9ycyBmcm9tIHRoZSBsaXN0LlxuXHRjb25zdCBhRGVmYXVsdE9wZXJhdG9ycyA9IF9nZXREZWZhdWx0T3BlcmF0b3JzKHByb3BlcnR5VHlwZSk7XG5cdGNvbnN0IGFNdWx0aVJhbmdlT3BzID0gW1wiRVFcIiwgXCJHRVwiLCBcIkxFXCIsIFwiTFRcIiwgXCJHVFwiLCBcIkJUXCIsIFwiTkVcIiwgXCJOT1RCVFwiLCBcIk5PVExFXCIsIFwiTk9UTFRcIiwgXCJOT1RHRVwiLCBcIk5PVEdUXCJdO1xuXHRyZXR1cm4gX2dldFJlc3RyaWN0aW9ucyhhRGVmYXVsdE9wZXJhdG9ycywgYU11bHRpUmFuZ2VPcHMpO1xufVxuXG50eXBlIFBhcmFtZXRlckluZm8gPSB7XG5cdGNvbnRleHRQYXRoPzogc3RyaW5nO1xuXHRwYXJhbWV0ZXJQcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsUHJvcGVydHk+O1xufTtcbmZ1bmN0aW9uIGdldFBhcmFtZXRlckluZm8obWV0YU1vZGVsQ29udGV4dDogT0RhdGFNZXRhTW9kZWwsIHNDb250ZXh0UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IHNQYXJhbWV0ZXJDb250ZXh0UGF0aCA9IHNDb250ZXh0UGF0aC5zdWJzdHJpbmcoMCwgc0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdGNvbnN0IGJSZXN1bHRDb250ZXh0ID0gbWV0YU1vZGVsQ29udGV4dC5nZXRPYmplY3QoYCR7c1BhcmFtZXRlckNvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0Y29uc3Qgb1BhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8gPSB7fTtcblx0aWYgKGJSZXN1bHRDb250ZXh0ICYmIHNQYXJhbWV0ZXJDb250ZXh0UGF0aCAhPT0gc0NvbnRleHRQYXRoKSB7XG5cdFx0b1BhcmFtZXRlckluZm8uY29udGV4dFBhdGggPSBzUGFyYW1ldGVyQ29udGV4dFBhdGg7XG5cdFx0b1BhcmFtZXRlckluZm8ucGFyYW1ldGVyUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhtZXRhTW9kZWxDb250ZXh0LCBzUGFyYW1ldGVyQ29udGV4dFBhdGgpO1xuXHR9XG5cdHJldHVybiBvUGFyYW1ldGVySW5mbztcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gYWRkIHRoZSBzZWxlY3QgT3B0aW9ucyB0byBmaWx0ZXIgY29uZGl0aW9ucy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9uc1xuICogQHBhcmFtIG9Qcm9wZXJ0eU1ldGFkYXRhIFByb3BlcnR5IG1ldGFkYXRhIGluZm9ybWF0aW9uXG4gKiBAcGFyYW0gYVZhbGlkT3BlcmF0b3JzIE9wZXJhdG9ycyBmb3IgYWxsIHRoZSBkYXRhIHR5cGVzXG4gKiBAcGFyYW0gYVNlbWFudGljRGF0ZU9wZXJhdG9ycyBPcGVyYXRvcnMgZm9yIHRoZSBEYXRlIHR5cGVcbiAqIEBwYXJhbSBhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMgRmlsdGVyIGNvbmRpdGlvbnNcbiAqIEBwYXJhbSBvU2VsZWN0T3B0aW9uIFNlbGVjdG9wdGlvbiBvZiBzZWxlY3Rpb24gdmFyaWFudFxuICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zXG4gKi9cbmZ1bmN0aW9uIGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9ucyhcblx0b1Byb3BlcnR5TWV0YWRhdGE6IHVua25vd24sXG5cdGFWYWxpZE9wZXJhdG9yczogc3RyaW5nW10sXG5cdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnM6IHN0cmluZ1tdLFxuXHRhQ3VtdWxhdGl2ZUNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLFxuXHRvU2VsZWN0T3B0aW9uOiBTZWxlY3RPcHRpb25cbikge1xuXHRjb25zdCBvQ29uZGl0aW9uID0gZ2V0Q29uZGl0aW9ucyhvU2VsZWN0T3B0aW9uLCBvUHJvcGVydHlNZXRhZGF0YSk7XG5cdGlmIChcblx0XHRvU2VsZWN0T3B0aW9uPy5TZW1hbnRpY0RhdGVzICYmXG5cdFx0YVNlbWFudGljRGF0ZU9wZXJhdG9ycyAmJlxuXHRcdGFTZW1hbnRpY0RhdGVPcGVyYXRvcnMuaW5kZXhPZihvU2VsZWN0T3B0aW9uPy5TZW1hbnRpY0RhdGVzPy5vcGVyYXRvcikgPiAtMVxuXHQpIHtcblx0XHRjb25zdCBzZW1hbnRpY0RhdGVzID0gQ29tbW9uVXRpbHMuYWRkU2VtYW50aWNEYXRlc1RvQ29uZGl0aW9ucyhvU2VsZWN0T3B0aW9uPy5TZW1hbnRpY0RhdGVzKTtcblx0XHRpZiAoc2VtYW50aWNEYXRlcyAmJiBPYmplY3Qua2V5cyhzZW1hbnRpY0RhdGVzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQ3VtdWxhdGl2ZUNvbmRpdGlvbnMucHVzaChzZW1hbnRpY0RhdGVzKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob0NvbmRpdGlvbikge1xuXHRcdGlmIChhVmFsaWRPcGVyYXRvcnMubGVuZ3RoID09PSAwIHx8IGFWYWxpZE9wZXJhdG9ycy5pbmRleE9mKG9Db25kaXRpb24ub3BlcmF0b3IpID4gLTEpIHtcblx0XHRcdGFDdW11bGF0aXZlQ29uZGl0aW9ucy5wdXNoKG9Db25kaXRpb24pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYUN1bXVsYXRpdmVDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBhZGQgdGhlIHNlbWFudGljIGRhdGVzIHRvIGZpbHRlciBjb25kaXRpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBhZGRTZW1hbnRpY0RhdGVzVG9Db25kaXRpb25zXG4gKiBAcGFyYW0gb1NlbWFudGljRGF0ZXMgU2VtYW50aWMgZGF0ZSBpbmZvbWF0aW9uXG4gKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbnMgY29udGFpbmluZyBzZW1hbnRpYyBkYXRlc1xuICovXG5cbmZ1bmN0aW9uIGFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMob1NlbWFudGljRGF0ZXM6IFNlbWFudGljRGF0ZUNvbmZpZ3VyYXRpb24pOiBDb25kaXRpb25PYmplY3Qge1xuXHRjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXHRpZiAob1NlbWFudGljRGF0ZXM/LmhpZ2gpIHtcblx0XHR2YWx1ZXMucHVzaChvU2VtYW50aWNEYXRlcz8uaGlnaCk7XG5cdH1cblx0aWYgKG9TZW1hbnRpY0RhdGVzPy5sb3cpIHtcblx0XHR2YWx1ZXMucHVzaChvU2VtYW50aWNEYXRlcz8ubG93KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogdmFsdWVzLFxuXHRcdG9wZXJhdG9yOiBvU2VtYW50aWNEYXRlcz8ub3BlcmF0b3IsXG5cdFx0aXNFbXB0eTogdW5kZWZpbmVkXG5cdH07XG59XG5cbnR5cGUgVmlld0RhdGEgPSB7XG5cdGNvbnRyb2xDb25maWd1cmF0aW9uPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufTtcblxuZnVuY3Rpb24gYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIG1QYWdlQ29udGV4dDogdW5rbm93bltdLCBvVmlldzogVmlldykge1xuXHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0Y29uc3Qgb05hdmlnYXRpb25TZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXROYXZpZ2F0aW9uU2VydmljZSgpO1xuXHRyZXR1cm4gb05hdmlnYXRpb25TZXJ2aWNlLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KG1QYWdlQ29udGV4dCwgb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCkpO1xufVxuXG4vKipcbiAqIEdldCBzZWxlY3Rpb24gdmFyaWFudCBiYXNlZCBvbiB0aGUgZmlsdGVyIGNvbmRpdGlvbnMgYW5kIHRoZSBuYXZpZ2F0aW9uIGNvbnRleHQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvblZhcmlhbnQgcHJvdmlkZWQgYnkgU0FQIEZpb3JpIGVsZW1lbnRzLlxuICogQHBhcmFtIGZpbHRlcnMgUmV0cmlldmVkIGZpbHRlciBjb25kaXRpb24gZm9yIGZpbHRlciBiYXIgYW5kIG5vbiBjb25mbGljdGluZyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gdGFyZ2V0SW5mbyBPYmplY3QgY29udGFpbmluZyBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbi1yZWxhdGVkIGluZm9cbiAqIEBwYXJhbSBmaWx0ZXJCYXIgVGhlIGZpbHRlcmJhciBjb250cm9sXG4gKiBAcmV0dXJucyBUaGUgc2VsZWN0aW9uIHZhcmlhbnRcbiAqL1xuXG5mdW5jdGlvbiBhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudChcblx0aW5wdXRTZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRmaWx0ZXJzOiBFeHRlcm5hbEZpbHRlcixcblx0ZmlsdGVyQmFyOiBGaWx0ZXJCYXIsXG5cdHRhcmdldEluZm8/OiBOYXZpZ2F0aW9uSW5mb1xuKTogU2VsZWN0aW9uVmFyaWFudCB7XG5cdGNvbnN0IGZpbHRlckNvbmRpdGlvbnMgPSBmaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnM7XG5cdGNvbnN0IGZpbHRlcnNXaXRob3V0Q29uZmxpY3QgPSBmaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QgPyBmaWx0ZXJzLmZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QgOiB7fTtcblx0Y29uc3QgdGFibGVQcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0ID0gdGFyZ2V0SW5mbz8ucHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA/IHRhcmdldEluZm8ucHJvcGVydGllc1dpdGhvdXRDb25mbGljdCA6IHt9O1xuXG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRGcm9tRmlsdGVyYmFyID0gU3RhdGVGaWx0ZXJUb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0aW9uVmFyaWFudEZyb21Db25kaXRpb25zKFxuXHRcdGZpbHRlckNvbmRpdGlvbnMsXG5cdFx0ZmlsdGVyQmFyLmdldFByb3BlcnR5SGVscGVyKClcblx0KTtcblx0Zm9yIChjb25zdCBmaWx0ZXJrZXkgaW4gZmlsdGVyQ29uZGl0aW9ucykge1xuXHRcdC8vIG9ubHkgYWRkIHRoZSBmaWx0ZXIgdmFsdWVzIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFNWIGFscmVhZHlcblx0XHRjb25zdCBmaWx0ZXJTZWxlY3RPcHRpb24gPSBzZWxlY3Rpb25WYXJpYW50RnJvbUZpbHRlcmJhci5nZXRTZWxlY3RPcHRpb24oZmlsdGVya2V5KTtcblx0XHRpZiAoIWlucHV0U2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oZmlsdGVya2V5KSkge1xuXHRcdFx0Ly8gVE9ETyA6IGN1c3RvbSBmaWx0ZXJzIHNob3VsZCBiZSBpZ25vcmVkIG1vcmUgZ2VuZXJpY2FsbHlcblx0XHRcdGlmIChmaWx0ZXJrZXkgPT09IFwiJGVkaXRTdGF0ZVwiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZpbHRlclNlbGVjdE9wdGlvbikge1xuXHRcdFx0XHRpbnB1dFNlbGVjdGlvblZhcmlhbnQubWFzc0FkZFNlbGVjdE9wdGlvbihmaWx0ZXJrZXksIGZpbHRlclNlbGVjdE9wdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0YWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QgJiYgZmlsdGVya2V5IGluIHRhYmxlUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCkge1xuXHRcdFx0XHRpbnB1dFNlbGVjdGlvblZhcmlhbnQubWFzc0FkZFNlbGVjdE9wdGlvbih0YWJsZVByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3RbZmlsdGVya2V5XSwgZmlsdGVyU2VsZWN0T3B0aW9uIGFzIFNlbGVjdE9wdGlvbltdKTtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHByb3BlcnR5IHdhcyB3aXRob3V0IGNvbmZsaWN0IGluIHBhZ2UgY29udGV4dCB0aGVuIGFkZCBwYXRoIGZyb20gcGFnZSBjb250ZXh0IHRvIFNWXG5cdFx0XHRpZiAoZmlsdGVya2V5IGluIGZpbHRlcnNXaXRob3V0Q29uZmxpY3QpIHtcblx0XHRcdFx0aW5wdXRTZWxlY3Rpb25WYXJpYW50Lm1hc3NBZGRTZWxlY3RPcHRpb24oZmlsdGVyc1dpdGhvdXRDb25mbGljdFtmaWx0ZXJrZXldLCBmaWx0ZXJTZWxlY3RPcHRpb24gYXMgU2VsZWN0T3B0aW9uW10pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaW5wdXRTZWxlY3Rpb25WYXJpYW50O1xufVxuXG5mdW5jdGlvbiBpc1N0aWNreUVkaXRNb2RlKG9Db250cm9sOiBDb250cm9sKSB7XG5cdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQoKG9Db250cm9sLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRjb25zdCBiVUlFZGl0YWJsZSA9IChvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0cmV0dXJuIGJJc1N0aWNreU1vZGUgJiYgYlVJRWRpdGFibGU7XG59XG5cbi8qKlxuICogQHBhcmFtIGFNYW5kYXRvcnlGaWx0ZXJGaWVsZHNcbiAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudFxuICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNcbiAqL1xuZnVuY3Rpb24gYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeShcblx0YU1hbmRhdG9yeUZpbHRlckZpZWxkczogRXhwYW5kUGF0aFR5cGU8RWRtLlByb3BlcnR5UGF0aD5bXSxcblx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdG9TZWxlY3Rpb25WYXJpYW50RGVmYXVsdHM6IFNlbGVjdGlvblZhcmlhbnRcbikge1xuXHRpZiAob1NlbGVjdGlvblZhcmlhbnQgJiYgYU1hbmRhdG9yeUZpbHRlckZpZWxkcyAmJiBhTWFuZGF0b3J5RmlsdGVyRmllbGRzLmxlbmd0aCkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1hbmRhdG9yeUZpbHRlckZpZWxkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYVNWT3B0aW9uID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKFwiRGlzcGxheUN1cnJlbmN5XCIpLFxuXHRcdFx0XHRhRGVmYXVsdFNWT3B0aW9uID0gb1NlbGVjdGlvblZhcmlhbnREZWZhdWx0cyAmJiBvU2VsZWN0aW9uVmFyaWFudERlZmF1bHRzLmdldFNlbGVjdE9wdGlvbihcIkRpc3BsYXlDdXJyZW5jeVwiKTtcblx0XHRcdGlmIChcblx0XHRcdFx0YU1hbmRhdG9yeUZpbHRlckZpZWxkc1tpXS4kUHJvcGVydHlQYXRoID09PSBcIkRpc3BsYXlDdXJyZW5jeVwiICYmXG5cdFx0XHRcdCghYVNWT3B0aW9uIHx8ICFhU1ZPcHRpb24ubGVuZ3RoKSAmJlxuXHRcdFx0XHRhRGVmYXVsdFNWT3B0aW9uICYmXG5cdFx0XHRcdGFEZWZhdWx0U1ZPcHRpb24ubGVuZ3RoXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uID0gYURlZmF1bHRTVk9wdGlvblswXTtcblx0XHRcdFx0Y29uc3Qgc1NpZ24gPSBkaXNwbGF5Q3VycmVuY3lTZWxlY3RPcHRpb25bXCJTaWduXCJdO1xuXHRcdFx0XHRjb25zdCBzT3B0aW9uID0gZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uW1wiT3B0aW9uXCJdO1xuXHRcdFx0XHRjb25zdCBzTG93ID0gZGlzcGxheUN1cnJlbmN5U2VsZWN0T3B0aW9uW1wiTG93XCJdO1xuXHRcdFx0XHRjb25zdCBzSGlnaCA9IGRpc3BsYXlDdXJyZW5jeVNlbGVjdE9wdGlvbltcIkhpZ2hcIl07XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkRpc3BsYXlDdXJyZW5jeVwiLCBzU2lnbiwgc09wdGlvbiwgc0xvdywgc0hpZ2gpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG50eXBlIFVzZXJEZWZhdWx0UGFyYW1ldGVyID0ge1xuXHQkTmFtZTogc3RyaW5nO1xuXHRnZXRQYXRoPygpOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdXNlciBkZWZhdWx0cyBmcm9tIHRoZSBzdGFydHVwIGFwcCBzdGF0ZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgYW5kIHNldHMgdGhlbSB0byBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gYVBhcmFtZXRlcnNcbiAqIEBwYXJhbSBvTW9kZWxcbiAqIEBwYXJhbSBiSXNBY3Rpb25cbiAqIEBwYXJhbSBiSXNDcmVhdGVcbiAqIEBwYXJhbSBvQWN0aW9uRGVmYXVsdFZhbHVlc1xuICovXG5hc3luYyBmdW5jdGlvbiBzZXRVc2VyRGVmYXVsdHMoXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0YVBhcmFtZXRlcnM6IFVzZXJEZWZhdWx0UGFyYW1ldGVyW10sXG5cdG9Nb2RlbDogSlNPTk1vZGVsIHwgT0RhdGFWNENvbnRleHQsXG5cdGJJc0FjdGlvbjogYm9vbGVhbixcblx0YklzQ3JlYXRlPzogYm9vbGVhbixcblx0b0FjdGlvbkRlZmF1bHRWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSBvQXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSxcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdG9TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdGNvbnN0IG9TdGFydHVwQXBwU3RhdGUgPSBhd2FpdCBvU2hlbGxTZXJ2aWNlcy5nZXRTdGFydHVwQXBwU3RhdGUob0FwcENvbXBvbmVudCk7XG5cdGNvbnN0IG9EYXRhID0gb1N0YXJ0dXBBcHBTdGF0ZT8uZ2V0RGF0YSgpIHx8IHt9LFxuXHRcdGFFeHRlbmRlZFBhcmFtZXRlcnMgPSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHx8IFtdO1xuXHRhUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvUGFyYW1ldGVyKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IGJJc0FjdGlvblxuXHRcdFx0PyBgLyR7b1BhcmFtZXRlci4kTmFtZX1gXG5cdFx0XHQ6IChvUGFyYW1ldGVyLmdldFBhdGg/LigpLnNsaWNlKG9QYXJhbWV0ZXIuZ2V0UGF0aCgpLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgc1BhcmFtZXRlck5hbWUgPSBiSXNBY3Rpb24gPyBzUHJvcGVydHlOYW1lLnNsaWNlKDEpIDogc1Byb3BlcnR5TmFtZTtcblx0XHRpZiAob0FjdGlvbkRlZmF1bHRWYWx1ZXMgJiYgYklzQ3JlYXRlKSB7XG5cdFx0XHRpZiAob0FjdGlvbkRlZmF1bHRWYWx1ZXNbc1BhcmFtZXRlck5hbWVdKSB7XG5cdFx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShzUHJvcGVydHlOYW1lLCBvQWN0aW9uRGVmYXVsdFZhbHVlc1tzUGFyYW1ldGVyTmFtZV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQYXJhbWV0ZXJOYW1lXSkge1xuXHRcdFx0b01vZGVsLnNldFByb3BlcnR5KHNQcm9wZXJ0eU5hbWUsIG9TdGFydHVwUGFyYW1ldGVyc1tzUGFyYW1ldGVyTmFtZV1bMF0pO1xuXHRcdH0gZWxzZSBpZiAoYUV4dGVuZGVkUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG9FeHRlbmRlZFBhcmFtZXRlciBvZiBhRXh0ZW5kZWRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGlmIChvRXh0ZW5kZWRQYXJhbWV0ZXIuUHJvcGVydHlOYW1lID09PSBzUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0XHRcdGNvbnN0IG9SYW5nZSA9IG9FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ/IG9FeHRlbmRlZFBhcmFtZXRlci5SYW5nZXNbb0V4dGVuZGVkUGFyYW1ldGVyLlJhbmdlcy5sZW5ndGggLSAxXVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKG9SYW5nZSAmJiBvUmFuZ2UuU2lnbiA9PT0gXCJJXCIgJiYgb1JhbmdlLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdFx0XHRvTW9kZWwuc2V0UHJvcGVydHkoc1Byb3BlcnR5TmFtZSwgb1JhbmdlLkxvdyk7IC8vIGhpZ2ggaXMgaWdub3JlZCB3aGVuIE9wdGlvbj1FUVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmV4cG9ydCB0eXBlIEluYm91bmRQYXJhbWV0ZXIgPSB7XG5cdHVzZUZvckNyZWF0ZTogYm9vbGVhbjtcbn07XG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsUGFyYW1zRm9yQ3JlYXRlKFxuXHRvU3RhcnR1cFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4sXG5cdG9JbmJvdW5kUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIEluYm91bmRQYXJhbWV0ZXI+XG4pIHtcblx0Y29uc3Qgb0luYm91bmRzID0gb0luYm91bmRQYXJhbWV0ZXJzLFxuXHRcdGFDcmVhdGVQYXJhbWV0ZXJzID1cblx0XHRcdG9JbmJvdW5kcyAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gT2JqZWN0LmtleXMob0luYm91bmRzKS5maWx0ZXIoZnVuY3Rpb24gKHNQYXJhbWV0ZXI6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbmJvdW5kc1tzUGFyYW1ldGVyXS51c2VGb3JDcmVhdGU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0bGV0IG9SZXQ7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYUNyZWF0ZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBzQ3JlYXRlUGFyYW1ldGVyID0gYUNyZWF0ZVBhcmFtZXRlcnNbaV07XG5cdFx0Y29uc3QgYVZhbHVlcyA9IG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbc0NyZWF0ZVBhcmFtZXRlcl07XG5cdFx0aWYgKGFWYWx1ZXMgJiYgYVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdG9SZXQgPSBvUmV0IHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdFx0XHRvUmV0W3NDcmVhdGVQYXJhbWV0ZXJdID0gYVZhbHVlc1swXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9SZXQ7XG59XG50eXBlIE91dGJvdW5kUGFyYW1ldGVyID0ge1xuXHRwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBPdXRib3VuZFBhcmFtZXRlclZhbHVlPjtcblx0c2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7XG5cdGFjdGlvbj86IHN0cmluZztcbn07XG50eXBlIE91dGJvdW5kUGFyYW1ldGVyVmFsdWUgPSB7XG5cdHZhbHVlPzoge1xuXHRcdHZhbHVlPzogc3RyaW5nO1xuXHRcdGZvcm1hdD86IHN0cmluZztcblx0fTtcbn07XG5mdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob091dGJvdW5kOiBPdXRib3VuZFBhcmFtZXRlcikge1xuXHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nOiBNZXRhTW9kZWxUeXBlPFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGU+W10gPSBbXTtcblx0aWYgKG9PdXRib3VuZC5wYXJhbWV0ZXJzKSB7XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvT3V0Ym91bmQucGFyYW1ldGVycykgfHwgW107XG5cdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNQYXJhbTogc3RyaW5nKSB7XG5cdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gb091dGJvdW5kLnBhcmFtZXRlcnNbc1BhcmFtXTtcblx0XHRcdFx0aWYgKG9NYXBwaW5nLnZhbHVlICYmIG9NYXBwaW5nLnZhbHVlLnZhbHVlICYmIG9NYXBwaW5nLnZhbHVlLmZvcm1hdCA9PT0gXCJiaW5kaW5nXCIpIHtcblx0XHRcdFx0XHQvLyB1c2luZyB0aGUgZm9ybWF0IG9mIFVJLk1hcHBpbmdcblx0XHRcdFx0XHRjb25zdCBvU2VtYW50aWNNYXBwaW5nID0ge1xuXHRcdFx0XHRcdFx0TG9jYWxQcm9wZXJ0eToge1xuXHRcdFx0XHRcdFx0XHQkUHJvcGVydHlQYXRoOiBvTWFwcGluZy52YWx1ZS52YWx1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IHNQYXJhbVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoYVNlbWFudGljT2JqZWN0TWFwcGluZy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvLyBUbyBjaGVjayBpZiB0aGUgc2VtYW50aWNPYmplY3QgTWFwcGluZyBpcyBkb25lIGZvciB0aGUgc2FtZSBsb2NhbCBwcm9wZXJ0eSBtb3JlIHRoYXQgb25jZSB0aGVuIGZpcnN0IG9uZSB3aWxsIGJlIGNvbnNpZGVyZWRcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVNlbWFudGljT2JqZWN0TWFwcGluZy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRpZiAoYVNlbWFudGljT2JqZWN0TWFwcGluZ1tpXS5Mb2NhbFByb3BlcnR5Py4kUHJvcGVydHlQYXRoICE9PSBvU2VtYW50aWNNYXBwaW5nLkxvY2FsUHJvcGVydHkuJFByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcucHVzaChvU2VtYW50aWNNYXBwaW5nKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nLnB1c2gob1NlbWFudGljTWFwcGluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFTZW1hbnRpY09iamVjdE1hcHBpbmc7XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbihvVmlld0RhdGE6IFZpZXdEYXRhLCBvQ3Jvc3NOYXY6IFJlY29yZDxzdHJpbmcsIE91dGJvdW5kUGFyYW1ldGVyPikge1xuXHRjb25zdCBvSGVhZGVyRmFjZXRJdGVtczogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRcdFx0YWN0aW9uOiBzdHJpbmc7XG5cdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXTtcblx0XHR9XG5cdD4gPSB7fTtcblx0bGV0IHNJZDtcblx0Y29uc3Qgb0NvbnRyb2xDb25maWcgPSBvVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24gYXMgUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRuYXZpZ2F0aW9uPzoge1xuXHRcdFx0XHR0YXJnZXRPdXRib3VuZD86IHtcblx0XHRcdFx0XHRvdXRib3VuZDogc3RyaW5nO1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblx0XHR9XG5cdD47XG5cdGZvciAoY29uc3QgY29uZmlnIGluIG9Db250cm9sQ29uZmlnKSB7XG5cdFx0aWYgKGNvbmZpZy5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xIHx8IGNvbmZpZy5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHNPdXRib3VuZCA9IG9Db250cm9sQ29uZmlnW2NvbmZpZ10ubmF2aWdhdGlvbj8udGFyZ2V0T3V0Ym91bmQ/Lm91dGJvdW5kO1xuXHRcdFx0aWYgKHNPdXRib3VuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IG9PdXRib3VuZCA9IG9Dcm9zc05hdltzT3V0Ym91bmRdO1xuXHRcdFx0XHRpZiAob091dGJvdW5kLnNlbWFudGljT2JqZWN0ICYmIG9PdXRib3VuZC5hY3Rpb24pIHtcblx0XHRcdFx0XHRpZiAoY29uZmlnLmluZGV4T2YoXCJDaGFydFwiKSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRzSWQgPSBnZW5lcmF0ZShbXCJmZVwiLCBcIk1pY3JvQ2hhcnRMaW5rXCIsIGNvbmZpZ10pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzSWQgPSBnZW5lcmF0ZShbXCJmZVwiLCBcIkhlYWRlckRQTGlua1wiLCBjb25maWddKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0TWFwcGluZyhvT3V0Ym91bmQpO1xuXHRcdFx0XHRcdG9IZWFkZXJGYWNldEl0ZW1zW3NJZF0gPSB7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb091dGJvdW5kLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0YWN0aW9uOiBvT3V0Ym91bmQuYWN0aW9uLFxuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU2VtYW50aWNPYmplY3RNYXBwaW5nXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYENyb3NzIG5hdmlnYXRpb24gb3V0Ym91bmQgaXMgY29uZmlndXJlZCB3aXRob3V0IHNlbWFudGljIG9iamVjdCBhbmQgYWN0aW9uIGZvciAke3NPdXRib3VuZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0hlYWRlckZhY2V0SXRlbXM7XG59XG5cbmZ1bmN0aW9uIHNldFNlbWFudGljT2JqZWN0TWFwcGluZ3Mob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsIHZNYXBwaW5nczogdW5rbm93bikge1xuXHRjb25zdCBvTWFwcGluZ3MgPSB0eXBlb2Ygdk1hcHBpbmdzID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2TWFwcGluZ3MpIDogdk1hcHBpbmdzO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IG9NYXBwaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNMb2NhbFByb3BlcnR5ID1cblx0XHRcdChvTWFwcGluZ3NbaV1bXCJMb2NhbFByb3BlcnR5XCJdICYmIG9NYXBwaW5nc1tpXVtcIkxvY2FsUHJvcGVydHlcIl1bXCIkUHJvcGVydHlQYXRoXCJdKSB8fFxuXHRcdFx0KG9NYXBwaW5nc1tpXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTG9jYWxQcm9wZXJ0eVwiXSAmJlxuXHRcdFx0XHRvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl1bXCIkUGF0aFwiXSk7XG5cdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0UHJvcGVydHkgPVxuXHRcdFx0b01hcHBpbmdzW2ldW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXSB8fCBvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl07XG5cdFx0Y29uc3Qgb1NlbGVjdE9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0aWYgKG9TZWxlY3RPcHRpb24pIHtcblx0XHRcdC8vQ3JlYXRlIGEgbmV3IFNlbGVjdE9wdGlvbiB3aXRoIHNTZW1hbnRpY09iamVjdFByb3BlcnR5IGFzIHRoZSBwcm9wZXJ0eSBOYW1lIGFuZCByZW1vdmUgdGhlIG9sZGVyIG9uZVxuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKHNMb2NhbFByb3BlcnR5KTtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50Lm1hc3NBZGRTZWxlY3RPcHRpb24oc1NlbWFudGljT2JqZWN0UHJvcGVydHksIG9TZWxlY3RPcHRpb24pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG59XG5cbnR5cGUgU2VtYW50aWNPYmplY3RGcm9tUGF0aCA9IHtcblx0c2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmc7XG5cdHNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3M6IHsgc2VtYW50aWNPYmplY3Q6IHN0cmluZyB9W107XG5cdHNlbWFudGljT2JqZWN0OiB7XG5cdFx0c2VtYW50aWNPYmplY3Q6IHsgJFBhdGg6IHN0cmluZyB9O1xuXHR9O1xuXHR1bmF2YWlsYWJsZUFjdGlvbnM6IHN0cmluZ1tdO1xufTtcbmFzeW5jIGZ1bmN0aW9uIGZuR2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNQYXRoOiBzdHJpbmcsIHNRdWFsaWZpZXI6IHN0cmluZykge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8U2VtYW50aWNPYmplY3RGcm9tUGF0aD4oZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRsZXQgc1NlbWFudGljT2JqZWN0LCBhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnM7XG5cdFx0aWYgKHNRdWFsaWZpZXIgPT09IFwiXCIpIHtcblx0XHRcdHNTZW1hbnRpY09iamVjdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdH1gKTtcblx0XHRcdGFTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUAke0NvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc31gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c1NlbWFudGljT2JqZWN0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0fSMke3NRdWFsaWZpZXJ9YCk7XG5cdFx0XHRhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0YCR7c1BhdGh9QCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfSMke3NRdWFsaWZpZXJ9YFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RGb3JHZXRMaW5rcyA9IFt7IHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QgfV07XG5cdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0ID0ge1xuXHRcdFx0c2VtYW50aWNPYmplY3Q6IHNTZW1hbnRpY09iamVjdFxuXHRcdH07XG5cdFx0cmVzb2x2ZSh7XG5cdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNQYXRoLFxuXHRcdFx0c2VtYW50aWNPYmplY3RGb3JHZXRMaW5rczogYVNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MsXG5cdFx0XHRzZW1hbnRpY09iamVjdDogb1NlbWFudGljT2JqZWN0LFxuXHRcdFx0dW5hdmFpbGFibGVBY3Rpb25zOiBhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnNcblx0XHR9KTtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZuVXBkYXRlU2VtYW50aWNUYXJnZXRzTW9kZWwoXG5cdGFHZXRMaW5rc1Byb21pc2VzOiBQcm9taXNlPExpbmtEZWZpbml0aW9uW11bXVtdPltdLFxuXHRhU2VtYW50aWNPYmplY3RzOiBTZW1hbnRpY09iamVjdFtdLFxuXHRvSW50ZXJuYWxNb2RlbENvbnRleHQ6IEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRzQ3VycmVudEhhc2g6IHN0cmluZ1xuKSB7XG5cdHR5cGUgU2VtYW50aWNPYmplY3RJbmZvID0geyBzZW1hbnRpY09iamVjdDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IEhhc1RhcmdldHM6IGJvb2xlYW47IEhhc1RhcmdldHNOb3RGaWx0ZXJlZDogYm9vbGVhbiB9O1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoYUdldExpbmtzUHJvbWlzZXMpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGFWYWx1ZXMpIHtcblx0XHRcdGxldCBhTGlua3M6IExpbmtEZWZpbml0aW9uW11bXVtdLFxuXHRcdFx0XHRfb0xpbmssXG5cdFx0XHRcdF9zTGlua0ludGVudEFjdGlvbixcblx0XHRcdFx0YUZpbmFsTGlua3M6IExpbmtEZWZpbml0aW9uW11bXSA9IFtdO1xuXHRcdFx0bGV0IG9GaW5hbFNlbWFudGljT2JqZWN0czogUmVjb3JkPHN0cmluZywgU2VtYW50aWNPYmplY3RJbmZvPiA9IHt9O1xuXHRcdFx0Y29uc3QgYkludGVudEhhc0FjdGlvbnMgPSBmdW5jdGlvbiAoc0ludGVudDogc3RyaW5nLCBhQWN0aW9ucz86IHVua25vd25bXSkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGludGVudCBpbiBhQWN0aW9ucykge1xuXHRcdFx0XHRcdGlmIChpbnRlbnQgPT09IHNJbnRlbnQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGxldCBrID0gMDsgayA8IGFWYWx1ZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0YUxpbmtzID0gYVZhbHVlc1trXTtcblx0XHRcdFx0aWYgKGFMaW5rcyAmJiBhTGlua3MubGVuZ3RoID4gMCAmJiBhTGlua3NbMF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IG9TZW1hbnRpY09iamVjdDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgU2VtYW50aWNPYmplY3RJbmZvPj4gPSB7fTtcblx0XHRcdFx0XHRsZXQgb1RtcDogU2VtYW50aWNPYmplY3RJbmZvO1xuXHRcdFx0XHRcdGxldCBzQWx0ZXJuYXRlUGF0aDtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0YUZpbmFsTGlua3MucHVzaChbXSk7XG5cdFx0XHRcdFx0XHRsZXQgaGFzVGFyZ2V0c05vdEZpbHRlcmVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRsZXQgaGFzVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUxpbmtDb3VudCA9IDA7IGlMaW5rQ291bnQgPCBhTGlua3NbaV1bMF0ubGVuZ3RoOyBpTGlua0NvdW50KyspIHtcblx0XHRcdFx0XHRcdFx0X29MaW5rID0gYUxpbmtzW2ldWzBdW2lMaW5rQ291bnRdO1xuXHRcdFx0XHRcdFx0XHRfc0xpbmtJbnRlbnRBY3Rpb24gPSBfb0xpbmsgJiYgX29MaW5rLmludGVudC5zcGxpdChcIj9cIilbMF0uc3BsaXQoXCItXCIpWzFdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICghKF9vTGluayAmJiBfb0xpbmsuaW50ZW50ICYmIF9vTGluay5pbnRlbnQuaW5kZXhPZihzQ3VycmVudEhhc2gpID09PSAwKSkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc1RhcmdldHNOb3RGaWx0ZXJlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFiSW50ZW50SGFzQWN0aW9ucyhfc0xpbmtJbnRlbnRBY3Rpb24sIGFTZW1hbnRpY09iamVjdHNba10udW5hdmFpbGFibGVBY3Rpb25zKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YUZpbmFsTGlua3NbaV0ucHVzaChfb0xpbmspO1xuXHRcdFx0XHRcdFx0XHRcdFx0aGFzVGFyZ2V0cyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvVG1wID0ge1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0cGF0aDogYVNlbWFudGljT2JqZWN0c1trXS5wYXRoLFxuXHRcdFx0XHRcdFx0XHRIYXNUYXJnZXRzOiBoYXNUYXJnZXRzLFxuXHRcdFx0XHRcdFx0XHRIYXNUYXJnZXRzTm90RmlsdGVyZWQ6IGhhc1RhcmdldHNOb3RGaWx0ZXJlZFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGlmIChvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF0gPSB7fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHNBbHRlcm5hdGVQYXRoID0gYVNlbWFudGljT2JqZWN0c1trXS5wYXRoLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XG5cdFx0XHRcdFx0XHRpZiAob1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdW3NBbHRlcm5hdGVQYXRoXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdFthU2VtYW50aWNPYmplY3RzW2tdLnNlbWFudGljT2JqZWN0XVtzQWx0ZXJuYXRlUGF0aF0gPSB7fSBhcyBTZW1hbnRpY09iamVjdEluZm87XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvU2VtYW50aWNPYmplY3RbYVNlbWFudGljT2JqZWN0c1trXS5zZW1hbnRpY09iamVjdF1bc0FsdGVybmF0ZVBhdGhdID0gT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W2FTZW1hbnRpY09iamVjdHNba10uc2VtYW50aWNPYmplY3RdW3NBbHRlcm5hdGVQYXRoXSxcblx0XHRcdFx0XHRcdFx0b1RtcFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0TmFtZSA9IE9iamVjdC5rZXlzKG9TZW1hbnRpY09iamVjdClbMF07XG5cdFx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9GaW5hbFNlbWFudGljT2JqZWN0cykuaW5jbHVkZXMoc1NlbWFudGljT2JqZWN0TmFtZSkpIHtcblx0XHRcdFx0XHRcdG9GaW5hbFNlbWFudGljT2JqZWN0c1tzU2VtYW50aWNPYmplY3ROYW1lXSA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHRcdG9GaW5hbFNlbWFudGljT2JqZWN0c1tzU2VtYW50aWNPYmplY3ROYW1lXSxcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljT2JqZWN0W3NTZW1hbnRpY09iamVjdE5hbWVdXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRmluYWxTZW1hbnRpY09iamVjdHMgPSBPYmplY3QuYXNzaWduKG9GaW5hbFNlbWFudGljT2JqZWN0cywgb1NlbWFudGljT2JqZWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YUZpbmFsTGlua3MgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9GaW5hbFNlbWFudGljT2JqZWN0cykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XCJzZW1hbnRpY3NUYXJnZXRzXCIsXG5cdFx0XHRcdFx0bWVyZ2VPYmplY3RzKG9GaW5hbFNlbWFudGljT2JqZWN0cywgb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VtYW50aWNzVGFyZ2V0c1wiKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIG9GaW5hbFNlbWFudGljT2JqZWN0cztcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJmblVwZGF0ZVNlbWFudGljVGFyZ2V0c01vZGVsOiBDYW5ub3QgcmVhZCBsaW5rc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZm5HZXRTZW1hbnRpY09iamVjdFByb21pc2UoXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0b1ZpZXc6IFZpZXcsXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRzUGF0aDogc3RyaW5nLFxuXHRzUXVhbGlmaWVyOiBzdHJpbmdcbikge1xuXHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RzRnJvbVBhdGgob01ldGFNb2RlbCwgc1BhdGgsIHNRdWFsaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBmblByZXBhcmVTZW1hbnRpY09iamVjdHNQcm9taXNlcyhcblx0X29BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0X29WaWV3OiBWaWV3LFxuXHRfb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdF9hU2VtYW50aWNPYmplY3RzRm91bmQ6IHN0cmluZ1tdLFxuXHRfYVNlbWFudGljT2JqZWN0c1Byb21pc2VzOiBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+W11cbikge1xuXHRsZXQgX0tleXM6IHN0cmluZ1tdLCBzUGF0aDtcblx0bGV0IHNRdWFsaWZpZXI6IHN0cmluZywgcmVnZXhSZXN1bHQ7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgX2FTZW1hbnRpY09iamVjdHNGb3VuZC5sZW5ndGg7IGkrKykge1xuXHRcdHNQYXRoID0gX2FTZW1hbnRpY09iamVjdHNGb3VuZFtpXTtcblx0XHRfS2V5cyA9IE9iamVjdC5rZXlzKF9vTWV0YU1vZGVsLmdldE9iamVjdChzUGF0aCArIFwiQFwiKSk7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IF9LZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRfS2V5c1tpbmRleF0uaW5kZXhPZihgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0fWApID09PSAwICYmXG5cdFx0XHRcdF9LZXlzW2luZGV4XS5pbmRleE9mKGBAJHtDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNPYmplY3RNYXBwaW5nfWApID09PSAtMSAmJlxuXHRcdFx0XHRfS2V5c1tpbmRleF0uaW5kZXhPZihgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zfWApID09PSAtMVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlZ2V4UmVzdWx0ID0gLyMoLiopLy5leGVjKF9LZXlzW2luZGV4XSk7XG5cdFx0XHRcdHNRdWFsaWZpZXIgPSByZWdleFJlc3VsdCA/IHJlZ2V4UmVzdWx0WzFdIDogXCJcIjtcblx0XHRcdFx0X2FTZW1hbnRpY09iamVjdHNQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0UHJvbWlzZShfb0FwcENvbXBvbmVudCwgX29WaWV3LCBfb01ldGFNb2RlbCwgc1BhdGgsIHNRdWFsaWZpZXIpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbnR5cGUgSW50ZXJuYWxKU09OTW9kZWwgPSB7XG5cdF9nZXRPYmplY3QodmFsOiBzdHJpbmcsIGNvbnRleHQ/OiBDb250ZXh0KTogb2JqZWN0O1xufTtcbmZ1bmN0aW9uIGZuR2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbChvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIHNQYWdlTW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBfZm5maW5kVmFsdWVzSGVscGVyID0gZnVuY3Rpb24gKFxuXHRcdG9iajogdW5kZWZpbmVkIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGxpc3Q6IHN0cmluZ1tdXG5cdCkge1xuXHRcdGlmICghb2JqKSB7XG5cdFx0XHRyZXR1cm4gbGlzdDtcblx0XHR9XG5cdFx0aWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHRvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuXHRcdFx0XHRsaXN0ID0gbGlzdC5jb25jYXQoX2ZuZmluZFZhbHVlc0hlbHBlcihpdGVtLCBrZXksIFtdKSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBsaXN0O1xuXHRcdH1cblx0XHRpZiAob2JqW2tleV0pIHtcblx0XHRcdGxpc3QucHVzaChvYmpba2V5XSBhcyBzdHJpbmcpO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygb2JqID09IFwib2JqZWN0XCIgJiYgb2JqICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IE9iamVjdC5rZXlzKG9iaik7XG5cdFx0XHRpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGlzdCA9IGxpc3QuY29uY2F0KF9mbmZpbmRWYWx1ZXNIZWxwZXIob2JqW2NoaWxkcmVuW2ldXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5LCBbXSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBsaXN0O1xuXHR9O1xuXHRjb25zdCBfZm5maW5kVmFsdWVzID0gZnVuY3Rpb24gKG9iajogdW5kZWZpbmVkIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXk6IHN0cmluZykge1xuXHRcdHJldHVybiBfZm5maW5kVmFsdWVzSGVscGVyKG9iaiwga2V5LCBbXSk7XG5cdH07XG5cdGNvbnN0IF9mbkRlbGV0ZUR1cGxpY2F0ZVNlbWFudGljT2JqZWN0cyA9IGZ1bmN0aW9uIChhU2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmdbXSkge1xuXHRcdHJldHVybiBhU2VtYW50aWNPYmplY3RQYXRoLmZpbHRlcihmdW5jdGlvbiAodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuXHRcdFx0cmV0dXJuIGFTZW1hbnRpY09iamVjdFBhdGguaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBvVmlldyA9IG9Db250cm9sbGVyLmdldFZpZXcoKTtcblx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRpZiAob0ludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c1Byb21pc2VzOiBQcm9taXNlPFNlbWFudGljT2JqZWN0RnJvbVBhdGg+W10gPSBbXTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQoKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpIGFzIEFwcENvbXBvbmVudDtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgb1BhZ2VNb2RlbCA9IChvQ29tcG9uZW50LmdldE1vZGVsKHNQYWdlTW9kZWwpIGFzIEpTT05Nb2RlbCkuZ2V0RGF0YSgpO1xuXHRcdGlmIChKU09OLnN0cmluZ2lmeShvUGFnZU1vZGVsKSA9PT0gXCJ7fVwiKSB7XG5cdFx0XHRvUGFnZU1vZGVsID0gKG9Db21wb25lbnQuZ2V0TW9kZWwoc1BhZ2VNb2RlbCkgYXMgdW5rbm93biBhcyBJbnRlcm5hbEpTT05Nb2RlbCkuX2dldE9iamVjdChcIi9cIiwgdW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0bGV0IGFTZW1hbnRpY09iamVjdHNGb3VuZCA9IF9mbmZpbmRWYWx1ZXMob1BhZ2VNb2RlbCwgXCJzZW1hbnRpY09iamVjdFBhdGhcIik7XG5cdFx0YVNlbWFudGljT2JqZWN0c0ZvdW5kID0gX2ZuRGVsZXRlRHVwbGljYXRlU2VtYW50aWNPYmplY3RzKGFTZW1hbnRpY09iamVjdHNGb3VuZCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZUhlbHBlciA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2ggPSBvU2hlbGxTZXJ2aWNlSGVscGVyLmdldEhhc2goKTtcblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzRm9yR2V0TGlua3MgPSBbXTtcblx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RzOiBTZW1hbnRpY09iamVjdFtdID0gW107XG5cdFx0bGV0IF9vU2VtYW50aWNPYmplY3Q7XG5cblx0XHRpZiAoc0N1cnJlbnRIYXNoICYmIHNDdXJyZW50SGFzaC5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcblx0XHRcdC8vIHNDdXJyZW50SGFzaCBjYW4gY29udGFpbiBxdWVyeSBzdHJpbmcsIGN1dCBpdCBvZmYhXG5cdFx0XHRzQ3VycmVudEhhc2ggPSBzQ3VycmVudEhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHRcdH1cblxuXHRcdGZuUHJlcGFyZVNlbWFudGljT2JqZWN0c1Byb21pc2VzKG9BcHBDb21wb25lbnQsIG9WaWV3LCBvTWV0YU1vZGVsLCBhU2VtYW50aWNPYmplY3RzRm91bmQsIGFTZW1hbnRpY09iamVjdHNQcm9taXNlcyk7XG5cblx0XHRpZiAoYVNlbWFudGljT2JqZWN0c1Byb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRQcm9taXNlLmFsbChhU2VtYW50aWNPYmplY3RzUHJvbWlzZXMpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChhVmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgYUdldExpbmtzUHJvbWlzZXMgPSBbXTtcblx0XHRcdFx0XHRsZXQgc1NlbU9iakV4cHJlc3Npb247XG5cdFx0XHRcdFx0dHlwZSBTZW1hbnRpY09iamVjdFJlc29sdmVkID0ge1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdEZvckdldExpbmtzOiB7IHNlbWFudGljT2JqZWN0OiBzdHJpbmcgfVtdO1xuXHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IHN0cmluZ1tdO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkOiBTZW1hbnRpY09iamVjdFJlc29sdmVkW10gPSBhVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHNTZW1PYmpFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24ocGF0aEluTW9kZWwoZWxlbWVudC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC4kUGF0aCkpITtcblx0XHRcdFx0XHRcdFx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBTZW1hbnRpY09iamVjdFJlc29sdmVkKS5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdCA9IHNTZW1PYmpFeHByZXNzaW9uO1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3NbMF0uc2VtYW50aWNPYmplY3QgPSBzU2VtT2JqRXhwcmVzc2lvbjtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuc2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSBhcyB1bmtub3duIGFzIFNlbWFudGljT2JqZWN0UmVzb2x2ZWRbXTtcblx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFTZW1hbnRpY09iamVjdHNSZXNvbHZlZC5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0X29TZW1hbnRpY09iamVjdCA9IGFTZW1hbnRpY09iamVjdHNSZXNvbHZlZFtqXTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0X29TZW1hbnRpY09iamVjdCAmJlxuXHRcdFx0XHRcdFx0XHRfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0ICYmXG5cdFx0XHRcdFx0XHRcdCEoX29TZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC5zZW1hbnRpY09iamVjdC5pbmRleE9mKFwie1wiKSA9PT0gMClcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RzRm9yR2V0TGlua3MucHVzaChfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3MpO1xuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNPYmplY3RzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRcdHVuYXZhaWxhYmxlQWN0aW9uczogX29TZW1hbnRpY09iamVjdC51bmF2YWlsYWJsZUFjdGlvbnMsXG5cdFx0XHRcdFx0XHRcdFx0cGF0aDogYVNlbWFudGljT2JqZWN0c1Jlc29sdmVkW2pdLnNlbWFudGljT2JqZWN0UGF0aFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0YUdldExpbmtzUHJvbWlzZXMucHVzaChvU2hlbGxTZXJ2aWNlSGVscGVyLmdldExpbmtzV2l0aENhY2hlKFtfb1NlbWFudGljT2JqZWN0LnNlbWFudGljT2JqZWN0Rm9yR2V0TGlua3NdKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBDb21tb25VdGlscy51cGRhdGVTZW1hbnRpY1RhcmdldHMoYUdldExpbmtzUHJvbWlzZXMsIGFTZW1hbnRpY09iamVjdHMsIG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgc0N1cnJlbnRIYXNoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21UYWJsZTogQ2Fubm90IGdldCBTZW1hbnRpYyBPYmplY3RzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlckFsbG93ZWRFeHByZXNzaW9uKG9GaWx0ZXJSZXN0cmljdGlvbnNBbm5vdGF0aW9uPzogTWV0YU1vZGVsVHlwZTxGaWx0ZXJSZXN0cmljdGlvbnNUeXBlPikge1xuXHRjb25zdCBtQWxsb3dlZEV4cHJlc3Npb25zOiBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0ge307XG5cdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbi5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eS5Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdFx0XHRpZiAobUFsbG93ZWRFeHByZXNzaW9uc1tvUHJvcGVydHkuUHJvcGVydHkuJFByb3BlcnR5UGF0aF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdLnB1c2gob1Byb3BlcnR5LkFsbG93ZWRFeHByZXNzaW9ucyBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LiRQcm9wZXJ0eVBhdGhdID0gW29Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMgYXMgc3RyaW5nXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBtQWxsb3dlZEV4cHJlc3Npb25zO1xufVxuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKFxuXHRvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbj86IE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4sXG5cdHNSZXN0cmljdGlvbj86IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIgfCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCJcbikge1xuXHRsZXQgYVByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb25bc1Jlc3RyaWN0aW9uIGFzIGtleW9mIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT5dKSB7XG5cdFx0YVByb3BzID0gKFxuXHRcdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb25bc1Jlc3RyaWN0aW9uIGFzIGtleW9mIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT5dIGFzIEV4cGFuZFBhdGhUeXBlPEVkbS5Qcm9wZXJ0eVBhdGg+W11cblx0XHQpLm1hcChmdW5jdGlvbiAob1Byb3BlcnR5OiBFeHBhbmRQYXRoVHlwZTxFZG0uUHJvcGVydHlQYXRoPikge1xuXHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS4kUHJvcGVydHlQYXRoO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhUHJvcHM7XG59XG5cbmZ1bmN0aW9uIF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKHBhdGhzOiBzdHJpbmdbXSwgbmF2UGF0aDogc3RyaW5nLCBwcm9wczogc3RyaW5nW10pIHtcblx0Y29uc3QgbmF2UGF0aFByZWZpeCA9IG5hdlBhdGggKyBcIi9cIjtcblx0cmV0dXJuIHBhdGhzLnJlZHVjZSgob3V0UGF0aHM6IHN0cmluZ1tdLCBwYXRoVG9DaGVjazogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKHBhdGhUb0NoZWNrLnN0YXJ0c1dpdGgobmF2UGF0aFByZWZpeCkpIHtcblx0XHRcdGNvbnN0IG91dFBhdGggPSBwYXRoVG9DaGVjay5yZXBsYWNlKG5hdlBhdGhQcmVmaXgsIFwiXCIpO1xuXHRcdFx0aWYgKG91dFBhdGhzLmluZGV4T2Yob3V0UGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdG91dFBhdGhzLnB1c2gob3V0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRQYXRocztcblx0fSwgcHJvcHMpO1xufVxudHlwZSBfRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xudHlwZSBfRmlsdGVyUmVzdHJpY3Rpb25zID0ge1xuXHRSZXF1aXJlZFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW107XG5cdEZpbHRlckFsbG93ZWRFeHByZXNzaW9uczogX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucztcbn07XG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgoZW50aXR5UGF0aDogc3RyaW5nLCBvQ29udGV4dDogT0RhdGFNZXRhTW9kZWwpIHtcblx0Y29uc3Qgb1JldDogX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0XHRSZXF1aXJlZFByb3BlcnRpZXM6IFtdLFxuXHRcdE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSxcblx0XHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IHt9XG5cdH07XG5cdGxldCBvRmlsdGVyUmVzdHJpY3Rpb25zO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGV4dCA9IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0Y29uc3QgZnJUZXJtID0gXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNcIjtcblx0Y29uc3QgZW50aXR5VHlwZVBhdGhQYXJ0cyA9IGVudGl0eVBhdGgucmVwbGFjZUFsbChcIiUyRlwiLCBcIi9cIikuc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdGNvbnN0IGVudGl0eVR5cGVQYXRoID0gYC8ke2VudGl0eVR5cGVQYXRoUGFydHMuam9pbihcIi9cIil9L2A7XG5cdGNvbnN0IGVudGl0eVNldFBhdGggPSBNb2RlbEhlbHBlci5nZXRFbnRpdHlTZXRQYXRoKGVudGl0eVBhdGgsIG9Db250ZXh0KTtcblx0Y29uc3QgZW50aXR5U2V0UGF0aFBhcnRzID0gZW50aXR5U2V0UGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0Y29uc3QgaXNDb250YWlubWVudCA9IG9Db250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlUeXBlUGF0aH0kQ29udGFpbnNUYXJnZXRgKTtcblx0Y29uc3QgY29udGFpbm1lbnROYXZQYXRoID0gISFpc0NvbnRhaW5tZW50ICYmIGVudGl0eVR5cGVQYXRoUGFydHNbZW50aXR5VHlwZVBhdGhQYXJ0cy5sZW5ndGggLSAxXTtcblxuXHQvL0xFQVNUIFBSSU9SSVRZIC0gRmlsdGVyIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBhdCBFbnRpdHkgU2V0XG5cdC8vZS5nLiBGUiBpbiBcIk5TLkVudGl0eUNvbnRhaW5lci9TYWxlc09yZGVyTWFuYWdlXCIgQ29udGV4dFBhdGg6IC9TYWxlc09yZGVyTWFuYWdlXG5cdGlmICghaXNDb250YWlubWVudCkge1xuXHRcdG9GaWx0ZXJSZXN0cmljdGlvbnMgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH0ke2ZyVGVybX1gKSBhcyBNZXRhTW9kZWxUeXBlPEZpbHRlclJlc3RyaWN0aW9uc1R5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdGNvbnN0IHJlc3VsdENvbnRleHRDaGVjayA9IG9Db250ZXh0LmdldE9iamVjdChgJHtlbnRpdHlUeXBlUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0XHRpZiAoIXJlc3VsdENvbnRleHRDaGVjaykge1xuXHRcdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdH1cblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBnZXRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbihvRmlsdGVyUmVzdHJpY3Rpb25zKSB8fCB7fTtcblx0fVxuXG5cdGlmIChlbnRpdHlUeXBlUGF0aFBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRjb25zdCBuYXZQYXRoID0gaXNDb250YWlubWVudCA/IChjb250YWlubWVudE5hdlBhdGggYXMgc3RyaW5nKSA6IGVudGl0eVNldFBhdGhQYXJ0c1tlbnRpdHlTZXRQYXRoUGFydHMubGVuZ3RoIC0gMV07XG5cdFx0Ly8gSW4gY2FzZSBvZiBjb250YWlubWVudCB3ZSB0YWtlIGVudGl0eVNldCBwcm92aWRlZCBhcyBwYXJlbnQuIEFuZCBpbiBjYXNlIG9mIG5vcm1hbCB3ZSB3b3VsZCByZW1vdmUgdGhlIGxhc3QgbmF2aWdhdGlvbiBmcm9tIGVudGl0eVNldFBhdGguXG5cdFx0Y29uc3QgcGFyZW50RW50aXR5U2V0UGF0aCA9IGlzQ29udGFpbm1lbnQgPyBlbnRpdHlTZXRQYXRoIDogYC8ke2VudGl0eVNldFBhdGhQYXJ0cy5zbGljZSgwLCAtMSkuam9pbihgLyR7bmF2aWdhdGlvblRleHR9L2ApfWA7XG5cdFx0Ly9USElSRCBISUdIRVNUIFBSSU9SSVRZIC0gUmVhZGluZyBwcm9wZXJ0eSBwYXRoIHJlc3RyaWN0aW9ucyAtIEFubm90YXRpb24gYXQgbWFpbiBlbnRpdHkgYnV0IGRpcmVjdGx5IG9uIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aFxuXHRcdC8vZS5nLiBQYXJlbnQgQ3VzdG9tZXIgd2l0aCBQcm9wZXJ0eVBhdGg9XCJTZXQvQ2l0eU5hbWVcIiBDb250ZXh0UGF0aDogQ3VzdG9tZXIvU2V0XG5cdFx0Y29uc3Qgb1BhcmVudFJldDogX0ZpbHRlclJlc3RyaWN0aW9ucyA9IHtcblx0XHRcdFJlcXVpcmVkUHJvcGVydGllczogW10sXG5cdFx0XHROb25GaWx0ZXJhYmxlUHJvcGVydGllczogW10sXG5cdFx0XHRGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM6IHt9XG5cdFx0fTtcblx0XHRpZiAoIW5hdlBhdGguaW5jbHVkZXMoXCIlMkZcIikpIHtcblx0XHRcdGNvbnN0IG9QYXJlbnRGUiA9IG9Db250ZXh0LmdldE9iamVjdChgJHtwYXJlbnRFbnRpdHlTZXRQYXRofSR7ZnJUZXJtfWApIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4gfCB1bmRlZmluZWQ7XG5cdFx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IF9mZXRjaFByb3BlcnRpZXNGb3JOYXZQYXRoKFxuXHRcdFx0XHRnZXRGaWx0ZXJSZXN0cmljdGlvbnMob1BhcmVudEZSLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXSxcblx0XHRcdFx0bmF2UGF0aCxcblx0XHRcdFx0b1JldC5SZXF1aXJlZFByb3BlcnRpZXMgfHwgW11cblx0XHRcdCk7XG5cdFx0XHRvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gX2ZldGNoUHJvcGVydGllc0Zvck5hdlBhdGgoXG5cdFx0XHRcdGdldEZpbHRlclJlc3RyaWN0aW9ucyhvUGFyZW50RlIsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW10sXG5cdFx0XHRcdG5hdlBhdGgsXG5cdFx0XHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgfHwgW11cblx0XHRcdCk7XG5cdFx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0XHRjb25zdCBjb21wbGV0ZUFsbG93ZWRFeHBzID0gZ2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob1BhcmVudEZSKSB8fCB7fTtcblx0XHRcdG9QYXJlbnRSZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zID0gT2JqZWN0LmtleXMoY29tcGxldGVBbGxvd2VkRXhwcykucmVkdWNlKFxuXHRcdFx0XHQob3V0UHJvcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LCBwcm9wUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb3BQYXRoLnN0YXJ0c1dpdGgobmF2UGF0aCArIFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3V0UHJvcFBhdGggPSBwcm9wUGF0aC5yZXBsYWNlKG5hdlBhdGggKyBcIi9cIiwgXCJcIik7XG5cdFx0XHRcdFx0XHRvdXRQcm9wW291dFByb3BQYXRoXSA9IGNvbXBsZXRlQWxsb3dlZEV4cHNbcHJvcFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gb3V0UHJvcDtcblx0XHRcdFx0fSxcblx0XHRcdFx0e30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IG1lcmdlT2JqZWN0cyhcblx0XHRcdHt9LFxuXHRcdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgfHwge30sXG5cdFx0XHRvUGFyZW50UmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyB8fCB7fVxuXHRcdCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG5cdFx0Ly9TRUNPTkQgSElHSEVTVCBwcmlvcml0eSAtIE5hdmlnYXRpb24gcmVzdHJpY3Rpb25zXG5cdFx0Ly9lLmcuIFBhcmVudCBcIi9DdXN0b21lclwiIHdpdGggTmF2aWdhdGlvblByb3BlcnR5UGF0aD1cIlNldFwiIENvbnRleHRQYXRoOiBDdXN0b21lci9TZXRcblx0XHRjb25zdCBvTmF2UmVzdHJpY3Rpb25zID0gTWV0YU1vZGVsRnVuY3Rpb24uZ2V0TmF2aWdhdGlvblJlc3RyaWN0aW9ucyhvQ29udGV4dCwgcGFyZW50RW50aXR5U2V0UGF0aCwgbmF2UGF0aC5yZXBsYWNlQWxsKFwiJTJGXCIsIFwiL1wiKSk7XG5cdFx0Y29uc3Qgb05hdkZpbHRlclJlc3QgPSBvTmF2UmVzdHJpY3Rpb25zICYmIChvTmF2UmVzdHJpY3Rpb25zW1wiRmlsdGVyUmVzdHJpY3Rpb25zXCJdIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT4pO1xuXHRcdGNvbnN0IG5hdlJlc1JlcVByb3BzID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZGaWx0ZXJSZXN0LCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXTtcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5SZXF1aXJlZFByb3BlcnRpZXMuY29uY2F0KG5hdlJlc1JlcVByb3BzKSk7XG5cdFx0Y29uc3QgbmF2Tm9uRmlsdGVyUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdkZpbHRlclJlc3QsIFwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcIikgfHwgW107XG5cdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IHVuaXF1ZVNvcnQob1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcy5jb25jYXQobmF2Tm9uRmlsdGVyUHJvcHMpKTtcblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zIHx8IHt9LFxuXHRcdFx0Z2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24ob05hdkZpbHRlclJlc3QpIHx8IHt9XG5cdFx0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cblx0XHQvL0hJR0hFU1QgcHJpb3JpdHkgLSBSZXN0cmljdGlvbnMgaGF2aW5nIHRhcmdldCB3aXRoIG5hdmlnYXRpb24gYXNzb2NpYXRpb24gZW50aXR5XG5cdFx0Ly8gZS5nLiBGUiBpbiBcIkN1c3RvbWVyUGFyYW1ldGVycy9TZXRcIiBDb250ZXh0UGF0aDogXCJDdXN0b21lci9TZXRcIlxuXHRcdGNvbnN0IG5hdkFzc29jaWF0aW9uRW50aXR5UmVzdCA9IG9Db250ZXh0LmdldE9iamVjdChcblx0XHRcdGAvJHtlbnRpdHlUeXBlUGF0aFBhcnRzLmpvaW4oXCIvXCIpfSR7ZnJUZXJtfWBcblx0XHQpIGFzIE1ldGFNb2RlbFR5cGU8RmlsdGVyUmVzdHJpY3Rpb25zVHlwZT47XG5cdFx0Y29uc3QgbmF2QXNzb2NSZXFQcm9wcyA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhuYXZBc3NvY2lhdGlvbkVudGl0eVJlc3QsIFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuUmVxdWlyZWRQcm9wZXJ0aWVzID0gdW5pcXVlU29ydChvUmV0LlJlcXVpcmVkUHJvcGVydGllcy5jb25jYXQobmF2QXNzb2NSZXFQcm9wcykpO1xuXHRcdGNvbnN0IG5hdkFzc29jTm9uRmlsdGVyUHJvcHMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMobmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0LCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRcdG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSB1bmlxdWVTb3J0KG9SZXQuTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuY29uY2F0KG5hdkFzc29jTm9uRmlsdGVyUHJvcHMpKTtcblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0b1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMgPSBtZXJnZU9iamVjdHMoXG5cdFx0XHR7fSxcblx0XHRcdG9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zLFxuXHRcdFx0Z2V0RmlsdGVyQWxsb3dlZEV4cHJlc3Npb24obmF2QXNzb2NpYXRpb25FbnRpdHlSZXN0KSB8fCB7fVxuXHRcdCkgYXMgX0ZpbHRlckFsbG93ZWRFeHByZXNzaW9ucztcblx0fVxuXHRyZXR1cm4gb1JldDtcbn1cblxudHlwZSBQcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0YmluZGluZ0NvbnRleHRzOiBvYmplY3Q7XG5cdG1vZGVsczogb2JqZWN0O1xufTtcbnR5cGUgQmFzZVRyZWVNb2RpZmllciA9IHtcblx0dGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXG5cdFx0c0ZyYWdtZW50TmFtZTogc3RyaW5nLFxuXHRcdG1QcmVwcm9jZXNzb3JTZXR0aW5nczogUHJlcHJvY2Vzc29yU2V0dGluZ3MsXG5cdFx0b1ZpZXc/OiBWaWV3XG5cdCk6IFByb21pc2U8VUk1RWxlbWVudFtdIHwgRWxlbWVudFtdPjtcblx0dGFyZ2V0czogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gdGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXG5cdHNGcmFnbWVudE5hbWU6IHN0cmluZyxcblx0b1ByZXByb2Nlc3NvclNldHRpbmdzOiBQcmVwcm9jZXNzb3JTZXR0aW5ncyxcblx0b09wdGlvbnM6IHsgdmlldz86IFZpZXc7IGlzWE1MPzogYm9vbGVhbjsgaWQ6IHN0cmluZzsgY29udHJvbGxlcjogQ29udHJvbGxlciB9LFxuXHRvTW9kaWZpZXI/OiBCYXNlVHJlZU1vZGlmaWVyXG4pOiBQcm9taXNlPEVsZW1lbnQgfCBVSTVFbGVtZW50IHwgRWxlbWVudFtdIHwgVUk1RWxlbWVudFtdPiB7XG5cdG9PcHRpb25zID0gb09wdGlvbnMgfHwge307XG5cdGlmIChvTW9kaWZpZXIpIHtcblx0XHRyZXR1cm4gb01vZGlmaWVyLnRlbXBsYXRlQ29udHJvbEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9QcmVwcm9jZXNzb3JTZXR0aW5ncywgb09wdGlvbnMudmlldykudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50KSB7XG5cdFx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIGFzIEZsZXggcmV0dXJucyBhbiBIVE1MQ29sbGVjdGlvbiBhcyB0ZW1wbGF0aW5nIHJlc3VsdCBpbiBYTUwgdGltZS5cblx0XHRcdHJldHVybiBvTW9kaWZpZXIudGFyZ2V0cyA9PT0gXCJ4bWxUcmVlXCIgJiYgb0ZyYWdtZW50Lmxlbmd0aCA+IDAgPyBvRnJhZ21lbnRbMF0gOiBvRnJhZ21lbnQ7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzXG5cdFx0KTtcblx0XHRjb25zdCBvQ29udHJvbCA9IG9GcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRpZiAoISFvT3B0aW9ucy5pc1hNTCAmJiBvQ29udHJvbCkge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRpZDogb09wdGlvbnMuaWQsXG5cdFx0XHRkZWZpbml0aW9uOiBvRnJhZ21lbnQgYXMgdW5rbm93biBhcyBzdHJpbmcsXG5cdFx0XHRjb250cm9sbGVyOiBvT3B0aW9ucy5jb250cm9sbGVyXG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U2luZ2xldG9uUGF0aChwYXRoOiBzdHJpbmcsIG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKSxcblx0XHRwcm9wZXJ0eU5hbWUgPSBwYXJ0cy5wb3AoKSEsXG5cdFx0bmF2aWdhdGlvblBhdGggPSBwYXJ0cy5qb2luKFwiL1wiKSxcblx0XHRlbnRpdHlTZXQgPSBuYXZpZ2F0aW9uUGF0aCAmJiBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtuYXZpZ2F0aW9uUGF0aH1gKTtcblx0aWYgKGVudGl0eVNldD8uJGtpbmQgPT09IFwiU2luZ2xldG9uXCIpIHtcblx0XHRjb25zdCBzaW5nbGV0b25OYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG5cdFx0cmV0dXJuIGAvJHtzaW5nbGV0b25OYW1lfS8ke3Byb3BlcnR5TmFtZX1gO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eShwYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdGlmICghcGF0aCB8fCAhbW9kZWwpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHR9XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHQvLyBGaW5kIHRoZSB1bmRlcmx5aW5nIGVudGl0eSBzZXQgZnJvbSB0aGUgcHJvcGVydHkgcGF0aCBhbmQgY2hlY2sgd2hldGhlciBpdCBpcyBhIHNpbmdsZXRvbi5cblx0Y29uc3QgcmVzb2x2ZWRQYXRoID0gZ2V0U2luZ2xldG9uUGF0aChwYXRoLCBtZXRhTW9kZWwpO1xuXHRpZiAocmVzb2x2ZWRQYXRoKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlCaW5kaW5nID0gbW9kZWwuYmluZFByb3BlcnR5KHJlc29sdmVkUGF0aCk7XG5cdFx0cmV0dXJuIHByb3BlcnR5QmluZGluZy5yZXF1ZXN0VmFsdWUoKTtcblx0fVxuXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG59XG5cbi8vIEdldCB0aGUgcGF0aCBmb3IgYWN0aW9uIHBhcmFtZXRlcnMgdGhhdCBpcyBuZWVkZWQgdG8gcmVhZCB0aGUgYW5ub3RhdGlvbnNcbmZ1bmN0aW9uIGdldFBhcmFtZXRlclBhdGgoc1BhdGg6IHN0cmluZywgc1BhcmFtZXRlcjogc3RyaW5nKSB7XG5cdGxldCBzQ29udGV4dDtcblx0aWYgKHNQYXRoLmluZGV4T2YoXCJAJHVpNS5vdmVybG9hZFwiKSA+IC0xKSB7XG5cdFx0c0NvbnRleHQgPSBzUGF0aC5zcGxpdChcIkAkdWk1Lm92ZXJsb2FkXCIpWzBdO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEZvciBVbmJvdW5kIEFjdGlvbnMgaW4gQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dzXG5cdFx0Y29uc3QgYUFjdGlvbiA9IHNQYXRoLnNwbGl0KFwiLzBcIilbMF0uc3BsaXQoXCIuXCIpO1xuXHRcdHNDb250ZXh0ID0gYC8ke2FBY3Rpb25bYUFjdGlvbi5sZW5ndGggLSAxXX0vYDtcblx0fVxuXHRyZXR1cm4gc0NvbnRleHQgKyBzUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIEdldCByZXNvbHZlZCBleHByZXNzaW9uIGJpbmRpbmcgdXNlZCBmb3IgdGV4dHMgYXQgcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gZXhwQmluZGluZ1xuICogQHBhcmFtIGNvbnRyb2xcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLkNvbW1vblV0aWxzXG4gKiBAcmV0dXJucyBBIHN0cmluZyBhZnRlciByZXNvbHV0aW9uLlxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIF9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmcoZXhwQmluZGluZzogc3RyaW5nLCBjb250cm9sOiBDb250cm9sKSB7XG5cdC8vIFRoZSBpZGVhIGhlcmUgaXMgdG8gY3JlYXRlIGR1bW15IGVsZW1lbnQgd2l0aCB0aGUgZXhwcmVzaW9uIGJpbmRpbmcuXG5cdC8vIEFkZGluZyBpdCBhcyBkZXBlbmRlbnQgdG8gdGhlIHZpZXcvY29udHJvbCB3b3VsZCBwcm9wYWdhdGUgYWxsIHRoZSBtb2RlbHMgdG8gdGhlIGR1bW15IGVsZW1lbnQgYW5kIHJlc29sdmUgdGhlIGJpbmRpbmcuXG5cdC8vIFdlIHJlbW92ZSB0aGUgZHVtbXkgZWxlbWVudCBhZnRlciB0aGF0IGFuZCBkZXN0cm95IGl0LlxuXG5cdGNvbnN0IGFueVJlc291cmNlVGV4dCA9IG5ldyBBbnlFbGVtZW50KHsgYW55VGV4dDogZXhwQmluZGluZyB9KTtcblx0Y29udHJvbC5hZGREZXBlbmRlbnQoYW55UmVzb3VyY2VUZXh0KTtcblx0Y29uc3QgcmVzdWx0VGV4dCA9IGFueVJlc291cmNlVGV4dC5nZXRBbnlUZXh0KCk7XG5cdGNvbnRyb2wucmVtb3ZlRGVwZW5kZW50KGFueVJlc291cmNlVGV4dCk7XG5cdGFueVJlc291cmNlVGV4dC5kZXN0cm95KCk7XG5cblx0cmV0dXJuIHJlc3VsdFRleHQ7XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBoYXMgYSBzbWFsbCBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBCb29sZWFuLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNTbWFsbERldmljZSgpIHtcblx0cmV0dXJuICFzeXN0ZW0uZGVza3RvcCB8fCBEZXZpY2UucmVzaXplLndpZHRoIDw9IDMyMDtcbn1cbi8qKlxuICogR2V0IGZpbHRlciBpbmZvcm1hdGlvbiBmb3IgYSBTZWxlY3Rpb25WYXJpYW50IGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250cm9sIFRoZSB0YWJsZS9jaGFydCBpbnN0YW5jZVxuICogQHBhcmFtIHNlbGVjdGlvblZhcmlhbnRQYXRoIFJlbGF0aXZlIFNlbGVjdGlvblZhcmlhbnQgYW5ub3RhdGlvbiBwYXRoXG4gKiBAcGFyYW0gaXNDaGFydFxuICogQHJldHVybnMgSW5mb3JtYXRpb24gb24gZmlsdGVyc1xuICogIGZpbHRlcnM6IGFycmF5IG9mIHNhcC51aS5tb2RlbC5maWx0ZXJzXG4gKiB0ZXh0OiBUZXh0IHByb3BlcnR5IG9mIHRoZSBTZWxlY3Rpb25WYXJpYW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmludGVyZmFjZSBJU2VsZWN0aW9uT3B0aW9uIHtcblx0UHJvcGVydHlOYW1lOiB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9O1xuXHRSYW5nZXM6IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRPcHRpb246IHsgJEVudW1NZW1iZXI6IFN0cmluZyB9O1xuXHRcdFx0TG93OiB1bmtub3duO1xuXHRcdFx0SGlnaDogdW5rbm93bjtcblx0XHR9O1xuXHR9O1xufVxuZnVuY3Rpb24gZ2V0RmlsdGVyc0luZm9Gb3JTVihvQ29udHJvbDogQ29udHJvbCB8IE1EQ0NoYXJ0IHwgTURDVGFibGUsIHNlbGVjdGlvblZhcmlhbnRQYXRoOiBzdHJpbmcsIGlzQ2hhcnQ/OiBib29sZWFuKSB7XG5cdGNvbnN0IHNFbnRpdHlUeXBlUGF0aCA9IG9Db250cm9sLmRhdGEoXCJlbnRpdHlUeXBlXCIpLFxuXHRcdG9NZXRhTW9kZWwgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob0NvbnRyb2wgYXMgQ29udHJvbCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0bVByb3BlcnR5RmlsdGVyczogUmVjb3JkPHN0cmluZywgRmlsdGVyW10+ID0ge30sXG5cdFx0YUZpbHRlcnMgPSBbXSxcblx0XHRhUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdGxldCBzVGV4dCA9IFwiXCI7XG5cdGxldCBvU2VsZWN0aW9uVmFyaWFudCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlUeXBlUGF0aH0ke3NlbGVjdGlvblZhcmlhbnRQYXRofWApO1xuXHQvLyBmb3IgY2hhcnQgdGhlIHN0cnVjdHVyZSB2YXJpZXMgaGVuY2UgcmVhZCBpdCBmcm9tIG1haW4gb2JqZWN0XG5cdGlmIChpc0NoYXJ0KSB7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQgPSBvU2VsZWN0aW9uVmFyaWFudC5TZWxlY3Rpb25WYXJpYW50O1xuXHR9XG5cdGlmIChvU2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdHNUZXh0ID0gb1NlbGVjdGlvblZhcmlhbnQuVGV4dDtcblx0XHQob1NlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyB8fCBbXSlcblx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9TZWxlY3RPcHRpb246IElTZWxlY3Rpb25PcHRpb24pIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RPcHRpb24gJiYgb1NlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUgJiYgb1NlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWUuJFByb3BlcnR5UGF0aDtcblx0XHRcdH0pXG5cdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob1NlbGVjdE9wdGlvbjogSVNlbGVjdGlvbk9wdGlvbikge1xuXHRcdFx0XHRjb25zdCBzUGF0aCA9IG9TZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lLiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmICghYVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGogaW4gb1NlbGVjdE9wdGlvbi5SYW5nZXMpIHtcblx0XHRcdFx0XHRjb25zdCBvUmFuZ2UgPSBvU2VsZWN0T3B0aW9uLlJhbmdlc1tqXTtcblx0XHRcdFx0XHRtUHJvcGVydHlGaWx0ZXJzW3NQYXRoXSA9IChtUHJvcGVydHlGaWx0ZXJzW3NQYXRoXSB8fCBbXSkuY29uY2F0KFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcihzUGF0aCwgb1JhbmdlLk9wdGlvbj8uJEVudW1NZW1iZXI/LnNwbGl0KFwiL1wiKS5wb3AoKSBhcyB1bmRlZmluZWQsIG9SYW5nZS5Mb3csIG9SYW5nZS5IaWdoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0Zm9yIChjb25zdCBzUHJvcGVydHlQYXRoIGluIG1Qcm9wZXJ0eUZpbHRlcnMpIHtcblx0XHRcdGFGaWx0ZXJzLnB1c2goXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdGZpbHRlcnM6IG1Qcm9wZXJ0eUZpbHRlcnNbc1Byb3BlcnR5UGF0aF0sXG5cdFx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHByb3BlcnRpZXM6IGFQYXRocyxcblx0XHRmaWx0ZXJzOiBhRmlsdGVycyxcblx0XHR0ZXh0OiBzVGV4dFxuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yUGF0aChzTWV0YVBhdGg6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNFbnRpdHlTZXQ6IHN0cmluZywgb0RpYWdub3N0aWNzOiBEaWFnbm9zdGljcykge1xuXHRjb25zdCBvQ29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc01ldGFQYXRoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0cmV0dXJuIENvbnZlcnRlckNvbnRleHQ/LmNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhzRW50aXR5U2V0LCBvQ29udGV4dCB8fCBvTWV0YU1vZGVsLCBvRGlhZ25vc3RpY3MsIG1lcmdlT2JqZWN0cywgdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gSUQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGludGVybmFsIGNoYXJ0IGZvciB0aGUgbWVhc3VyZSBvciBkaW1lbnNpb24uXG4gKiBGb3Igc3RhbmRhcmQgY2FzZXMsIHRoaXMgaXMganVzdCB0aGUgSUQgb2YgdGhlIHByb3BlcnR5LlxuICogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHVzZSBhbm90aGVyIElEIGludGVybmFsbHkgaW5zaWRlIHRoZSBjaGFydCAoZS5nLiBvbiBkdXBsaWNhdGUgcHJvcGVydHkgSURzKSB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcndyaXR0ZW4uXG4gKiBJbiB0aGlzIGNhc2UsIDxjb2RlPmdldFByb3BlcnR5RnJvbU5hbWVBbmRLaW5kPC9jb2RlPiBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSBuYW1lIElEIG9mIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtpbmQgVHlwZSBvZiB0aGUgcHJvcGVydHkgKG1lYXN1cmUgb3IgZGltZW5zaW9uKVxuICogQHJldHVybnMgSW50ZXJuYWwgSUQgZm9yIHRoZSBzYXAuY2hhcnQuQ2hhcnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWxDaGFydE5hbWVGcm9tUHJvcGVydHlOYW1lQW5kS2luZChuYW1lOiBzdHJpbmcsIGtpbmQ6IHN0cmluZykge1xuXHRyZXR1cm4gbmFtZS5yZXBsYWNlKFwiX2ZlX1wiICsga2luZCArIFwiX1wiLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhcnQgcHJvcGVydGllcyBieSByZW12b2luZyBfZmVfZ3JvdXBhYmxlIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhRmlsdGVycyBDaGFydCBmaWx0ZXIgcHJvcGVydGllc1xuICogQHJldHVybnMgQ2hhcnQgcHJvcGVydGllcyB3aXRob3V0IHByZWZpeGVzXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmludGVyZmFjZSBJRmlsdGVyUHJvcCB7XG5cdHNQYXRoOiBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRDaGFydFByb3BlcnRpZXNXaXRob3V0UHJlZml4ZXMoYUZpbHRlcnM6IElGaWx0ZXJQcm9wW10pIHtcblx0YUZpbHRlcnMuZm9yRWFjaCgoZWxlbWVudDogSUZpbHRlclByb3ApID0+IHtcblx0XHRpZiAoZWxlbWVudC5zUGF0aCAmJiBlbGVtZW50LnNQYXRoLmluY2x1ZGVzKFwiZmVfZ3JvdXBhYmxlXCIpKSB7XG5cdFx0XHRlbGVtZW50LnNQYXRoID0gQ29tbW9uVXRpbHMuZ2V0SW50ZXJuYWxDaGFydE5hbWVGcm9tUHJvcGVydHlOYW1lQW5kS2luZChlbGVtZW50LnNQYXRoLCBcImdyb3VwYWJsZVwiKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYUZpbHRlcnM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgRHJhZnRSb290IHBhdGguXG4gKiBJZiBhIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBkcmFmdCBSb290IFBhdGgsIHRoaXMgbWV0aG9kIHJldHVybnMgaXRzIGJpbmRpbmdDb250ZXh0LlxuICogV2hlcmUgbm8gdmlldyBpcyBmb3VuZCBhIG5ldyBjcmVhdGVkIGNvbnRleHQgaXMgcmV0dXJuZWQuXG4gKiBUaGUgbmV3IGNyZWF0ZWQgY29udGV4dCByZXF1ZXN0IHRoZSBrZXkgb2YgdGhlIGVudGl0eSBpbiBvcmRlciB0byBnZXQgdGhlIEV0YWcgb2YgdGhpcyBlbnRpdHkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gcHJvZ3JhbW1pbmdNb2RlbFxuICogQHBhcmFtIHZpZXdcbiAqIEBwYXJhbSBhcHBDb21wb25lbnRcbiAqIEBuYW1lIGNyZWF0ZVJvb3RDb250ZXh0XG4gKiBAcmV0dXJucyBSZXR1cm5zIGEgUHJvbWlzZVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSb290Q29udGV4dChwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIHZpZXc6IFZpZXcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdGlmIChjb250ZXh0KSB7XG5cdFx0Y29uc3Qgcm9vdENvbnRleHRQYXRoID1cblx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgPyBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKGNvbnRleHQpIDogTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgoY29udGV4dCk7XG5cdFx0bGV0IHNpbXBsZVJvb3RDb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcblx0XHRpZiAocm9vdENvbnRleHRQYXRoKSB7XG5cdFx0XHQvLyBDaGVjayBpZiBhIHZpZXcgbWF0Y2hlcyB3aXRoIHRoZSBkcmFmdCByb290IHBhdGhcblx0XHRcdGNvbnN0IGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UgPSBhcHBDb21wb25lbnRcblx0XHRcdFx0LmdldFJvb3RWaWV3Q29udHJvbGxlcigpXG5cdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdC5maW5kKChwYWdlVmlldzogVmlldykgPT4gcGFnZVZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpID09PSByb290Q29udGV4dFBhdGgpXG5cdFx0XHRcdD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UpIHtcblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdHNpbXBsZVJvb3RDb250ZXh0ID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zaW1wbGVSb290Q29udGV4dFwiKTtcblx0XHRcdGlmIChzaW1wbGVSb290Q29udGV4dD8uZ2V0UGF0aCgpID09PSByb290Q29udGV4dFBhdGgpIHtcblx0XHRcdFx0cmV0dXJuIHNpbXBsZVJvb3RDb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRzaW1wbGVSb290Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHJvb3RDb250ZXh0UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaW1wbGVSb290Q29udGV4dCk7XG5cdFx0XHQvLyBTdG9yZSB0aGlzIG5ldyBjcmVhdGVkIGNvbnRleHQgdG8gdXNlIGl0IG9uIHRoZSBuZXh0IGl0ZXJhdGlvbnNcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2ltcGxlUm9vdENvbnRleHRcIiwgc2ltcGxlUm9vdENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIHNpbXBsZVJvb3RDb250ZXh0O1xuXHRcdH1cblx0fVxufVxuXG5jb25zdCBDb21tb25VdGlscyA9IHtcblx0ZmlyZUJ1dHRvblByZXNzOiBmbkZpcmVCdXR0b25QcmVzcyxcblx0Z2V0VGFyZ2V0VmlldzogZ2V0VGFyZ2V0Vmlldyxcblx0Z2V0Q3VycmVudFBhZ2VWaWV3OiBnZXRDdXJyZW50UGFnZVZpZXcsXG5cdGhhc1RyYW5zaWVudENvbnRleHQ6IGZuSGFzVHJhbnNpZW50Q29udGV4dHMsXG5cdHVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlsczogZm5VcGRhdGVSZWxhdGVkQXBwc0RldGFpbHMsXG5cdGdldEFwcENvbXBvbmVudDogZ2V0QXBwQ29tcG9uZW50LFxuXHRnZXRNYW5kYXRvcnlGaWx0ZXJGaWVsZHM6IGZuR2V0TWFuZGF0b3J5RmlsdGVyRmllbGRzLFxuXHRnZXRDb250ZXh0UGF0aFByb3BlcnRpZXM6IGZuR2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzLFxuXHRnZXRQYXJhbWV0ZXJJbmZvOiBnZXRQYXJhbWV0ZXJJbmZvLFxuXHR1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eTogZm5VcGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSxcblx0Z2V0RW50aXR5U2V0TmFtZTogZ2V0RW50aXR5U2V0TmFtZSxcblx0Z2V0QWN0aW9uUGF0aDogZ2V0QWN0aW9uUGF0aCxcblx0Y29tcHV0ZURpc3BsYXlNb2RlOiBjb21wdXRlRGlzcGxheU1vZGUsXG5cdGlzU3RpY2t5RWRpdE1vZGU6IGlzU3RpY2t5RWRpdE1vZGUsXG5cdGdldE9wZXJhdG9yc0ZvclByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JQcm9wZXJ0eSxcblx0Z2V0T3BlcmF0b3JzRm9yRGF0ZVByb3BlcnR5OiBnZXRPcGVyYXRvcnNGb3JEYXRlUHJvcGVydHksXG5cdGdldE9wZXJhdG9yc0Zvckd1aWRQcm9wZXJ0eTogZ2V0T3BlcmF0b3JzRm9yR3VpZFByb3BlcnR5LFxuXHRhZGRFeHRlcm5hbFN0YXRlRmlsdGVyc1RvU2VsZWN0aW9uVmFyaWFudDogYWRkRXh0ZXJuYWxTdGF0ZUZpbHRlcnNUb1NlbGVjdGlvblZhcmlhbnQsXG5cdGFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50OiBhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCxcblx0YWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeTogYWRkRGVmYXVsdERpc3BsYXlDdXJyZW5jeSxcblx0c2V0VXNlckRlZmF1bHRzOiBzZXRVc2VyRGVmYXVsdHMsXG5cdGdldElCTkFjdGlvbnM6IGZuR2V0SUJOQWN0aW9ucyxcblx0Z2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uOiBnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24sXG5cdGdldFNlbWFudGljT2JqZWN0TWFwcGluZzogZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzOiBzZXRTZW1hbnRpY09iamVjdE1hcHBpbmdzLFxuXHRnZXRTZW1hbnRpY09iamVjdFByb21pc2U6IGZuR2V0U2VtYW50aWNPYmplY3RQcm9taXNlLFxuXHRnZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsOiBmbkdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwsXG5cdGdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoOiBmbkdldFNlbWFudGljT2JqZWN0c0Zyb21QYXRoLFxuXHR1cGRhdGVTZW1hbnRpY1RhcmdldHM6IGZuVXBkYXRlU2VtYW50aWNUYXJnZXRzTW9kZWwsXG5cdHdhaXRGb3JDb250ZXh0UmVxdWVzdGVkOiB3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCxcblx0Z2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoOiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeVBhdGgsXG5cdGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb246IGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24sXG5cdGdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGU6IGdldEFkZGl0aW9uYWxQYXJhbXNGb3JDcmVhdGUsXG5cdHJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eTogcmVxdWVzdFNpbmdsZXRvblByb3BlcnR5LFxuXHR0ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudDogdGVtcGxhdGVDb250cm9sRnJhZ21lbnQsXG5cdEZpbHRlclJlc3RyaWN0aW9uczoge1xuXHRcdFJFUVVJUkVEX1BST1BFUlRJRVM6IFwiUmVxdWlyZWRQcm9wZXJ0aWVzXCIsXG5cdFx0Tk9OX0ZJTFRFUkFCTEVfUFJPUEVSVElFUzogXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiLFxuXHRcdEFMTE9XRURfRVhQUkVTU0lPTlM6IFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCJcblx0fSxcblx0QWxsb3dlZEV4cHJlc3Npb25zUHJpbzogW1wiU2luZ2xlVmFsdWVcIiwgXCJNdWx0aVZhbHVlXCIsIFwiU2luZ2xlUmFuZ2VcIiwgXCJNdWx0aVJhbmdlXCIsIFwiU2VhcmNoRXhwcmVzc2lvblwiLCBcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIl0sXG5cdG5vcm1hbGl6ZVNlYXJjaFRlcm06IG5vcm1hbGl6ZVNlYXJjaFRlcm0sXG5cdHNldENvbnRleHRzQmFzZWRPbk9wZXJhdGlvbkF2YWlsYWJsZTogc2V0Q29udGV4dHNCYXNlZE9uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRzZXREeW5hbWljQWN0aW9uQ29udGV4dHM6IHNldER5bmFtaWNBY3Rpb25Db250ZXh0cyxcblx0cmVxdWVzdFByb3BlcnR5OiByZXF1ZXN0UHJvcGVydHksXG5cdGdldFBhcmFtZXRlclBhdGg6IGdldFBhcmFtZXRlclBhdGgsXG5cdGdldFJlbGF0ZWRBcHBzTWVudUl0ZW1zOiBfZ2V0UmVsYXRlZEFwcHNNZW51SXRlbXMsXG5cdGdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmc6IF9mbnRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmcsXG5cdGFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnM6IGFkZFNlbWFudGljRGF0ZXNUb0NvbmRpdGlvbnMsXG5cdGFkZFNlbGVjdE9wdGlvblRvQ29uZGl0aW9uczogYWRkU2VsZWN0T3B0aW9uVG9Db25kaXRpb25zLFxuXHR1cGRhdGVSZWxhdGVBcHBzTW9kZWw6IHVwZGF0ZVJlbGF0ZUFwcHNNb2RlbCxcblx0Z2V0U2VtYW50aWNPYmplY3RBbm5vdGF0aW9uczogX2dldFNlbWFudGljT2JqZWN0QW5ub3RhdGlvbnMsXG5cdGdldEZpbHRlcnNJbmZvRm9yU1Y6IGdldEZpbHRlcnNJbmZvRm9yU1YsXG5cdGdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQ6IGdldEludGVybmFsQ2hhcnROYW1lRnJvbVByb3BlcnR5TmFtZUFuZEtpbmQsXG5cdGdldENoYXJ0UHJvcGVydGllc1dpdGhvdXRQcmVmaXhlczogZ2V0Q2hhcnRQcm9wZXJ0aWVzV2l0aG91dFByZWZpeGVzLFxuXHRjcmVhdGVSb290Q29udGV4dDogY3JlYXRlUm9vdENvbnRleHQsXG5cdGlzU21hbGxEZXZpY2UsXG5cdGdldENvbnZlcnRlckNvbnRleHRGb3JQYXRoXG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb21tb25VdGlscztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7OztFQXFFQSxNQUFNQSxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBZ0I7RUFlbkQsU0FBU0UsbUJBQW1CLENBQUNDLFdBQW1CLEVBQUU7SUFDakQsSUFBSSxDQUFDQSxXQUFXLEVBQUU7TUFDakIsT0FBT0MsU0FBUztJQUNqQjtJQUVBLE9BQU9ELFdBQVcsQ0FDaEJFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQ2xCQSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQUEsQ0FDdkJDLEtBQUssQ0FBQyxLQUFL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