@sapui5/sap.fe.core 1.131.0 → 1.133.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 (317) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +17 -23
  4. package/src/sap/fe/core/AppComponent.js +74 -36
  5. package/src/sap/fe/core/AppComponent.ts +70 -3
  6. package/src/sap/fe/core/AppStateHandler.js +44 -13
  7. package/src/sap/fe/core/AppStateHandler.ts +38 -0
  8. package/src/sap/fe/core/BaseController.js +3 -3
  9. package/src/sap/fe/core/CommonUtils.js +30 -37
  10. package/src/sap/fe/core/CommonUtils.ts +15 -13
  11. package/src/sap/fe/core/ExtensionAPI.js +29 -34
  12. package/src/sap/fe/core/ExtensionAPI.ts +3 -0
  13. package/src/sap/fe/core/InsightsFormattersExtension.js +2 -2
  14. package/src/sap/fe/core/PageController.js +40 -31
  15. package/src/sap/fe/core/PageController.ts +14 -1
  16. package/src/sap/fe/core/ResourceModel.js +4 -4
  17. package/src/sap/fe/core/ReuseComponent.js +27 -13
  18. package/src/sap/fe/core/ReuseComponent.ts +18 -0
  19. package/src/sap/fe/core/TemplateComponent.js +102 -89
  20. package/src/sap/fe/core/TemplateComponent.ts +20 -1
  21. package/src/sap/fe/core/TemplateModel.js +6 -7
  22. package/src/sap/fe/core/UIProvider.js +1 -1
  23. package/src/sap/fe/core/UIProvider.ts +2 -9
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +63 -48
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +56 -27
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +9 -0
  27. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.ts +48 -0
  28. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +4 -6
  29. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +2 -2
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -3
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +32 -18
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +30 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +9 -13
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +2 -1
  35. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +2 -2
  36. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +19 -25
  37. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -1
  38. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +3 -4
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +20 -24
  40. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +10 -15
  41. package/src/sap/fe/core/controllerextensions/ContextSharing.js +3 -3
  42. package/src/sap/fe/core/controllerextensions/EditFlow.js +296 -246
  43. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -175
  44. package/src/sap/fe/core/controllerextensions/Feedback.js +10 -11
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +6 -6
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -0
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -36
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +57 -78
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +42 -50
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +12 -19
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +23 -17
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -7
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +15 -21
  54. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -3
  55. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/Recommendations.js +23 -36
  57. package/src/sap/fe/core/controllerextensions/Recommendations.ts +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +3 -3
  59. package/src/sap/fe/core/controllerextensions/Share.js +19 -28
  60. package/src/sap/fe/core/controllerextensions/SideEffects.js +68 -32
  61. package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -6
  62. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -5
  63. package/src/sap/fe/core/controllerextensions/ViewState.js +23 -24
  64. package/src/sap/fe/core/controllerextensions/ViewState.ts +6 -1
  65. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +13 -10
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +13 -8
  67. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +15 -16
  69. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +3 -4
  70. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +288 -0
  71. package/src/sap/fe/core/controllerextensions/dialog/{OperationsDialog.block.tsx → OperationsDialog.tsx} +27 -29
  72. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +41 -5
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +61 -8
  74. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +404 -0
  75. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +502 -0
  76. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +35 -43
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +34 -14
  78. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -27
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +27 -15
  80. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +51 -39
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +75 -34
  82. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +4 -4
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +88 -427
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +82 -620
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +9 -5
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -5
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +116 -79
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +87 -13
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +4 -6
  90. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +5 -7
  91. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +6 -7
  92. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +4 -4
  93. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +58 -20
  94. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -4
  95. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +1 -1
  97. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +9 -12
  98. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  99. package/src/sap/fe/core/controls/ComponentLoader.js +20 -21
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +250 -0
  101. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/{DraftDataLossDialog.block.tsx → DraftDataLossDialog.tsx} +31 -19
  102. package/src/sap/fe/core/controls/FormElementWrapper.js +19 -21
  103. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +114 -0
  104. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +115 -0
  105. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +454 -0
  106. package/src/sap/fe/core/controls/Recommendations/{ConfirmRecommendationDialog.block.tsx → ConfirmRecommendationDialog.tsx} +5 -9
  107. package/src/sap/fe/core/converters/ConverterContext.js +17 -18
  108. package/src/sap/fe/core/converters/ConverterContext.ts +10 -15
  109. package/src/sap/fe/core/converters/ManifestSettings.js +29 -28
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +22 -1
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +26 -48
  112. package/src/sap/fe/core/converters/MetaModelConverter.js +21 -28
  113. package/src/sap/fe/core/converters/MetaModelConverter.ts +2 -0
  114. package/src/sap/fe/core/converters/TemplateConverter.js +17 -21
  115. package/src/sap/fe/core/converters/TemplateConverter.ts +5 -3
  116. package/src/sap/fe/core/converters/annotations/DataField.js +69 -66
  117. package/src/sap/fe/core/converters/annotations/DataField.ts +30 -0
  118. package/src/sap/fe/core/converters/common/AnnotationConverter.js +20 -23
  119. package/src/sap/fe/core/converters/controls/Common/Action.js +178 -43
  120. package/src/sap/fe/core/converters/controls/Common/Action.ts +202 -19
  121. package/src/sap/fe/core/converters/controls/Common/Chart.js +47 -22
  122. package/src/sap/fe/core/converters/controls/Common/Chart.ts +50 -5
  123. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +16 -23
  124. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -38
  125. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -0
  126. package/src/sap/fe/core/converters/controls/Common/KPI.js +32 -47
  127. package/src/sap/fe/core/converters/controls/Common/Table.js +464 -506
  128. package/src/sap/fe/core/converters/controls/Common/Table.ts +335 -219
  129. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +17 -28
  130. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +1 -2
  131. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +66 -90
  132. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +10 -1
  133. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +49 -73
  134. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +6 -10
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +35 -50
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +110 -60
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +137 -41
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +19 -30
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +5 -5
  140. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +11 -14
  141. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +14 -21
  142. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +4 -6
  143. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -7
  144. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  145. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -3
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -52
  147. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -34
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +103 -74
  149. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -39
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.js +28 -31
  151. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -9
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +61 -52
  153. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +60 -21
  154. package/src/sap/fe/core/definition/FEDefinition.js +104 -44
  155. package/src/sap/fe/core/designtime/AppComponent.designtime.js +37 -7
  156. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +42 -2
  157. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -5
  158. package/src/sap/fe/core/formatters/FiscalFormat.js +24 -24
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -23
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -18
  161. package/src/sap/fe/core/fpm/Component.js +12 -14
  162. package/src/sap/fe/core/fpm/manifest.json +1 -1
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +20 -15
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +22 -13
  165. package/src/sap/fe/core/helpers/BindingHelper.js +3 -3
  166. package/src/sap/fe/core/helpers/BindingHelper.ts +1 -1
  167. package/src/sap/fe/core/helpers/DeleteHelper.js +55 -62
  168. package/src/sap/fe/core/helpers/DeleteHelper.ts +48 -51
  169. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +4 -7
  170. package/src/sap/fe/core/helpers/FPMHelper.js +4 -7
  171. package/src/sap/fe/core/helpers/HTTP503Handler.js +2 -1
  172. package/src/sap/fe/core/helpers/HTTP503Handler.ts +4 -3
  173. package/src/sap/fe/core/helpers/KeepAliveHelper.js +5 -5
  174. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +6 -6
  175. package/src/sap/fe/core/helpers/LoaderUtils.js +8 -3
  176. package/src/sap/fe/core/helpers/LoaderUtils.ts +15 -4
  177. package/src/sap/fe/core/helpers/MessageStrip.js +3 -4
  178. package/src/sap/fe/core/helpers/MetaModelFunction.js +26 -40
  179. package/src/sap/fe/core/helpers/MetaPath.js +9 -7
  180. package/src/sap/fe/core/helpers/MetaPath.ts +9 -3
  181. package/src/sap/fe/core/helpers/ModelHelper.js +33 -57
  182. package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
  183. package/src/sap/fe/core/helpers/PasteHelper.js +11 -19
  184. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  185. package/src/sap/fe/core/helpers/RecommendationHelper.js +3 -4
  186. package/src/sap/fe/core/helpers/ResourceModelHelper.js +3 -5
  187. package/src/sap/fe/core/helpers/SizeHelper.js +3 -5
  188. package/src/sap/fe/core/helpers/StableIdHelper.js +13 -11
  189. package/src/sap/fe/core/helpers/StableIdHelper.ts +5 -1
  190. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +28 -38
  191. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  192. package/src/sap/fe/core/helpers/TitleHelper.js +19 -40
  193. package/src/sap/fe/core/helpers/TitleHelper.ts +5 -25
  194. package/src/sap/fe/core/helpers/TypeGuards.js +25 -18
  195. package/src/sap/fe/core/helpers/TypeGuards.ts +7 -0
  196. package/src/sap/fe/core/helpers/WebSocket.js +4 -4
  197. package/src/sap/fe/core/library.js +8 -7
  198. package/src/sap/fe/core/library.ts +2 -0
  199. package/src/sap/fe/core/manifestMerger/AddNewPage.js +9 -11
  200. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +14 -25
  201. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +15 -17
  202. package/src/sap/fe/core/messagebundle.properties +21 -0
  203. package/src/sap/fe/core/messagebundle_ar.properties +5 -1
  204. package/src/sap/fe/core/messagebundle_bg.properties +4 -0
  205. package/src/sap/fe/core/messagebundle_ca.properties +4 -0
  206. package/src/sap/fe/core/messagebundle_cnr.properties +4 -0
  207. package/src/sap/fe/core/messagebundle_cs.properties +8 -4
  208. package/src/sap/fe/core/messagebundle_cy.properties +4 -0
  209. package/src/sap/fe/core/messagebundle_da.properties +4 -0
  210. package/src/sap/fe/core/messagebundle_de.properties +4 -0
  211. package/src/sap/fe/core/messagebundle_el.properties +4 -0
  212. package/src/sap/fe/core/messagebundle_en.properties +4 -0
  213. package/src/sap/fe/core/messagebundle_en_GB.properties +4 -0
  214. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
  215. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +249 -231
  216. package/src/sap/fe/core/messagebundle_es.properties +5 -1
  217. package/src/sap/fe/core/messagebundle_es_MX.properties +4 -0
  218. package/src/sap/fe/core/messagebundle_et.properties +4 -0
  219. package/src/sap/fe/core/messagebundle_fi.properties +4 -0
  220. package/src/sap/fe/core/messagebundle_fr.properties +6 -2
  221. package/src/sap/fe/core/messagebundle_fr_CA.properties +4 -0
  222. package/src/sap/fe/core/messagebundle_hi.properties +4 -0
  223. package/src/sap/fe/core/messagebundle_hr.properties +4 -0
  224. package/src/sap/fe/core/messagebundle_hu.properties +4 -0
  225. package/src/sap/fe/core/messagebundle_id.properties +4 -0
  226. package/src/sap/fe/core/messagebundle_it.properties +4 -0
  227. package/src/sap/fe/core/messagebundle_iw.properties +4 -0
  228. package/src/sap/fe/core/messagebundle_ja.properties +4 -0
  229. package/src/sap/fe/core/messagebundle_kk.properties +4 -0
  230. package/src/sap/fe/core/messagebundle_ko.properties +4 -0
  231. package/src/sap/fe/core/messagebundle_lt.properties +4 -0
  232. package/src/sap/fe/core/messagebundle_lv.properties +4 -0
  233. package/src/sap/fe/core/messagebundle_mk.properties +4 -0
  234. package/src/sap/fe/core/messagebundle_ms.properties +4 -0
  235. package/src/sap/fe/core/messagebundle_nl.properties +4 -0
  236. package/src/sap/fe/core/messagebundle_no.properties +4 -0
  237. package/src/sap/fe/core/messagebundle_pl.properties +4 -0
  238. package/src/sap/fe/core/messagebundle_pt.properties +4 -0
  239. package/src/sap/fe/core/messagebundle_pt_PT.properties +4 -0
  240. package/src/sap/fe/core/messagebundle_ro.properties +4 -0
  241. package/src/sap/fe/core/messagebundle_ru.properties +4 -0
  242. package/src/sap/fe/core/messagebundle_sh.properties +4 -0
  243. package/src/sap/fe/core/messagebundle_sk.properties +4 -0
  244. package/src/sap/fe/core/messagebundle_sl.properties +4 -0
  245. package/src/sap/fe/core/messagebundle_sr.properties +4 -0
  246. package/src/sap/fe/core/messagebundle_sv.properties +4 -0
  247. package/src/sap/fe/core/messagebundle_th.properties +4 -0
  248. package/src/sap/fe/core/messagebundle_tr.properties +5 -1
  249. package/src/sap/fe/core/messagebundle_uk.properties +4 -0
  250. package/src/sap/fe/core/messagebundle_vi.properties +4 -0
  251. package/src/sap/fe/core/messagebundle_zh_CN.properties +4 -0
  252. package/src/sap/fe/core/messagebundle_zh_TW.properties +4 -0
  253. package/src/sap/fe/core/operationsHelper.js +23 -27
  254. package/src/sap/fe/core/operationsHelper.ts +6 -7
  255. package/src/sap/fe/core/rootView/Fcl.controller.js +53 -40
  256. package/src/sap/fe/core/rootView/Fcl.controller.ts +42 -7
  257. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -10
  258. package/src/sap/fe/core/rootView/RootViewBaseController.js +22 -21
  259. package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -2
  260. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  261. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +4 -3
  262. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -0
  263. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +12 -10
  264. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +6 -2
  265. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +8 -13
  266. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +5 -7
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +31 -8
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +31 -5
  269. package/src/sap/fe/core/services/InlineEditServiceFactory.js +190 -0
  270. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +226 -0
  271. package/src/sap/fe/core/services/NavigationServiceFactory.js +10 -15
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +76 -56
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +47 -14
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +32 -34
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +75 -60
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +58 -12
  278. package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -9
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +13 -18
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +3 -0
  281. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +7 -9
  282. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +12 -16
  283. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +1 -1
  284. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +4 -7
  285. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +5 -6
  286. package/src/sap/fe/core/support/CommonHelper.js +2 -3
  287. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  288. package/src/sap/fe/core/templating/ActionHelper.js +3 -4
  289. package/src/sap/fe/core/templating/CommonFormatters.js +6 -8
  290. package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
  291. package/src/sap/fe/core/templating/CriticalityFormatters.js +53 -5
  292. package/src/sap/fe/core/templating/CriticalityFormatters.ts +129 -7
  293. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -11
  294. package/src/sap/fe/core/templating/DataFieldFormatters.ts +1 -1
  295. package/src/sap/fe/core/templating/DataModelPathHelper.js +33 -56
  296. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  297. package/src/sap/fe/core/templating/EntitySetHelper.js +11 -19
  298. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  299. package/src/sap/fe/core/templating/FieldControlHelper.js +13 -20
  300. package/src/sap/fe/core/templating/FilterTemplating.js +6 -9
  301. package/src/sap/fe/core/templating/PropertyHelper.js +33 -63
  302. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -1
  303. package/src/sap/fe/core/templating/SemanticObjectHelper.js +13 -21
  304. package/src/sap/fe/core/templating/UIFormatters.js +57 -78
  305. package/src/sap/fe/core/templating/UIFormatters.ts +2 -1
  306. package/src/sap/fe/core/type/Date.js +2 -2
  307. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  308. package/src/sap/fe/core/type/EDM.js +3 -5
  309. package/src/sap/fe/core/type/Email.js +17 -6
  310. package/src/sap/fe/core/type/Email.ts +23 -4
  311. package/src/sap/fe/core/type/FiscalDate.js +8 -9
  312. package/src/sap/fe/core/type/InputMask.js +3 -4
  313. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +0 -299
  314. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +0 -87
  315. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +0 -43
  316. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +0 -251
  317. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +0 -471
@@ -77,19 +77,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
77
77
  * @returns Resolve function returns the context of the operation
78
78
  */
79
79
  async function executeDraftEditAction(oContext, bPreserveChanges, oView, groupId, messageHandler, overwriteChange) {
80
- if (oContext.getProperty("IsActiveEntity")) {
80
+ // If the context is not loaded (i.e. oContext.getObject() == undefined), we assume it corresponds to an active context
81
+ // This situation happens when opening an OP directly in edit mode (InternalRouting._bindPageForEdit)
82
+ if (oContext.getObject() === undefined || oContext.getProperty("IsActiveEntity")) {
81
83
  const oOptions = {
82
84
  $$inheritExpandSelect: true
83
85
  };
84
86
  const oOperation = draft.createOperation(oContext, draftOperations.EDIT, oOptions);
85
87
  oOperation.setParameter("PreserveChanges", bPreserveChanges);
88
+
89
+ // If the context has not been loaded yet, we can ignore the ETag (as no previous ETag is available)
90
+ const ignoreETag = oContext.getObject() === undefined ? true : undefined;
86
91
  const resourceModel = getResourceModel(oView);
87
92
  const sActionName = resourceModel.getText("C_COMMON_OBJECT_PAGE_EDIT");
88
93
  //If the context is coming from a list binding we pass the flag true to replace the context by the active one
89
- const oEditPromise = oOperation.execute(groupId, undefined, operationsHelper.fnOnStrictHandlingFailed.bind(draft, groupId, {
94
+ const oEditPromise = oOperation.execute(groupId, ignoreETag, operationsHelper.fnOnStrictHandlingFailed.bind(draft, groupId, {
95
+ appComponent: CommonUtils.getAppComponent(oView),
90
96
  label: sActionName,
91
97
  model: oContext.getModel()
92
- }, resourceModel, null, null, null, messageHandler, undefined, undefined), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding"));
98
+ }, null, null, null, messageHandler, undefined, undefined), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding"));
93
99
  if (overwriteChange) {
94
100
  oOperation.getModel().submitBatch(groupId);
95
101
  }
@@ -119,12 +125,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
119
125
  // the POST will be sent without If-Match and will generate an error on backend side.
120
126
  await context.getBinding().requestObject("");
121
127
  }
122
- const operation = await draft.executeDraftPreparationAction(context, context.getUpdateGroupId(), true, ignoreETag);
123
- // if there is no returned operation by executeDraftPreparationAction -> the action has failed
124
- if (operation && !getReturnType(context, draftOperations.PREPARE)) {
128
+ const operation = draft.executeDraftPreparationAction(context, context.getUpdateGroupId(), true, ignoreETag);
129
+ if (!getReturnType(context, draftOperations.PREPARE)) {
125
130
  requestMessages(context, appComponent.getSideEffectsService());
126
131
  }
127
- return operation;
132
+ return await operation;
128
133
  } catch (error) {
129
134
  Log.error("Error while requesting messages", error);
130
135
  }
@@ -153,9 +158,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
153
158
  const sActionName = resourceModel.getText("C_OP_OBJECT_PAGE_SAVE");
154
159
  try {
155
160
  return await oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? operationsHelper.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
161
+ appComponent: oAppComponent,
156
162
  label: sActionName,
157
163
  model: oContext.getModel()
158
- }, resourceModel, null, null, null, messageHandler, undefined, undefined) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding"));
164
+ }, null, null, null, messageHandler, undefined, undefined) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding"));
159
165
  } catch (e) {
160
166
  if (bHasPrepareAction) {
161
167
  const actionName = getActionName(oContext, draftOperations.PREPARE),
@@ -200,10 +206,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
200
206
  * @returns Path to the message
201
207
  */
202
208
  function getMessagePathForContext(context) {
203
- var _convertedContext$tar;
204
209
  const metaContext = context.getModel().getMetaModel().getMetaContext(context.getPath());
205
210
  const convertedContext = getInvolvedDataModelObjects(metaContext);
206
- const messages = (_convertedContext$tar = convertedContext.targetEntityType.annotations.Common) === null || _convertedContext$tar === void 0 ? void 0 : _convertedContext$tar.Messages;
211
+ const messages = convertedContext.targetEntityType.annotations.Common?.Messages;
207
212
  return isPathAnnotationExpression(messages) ? messages.path : undefined;
208
213
  }
209
214
 
@@ -259,14 +264,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
259
264
  async function executeDraftDiscardAction(oContext, messageHandler, oAppComponent, bEnableStrictHandling) {
260
265
  if (!oContext.getProperty("IsActiveEntity")) {
261
266
  const oDiscardOperation = draft.createOperation(oContext, draftOperations.DISCARD);
262
- const resourceModel = oAppComponent && getResourceModel(oAppComponent);
267
+ const resourceModel = getResourceModel(oAppComponent);
263
268
  const sGroupId = "direct";
264
- const sActionName = (resourceModel === null || resourceModel === void 0 ? void 0 : resourceModel.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON")) || "";
269
+ const sActionName = resourceModel?.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON") || "";
265
270
  // as the discard action doesnt' send the active version in the response we do not use the replace in cache
266
271
  const oDiscardPromise = !bEnableStrictHandling ? oDiscardOperation.execute(sGroupId) : oDiscardOperation.execute(sGroupId, undefined, operationsHelper.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
272
+ AppComponent: oAppComponent,
267
273
  label: sActionName,
268
274
  model: oContext.getModel()
269
- }, resourceModel, null, null, null, messageHandler, undefined, undefined), false);
275
+ }, null, null, null, messageHandler, undefined, undefined), false);
270
276
  oContext.getModel().submitBatch(sGroupId);
271
277
  await oDiscardPromise;
272
278
  } else {
@@ -318,10 +324,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
318
324
  // Computing sibling entity of root of the draft context is not required if the context is already in the sub-OP
319
325
  // Example: Edit in Sub-OP where new context is already available
320
326
  const paths = [...segments];
321
- if (rootContextInfo !== null && rootContextInfo !== void 0 && rootContextInfo.rootSiblingPathPromise) {
322
- var _rootCurrentContext$g;
327
+ if (rootContextInfo?.rootSiblingPathPromise) {
323
328
  paths.shift();
324
- currentPath = "/" + (rootCurrentContext === null || rootCurrentContext === void 0 ? void 0 : (_rootCurrentContext$g = rootCurrentContext.getPath()) === null || _rootCurrentContext$g === void 0 ? void 0 : _rootCurrentContext$g.substring(1));
329
+ currentPath = "/" + rootCurrentContext?.getPath()?.substring(1);
325
330
  }
326
331
  const canonicalPathPromises = paths.map(async segment => {
327
332
  currentPath += `/${segment}`;
@@ -341,9 +346,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
341
346
  // Example: for canonical paths "/Param(aa)/Entity(bb-sibling)", "/Entity2(cc-sibling)", "/Entity3(dd-sibling)"
342
347
  // --> ["Param(aa)/Entity(bb-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)/_SubNav(dd-sibling)"]
343
348
  const canonicalPaths = await Promise.all(canonicalPathPromises);
344
- if (rootContextInfo !== null && rootContextInfo !== void 0 && rootContextInfo.rootSiblingPathPromise) {
345
- var _await$rootContextInf;
346
- const rootSiblingPath = (_await$rootContextInf = await rootContextInfo.rootSiblingPathPromise) === null || _await$rootContextInf === void 0 ? void 0 : _await$rootContextInf.getPath();
349
+
350
+ // Workaround (temporary ?): when the sibling doesn't exist, requestCanonicalPath returns the same path
351
+ if (canonicalPaths.some(path => {
352
+ return path && path.endsWith("/SiblingEntity");
353
+ })) {
354
+ // At least one sibling entity doesn't exist
355
+ return undefined;
356
+ }
357
+ if (rootContextInfo?.rootSiblingPathPromise) {
358
+ const rootSiblingPath = (await rootContextInfo.rootSiblingPathPromise)?.getPath();
347
359
  canonicalPaths.unshift(rootSiblingPath);
348
360
  oldPaths.push(rootCurrentContext.getPath());
349
361
  }
@@ -424,7 +436,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
424
436
  await draft.showEditConfirmationMessageBox(sUnsavedChangesMsg, oContext);
425
437
  return draft.executeDraftEditAction(oContext, false, mParameters.oView, groupId, messageHandler, true); // true because we overwrite changes
426
438
  }
427
- } else if (response !== null && response !== void 0 && response.message) {
439
+ } else if (response?.message) {
428
440
  MessageBox.error(response.message);
429
441
  }
430
442
  throw new Error(`Draft creation aborted for document: ${oContext.getPath()}`);
@@ -440,7 +452,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
440
452
  messageHandling.removeBoundTransitionMessages();
441
453
  messageHandling.removeUnboundTransitionMessages();
442
454
  const siblingInfo = await draft.computeSiblingInformation(oContext, oContext);
443
- if (siblingInfo !== null && siblingInfo !== void 0 && siblingInfo.targetContext) {
455
+ if (siblingInfo?.targetContext) {
444
456
  //there is a context authorized to be edited by the current user
445
457
  await CommonUtils.waitForContextRequested(siblingInfo.targetContext);
446
458
  return siblingInfo.targetContext;
@@ -453,10 +465,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
453
465
  }
454
466
  }
455
467
  if (oDraftContext) {
456
- var _oSideEffects$trigger;
457
468
  const sEditActionName = draft.getActionName(oDraftContext, draftOperations.EDIT);
458
469
  const oSideEffects = oAppComponent.getSideEffectsService().getODataActionSideEffects(sEditActionName, oDraftContext);
459
- if (oSideEffects !== null && oSideEffects !== void 0 && (_oSideEffects$trigger = oSideEffects.triggerActions) !== null && _oSideEffects$trigger !== void 0 && _oSideEffects$trigger.length) {
470
+ if (oSideEffects?.triggerActions?.length) {
460
471
  await oAppComponent.getSideEffectsService().requestSideEffectsForODataAction(oSideEffects, oDraftContext);
461
472
  return oDraftContext;
462
473
  } else {
@@ -514,7 +525,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
514
525
  const data = await oContext.requestObject();
515
526
  if (data[sMessagesPath].length > 0) {
516
527
  //if messages are available from the PREPARATION action, then previous transition messages are removed
517
- messageHandler === null || messageHandler === void 0 ? void 0 : messageHandler.removeTransitionMessages(false, false, oContext.getPath());
528
+ messageHandler?.removeTransitionMessages(false, false, oContext.getPath());
518
529
  }
519
530
  }
520
531
  throw err;
@@ -583,7 +594,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
583
594
  throw error;
584
595
  });
585
596
  } else {
586
- var _getInvolvedDataModel;
587
597
  // When cancelling an edit draft root node, use model.delete instead of context.delete, to only send deletion to backend,
588
598
  // but keep context alive (including bindings). Thus, we can ensure seamless transistion from draft to active instance
589
599
  // (without intermediate undefined bindings e.g. leading to flickering).
@@ -593,7 +603,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
593
603
  // occur, but needs quite specific modelling (button visibility on item level bound against service property in an FCL app)
594
604
  // and acting (looking at button on third column while discarding on 2nd column). Currently, model seems not to be prepared
595
605
  // for that case, thus due to the minimal impact (only intermediate visual state), accepting this for the time being.
596
- return !oContext.getProperty("IsActiveEntity") && ModelHelper.isDraftRoot((_getInvolvedDataModel = getInvolvedDataModelObjects(oContext.getModel().getMetaModel().getMetaContext(oContext.getPath()))) === null || _getInvolvedDataModel === void 0 ? void 0 : _getInvolvedDataModel.targetEntitySet) && oContext.getProperty("HasActiveEntity") ? oContext.getModel().delete(oContext) : oContext.delete();
606
+ return !oContext.getProperty("IsActiveEntity") && ModelHelper.isDraftRoot(getInvolvedDataModelObjects(oContext.getModel().getMetaModel().getMetaContext(oContext.getPath()))?.targetEntitySet) && oContext.getProperty("HasActiveEntity") ? oContext.getModel().delete(oContext) : oContext.delete();
597
607
  }
598
608
  } else {
599
609
  //Use Discard Post Action if it is a draft entity and discard action exists
@@ -620,4 +630,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
620
630
  };
621
631
  return draft;
622
632
  }, false);
623
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwiZHJhZnQiLCJzZXRQYXJhbWV0ZXIiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInNBY3Rpb25OYW1lIiwiZ2V0VGV4dCIsIm9FZGl0UHJvbWlzZSIsImV4ZWN1dGUiLCJ1bmRlZmluZWQiLCJvcGVyYXRpb25zSGVscGVyIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImxhYmVsIiwibW9kZWwiLCJnZXRCaW5kaW5nIiwiaXNBIiwic3VibWl0QmF0Y2giLCJFcnJvciIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJjb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiaWdub3JlRVRhZyIsIk1vZGVsSGVscGVyIiwiZ2V0TWVzc2FnZXNQYXRoIiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0Iiwib3BlcmF0aW9uIiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsImUiLCJhY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUiLCJnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQiLCJfY29udmVydGVkQ29udGV4dCR0YXIiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiY29udmVydGVkQ29udGV4dCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1lc3NhZ2VzIiwidGFyZ2V0RW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTWVzc2FnZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJiTWVzc2FnZXMiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsImdldEdyb3VwSWQiLCJ0aGVuIiwiY2F0Y2giLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJyb290Q29udGV4dEluZm8iLCJzdGFydHNXaXRoIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJwYXRocyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJfcm9vdEN1cnJlbnRDb250ZXh0JGciLCJzaGlmdCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJlbmRzV2l0aCIsInNpYmxpbmdDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbm9uaWNhbFBhdGhzIiwiYWxsIiwiX2F3YWl0JHJvb3RDb250ZXh0SW5mIiwicm9vdFNpYmxpbmdQYXRoIiwicHVzaCIsInNpYmxpbmdQYXRoIiwiZm9yRWFjaCIsImNhbm9uaWNhbFBhdGgiLCJpbmRleCIsIm5hdmlnYXRpb24iLCJrZXlzIiwidGFyZ2V0Q29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIk1lc3NhZ2VCb3giLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94IiwibWVzc2FnZSIsIm9EcmFmdENvbnRleHQiLCJvUmVzcG9uc2UiLCJzdGF0dXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInNpYmxpbmdJbmZvIiwiQ29tbW9uVXRpbHMiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImNhbmNlbGVkIiwiX29TaWRlRWZmZWN0cyR0cmlnZ2VyIiwic0VkaXRBY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImFjdGl2YXRlRG9jdW1lbnQiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJzQmF0Y2hHcm91cCIsImlnbm9yZUV0YWciLCJoYXNQZW5kaW5nQ2hhbmdlcyIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJlcnIiLCJkYXRhIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJsb2NhbEkxOG5SZWYiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJyZWplY3QiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiZGVsZXRlRHJhZnQiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSIsIl9nZXRJbnZvbHZlZERhdGFNb2RlbCIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRFcnJvclR5cGUgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCIuLi8uLi9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCIuLi8uLi9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgb3BlcmF0aW9uc0hlbHBlciBmcm9tIFwiLi4vLi4vb3BlcmF0aW9uc0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbnRleHRJbmZvID0ge1xuXHRyb290U2libGluZ1BhdGhQcm9taXNlOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHQvKipcblx0ICogVGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMiBTeXN0ZW0gUXVlcnkgT3B0aW9uICRleHBhbmRcIiBvciBhbiBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyB0aGF0IHZhbHVlLiBUaGUgb2JqZWN0XG5cdCAqIGlzIGEgbWFwIGZyb20gZXhwYW5kIHBhdGggdG8gZXhwYW5kIG9wdGlvbnMsIHdoZXJlIHRoZSBvcHRpb25zIGFyZSBhZ2FpbiBtYXBzIG9mIHN5c3RlbSBxdWVyeSBvcHRpb25zLFxuXHQgKiB0eXBpY2FsbHkgd2l0aCBzdHJpbmcgdmFsdWVzLiAkY291bnQgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBgYm9vbGVhbmAgdmFsdWUsICRleHBhbmQgY2FuIHJlY3Vyc2l2ZWx5XG5cdCAqIGJlIGdpdmVuIGFzIGEgbWFwLCAkbGV2ZWxzIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYG51bWJlcmAgdmFsdWUsIGFuZCAkc2VsZWN0IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGFuXG5cdCAqIGFycmF5IChidXQgd2l0aG91dCBuYXZpZ2F0aW9uIHBhdGhzKS4gQW4gZW1wdHkgbWFwIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGBudWxsYCBvciBgdHJ1ZWAuIFNlZSBhbHNvIHtAbGluayBodHRwczovL3VpNS5zYXAuY29tLyMvdG9waWMvMWFiNGY2MmRlNmFiNDY3MDk2YTJhOThiMzYzYTEzNzMgUGFyYW1ldGVyc30uXG5cdCAqL1xuXHQkZXhwYW5kPzogc3RyaW5nIHwgb2JqZWN0O1xuXHQvKipcblx0ICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvciBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMyBTeXN0ZW0gUXVlcnkgT3B0aW9uXG5cdCAqICRzZWxlY3RcIi4gU2luY2UgMS43NS4wLCB3aGVuIHVzaW5nIHRoZSBcImF1dG9FeHBhbmRTZWxlY3RcIiBtb2RlbCBwYXJhbWV0ZXIgKHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9KSxcblx0ICogcGF0aHMgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIGFuZCB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkZXhwYW5kXCIuXG5cdCAqL1xuXHQkc2VsZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogV2hldGhlciBhIGJpbmRpbmcgcmVsYXRpdmUgdG8gYW4ge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB1c2VzIHRoZSBjYW5vbmljYWwgcGF0aCBjb21wdXRlZFxuXHQgKiBmcm9tIGl0cyBjb250ZXh0J3MgcGF0aCBmb3IgZGF0YSBzZXJ2aWNlIHJlcXVlc3RzOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkY2Fub25pY2FsUGF0aD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKipyZWFkKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgZ3JvdXAgSUQgaXMgdXNlZCwgc2VlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbCNjb25zdHJ1Y3Rvcn0uXG5cdCAqIFZhbGlkIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGAsICckYXV0bycsICckYXV0by4qJywgJyRkaXJlY3QnIG9yIGFwcGxpY2F0aW9uIGdyb3VwIElEcyBhcyBzcGVjaWZpZWQgaW5cblx0ICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfS5cblx0ICovXG5cdCQkZ3JvdXBJZD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvciBvcGVyYXRpb24gYmluZGluZ3Mgb25seTogV2hldGhlciAkZXhwYW5kIGFuZCAkc2VsZWN0IGZyb20gdGhlIHBhcmVudCBiaW5kaW5nIGFyZSB1c2VkIGluIHRoZSByZXF1ZXN0XG5cdCAqIHNlbnQgb24ge0BsaW5rICNleGVjdXRlfS4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGJpbmRpbmcgbXVzdCBub3Qgc2V0IHRoZSAkZXhwYW5kIGl0c2VsZiwgdGhlIG9wZXJhdGlvblxuXHQgKiBtdXN0IGJlIGJvdW5kLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGVudGl0eSBzZXQuXG5cdCAqL1xuXHQkJGluaGVyaXRFeHBhbmRTZWxlY3Q/OiBib29sZWFuO1xuXHQvKipcblx0ICogV2hldGhlciB0aGUgYmluZGluZyBhbHdheXMgdXNlcyBhbiBvd24gc2VydmljZSByZXF1ZXN0IHRvIHJlYWQgaXRzIGRhdGE7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0JCRvd25SZXF1ZXN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgaW1wbGljaXQgbG9hZGluZyBvZiBzaWRlIGVmZmVjdHMgdmlhIFBBVENIIHJlcXVlc3RzIGlzIHN3aXRjaGVkIG9mZjsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzXG5cdCAqIGFsbG93ZWQuIFRoaXMgc2V0cyB0aGUgcHJlZmVyZW5jZSBcInJldHVybj1taW5pbWFsXCIgYW5kIHJlcXVpcmVzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBFVGFnIGhlYWRlclxuXHQgKiBmb3IgXCIyMDQgTm8gQ29udGVudFwiIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgYmluZGluZyBpcyB1c2VkLlxuXHQgKi9cblx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKip1cGRhdGUqKiByZXF1ZXN0cyB0cmlnZ2VyZWQgYnkgdGhpcyBiaW5kaW5nOyBpZiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgdGhlXG5cdCAqIHBhcmVudCBiaW5kaW5nJ3MgdXBkYXRlIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgdXBkYXRlIGdyb3VwIElEIGlzIHVzZWQsXG5cdCAqIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgcGFyYW1ldGVyIFwiJCRncm91cElkXCIuXG5cdCAqL1xuXHQkJHVwZGF0ZUdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICogQG5hbWVzcGFjZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aW9uTmFtZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259YCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nLCBvT3B0aW9ucz86IEJpbmRDb250ZXh0UGFyYW1ldGVycyk6IE9EYXRhQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBzT3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIHNPcGVyYXRpb24pO1xuXG5cdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke3NPcGVyYXRpb25OYW1lfSguLi4pYCwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0dXJuVHlwZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogdW5rbm93biB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufS8kUmV0dXJuVHlwZWApO1xufVxuLyoqXG4gKiBDaGVjayBpZiBvcHRpb25hbCBkcmFmdCBwcmVwYXJlIGFjdGlvbiBleGlzdHMuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0cmV0dXJuICEhZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGRyYWZ0IGZyb20gYW4gYWN0aXZlIGRvY3VtZW50LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGJQcmVzZXJ2ZUNoYW5nZXMgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgcHJlc2VydmVkIGFuZCBhbiBlcnJvciBpcyBzZW50IGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHBhcmFtIG9WaWV3IElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyICBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb3ZlcndyaXRlQ2hhbmdlXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0YlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbixcblx0b1ZpZXc6IFZpZXcsXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvdmVyd3JpdGVDaGFuZ2U/OiBib29sZWFuXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3B0aW9ucyA9IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH07XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQsIG9PcHRpb25zKTtcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlByZXNlcnZlQ2hhbmdlc1wiLCBiUHJlc2VydmVDaGFuZ2VzKTtcblxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9WaWV3KTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdGdyb3VwSWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdHVuZGVmaW5lZFxuXHRcdFx0KSxcblx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdCk7XG5cdFx0aWYgKG92ZXJ3cml0ZUNoYW5nZSkge1xuXHRcdFx0b09wZXJhdGlvbi5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0VkaXRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3QgZWRpdCB0aGlzIGRyYWZ0IGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRyYWZ0LiBUaGUgUHJlcGFyZUFjdGlvbiBpcyB0cmlnZ2VyZWQgaWYgdGhlIG1lc3NhZ2VzIGFyZSBhbm5vdGF0ZWQgYW5kIGVudGl0eVNldCBnZXRzIGEgUHJlcGFyYXRpb25BY3Rpb24gYW5ub3RhdGVkLlxuICogSWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQgb3BlcmF0aW9uIGRvZXNuJ3QgZ2V0IGEgcmV0dXJuIHR5cGUgKFJBUCBzeXN0ZW0pIHRoZSBtZXNzYWdlcyBhcmUgcmVxdWVzdGVkLlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIFByZXBhcmVBY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZ3MgYXJlIGlnbm9yZWQgd2hlbiBleGVjdXRpbmcgdGhlIGFjdGlvblxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zXG4gKiAgLSB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uIGlmIHRoZSBhY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkXG4gKiAgLSB2b2lkIGlmIHRoZSBhY3Rpb24gaGFzIGZhaWxlZFxuICogIC0gdW5kZWZpbmVkIGlmIHRoZSBhY3Rpb24gaGFzIG5vdCBiZWVuIHRyaWdnZXJlZCBzaW5jZSB0aGUgcHJlcmVxdWlzaXRlcyBhcmUgbm90IG1ldFxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uKFxuXHRjb250ZXh0OiBDb250ZXh0LFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0aWdub3JlRVRhZzogYm9vbGVhblxuKTogUHJvbWlzZTxPRGF0YUNvbnRleHRCaW5kaW5nIHwgdm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgY29udGV4dC5nZXRQYXRoKCkpICYmIGRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24oY29udGV4dCkpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKCFpZ25vcmVFVGFnICYmICFjb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgdG8gcG9zdCB0aGUgYWN0aW9uIHdpdGggdGhlIElmLU1hdGNoIGhlYWRlclxuXHRcdFx0XHQvLyBTb21lIHRyaWdnZXJzIChlbnRlciBvbiB0YWJsZSkgY2FuIGdlbmVyYXRlIGEgcHJvbWlzZSBpbiB0aGUgY2FjaGUgc28gaWYgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGVudGl0eVxuXHRcdFx0XHQvLyB0aGUgUE9TVCB3aWxsIGJlIHNlbnQgd2l0aG91dCBJZi1NYXRjaCBhbmQgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciBvbiBiYWNrZW5kIHNpZGUuXG5cdFx0XHRcdGF3YWl0IChjb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nKS5yZXF1ZXN0T2JqZWN0KFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3BlcmF0aW9uID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oY29udGV4dCwgY29udGV4dC5nZXRVcGRhdGVHcm91cElkKCksIHRydWUsIGlnbm9yZUVUYWcpO1xuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgbm8gcmV0dXJuZWQgb3BlcmF0aW9uIGJ5IGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIC0+IHRoZSBhY3Rpb24gaGFzIGZhaWxlZFxuXHRcdFx0aWYgKG9wZXJhdGlvbiAmJiAhZ2V0UmV0dXJuVHlwZShjb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSkpIHtcblx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKGNvbnRleHQsIGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3BlcmF0aW9uO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBY3RpdmF0ZXMgYSBkcmFmdCBkb2N1bWVudC4gVGhlIGRyYWZ0IHdpbGwgcmVwbGFjZSB0aGUgc2libGluZyBlbnRpdHkgYW5kIHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgYmFjayBlbmQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcbiAqIEBwYXJhbSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHNHcm91cElkPzogc3RyaW5nXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblx0Ly8gQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzcGVjIGlmIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGEgcHJlcGFyZSBhY3Rpb24gYW5kIHdlIHRyaWdnZXIgYm90aCBwcmVwYXJlIGFuZFxuXHQvLyBhY3RpdmF0ZSBpbiBvbmUgJGJhdGNoIHRoZSBhY3RpdmF0ZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGggaUYtTWF0Y2g9KlxuXHRjb25zdCBiSWdub3JlRXRhZyA9IGJIYXNQcmVwYXJlQWN0aW9uO1xuXG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5BQ1RJVkFUSU9OLCB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9KTtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvQXBwQ29tcG9uZW50KTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGF3YWl0IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZFxuXHRcdFx0XHRcdD8gb3BlcmF0aW9uc0hlbHBlci5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0XHRcdFx0ZHJhZnQsXG5cdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzQWN0aW9uTmFtZSwgbW9kZWw6IG9Db250ZXh0LmdldE1vZGVsKCkgfSxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2UpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3VwcG9ydGVkIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBvbiB0aGUgUHJlcGFyZUFjdGlvbiBmb3IgYSBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gSWYgdGhlcmUgaXMgbm8gcmV0dXJuIHBhcmFtZXRlciwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcXVlc3QgTWVzc2FnZXMuXG5cdC8vIFJBUCBkcmFmdCBwcmVwYXJlIGhhcyBubyByZXR1cm4gcGFyYW1ldGVyXG5cdHJldHVybiBnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSA/IGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChjb250ZXh0KSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZENvbnRleHQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXHRjb25zdCBtZXNzYWdlcyA9IGNvbnZlcnRlZENvbnRleHQudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gYk1lc3NhZ2VzIElmIHNldCB0byB0cnVlLCB0aGUgUFJFUEFSRSBhY3Rpb24gcmV0cmlldmVzIFNBUF9NZXNzYWdlc1xuICogQHBhcmFtIGlnbm9yZUVUYWcgSWYgc2V0IHRvIHRydWUsIEVUYWcgaW5mb3JtYXRpb24gaXMgaWdub3JlZCB3aGVuIHRoZSBhY3Rpb24gaXMgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0Z3JvdXBJZD86IHN0cmluZyxcblx0Yk1lc3NhZ2VzPzogYm9vbGVhbixcblx0aWdub3JlRVRhZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZCB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGJNZXNzYWdlcyA/IGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShvQ29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUsIHNNZXNzYWdlc1BhdGggPyB7ICRzZWxlY3Q6IHNNZXNzYWdlc1BhdGggfSA6IHVuZGVmaW5lZCk7XG5cblx0XHQvLyBUT0RPOiBzaWRlIGVmZmVjdHMgcXVhbGlmaWVyIHNoYWxsIGJlIGV2ZW4gZGVwcmVjYXRlZCB0byBiZSBjaGVja2VkXG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJTaWRlRWZmZWN0c1F1YWxpZmllclwiLCBcIlwiKTtcblxuXHRcdGNvbnN0IHNHcm91cElkID0gZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoc0dyb3VwSWQsIGlnbm9yZUVUYWcpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBtZXNzYWdlcyBzaGFsbCBiZSByZXF1ZXN0ZWRcbiAqIEBwYXJhbSBvU2lkZUVmZmVjdHNTZXJ2aWNlIFNlcnZpY2UgZm9yIHRoZSBTaWRlRWZmZWN0cyBvbiBTQVAgRmlvcmkgZWxlbWVudHNcbiAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQ6IENvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2U6IFNpZGVFZmZlY3RzU2VydmljZSk6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtzTWVzc2FnZXNQYXRoXSwgb0NvbnRleHQpO1xuXHR9XG5cdHJldHVybjtcbn1cbi8qKlxuICogRXhlY3V0ZXMgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUG9zdC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBBcHAgQ29tcG9uZW50XG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50PzogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb0Rpc2NhcmRPcGVyYXRpb24gPSBkcmFmdC5jcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gb0FwcENvbXBvbmVudCAmJiBnZXRSZXNvdXJjZU1vZGVsKG9BcHBDb21wb25lbnQpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSB8fCBcIlwiO1xuXHRcdC8vIGFzIHRoZSBkaXNjYXJkIGFjdGlvbiBkb2VzbnQnIHNlbmQgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIHRoZSByZXNwb25zZSB3ZSBkbyBub3QgdXNlIHRoZSByZXBsYWNlIGluIGNhY2hlXG5cdFx0Y29uc3Qgb0Rpc2NhcmRQcm9taXNlID0gIWJFbmFibGVTdHJpY3RIYW5kbGluZ1xuXHRcdFx0PyBvRGlzY2FyZE9wZXJhdGlvbi5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0OiBvRGlzY2FyZE9wZXJhdGlvbi5leGVjdXRlKFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRcdFx0ZHJhZnQsXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHsgbGFiZWw6IHNBY3Rpb25OYW1lLCBtb2RlbDogb0NvbnRleHQuZ2V0TW9kZWwoKSB9LFxuXHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0ICApO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdGF3YWl0IG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIGNvbnRleHQgaW5mbyBvZiByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIGdyb3VwSWRcbiAqIEByZXR1cm5zIFRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJvb3RDb250ZXh0SW5mbz86IFJvb3RDb250ZXh0SW5mbyxcblx0Z3JvdXBJZD86IHN0cmluZ1xuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0aWYgKFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlXG5cdCkge1xuXHRcdC8vIFdlIGFscmVhZHkga25vdyB0aGUgc2libGluZyBmb3IgcmlnaHRtb3N0Q3VycmVudENvbnRleHQgZG9lc24ndCBleGlzdFxuXHRcdC8vIC0tPiBObyBuZWVkIHRvIGNoZWNrIGNhbm9uaWNhbCBwYXRocyBldGMuLi5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhY2ggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXG5cdFx0Ly8gQ29tcHV0aW5nIHNpYmxpbmcgZW50aXR5IG9mIHJvb3Qgb2YgdGhlIGRyYWZ0IGNvbnRleHQgaXMgbm90IHJlcXVpcmVkIGlmIHRoZSBjb250ZXh0IGlzIGFscmVhZHkgaW4gdGhlIHN1Yi1PUFxuXHRcdC8vIEV4YW1wbGU6IEVkaXQgaW4gU3ViLU9QIHdoZXJlIG5ldyBjb250ZXh0IGlzIGFscmVhZHkgYXZhaWxhYmxlXG5cdFx0Y29uc3QgcGF0aHMgPSBbLi4uc2VnbWVudHNdO1xuXHRcdGlmIChyb290Q29udGV4dEluZm8/LnJvb3RTaWJsaW5nUGF0aFByb21pc2UpIHtcblx0XHRcdHBhdGhzLnNoaWZ0KCk7XG5cdFx0XHRjdXJyZW50UGF0aCA9IFwiL1wiICsgcm9vdEN1cnJlbnRDb250ZXh0Py5nZXRQYXRoKCk/LnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aFByb21pc2VzID0gcGF0aHMubWFwKGFzeW5jIChzZWdtZW50KSA9PiB7XG5cdFx0XHRjdXJyZW50UGF0aCArPSBgLyR7c2VnbWVudH1gO1xuXHRcdFx0b2xkUGF0aHMudW5zaGlmdChjdXJyZW50UGF0aCk7XG5cdFx0XHRpZiAoY3VycmVudFBhdGguZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWxcblx0XHRcdFx0XHQuYmluZENvbnRleHQoYCR7Y3VycmVudFBhdGh9L1NpYmxpbmdFbnRpdHlgLCB1bmRlZmluZWQsIGdyb3VwSWQgPyB7ICQkZ3JvdXBJZDogZ3JvdXBJZCB9IDogdW5kZWZpbmVkKVxuXHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMy4gUmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aHMgZnJvbSBjYW5vbmljYWwgcGF0aHMgKGZvciBwYXRoIG1hcHBpbmcpXG5cdFx0Ly8gRXhhbXBsZTogZm9yIGNhbm9uaWNhbCBwYXRocyBcIi9QYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiL0VudGl0eTIoY2Mtc2libGluZylcIiwgXCIvRW50aXR5MyhkZC1zaWJsaW5nKVwiXG5cdFx0Ly8gLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZykvX1N1Yk5hdihkZC1zaWJsaW5nKVwiXVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhzID0gKGF3YWl0IFByb21pc2UuYWxsKGNhbm9uaWNhbFBhdGhQcm9taXNlcykpIGFzIHN0cmluZ1tdO1xuXG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0Y29uc3Qgcm9vdFNpYmxpbmdQYXRoID0gKGF3YWl0IHJvb3RDb250ZXh0SW5mby5yb290U2libGluZ1BhdGhQcm9taXNlKT8uZ2V0UGF0aCgpIGFzIHN0cmluZztcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnVuc2hpZnQocm9vdFNpYmxpbmdQYXRoKTtcblx0XHRcdG9sZFBhdGhzLnB1c2gocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0fVxuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbaW5kZXhdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdmlnYXRpb24gPSBzZWdtZW50c1tpbmRleF0ucmVwbGFjZSgvXFwoLiokLywgXCJcIik7IC8vIEtlZXAgb25seSBuYXZpZ2F0aW9uIG5hbWUgZnJvbSB0aGUgc2VnbWVudCwgaS5lLiBhYWEoeHh4KSAtLT4gYWFhXG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmcm9tIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7c2VnbWVudHNbaW5kZXhdfWA7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsXG5cdFx0XHRcdC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JHNlbGVjdDogZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSxcblx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCJcblx0XHRcdFx0fSlcblx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpLCAvLyBDcmVhdGUgdGhlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHQgZnJvbSBpdHMgcGF0aFxuXHRcdFx0cGF0aE1hcHBpbmc6IG9sZFBhdGhzLm1hcCgob2xkUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRvbGRQYXRoLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld1BhdGhzW2luZGV4XVxuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIEEgY2Fub25pY2FsIHBhdGggY291bGRuJ3QgYmUgcmVzb2x2ZWQgKGJlY2F1c2UgYSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5iUHJlc2VydmVDaGFuZ2VzXSBQcmVzZXJ2ZSBjaGFuZ2VzIG9mIGFuIGV4aXN0aW5nIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IEZFVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0fSxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcbik6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNoYW5nZS5cblx0ICogQHBhcmFtIHJlc3BvbnNlIENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdCBvciB0aGUgZXJyb3IgcmV0cmlldmVkXG5cdCAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRhc3luYyBmdW5jdGlvbiBvdmVyd3JpdGVDaGFuZ2UocmVzcG9uc2U6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlKTogUHJvbWlzZTxDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG1QYXJhbWV0ZXJzLm9WaWV3KTtcblx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0O1xuXHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX0xPQ0tFRF9CWV9VU0VSXCIsIHNJbmZvLCBzRW50aXR5U2V0KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0Y29uc3Qgc1Vuc2F2ZWRDaGFuZ2VzTXNnID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRhd2FpdCBkcmFmdC5zaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBmYWxzZSwgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyLCB0cnVlKTsgLy8gdHJ1ZSBiZWNhdXNlIHdlIG92ZXJ3cml0ZSBjaGFuZ2VzXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICgocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk/Lm1lc3NhZ2UpIHtcblx0XHRcdE1lc3NhZ2VCb3guZXJyb3IoKHJlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLm1lc3NhZ2UpO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cdGxldCBvRHJhZnRDb250ZXh0OiBDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZDtcblx0dHJ5IHtcblx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3csIG1QYXJhbWV0ZXJzLm9WaWV3LCBncm91cElkLCBtZXNzYWdlSGFuZGxlcik7XG5cdH0gY2F0Y2ggKG9SZXNwb25zZSkge1xuXHRcdGlmICgob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLnN0YXR1cyA9PT0gNDA5IHx8IChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MjMpIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0aWYgKHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0KSB7XG5cdFx0XHRcdC8vdGhlcmUgaXMgYSBjb250ZXh0IGF1dGhvcml6ZWQgdG8gYmUgZWRpdGVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMud2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBubyBkcmFmdCBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVDaGFuZ2Uob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIShvUmVzcG9uc2UgJiYgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5jYW5jZWxlZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRpZiAob0RyYWZ0Q29udGV4dCkge1xuXHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGRyYWZ0LmdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCk7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIGEgdmV0byBiZWZvcmUgdGhlICdDcmVhdGUnIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5BZnRlckFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2luZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHsgZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb247IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb24gfSxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRjb25zdCBiRXhlY3V0ZSA9IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBhd2FpdCBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWU7XG5cdGlmICghYkV4ZWN1dGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0bGV0IG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IENvbnRleHQ7XG5cdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIGFjdGl2YXRpb24gcmVxdWlyZXMgcHJlcGFyYXRpb24gKi9cblx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiJGF1dG9cIjtcblx0XHQvL3doZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyB0aGVyZSB3aWxsIGJlIGEgcGF0Y2ggcmVxdWVzdCBtZXJnZWQgdG9nZXRoZXIgd2l0aCB0aGUgZHJhZnRQcmVwYXJlIGFuZCBkcmFmdEFjaXZhdGUuXG5cdFx0Ly9UaGUgcGF0Y2ggY2hhbmdlcyB0aGUgRXRhZywgdGhlcmZvcmUgdGhlIHByZXBhcmUgbmVlZHMgdG8gaWdub3JlIEV0YWdzXG5cdFx0Y29uc3QgaWdub3JlRXRhZzogYm9vbGVhbiA9IG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSA/IHRydWUgOiBmYWxzZTtcblx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdGxldCBvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHVuZGVmaW5lZCwgaWdub3JlRXRhZyk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0Y29uc3Qgb0FjdGl2YXRlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyLCBzQmF0Y2hHcm91cCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHQvLyBCQ1AgMjI3MDA4NDA3NVxuXHRcdFx0Ly8gaWYgdGhlIEFjdGl2YXRpb24gZmFpbHMsIHRoZW4gdGhlIG1lc3NhZ2VzIGFyZSByZXRyaWV2ZWQgZnJvbSBQUkVQQVJBVElPTiBhY3Rpb25cblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUob0NvbnRleHQpO1xuXHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0b1ByZXBhcmVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwLCB0cnVlKTtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0XHRcdGF3YWl0IG9QcmVwYXJlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0aWYgKGRhdGFbc01lc3NhZ2VzUGF0aF0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8vaWYgbWVzc2FnZXMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQUkVQQVJBVElPTiBhY3Rpb24sIHRoZW4gcHJldmlvdXMgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyPy5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGJveCBhZnRlciBwcmVzc2luZyB0aGUgZWRpdCBidXR0b24gb2YgYW4gb2JqZWN0IHBhZ2Ugd2l0aCB1bnNhdmVkIGNoYW5nZXMuXG4gKiBAcGFyYW0gc1Vuc2F2ZWRDaGFuZ2VzTXNnIERpYWxvZyBib3ggbWVzc2FnZSBpbmZvcm1pbmcgdGhlIHVzZXIgdGhhdCBpZiBoZSBzdGFydHMgZWRpdGluZywgdGhlIHByZXZpb3VzIHVuc2F2ZWQgY2hhbmdlcyB3aWxsIGJlIGxvc3RcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBsb2NhbEkxOG5SZWYgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0fSksXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlamVjdChgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRvRGlhbG9nLm9wZW4oKTtcblx0fSk7XG59XG5cbi8qKlxuICogSFRUUCBQT1NUIGNhbGwgd2hlbiBEcmFmdEFjdGlvbiBpcyBwcmVzZW50IGZvciBEcmFmdCBEZWxldGU7IEhUVFAgREVMRVRFIGNhbGwgd2hlbiB0aGVyZSBpcyBubyBEcmFmdEFjdGlvblxuICogYW5kIEFjdGl2ZSBJbnN0YW5jZSBhbHdheXMgdXNlcyBERUxFVEUuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkZWxldGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURyYWZ0KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50PzogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgc0Rpc2NhcmRBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCksXG5cdFx0YklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cblx0aWYgKGJJc0FjdGl2ZUVudGl0eSB8fCAoIWJJc0FjdGl2ZUVudGl0eSAmJiAhc0Rpc2NhcmRBY3Rpb24pKSB7XG5cdFx0Ly9Vc2UgRGVsZXRlIGluIGNhc2Ugb2YgYWN0aXZlIGVudGl0eSBhbmQgbm8gZGlzY2FyZCBhY3Rpb24gYXZhaWxhYmxlIGZvciBkcmFmdFxuXHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmICFvQ29udGV4dC5pc0luYWN0aXZlKCkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXaGVuIGNhbmNlbGxpbmcgYW4gZWRpdCBkcmFmdCByb290IG5vZGUsIHVzZSBtb2RlbC5kZWxldGUgaW5zdGVhZCBvZiBjb250ZXh0LmRlbGV0ZSwgdG8gb25seSBzZW5kIGRlbGV0aW9uIHRvIGJhY2tlbmQsXG5cdFx0XHQvLyBidXQga2VlcCBjb250ZXh0IGFsaXZlIChpbmNsdWRpbmcgYmluZGluZ3MpLiBUaHVzLCB3ZSBjYW4gZW5zdXJlIHNlYW1sZXNzIHRyYW5zaXN0aW9uIGZyb20gZHJhZnQgdG8gYWN0aXZlIGluc3RhbmNlXG5cdFx0XHQvLyAod2l0aG91dCBpbnRlcm1lZGlhdGUgdW5kZWZpbmVkIGJpbmRpbmdzIGUuZy4gbGVhZGluZyB0byBmbGlja2VyaW5nKS5cblx0XHRcdC8vIEluIG90aGVyIGNhc2VzIChkZWxldGluZyBhY3RpdmUsIGRpc2NhcmRpbmcgY3JlYXRlIGRyYWZ0IG9yIGRpc2NhcmRpbmcgZHJhZnQgbm9kZSksIHN0YXkgd2l0aCBjb250ZXh0LmRlbGV0ZS5cblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhIGNyZWF0ZSBkcmFmdCwgcGFnZSBpcyBjbG9zZWQsIHRodXMgdGhlIHByb2JsZW0gb2YgZmxpY2tlcmluZyBjYW5ub3Qgb2NjdXIuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRpc2NhcmRpbmcgYSBkcmFmdCBub2RlLCB0aGVvcmV0aWNhbGx5IHRoZSBzYW1lIHByb2JsZW0gY291bGRcblx0XHRcdC8vIG9jY3VyLCBidXQgbmVlZHMgcXVpdGUgc3BlY2lmaWMgbW9kZWxsaW5nIChidXR0b24gdmlzaWJpbGl0eSBvbiBpdGVtIGxldmVsIGJvdW5kIGFnYWluc3Qgc2VydmljZSBwcm9wZXJ0eSBpbiBhbiBGQ0wgYXBwKVxuXHRcdFx0Ly8gYW5kIGFjdGluZyAobG9va2luZyBhdCBidXR0b24gb24gdGhpcmQgY29sdW1uIHdoaWxlIGRpc2NhcmRpbmcgb24gMm5kIGNvbHVtbikuIEN1cnJlbnRseSwgbW9kZWwgc2VlbXMgbm90IHRvIGJlIHByZXBhcmVkXG5cdFx0XHQvLyBmb3IgdGhhdCBjYXNlLCB0aHVzIGR1ZSB0byB0aGUgbWluaW1hbCBpbXBhY3QgKG9ubHkgaW50ZXJtZWRpYXRlIHZpc3VhbCBzdGF0ZSksIGFjY2VwdGluZyB0aGlzIGZvciB0aGUgdGltZSBiZWluZy5cblx0XHRcdHJldHVybiAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChcblx0XHRcdFx0XHRnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpKT8udGFyZ2V0RW50aXR5U2V0XG5cdFx0XHRcdCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIilcblx0XHRcdFx0PyBvQ29udGV4dC5nZXRNb2RlbCgpLmRlbGV0ZShvQ29udGV4dClcblx0XHRcdFx0OiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly9Vc2UgRGlzY2FyZCBQb3N0IEFjdGlvbiBpZiBpdCBpcyBhIGRyYWZ0IGVudGl0eSBhbmQgZGlzY2FyZCBhY3Rpb24gZXhpc3RzXG5cdFx0YXdhaXQgZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIG9BcHBDb21wb25lbnQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRleGVjdXRlRHJhZnRWYWxpZGF0aW9uOiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uLFxuXHRleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24sXG5cdGhhc1ByZXBhcmVBY3Rpb246IGhhc1ByZXBhcmVBY3Rpb24sXG5cdGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb246IGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24sXG5cdHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0Y3JlYXRlT3BlcmF0aW9uOiBjcmVhdGVPcGVyYXRpb24sXG5cdGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb246IGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24sXG5cdE5hdmlnYXRpb25UeXBlOiBkcmFmdERhdGFMb3NzUG9wdXAuTmF2aWdhdGlvblR5cGUsXG5cdGdldEFjdGlvbk5hbWU6IGdldEFjdGlvbk5hbWUsXG5cdHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveDogc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQW9GQTtFQUNBLE1BQU1BLGVBQWUsR0FBRztJQUN2QkMsSUFBSSxFQUFFLFlBQVk7SUFDbEJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCQyxPQUFPLEVBQUU7RUFDVixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxhQUFhQSxDQUFDQyxRQUFpQixFQUFFQyxVQUFrQixFQUFVO0lBQ3JFLE1BQU1DLE1BQU0sR0FBR0YsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQztNQUNqQ0MsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksQ0FBQyxDQUFDO01BQ2xDQyxjQUFjLEdBQUdGLFVBQVUsQ0FBQ0csV0FBVyxDQUFDUCxRQUFRLENBQUNRLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFNUQsT0FBT0osVUFBVSxDQUFDSyxTQUFTLENBQUMsR0FBR0gsY0FBYyw2Q0FBNkNMLFVBQVUsRUFBRSxDQUFDO0VBQ3hHO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTUyxlQUFlQSxDQUFDVixRQUFpQixFQUFFQyxVQUFrQixFQUFFVSxRQUFnQyxFQUF1QjtJQUN0SCxNQUFNQyxjQUFjLEdBQUdiLGFBQWEsQ0FBQ0MsUUFBUSxF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
633
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwidW5kZWZpbmVkIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwiZHJhZnQiLCJzZXRQYXJhbWV0ZXIiLCJpZ25vcmVFVGFnIiwicmVzb3VyY2VNb2RlbCIsImdldFJlc291cmNlTW9kZWwiLCJzQWN0aW9uTmFtZSIsImdldFRleHQiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwib3BlcmF0aW9uc0hlbHBlciIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJhcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsImxhYmVsIiwibW9kZWwiLCJnZXRCaW5kaW5nIiwiaXNBIiwic3VibWl0QmF0Y2giLCJFcnJvciIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJjb250ZXh0IiwiTW9kZWxIZWxwZXIiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0tlZXBBbGl2ZSIsInJlcXVlc3RPYmplY3QiLCJvcGVyYXRpb24iLCJleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbiIsImdldFVwZGF0ZUdyb3VwSWQiLCJyZXF1ZXN0TWVzc2FnZXMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJlcnJvciIsIkxvZyIsImV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24iLCJvQXBwQ29tcG9uZW50Iiwic0dyb3VwSWQiLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwiZSIsImFjdGlvbk5hbWUiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwib0JpbmRpbmdQYXJhbWV0ZXJzIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsImFUYXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsImxlbmd0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIm9FcnJvciIsImdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZSIsImdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJjb252ZXJ0ZWRDb250ZXh0IiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwibWVzc2FnZXMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJNZXNzYWdlcyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwicGF0aCIsImJNZXNzYWdlcyIsInNNZXNzYWdlc1BhdGgiLCIkc2VsZWN0IiwiZ2V0R3JvdXBJZCIsInRoZW4iLCJjYXRjaCIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvRGlzY2FyZE9wZXJhdGlvbiIsIm9EaXNjYXJkUHJvbWlzZSIsIkFwcENvbXBvbmVudCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsInJvb3RDb250ZXh0SW5mbyIsInN0YXJ0c1dpdGgiLCJhZGRpdGlvbmFsUGF0aCIsInJlcGxhY2UiLCJzZWdtZW50cyIsInN1YnN0cmluZyIsInNwbGl0IiwidW5zaGlmdCIsIm9sZFBhdGhzIiwibmV3UGF0aHMiLCJjdXJyZW50UGF0aCIsInBhdGhzIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsInNoaWZ0IiwiY2Fub25pY2FsUGF0aFByb21pc2VzIiwibWFwIiwic2VnbWVudCIsImVuZHNXaXRoIiwic2libGluZ0NvbnRleHQiLCIkJGdyb3VwSWQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwiY2Fub25pY2FsUGF0aHMiLCJhbGwiLCJzb21lIiwicm9vdFNpYmxpbmdQYXRoIiwicHVzaCIsInNpYmxpbmdQYXRoIiwiZm9yRWFjaCIsImNhbm9uaWNhbFBhdGgiLCJpbmRleCIsIm5hdmlnYXRpb24iLCJrZXlzIiwidGFyZ2V0Q29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIk1lc3NhZ2VCb3giLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94IiwibWVzc2FnZSIsIm9EcmFmdENvbnRleHQiLCJvUmVzcG9uc2UiLCJzdGF0dXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInNpYmxpbmdJbmZvIiwid2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQiLCJjYW5jZWxlZCIsInNFZGl0QWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsInRyaWdnZXJBY3Rpb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJhY3RpdmF0ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic0JhdGNoR3JvdXAiLCJpZ25vcmVFdGFnIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJvUHJlcGFyZVByb21pc2UiLCJvQWN0aXZhdGVQcm9taXNlIiwidmFsdWVzIiwiZXJyIiwiZGF0YSIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50IiwibG9jYWxJMThuUmVmIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwicmVqZWN0Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImlzSW5hY3RpdmUiLCJyZXNldENoYW5nZXMiLCJkZWxldGUiLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVNldCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZHJhZnREYXRhTG9zc1BvcHVwIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiTmF2aWdhdGlvblR5cGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBkcmFmdERhdGFMb3NzUG9wdXAgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0RGF0YUxvc3NQb3B1cFwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0RXJyb3JUeXBlIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwiLi4vLi4vQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwiLi4vLi4vaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IG9wZXJhdGlvbnNIZWxwZXIgZnJvbSBcIi4uLy4uL29wZXJhdGlvbnNIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCIuLi9NZXNzYWdlSGFuZGxlclwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IENvbnRleHQ7XG5cdHBhdGhNYXBwaW5nOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJvb3RDb250ZXh0SW5mbyA9IHtcblx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvbiAkZXhwYW5kXCIgb3IgYW4gb2JqZWN0IHdoaWNoIGRldGVybWluZXMgdGhhdCB2YWx1ZS4gVGhlIG9iamVjdFxuXHQgKiBpcyBhIG1hcCBmcm9tIGV4cGFuZCBwYXRoIHRvIGV4cGFuZCBvcHRpb25zLCB3aGVyZSB0aGUgb3B0aW9ucyBhcmUgYWdhaW4gbWFwcyBvZiBzeXN0ZW0gcXVlcnkgb3B0aW9ucyxcblx0ICogdHlwaWNhbGx5IHdpdGggc3RyaW5nIHZhbHVlcy4gJGNvdW50IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYGJvb2xlYW5gIHZhbHVlLCAkZXhwYW5kIGNhbiByZWN1cnNpdmVseVxuXHQgKiBiZSBnaXZlbiBhcyBhIG1hcCwgJGxldmVscyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIGBudW1iZXJgIHZhbHVlLCBhbmQgJHNlbGVjdCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhblxuXHQgKiBhcnJheSAoYnV0IHdpdGhvdXQgbmF2aWdhdGlvbiBwYXRocykuIEFuIGVtcHR5IG1hcCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBgbnVsbGAgb3IgYHRydWVgLiBTZWUgYWxzbyB7QGxpbmsgaHR0cHM6Ly91aTUuc2FwLmNvbS8jL3RvcGljLzFhYjRmNjJkZTZhYjQ2NzA5NmEyYTk4YjM2M2ExMzczIFBhcmFtZXRlcnN9LlxuXHQgKi9cblx0JGV4cGFuZD86IHN0cmluZyB8IG9iamVjdDtcblx0LyoqXG5cdCAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb3IgYW4gYXJyYXkgb2YgaXRlbXMgd2hpY2ggZGV0ZXJtaW5lIHRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjMgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkc2VsZWN0XCIuIFNpbmNlIDEuNzUuMCwgd2hlbiB1c2luZyB0aGUgXCJhdXRvRXhwYW5kU2VsZWN0XCIgbW9kZWwgcGFyYW1ldGVyIChzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfSksXG5cdCAqIHBhdGhzIHdpdGggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCBhbmQgd2lsbCBjb250cmlidXRlIHRvIHRoZSBcIjUuMS4yIFN5c3RlbSBRdWVyeSBPcHRpb25cblx0ICogJGV4cGFuZFwiLlxuXHQgKi9cblx0JHNlbGVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFdoZXRoZXIgYSBiaW5kaW5nIHJlbGF0aXZlIHRvIGFuIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gdXNlcyB0aGUgY2Fub25pY2FsIHBhdGggY29tcHV0ZWRcblx0ICogZnJvbSBpdHMgY29udGV4dCdzIHBhdGggZm9yIGRhdGEgc2VydmljZSByZXF1ZXN0czsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHQkJGNhbm9uaWNhbFBhdGg/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqcmVhZCoqIHJlcXVlc3RzIHRyaWdnZXJlZCBieSB0aGlzIGJpbmRpbmc7IGlmIG5vdCBzcGVjaWZpZWQsIGVpdGhlciB0aGVcblx0ICogcGFyZW50IGJpbmRpbmcncyBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIGdyb3VwIElEIGlzIHVzZWQsIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LlxuXHQgKiBWYWxpZCB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgLCAnJGF1dG8nLCAnJGF1dG8uKicsICckZGlyZWN0JyBvciBhcHBsaWNhdGlvbiBncm91cCBJRHMgYXMgc3BlY2lmaWVkIGluXG5cdCAqIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0uXG5cdCAqL1xuXHQkJGdyb3VwSWQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3Igb3BlcmF0aW9uIGJpbmRpbmdzIG9ubHk6IFdoZXRoZXIgJGV4cGFuZCBhbmQgJHNlbGVjdCBmcm9tIHRoZSBwYXJlbnQgYmluZGluZyBhcmUgdXNlZCBpbiB0aGUgcmVxdWVzdFxuXHQgKiBzZW50IG9uIHtAbGluayAjZXhlY3V0ZX0uIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBiaW5kaW5nIG11c3Qgbm90IHNldCB0aGUgJGV4cGFuZCBpdHNlbGYsIHRoZSBvcGVyYXRpb25cblx0ICogbXVzdCBiZSBib3VuZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgYW5kIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBlbnRpdHkgc2V0LlxuXHQgKi9cblx0JCRpbmhlcml0RXhwYW5kU2VsZWN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGJpbmRpbmcgYWx3YXlzIHVzZXMgYW4gb3duIHNlcnZpY2UgcmVxdWVzdCB0byByZWFkIGl0cyBkYXRhOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkb3duUmVxdWVzdD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBXaGV0aGVyIGltcGxpY2l0IGxvYWRpbmcgb2Ygc2lkZSBlZmZlY3RzIHZpYSBQQVRDSCByZXF1ZXN0cyBpcyBzd2l0Y2hlZCBvZmY7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpc1xuXHQgKiBhbGxvd2VkLiBUaGlzIHNldHMgdGhlIHByZWZlcmVuY2UgXCJyZXR1cm49bWluaW1hbFwiIGFuZCByZXF1aXJlcyB0aGUgc2VydmljZSB0byByZXR1cm4gYW4gRVRhZyBoZWFkZXJcblx0ICogZm9yIFwiMjA0IE5vIENvbnRlbnRcIiByZXNwb25zZXMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGJpbmRpbmcgaXMgdXNlZC5cblx0ICovXG5cdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqdXBkYXRlKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIHVwZGF0ZSBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIHVwZGF0ZSBncm91cCBJRCBpcyB1c2VkLFxuXHQgKiBzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfS4gRm9yIHZhbGlkIHZhbHVlcywgc2VlIHBhcmFtZXRlciBcIiQkZ3JvdXBJZFwiLlxuXHQgKi9cblx0JCR1cGRhdGVHcm91cElkPzogc3RyaW5nO1xufTtcblxuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufWApO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb250ZXh0IGJpbmRpbmcgb2YgdGhlIGJvdW5kIG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnMpOiBPRGF0YUNvbnRleHRCaW5kaW5nIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtzT3BlcmF0aW9uTmFtZX0oLi4uKWAsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVyblR5cGUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIFRydWUgaWYgYSBhIHByZXBhcmUgYWN0aW9uIGV4aXN0c1xuICovXG5mdW5jdGlvbiBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgaXMgc2VudCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEBwYXJhbSBvVmlldyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciAgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG92ZXJ3cml0ZUNoYW5nZVxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGJQcmVzZXJ2ZUNoYW5nZXM6IGJvb2xlYW4sXG5cdG9WaWV3OiBWaWV3LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b3ZlcndyaXRlQ2hhbmdlPzogYm9vbGVhblxuKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdC8vIElmIHRoZSBjb250ZXh0IGlzIG5vdCBsb2FkZWQgKGkuZS4gb0NvbnRleHQuZ2V0T2JqZWN0KCkgPT0gdW5kZWZpbmVkKSwgd2UgYXNzdW1lIGl0IGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjb250ZXh0XG5cdC8vIFRoaXMgc2l0dWF0aW9uIGhhcHBlbnMgd2hlbiBvcGVuaW5nIGFuIE9QIGRpcmVjdGx5IGluIGVkaXQgbW9kZSAoSW50ZXJuYWxSb3V0aW5nLl9iaW5kUGFnZUZvckVkaXQpXG5cdGlmIChvQ29udGV4dC5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkIHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3B0aW9ucyA9IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH07XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQsIG9PcHRpb25zKTtcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlByZXNlcnZlQ2hhbmdlc1wiLCBiUHJlc2VydmVDaGFuZ2VzKTtcblxuXHRcdC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRjb25zdCBpZ25vcmVFVGFnID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvVmlldyk7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpO1xuXHRcdC8vSWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRjb25zdCBvRWRpdFByb21pc2UgPSBvT3BlcmF0aW9uLmV4ZWN1dGUoXG5cdFx0XHRncm91cElkLFxuXHRcdFx0aWdub3JlRVRhZyxcblx0XHRcdG9wZXJhdGlvbnNIZWxwZXIuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdGRyYWZ0LFxuXHRcdFx0XHRncm91cElkLFxuXHRcdFx0XHR7IGFwcENvbXBvbmVudDogQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KSwgbGFiZWw6IHNBY3Rpb25OYW1lLCBtb2RlbDogb0NvbnRleHQuZ2V0TW9kZWwoKSB9LFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdCksXG5cdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHQpO1xuXHRcdGlmIChvdmVyd3JpdGVDaGFuZ2UpIHtcblx0XHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkcmFmdC4gVGhlIFByZXBhcmVBY3Rpb24gaXMgdHJpZ2dlcmVkIGlmIHRoZSBtZXNzYWdlcyBhcmUgYW5ub3RhdGVkIGFuZCBlbnRpdHlTZXQgZ2V0cyBhIFByZXBhcmF0aW9uQWN0aW9uIGFubm90YXRlZC5cbiAqIElmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgYW5kIG9wZXJhdGlvbiBkb2Vzbid0IGdldCBhIHJldHVybiB0eXBlIChSQVAgc3lzdGVtKSB0aGUgbWVzc2FnZXMgYXJlIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBQcmVwYXJlQWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIGlnbm9yZUVUYWcgSWYgc2V0IHRvIHRydWUsIEVUYWdzIGFyZSBpZ25vcmVkIHdoZW4gZXhlY3V0aW5nIHRoZSBhY3Rpb25cbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJuc1xuICogIC0gdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiBpZiB0aGUgYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZFxuICogIC0gdm9pZCBpZiB0aGUgYWN0aW9uIGhhcyBmYWlsZWRcbiAqICAtIHVuZGVmaW5lZCBpZiB0aGUgYWN0aW9uIGhhcyBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgdGhlIHByZXJlcXVpc2l0ZXMgYXJlIG5vdCBtZXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihcblx0Y29udGV4dDogQ29udGV4dCxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGlnbm9yZUVUYWc6IGJvb2xlYW5cbik6IFByb21pc2U8T0RhdGFDb250ZXh0QmluZGluZyB8IHZvaWQgfCB1bmRlZmluZWQ+IHtcblx0aWYgKE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIGNvbnRleHQuZ2V0UGF0aCgpKSAmJiBkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKGNvbnRleHQpKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghaWdub3JlRVRhZyAmJiAhY29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IHRvIHBvc3QgdGhlIGFjdGlvbiB3aXRoIHRoZSBJZi1NYXRjaCBoZWFkZXJcblx0XHRcdFx0Ly8gU29tZSB0cmlnZ2VycyAoZW50ZXIgb24gdGFibGUpIGNhbiBnZW5lcmF0ZSBhIHByb21pc2UgaW4gdGhlIGNhY2hlIHNvIGlmIHdlIGRvbid0IHdhaXQgZm9yIHRoZSBlbnRpdHlcblx0XHRcdFx0Ly8gdGhlIFBPU1Qgd2lsbCBiZSBzZW50IHdpdGhvdXQgSWYtTWF0Y2ggYW5kIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3Igb24gYmFja2VuZCBzaWRlLlxuXHRcdFx0XHRhd2FpdCAoY29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFDb250ZXh0QmluZGluZykucmVxdWVzdE9iamVjdChcIlwiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9wZXJhdGlvbiA9IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKGNvbnRleHQsIGNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpLCB0cnVlLCBpZ25vcmVFVGFnKTtcblx0XHRcdGlmICghZ2V0UmV0dXJuVHlwZShjb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSkpIHtcblx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKGNvbnRleHQsIGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhd2FpdCBvcGVyYXRpb247XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuICogQHBhcmFtIFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0c0dyb3VwSWQ/OiBzdHJpbmdcbik6IFByb21pc2U8Q29udGV4dD4ge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXHQvLyBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHNwZWMgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgYSBwcmVwYXJlIGFjdGlvbiBhbmQgd2UgdHJpZ2dlciBib3RoIHByZXBhcmUgYW5kXG5cdC8vIGFjdGl2YXRlIGluIG9uZSAkYmF0Y2ggdGhlIGFjdGl2YXRlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aCBpRi1NYXRjaD0qXG5cdGNvbnN0IGJJZ25vcmVFdGFnID0gYkhhc1ByZXBhcmVBY3Rpb247XG5cblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkFDVElWQVRJT04sIHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH0pO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9BcHBDb21wb25lbnQpO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gYXdhaXQgb09wZXJhdGlvbi5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0Yklnbm9yZUV0YWcsXG5cdFx0XHRcdHNHcm91cElkXG5cdFx0XHRcdFx0PyBvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdHsgYXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LCBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdHVuZGVmaW5lZFxuXHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggb24gdGhlIFByZXBhcmVBY3Rpb24gZm9yIGEgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUoY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdC8vIElmIHRoZXJlIGlzIG5vIHJldHVybiBwYXJhbWV0ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXF1ZXN0IE1lc3NhZ2VzLlxuXHQvLyBSQVAgZHJhZnQgcHJlcGFyZSBoYXMgbm8gcmV0dXJuIHBhcmFtZXRlclxuXHRyZXR1cm4gZ2V0UmV0dXJuVHlwZShjb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSkgPyBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQoY29udGV4dCkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3VwcG9ydGVkIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBmb3IgYSBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbWV0YUNvbnRleHQgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRjb25zdCBjb252ZXJ0ZWRDb250ZXh0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblx0Y29uc3QgbWVzc2FnZXMgPSBjb252ZXJ0ZWRDb250ZXh0LnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5NZXNzYWdlcztcblx0cmV0dXJuIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG1lc3NhZ2VzKSA/IG1lc3NhZ2VzLnBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRXhlY3V0ZSBhIHByZXBhcmF0aW9uIGFjdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIGJNZXNzYWdlcyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIFBSRVBBUkUgYWN0aW9uIHJldHJpZXZlcyBTQVBfTWVzc2FnZXNcbiAqIEBwYXJhbSBpZ25vcmVFVGFnIElmIHNldCB0byB0cnVlLCBFVGFnIGluZm9ybWF0aW9uIGlzIGlnbm9yZWQgd2hlbiB0aGUgYWN0aW9uIGlzIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGdyb3VwSWQ/OiBzdHJpbmcsXG5cdGJNZXNzYWdlcz86IGJvb2xlYW4sXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQgfCBPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBiTWVzc2FnZXMgPyBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUob0NvbnRleHQpIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFLCBzTWVzc2FnZXNQYXRoID8geyAkc2VsZWN0OiBzTWVzc2FnZXNQYXRoIH0gOiB1bmRlZmluZWQpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkLCBpZ25vcmVFVGFnKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFJlcXVlc3RzIHRoZSBtZXNzYWdlcyBpZiBhbm5vdGF0ZWQgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgbWVzc2FnZXMgd2VyZSByZXF1ZXN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0OiBDb250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdHJldHVybiBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc01lc3NhZ2VzUGF0aF0sIG9Db250ZXh0KTtcblx0fVxuXHRyZXR1cm47XG59XG4vKipcbiAqIEV4ZWN1dGVzIGRpc2NhcmQgb2YgYSBkcmFmdCBmdW5jdGlvbiB1c2luZyBIVFRQIFBvc3QuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb0Rpc2NhcmRPcGVyYXRpb24gPSBkcmFmdC5jcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvQXBwQ29tcG9uZW50KTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSByZXNvdXJjZU1vZGVsPy5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIikgfHwgXCJcIjtcblx0XHQvLyBhcyB0aGUgZGlzY2FyZCBhY3Rpb24gZG9lc250JyBzZW5kIHRoZSBhY3RpdmUgdmVyc2lvbiBpbiB0aGUgcmVzcG9uc2Ugd2UgZG8gbm90IHVzZSB0aGUgcmVwbGFjZSBpbiBjYWNoZVxuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmdcblx0XHRcdD8gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdDogb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0b3BlcmF0aW9uc0hlbHBlci5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0XHRcdGRyYWZ0LFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHR7IEFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCwgbGFiZWw6IHNBY3Rpb25OYW1lLCBtb2RlbDogb0NvbnRleHQuZ2V0TW9kZWwoKSB9LFxuXHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHR1bmRlZmluZWRcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHQgICk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0YXdhaXQgb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRoc1xuICogYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3QgcGFnZVxuICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgY29udGV4dCBpbmZvIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gZ3JvdXBJZFxuICogQHJldHVybnMgVGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRncm91cElkPzogc3RyaW5nXG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRpZiAoXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgJiZcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0KSB7XG5cdFx0Ly8gV2UgYWxyZWFkeSBrbm93IHRoZSBzaWJsaW5nIGZvciByaWdodG1vc3RDdXJyZW50Q29udGV4dCBkb2Vzbid0IGV4aXN0XG5cdFx0Ly8gLS0+IE5vIG5lZWQgdG8gY2hlY2sgY2Fub25pY2FsIHBhdGhzIGV0Yy4uLlxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFjaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cblx0XHQvLyBDb21wdXRpbmcgc2libGluZyBlbnRpdHkgb2Ygcm9vdCBvZiB0aGUgZHJhZnQgY29udGV4dCBpcyBub3QgcmVxdWlyZWQgaWYgdGhlIGNvbnRleHQgaXMgYWxyZWFkeSBpbiB0aGUgc3ViLU9QXG5cdFx0Ly8gRXhhbXBsZTogRWRpdCBpbiBTdWItT1Agd2hlcmUgbmV3IGNvbnRleHQgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRjb25zdCBwYXRocyA9IFsuLi5zZWdtZW50c107XG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0cGF0aHMuc2hpZnQoKTtcblx0XHRcdGN1cnJlbnRQYXRoID0gXCIvXCIgKyByb290Q3VycmVudENvbnRleHQ/LmdldFBhdGgoKT8uc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBwYXRocy5tYXAoYXN5bmMgKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGlmIChjdXJyZW50UGF0aC5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbFxuXHRcdFx0XHRcdC5iaW5kQ29udGV4dChgJHtjdXJyZW50UGF0aH0vU2libGluZ0VudGl0eWAsIHVuZGVmaW5lZCwgZ3JvdXBJZCA/IHsgJCRncm91cElkOiBncm91cElkIH0gOiB1bmRlZmluZWQpXG5cdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAzLiBSZWNvbnN0cnVjdCB0aGUgZnVsbCBwYXRocyBmcm9tIGNhbm9uaWNhbCBwYXRocyAoZm9yIHBhdGggbWFwcGluZylcblx0XHQvLyBFeGFtcGxlOiBmb3IgY2Fub25pY2FsIHBhdGhzIFwiL1BhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCIvRW50aXR5MihjYy1zaWJsaW5nKVwiLCBcIi9FbnRpdHkzKGRkLXNpYmxpbmcpXCJcblx0XHQvLyAtLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKS9fU3ViTmF2KGRkLXNpYmxpbmcpXCJdXG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoY2Fub25pY2FsUGF0aFByb21pc2VzKSkgYXMgc3RyaW5nW107XG5cblx0XHQvLyBXb3JrYXJvdW5kICh0ZW1wb3JhcnkgPyk6IHdoZW4gdGhlIHNpYmxpbmcgZG9lc24ndCBleGlzdCwgcmVxdWVzdENhbm9uaWNhbFBhdGggcmV0dXJucyB0aGUgc2FtZSBwYXRoXG5cdFx0aWYgKFxuXHRcdFx0Y2Fub25pY2FsUGF0aHMuc29tZSgocGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gcGF0aCAmJiBwYXRoLmVuZHNXaXRoKFwiL1NpYmxpbmdFbnRpdHlcIik7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0Ly8gQXQgbGVhc3Qgb25lIHNpYmxpbmcgZW50aXR5IGRvZXNuJ3QgZXhpc3Rcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0Y29uc3Qgcm9vdFNpYmxpbmdQYXRoID0gKGF3YWl0IHJvb3RDb250ZXh0SW5mby5yb290U2libGluZ1BhdGhQcm9taXNlKT8uZ2V0UGF0aCgpIGFzIHN0cmluZztcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnVuc2hpZnQocm9vdFNpYmxpbmdQYXRoKTtcblx0XHRcdG9sZFBhdGhzLnB1c2gocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0fVxuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbaW5kZXhdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdmlnYXRpb24gPSBzZWdtZW50c1tpbmRleF0ucmVwbGFjZSgvXFwoLiokLywgXCJcIik7IC8vIEtlZXAgb25seSBuYXZpZ2F0aW9uIG5hbWUgZnJvbSB0aGUgc2VnbWVudCwgaS5lLiBhYWEoeHh4KSAtLT4gYWFhXG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmcm9tIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7c2VnbWVudHNbaW5kZXhdfWA7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsXG5cdFx0XHRcdC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JHNlbGVjdDogZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSxcblx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCJcblx0XHRcdFx0fSlcblx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpLCAvLyBDcmVhdGUgdGhlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHQgZnJvbSBpdHMgcGF0aFxuXHRcdFx0cGF0aE1hcHBpbmc6IG9sZFBhdGhzLm1hcCgob2xkUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRvbGRQYXRoLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld1BhdGhzW2luZGV4XVxuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIEEgY2Fub25pY2FsIHBhdGggY291bGRuJ3QgYmUgcmVzb2x2ZWQgKGJlY2F1c2UgYSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5iUHJlc2VydmVDaGFuZ2VzXSBQcmVzZXJ2ZSBjaGFuZ2VzIG9mIGFuIGV4aXN0aW5nIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IEZFVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0fSxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcbik6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNoYW5nZS5cblx0ICogQHBhcmFtIHJlc3BvbnNlIENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdCBvciB0aGUgZXJyb3IgcmV0cmlldmVkXG5cdCAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRhc3luYyBmdW5jdGlvbiBvdmVyd3JpdGVDaGFuZ2UocmVzcG9uc2U6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlKTogUHJvbWlzZTxDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG1QYXJhbWV0ZXJzLm9WaWV3KTtcblx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0O1xuXHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX0xPQ0tFRF9CWV9VU0VSXCIsIHNJbmZvLCBzRW50aXR5U2V0KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0Y29uc3Qgc1Vuc2F2ZWRDaGFuZ2VzTXNnID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRhd2FpdCBkcmFmdC5zaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBmYWxzZSwgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyLCB0cnVlKTsgLy8gdHJ1ZSBiZWNhdXNlIHdlIG92ZXJ3cml0ZSBjaGFuZ2VzXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICgocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk/Lm1lc3NhZ2UpIHtcblx0XHRcdE1lc3NhZ2VCb3guZXJyb3IoKHJlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLm1lc3NhZ2UpO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cdGxldCBvRHJhZnRDb250ZXh0OiBDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZDtcblx0dHJ5IHtcblx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3csIG1QYXJhbWV0ZXJzLm9WaWV3LCBncm91cElkLCBtZXNzYWdlSGFuZGxlcik7XG5cdH0gY2F0Y2ggKG9SZXNwb25zZSkge1xuXHRcdGlmICgob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLnN0YXR1cyA9PT0gNDA5IHx8IChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MjMpIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0aWYgKHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0KSB7XG5cdFx0XHRcdC8vdGhlcmUgaXMgYSBjb250ZXh0IGF1dGhvcml6ZWQgdG8gYmUgZWRpdGVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMud2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBubyBkcmFmdCBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVDaGFuZ2Uob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIShvUmVzcG9uc2UgJiYgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5jYW5jZWxlZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRpZiAob0RyYWZ0Q29udGV4dCkge1xuXHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGRyYWZ0LmdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCk7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIGEgdmV0byBiZWZvcmUgdGhlICdDcmVhdGUnIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5BZnRlckFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2luZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHsgZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb247IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb24gfSxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRjb25zdCBiRXhlY3V0ZSA9IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBhd2FpdCBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWU7XG5cdGlmICghYkV4ZWN1dGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0bGV0IG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IENvbnRleHQ7XG5cdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIGFjdGl2YXRpb24gcmVxdWlyZXMgcHJlcGFyYXRpb24gKi9cblx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiJGF1dG9cIjtcblx0XHQvL3doZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyB0aGVyZSB3aWxsIGJlIGEgcGF0Y2ggcmVxdWVzdCBtZXJnZWQgdG9nZXRoZXIgd2l0aCB0aGUgZHJhZnRQcmVwYXJlIGFuZCBkcmFmdEFjaXZhdGUuXG5cdFx0Ly9UaGUgcGF0Y2ggY2hhbmdlcyB0aGUgRXRhZywgdGhlcmZvcmUgdGhlIHByZXBhcmUgbmVlZHMgdG8gaWdub3JlIEV0YWdzXG5cdFx0Y29uc3QgaWdub3JlRXRhZzogYm9vbGVhbiA9IG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSA/IHRydWUgOiBmYWxzZTtcblx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdGxldCBvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHVuZGVmaW5lZCwgaWdub3JlRXRhZyk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0Y29uc3Qgb0FjdGl2YXRlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyLCBzQmF0Y2hHcm91cCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHQvLyBCQ1AgMjI3MDA4NDA3NVxuXHRcdFx0Ly8gaWYgdGhlIEFjdGl2YXRpb24gZmFpbHMsIHRoZW4gdGhlIG1lc3NhZ2VzIGFyZSByZXRyaWV2ZWQgZnJvbSBQUkVQQVJBVElPTiBhY3Rpb25cblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUob0NvbnRleHQpO1xuXHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0b1ByZXBhcmVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwLCB0cnVlKTtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0XHRcdGF3YWl0IG9QcmVwYXJlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0aWYgKGRhdGFbc01lc3NhZ2VzUGF0aF0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8vaWYgbWVzc2FnZXMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQUkVQQVJBVElPTiBhY3Rpb24sIHRoZW4gcHJldmlvdXMgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyPy5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGJveCBhZnRlciBwcmVzc2luZyB0aGUgZWRpdCBidXR0b24gb2YgYW4gb2JqZWN0IHBhZ2Ugd2l0aCB1bnNhdmVkIGNoYW5nZXMuXG4gKiBAcGFyYW0gc1Vuc2F2ZWRDaGFuZ2VzTXNnIERpYWxvZyBib3ggbWVzc2FnZSBpbmZvcm1pbmcgdGhlIHVzZXIgdGhhdCBpZiBoZSBzdGFydHMgZWRpdGluZywgdGhlIHByZXZpb3VzIHVuc2F2ZWQgY2hhbmdlcyB3aWxsIGJlIGxvc3RcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBsb2NhbEkxOG5SZWYgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0fSksXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlamVjdChgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRvRGlhbG9nLm9wZW4oKTtcblx0fSk7XG59XG5cbi8qKlxuICogSFRUUCBQT1NUIGNhbGwgd2hlbiBEcmFmdEFjdGlvbiBpcyBwcmVzZW50IGZvciBEcmFmdCBEZWxldGU7IEhUVFAgREVMRVRFIGNhbGwgd2hlbiB0aGVyZSBpcyBubyBEcmFmdEFjdGlvblxuICogYW5kIEFjdGl2ZSBJbnN0YW5jZSBhbHdheXMgdXNlcyBERUxFVEUuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkZWxldGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURyYWZ0KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKSxcblx0XHRiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgIW9Db250ZXh0LmlzSW5hY3RpdmUoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhbiBlZGl0IGRyYWZ0IHJvb3Qgbm9kZSwgdXNlIG1vZGVsLmRlbGV0ZSBpbnN0ZWFkIG9mIGNvbnRleHQuZGVsZXRlLCB0byBvbmx5IHNlbmQgZGVsZXRpb24gdG8gYmFja2VuZCxcblx0XHRcdC8vIGJ1dCBrZWVwIGNvbnRleHQgYWxpdmUgKGluY2x1ZGluZyBiaW5kaW5ncykuIFRodXMsIHdlIGNhbiBlbnN1cmUgc2VhbWxlc3MgdHJhbnNpc3Rpb24gZnJvbSBkcmFmdCB0byBhY3RpdmUgaW5zdGFuY2Vcblx0XHRcdC8vICh3aXRob3V0IGludGVybWVkaWF0ZSB1bmRlZmluZWQgYmluZGluZ3MgZS5nLiBsZWFkaW5nIHRvIGZsaWNrZXJpbmcpLlxuXHRcdFx0Ly8gSW4gb3RoZXIgY2FzZXMgKGRlbGV0aW5nIGFjdGl2ZSwgZGlzY2FyZGluZyBjcmVhdGUgZHJhZnQgb3IgZGlzY2FyZGluZyBkcmFmdCBub2RlKSwgc3RheSB3aXRoIGNvbnRleHQuZGVsZXRlLlxuXHRcdFx0Ly8gV2hlbiBjYW5jZWxsaW5nIGEgY3JlYXRlIGRyYWZ0LCBwYWdlIGlzIGNsb3NlZCwgdGh1cyB0aGUgcHJvYmxlbSBvZiBmbGlja2VyaW5nIGNhbm5vdCBvY2N1ci5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZGlzY2FyZGluZyBhIGRyYWZ0IG5vZGUsIHRoZW9yZXRpY2FsbHkgdGhlIHNhbWUgcHJvYmxlbSBjb3VsZFxuXHRcdFx0Ly8gb2NjdXIsIGJ1dCBuZWVkcyBxdWl0ZSBzcGVjaWZpYyBtb2RlbGxpbmcgKGJ1dHRvbiB2aXNpYmlsaXR5IG9uIGl0ZW0gbGV2ZWwgYm91bmQgYWdhaW5zdCBzZXJ2aWNlIHByb3BlcnR5IGluIGFuIEZDTCBhcHApXG5cdFx0XHQvLyBhbmQgYWN0aW5nIChsb29raW5nIGF0IGJ1dHRvbiBvbiB0aGlyZCBjb2x1bW4gd2hpbGUgZGlzY2FyZGluZyBvbiAybmQgY29sdW1uKS4gQ3VycmVudGx5LCBtb2RlbCBzZWVtcyBub3QgdG8gYmUgcHJlcGFyZWRcblx0XHRcdC8vIGZvciB0aGF0IGNhc2UsIHRodXMgZHVlIHRvIHRoZSBtaW5pbWFsIGltcGFjdCAob25seSBpbnRlcm1lZGlhdGUgdmlzdWFsIHN0YXRlKSwgYWNjZXB0aW5nIHRoaXMgZm9yIHRoZSB0aW1lIGJlaW5nLlxuXHRcdFx0cmV0dXJuICFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpICYmXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzRHJhZnRSb290KFxuXHRcdFx0XHRcdGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkpPy50YXJnZXRFbnRpdHlTZXRcblx0XHRcdFx0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKVxuXHRcdFx0XHQ/IG9Db250ZXh0LmdldE1vZGVsKCkuZGVsZXRlKG9Db250ZXh0KVxuXHRcdFx0XHQ6IG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRhd2FpdCBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgb0FwcENvbXBvbmVudCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnQsXG5cdGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb246IGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdFZhbGlkYXRpb246IGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24sXG5cdGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbixcblx0aGFzUHJlcGFyZUFjdGlvbjogaGFzUHJlcGFyZUFjdGlvbixcblx0Y29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbjogY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbixcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0c2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAuc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRjcmVhdGVPcGVyYXRpb246IGNyZWF0ZU9wZXJhdGlvbixcblx0ZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbjogZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IGRyYWZ0RGF0YUxvc3NQb3B1cC5OYXZpZ2F0aW9uVHlwZSxcblx0Z2V0QWN0aW9uTmFtZTogZ2V0QWN0aW9uTmFtZSxcblx0c2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94OiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3hcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBb0ZBO0VBQ0Es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