@sapui5/sap.fe.core 1.127.2 → 1.129.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 (393) 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 +3 -9
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -7
  5. package/src/sap/fe/core/AppComponent.js +9 -19
  6. package/src/sap/fe/core/AppComponent.ts +2 -12
  7. package/src/sap/fe/core/AppStateHandler.js +3 -11
  8. package/src/sap/fe/core/AppStateHandler.ts +0 -7
  9. package/src/sap/fe/core/BaseController.js +4 -8
  10. package/src/sap/fe/core/BaseController.ts +0 -5
  11. package/src/sap/fe/core/CommonUtils.js +1 -9
  12. package/src/sap/fe/core/CommonUtils.ts +4 -8
  13. package/src/sap/fe/core/ExtensionAPI.js +10 -25
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -19
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +5 -3
  16. package/src/sap/fe/core/PageController.js +7 -10
  17. package/src/sap/fe/core/PageController.ts +0 -3
  18. package/src/sap/fe/core/ResourceModel.js +3 -5
  19. package/src/sap/fe/core/ResourceModel.ts +0 -2
  20. package/src/sap/fe/core/ReuseComponent.js +8 -14
  21. package/src/sap/fe/core/ReuseComponent.ts +0 -6
  22. package/src/sap/fe/core/TemplateComponent.js +37 -9
  23. package/src/sap/fe/core/TemplateComponent.ts +3 -2
  24. package/src/sap/fe/core/TemplateModel.js +5 -5
  25. package/src/sap/fe/core/TemplateModel.ts +0 -1
  26. package/src/sap/fe/core/UIProvider.js +1 -1
  27. package/src/sap/fe/core/UIProvider.ts +44 -1
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +7 -12
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +0 -5
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +61 -65
  31. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +60 -63
  32. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +3 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +21 -5
  35. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +0 -4
  36. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +6 -18
  37. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -20
  38. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -11
  39. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +0 -6
  40. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +3 -3
  41. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +11 -10
  42. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +0 -1
  43. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -7
  44. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +0 -1
  45. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  46. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +3 -10
  47. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +0 -7
  48. package/src/sap/fe/core/controllerextensions/ContextSharing.js +5 -8
  49. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +0 -2
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +225 -155
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +248 -164
  52. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -3
  53. package/src/sap/fe/core/controllerextensions/Feedback.ts +0 -2
  54. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +4 -7
  55. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -3
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -25
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -21
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +22 -34
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +25 -31
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +8 -21
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +4 -15
  62. package/src/sap/fe/core/controllerextensions/MessageHandler.js +68 -31
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +78 -32
  64. package/src/sap/fe/core/controllerextensions/PageReady.js +4 -4
  65. package/src/sap/fe/core/controllerextensions/Paginator.js +4 -8
  66. package/src/sap/fe/core/controllerextensions/Paginator.ts +0 -4
  67. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -4
  68. package/src/sap/fe/core/controllerextensions/Recommendations.js +15 -24
  69. package/src/sap/fe/core/controllerextensions/Recommendations.ts +13 -20
  70. package/src/sap/fe/core/controllerextensions/Routing.js +4 -10
  71. package/src/sap/fe/core/controllerextensions/Routing.ts +0 -6
  72. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/Share.js +17 -11
  74. package/src/sap/fe/core/controllerextensions/Share.ts +10 -5
  75. package/src/sap/fe/core/controllerextensions/SideEffects.js +49 -45
  76. package/src/sap/fe/core/controllerextensions/SideEffects.ts +54 -41
  77. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -4
  78. package/src/sap/fe/core/controllerextensions/ViewState.js +10 -34
  79. package/src/sap/fe/core/controllerextensions/ViewState.ts +3 -49
  80. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +6 -8
  81. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +0 -1
  82. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -2
  83. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +0 -1
  84. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +4 -3
  85. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +16 -12
  87. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +4 -1
  88. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  89. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +126 -74
  90. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +158 -91
  91. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -22
  92. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +0 -20
  93. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -20
  94. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +11 -17
  95. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +191 -767
  97. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +277 -1024
  98. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  99. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -6
  100. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +0 -5
  101. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +381 -250
  102. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +467 -301
  103. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +2 -6
  104. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +0 -5
  105. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +2 -6
  106. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +4 -6
  107. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -6
  108. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +0 -4
  109. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +4 -41
  111. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -37
  112. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  113. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +0 -1
  114. package/src/sap/fe/core/controls/Any.js +1 -2
  115. package/src/sap/fe/core/controls/Any.ts +0 -1
  116. package/src/sap/fe/core/controls/AnyElement.js +1 -2
  117. package/src/sap/fe/core/controls/AnyElement.ts +0 -1
  118. package/src/sap/fe/core/controls/CommandExecution.js +3 -3
  119. package/src/sap/fe/core/controls/ComponentLoader.js +23 -10
  120. package/src/sap/fe/core/controls/ComponentLoader.ts +0 -1
  121. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +10 -13
  122. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +0 -6
  123. package/src/sap/fe/core/controls/EventDelegateHook.js +8 -9
  124. package/src/sap/fe/core/controls/FormElementWrapper.js +7 -7
  125. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -1
  126. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +140 -24
  127. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +141 -10
  128. package/src/sap/fe/core/converters/ConverterContext.js +8 -30
  129. package/src/sap/fe/core/converters/ConverterContext.ts +7 -29
  130. package/src/sap/fe/core/converters/ManifestSettings.js +37 -1
  131. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -3
  132. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -40
  133. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -46
  134. package/src/sap/fe/core/converters/MetaModelConverter.js +44 -48
  135. package/src/sap/fe/core/converters/MetaModelConverter.ts +50 -48
  136. package/src/sap/fe/core/converters/TemplateConverter.js +3 -2
  137. package/src/sap/fe/core/converters/TemplateConverter.ts +0 -1
  138. package/src/sap/fe/core/converters/annotations/DataField.js +1 -28
  139. package/src/sap/fe/core/converters/annotations/DataField.ts +0 -26
  140. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -19
  141. package/src/sap/fe/core/converters/controls/Common/Action.js +13 -26
  142. package/src/sap/fe/core/converters/controls/Common/Action.ts +13 -31
  143. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -6
  144. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -5
  145. package/src/sap/fe/core/converters/controls/Common/Criticality.js +2 -4
  146. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +1 -2
  147. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -5
  148. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +0 -4
  149. package/src/sap/fe/core/converters/controls/Common/Form.js +3 -2
  150. package/src/sap/fe/core/converters/controls/Common/Form.ts +2 -1
  151. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -7
  152. package/src/sap/fe/core/converters/controls/Common/KPI.ts +11 -6
  153. package/src/sap/fe/core/converters/controls/Common/Table.js +159 -141
  154. package/src/sap/fe/core/converters/controls/Common/Table.ts +166 -122
  155. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +5 -30
  156. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +3 -29
  157. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +43 -55
  158. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +43 -47
  159. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -4
  160. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +0 -3
  161. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  162. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -8
  163. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +2 -7
  164. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -11
  165. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +0 -9
  166. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -10
  167. package/src/sap/fe/core/converters/helpers/Aggregation.ts +0 -9
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -7
  169. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +0 -6
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -9
  171. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +0 -8
  172. package/src/sap/fe/core/converters/helpers/ID.js +1 -2
  173. package/src/sap/fe/core/converters/helpers/ID.ts +0 -1
  174. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -2
  175. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +0 -1
  176. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/Key.js +1 -5
  178. package/src/sap/fe/core/converters/helpers/Key.ts +0 -4
  179. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -2
  180. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +0 -1
  181. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  182. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -7
  183. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +0 -6
  184. package/src/sap/fe/core/converters/templates/ListReportConverter.js +6 -27
  185. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +9 -26
  186. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -16
  187. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +0 -15
  188. package/src/sap/fe/core/definition/FEDefinition.js +2550 -0
  189. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -12
  190. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +9 -10
  191. package/src/sap/fe/core/formatters/CollaborationFormatter.js +8 -2
  192. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +0 -2
  193. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  194. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -2
  195. package/src/sap/fe/core/formatters/FPMFormatter.ts +0 -1
  196. package/src/sap/fe/core/formatters/FiscalFormat.js +9 -14
  197. package/src/sap/fe/core/formatters/FiscalFormat.ts +0 -11
  198. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -4
  199. package/src/sap/fe/core/formatters/KPIFormatter.ts +0 -3
  200. package/src/sap/fe/core/formatters/StandardFormatter.js +6 -3
  201. package/src/sap/fe/core/formatters/StandardFormatter.ts +6 -2
  202. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -4
  203. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -3
  204. package/src/sap/fe/core/fpm/Component.js +14 -17
  205. package/src/sap/fe/core/fpm/Component.ts +7 -10
  206. package/src/sap/fe/core/fpm/manifest.json +1 -1
  207. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +3 -10
  208. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +0 -9
  209. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -13
  210. package/src/sap/fe/core/helpers/AppStartupHelper.ts +0 -11
  211. package/src/sap/fe/core/helpers/BindingHelper.js +1 -4
  212. package/src/sap/fe/core/helpers/BindingHelper.ts +0 -3
  213. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -2
  214. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +0 -1
  215. package/src/sap/fe/core/helpers/DeleteHelper.js +61 -32
  216. package/src/sap/fe/core/helpers/DeleteHelper.ts +79 -33
  217. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -2
  218. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +0 -1
  219. package/src/sap/fe/core/helpers/EditState.js +1 -1
  220. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -2
  221. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +0 -1
  222. package/src/sap/fe/core/helpers/FPMHelper.js +1 -2
  223. package/src/sap/fe/core/helpers/FPMHelper.ts +0 -1
  224. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -8
  225. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +0 -7
  226. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +7 -1
  227. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  228. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -3
  229. package/src/sap/fe/core/helpers/ManifestHelper.ts +0 -2
  230. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  231. package/src/sap/fe/core/helpers/MetaModelFunction.js +3 -8
  232. package/src/sap/fe/core/helpers/MetaModelFunction.ts +0 -5
  233. package/src/sap/fe/core/helpers/MetaPath.js +1 -7
  234. package/src/sap/fe/core/helpers/MetaPath.ts +0 -6
  235. package/src/sap/fe/core/helpers/ModelHelper.js +55 -35
  236. package/src/sap/fe/core/helpers/ModelHelper.ts +64 -38
  237. package/src/sap/fe/core/helpers/PasteHelper.js +77 -24
  238. package/src/sap/fe/core/helpers/PasteHelper.ts +105 -23
  239. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -3
  240. package/src/sap/fe/core/helpers/PromiseKeeper.ts +0 -2
  241. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -4
  242. package/src/sap/fe/core/helpers/RecommendationHelper.ts +0 -3
  243. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -3
  244. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +3 -4
  245. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -2
  246. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +0 -1
  247. package/src/sap/fe/core/helpers/SizeHelper.js +1 -2
  248. package/src/sap/fe/core/helpers/SizeHelper.ts +0 -1
  249. package/src/sap/fe/core/helpers/StableIdHelper.js +7 -17
  250. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -17
  251. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -12
  252. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +0 -11
  253. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  254. package/src/sap/fe/core/helpers/TitleHelper.js +1 -10
  255. package/src/sap/fe/core/helpers/TitleHelper.ts +0 -9
  256. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -2
  257. package/src/sap/fe/core/helpers/ToES6Promise.ts +0 -1
  258. package/src/sap/fe/core/helpers/TypeGuards.js +1 -15
  259. package/src/sap/fe/core/helpers/TypeGuards.ts +0 -14
  260. package/src/sap/fe/core/helpers/WebSocket.js +1 -1
  261. package/src/sap/fe/core/library.js +10 -44
  262. package/src/sap/fe/core/library.support.js +1 -1
  263. package/src/sap/fe/core/library.ts +8 -45
  264. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -6
  265. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -5
  266. package/src/sap/fe/core/messagebundle.properties +12 -1
  267. package/src/sap/fe/core/messagebundle_ar.properties +8 -0
  268. package/src/sap/fe/core/messagebundle_bg.properties +8 -0
  269. package/src/sap/fe/core/messagebundle_ca.properties +8 -0
  270. package/src/sap/fe/core/messagebundle_cnr.properties +8 -0
  271. package/src/sap/fe/core/messagebundle_cs.properties +9 -1
  272. package/src/sap/fe/core/messagebundle_cy.properties +8 -0
  273. package/src/sap/fe/core/messagebundle_da.properties +8 -0
  274. package/src/sap/fe/core/messagebundle_de.properties +8 -0
  275. package/src/sap/fe/core/messagebundle_el.properties +8 -0
  276. package/src/sap/fe/core/messagebundle_en.properties +8 -0
  277. package/src/sap/fe/core/messagebundle_en_GB.properties +8 -0
  278. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +144 -65
  279. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -0
  280. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +273 -194
  281. package/src/sap/fe/core/messagebundle_es.properties +9 -1
  282. package/src/sap/fe/core/messagebundle_es_MX.properties +8 -0
  283. package/src/sap/fe/core/messagebundle_et.properties +8 -0
  284. package/src/sap/fe/core/messagebundle_fi.properties +8 -0
  285. package/src/sap/fe/core/messagebundle_fr.properties +8 -0
  286. package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -0
  287. package/src/sap/fe/core/messagebundle_hi.properties +9 -1
  288. package/src/sap/fe/core/messagebundle_hr.properties +8 -0
  289. package/src/sap/fe/core/messagebundle_hu.properties +8 -0
  290. package/src/sap/fe/core/messagebundle_id.properties +12 -4
  291. package/src/sap/fe/core/messagebundle_it.properties +8 -0
  292. package/src/sap/fe/core/messagebundle_iw.properties +8 -0
  293. package/src/sap/fe/core/messagebundle_ja.properties +8 -0
  294. package/src/sap/fe/core/messagebundle_kk.properties +8 -0
  295. package/src/sap/fe/core/messagebundle_ko.properties +8 -0
  296. package/src/sap/fe/core/messagebundle_lt.properties +8 -0
  297. package/src/sap/fe/core/messagebundle_lv.properties +8 -0
  298. package/src/sap/fe/core/messagebundle_mk.properties +8 -0
  299. package/src/sap/fe/core/messagebundle_ms.properties +8 -0
  300. package/src/sap/fe/core/messagebundle_nl.properties +16 -8
  301. package/src/sap/fe/core/messagebundle_no.properties +8 -0
  302. package/src/sap/fe/core/messagebundle_pl.properties +8 -0
  303. package/src/sap/fe/core/messagebundle_pt.properties +8 -0
  304. package/src/sap/fe/core/messagebundle_pt_PT.properties +8 -0
  305. package/src/sap/fe/core/messagebundle_ro.properties +8 -0
  306. package/src/sap/fe/core/messagebundle_ru.properties +8 -0
  307. package/src/sap/fe/core/messagebundle_sh.properties +8 -0
  308. package/src/sap/fe/core/messagebundle_sk.properties +8 -0
  309. package/src/sap/fe/core/messagebundle_sl.properties +8 -0
  310. package/src/sap/fe/core/messagebundle_sr.properties +8 -0
  311. package/src/sap/fe/core/messagebundle_sv.properties +8 -0
  312. package/src/sap/fe/core/messagebundle_th.properties +12 -4
  313. package/src/sap/fe/core/messagebundle_tr.properties +8 -0
  314. package/src/sap/fe/core/messagebundle_uk.properties +10 -2
  315. package/src/sap/fe/core/messagebundle_vi.properties +8 -0
  316. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -0
  317. package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -0
  318. package/src/sap/fe/core/operationsHelper.js +22 -7
  319. package/src/sap/fe/core/operationsHelper.ts +24 -5
  320. package/src/sap/fe/core/rootView/Fcl.controller.js +7 -27
  321. package/src/sap/fe/core/rootView/Fcl.controller.ts +0 -18
  322. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -12
  323. package/src/sap/fe/core/rootView/NavContainer.controller.ts +0 -5
  324. package/src/sap/fe/core/rootView/RootViewBaseController.js +10 -24
  325. package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -16
  326. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  327. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -3
  328. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +4 -4
  329. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +3 -3
  330. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +3 -4
  331. package/src/sap/fe/core/services/ContextSharingServiceFactory.ts +0 -1
  332. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +13 -20
  333. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +11 -17
  334. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -21
  335. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -17
  336. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  337. package/src/sap/fe/core/services/RoutingServiceFactory.js +7 -19
  338. package/src/sap/fe/core/services/RoutingServiceFactory.ts +0 -12
  339. package/src/sap/fe/core/services/ShellServicesFactory.js +8 -44
  340. package/src/sap/fe/core/services/ShellServicesFactory.ts +1 -41
  341. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +19 -60
  342. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +14 -57
  343. package/src/sap/fe/core/services/TelemetryServiceFactory.js +6 -14
  344. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +2 -10
  345. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +17 -7
  346. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +17 -3
  347. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +11 -24
  348. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +0 -19
  349. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +3 -31
  350. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +0 -27
  351. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -4
  352. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.ts +0 -3
  353. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +7 -7
  354. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  355. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  356. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  357. package/src/sap/fe/core/support/CommonHelper.js +4 -1
  358. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  359. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  360. package/src/sap/fe/core/templating/ActionHelper.js +1 -2
  361. package/src/sap/fe/core/templating/ActionHelper.ts +0 -1
  362. package/src/sap/fe/core/templating/CommonFormatters.js +1 -2
  363. package/src/sap/fe/core/templating/CommonFormatters.ts +0 -1
  364. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -6
  365. package/src/sap/fe/core/templating/CriticalityFormatters.ts +0 -5
  366. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -2
  367. package/src/sap/fe/core/templating/DataFieldFormatters.ts +0 -1
  368. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -18
  369. package/src/sap/fe/core/templating/DataModelPathHelper.ts +0 -17
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +6 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -4
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +0 -3
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  374. package/src/sap/fe/core/templating/EntityTypeHelper.ts +3 -4
  375. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -9
  376. package/src/sap/fe/core/templating/FieldControlHelper.ts +3 -9
  377. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  378. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  379. package/src/sap/fe/core/templating/PropertyHelper.js +1 -31
  380. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -30
  381. package/src/sap/fe/core/templating/SemanticObjectHelper.js +1 -7
  382. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +0 -6
  383. package/src/sap/fe/core/templating/UIFormatters.js +18 -14
  384. package/src/sap/fe/core/templating/UIFormatters.ts +30 -18
  385. package/src/sap/fe/core/type/Date.js +3 -6
  386. package/src/sap/fe/core/type/Date.ts +0 -3
  387. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  388. package/src/sap/fe/core/type/EDM.js +1 -1
  389. package/src/sap/fe/core/type/Email.js +3 -3
  390. package/src/sap/fe/core/type/FiscalDate.js +3 -9
  391. package/src/sap/fe/core/type/FiscalDate.ts +0 -6
  392. package/src/sap/fe/core/type/InputMask.js +3 -7
  393. package/src/sap/fe/core/type/InputMask.ts +0 -4
@@ -2,18 +2,34 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/ui/core/Element", "sap/ui/core/Fragment", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "../../../operationsHelper"], function (Log, ActionRuntime, CommonUtils, BusyLocker, UiModelConstants, messageHandling, MetaModelConverter, DeleteHelper, FPMHelper, ModelHelper, ResourceModelHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, Element, Fragment, Library, Messaging, XMLTemplateProcessor, Message, MessageType, XMLPreprocessor, JSONModel, operationsHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/UIProvider", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/library", "sap/m/MessageBox", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "../../../operationsHelper"], function (Log, ActionRuntime, UIProvider, messageHandling, MetaModelConverter, DeleteHelper, ModelHelper, ResourceModelHelper, FELibrary, MessageBox, Library, Messaging, Message, MessageType, operationsHelper) {
6
6
  "use strict";
7
7
 
8
- var generate = StableIdHelper.generate;
8
+ function __ui5_require_async(path) {
9
+ return new Promise((resolve, reject) => {
10
+ sap.ui.require([path], module => {
11
+ if (!(module && module.__esModule)) {
12
+ module = module === null || !(typeof module === "object" && path.endsWith("/library")) ? {
13
+ default: module
14
+ } : module;
15
+ Object.defineProperty(module, "__esModule", {
16
+ value: true
17
+ });
18
+ }
19
+ resolve(module);
20
+ }, err => {
21
+ reject(err);
22
+ });
23
+ });
24
+ }
9
25
  var getResourceModel = ResourceModelHelper.getResourceModel;
10
26
  var convertTypes = MetaModelConverter.convertTypes;
27
+ var getCoreUIFactory = UIProvider.getCoreUIFactory;
11
28
  const Constants = FELibrary.Constants,
12
29
  InvocationGrouping = FELibrary.InvocationGrouping;
13
30
  const Action = MessageBox.Action;
14
31
  /**
15
32
  * Calls a bound action for one or multiple contexts.
16
- *
17
33
  * @param sActionName The name of the action to be called
18
34
  * @param contexts Either one context or an array with contexts for which the action is to be be called
19
35
  * @param oModel OData Model
@@ -30,7 +46,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
30
46
  * @param [mParameters.parentControl] If specified, the dialogs are added as dependent of the parent control
31
47
  * @param [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
32
48
  * @param [mParameters.ignoreETag] If specified, the action is called without ETag handling
33
- * @param [strictHandlingUtilities] Optional, utility flags and messages for strictHandling
34
49
  * @returns Promise resolves with an array of response objects (TODO: to be changed)
35
50
  */
36
51
  async function callBoundAction(sActionName, contexts, oModel, oAppComponent, mParameters) {
@@ -86,7 +101,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
86
101
  }
87
102
  /**
88
103
  * Calls an action import.
89
- *
90
104
  * @param actionName The name of the action import to be called
91
105
  * @param model An instance of an OData V4 model
92
106
  * @param appComponent The AppComponent
@@ -97,7 +111,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
97
111
  * @param [parameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
98
112
  * @param [parameters.defaultParameters] Can contain default parameters from FLP user defaults
99
113
  * @param [parameters.ignoreETag] If specified, the action is called without ETag handling
100
- * @param [strictHandlingUtilities] Optional, utility flags and messages for strictHandling
101
114
  * @returns Promise resolves with an array of response objects (TODO: to be changed)
102
115
  */
103
116
  async function callActionImport(actionName, model, appComponent, parameters) {
@@ -127,7 +140,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
127
140
 
128
141
  /**
129
142
  * Calls a function import.
130
- *
131
143
  * @param sFunctionName The name of the function to be called
132
144
  * @param oModel An instance of an OData v4 model
133
145
  * @returns Promise resolves
@@ -149,6 +161,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
149
161
  await executionPromise;
150
162
  return functionToCall.getBoundContext();
151
163
  }
164
+ async function checkParameterTypeAndReturnConvertedValue(parameter, value) {
165
+ if (value === undefined || value === null) {
166
+ return value;
167
+ }
168
+ const BaseType = (await __ui5_require_async("sap/ui/mdc/enums/BaseType")).default;
169
+ const TypeMap = (await __ui5_require_async("sap/ui/mdc/odata/v4/TypeMap")).default;
170
+ const parameterType = parameter.type ? TypeMap.getBaseType(parameter.type) : BaseType.String;
171
+ const typeInstance = TypeMap.getDataTypeInstance(parameterType);
172
+ return typeInstance.parseValue(value, "string");
173
+ }
152
174
  async function callAction(convertedAction, oModel, oAction, oAppComponent, mParameters) {
153
175
  let strictHandlingUtilities = {
154
176
  is412Executed: false,
@@ -156,14 +178,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
156
178
  strictHandlingPromises: [],
157
179
  strictHandlingWarningMessages: [],
158
180
  delaySuccessMessages: [],
159
- processedMessageIds: new Set()
181
+ processedMessageIds: new Set(),
182
+ strictResponseErrorExists: false
160
183
  };
161
184
  const sActionName = convertedAction.isBound ? convertedAction.fullyQualifiedName.replace(/\(.*\)$/g, "") // remove the part related to the overlay
162
185
  : convertedAction.name;
163
186
  mParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
164
187
  return new Promise(async function (resolve, reject) {
165
188
  var _convertedAction$para;
166
- let fnDialog = null;
167
189
  const sActionLabel = mParameters.label;
168
190
  let bSkipParameterDialog = mParameters.skipParameterDialog;
169
191
  const aContexts = mParameters.aContexts;
@@ -205,19 +227,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
205
227
 
206
228
  // Depending on the previously determined data, either set a dialog or leave it empty which
207
229
  // will lead to direct execution of the action without a dialog
208
- if (bActionNeedsParameterDialog) {
209
- if (!(bSkipParameterDialog && bValuesProvidedForAllMandatoryParameters)) {
210
- fnDialog = showActionParameterDialog;
211
- }
212
- } else if (bIsCriticalAction) {
213
- fnDialog = confirmCriticalAction;
214
- }
230
+
215
231
  const mActionExecutionParameters = {
216
232
  defaultParametersValues: {},
217
233
  appComponent: oAppComponent,
218
234
  fnOnSubmitted: mParameters.onSubmitted,
219
235
  fnOnResponse: mParameters.onResponse,
220
236
  actionName: sActionName,
237
+ aContexts: [],
221
238
  model: oModel,
222
239
  aActionParameters: actionParameters,
223
240
  bGetBoundContext: mParameters.bGetBoundContext,
@@ -265,7 +282,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
265
282
  }
266
283
  }
267
284
  }
268
- mActionExecutionParameters.aContexts = aContexts;
285
+ mActionExecutionParameters.aContexts = aContexts ?? [];
269
286
  mActionExecutionParameters.mBindingParameters = mParameters.mBindingParameters;
270
287
  mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
271
288
  mActionExecutionParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
@@ -288,87 +305,108 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
288
305
  mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
289
306
  }
290
307
  mActionExecutionParameters.isStatic = convertedAction.isBound && !!((_convertedAction$para = convertedAction.parameters[0]) !== null && _convertedAction$para !== void 0 && _convertedAction$para.isCollection);
291
- if (fnDialog) {
292
- try {
293
- const operationResult = await fnDialog(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, actionParameters, aParameterValues, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler, strictHandlingUtilities, mParameters.view, mParameters.ignoreETag);
294
- afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
295
- resolve(operationResult);
296
- return;
297
- } catch (e) {
298
- reject(e);
308
+ let operationResult;
309
+ let executionWitDialog = false;
310
+ try {
311
+ if (bActionNeedsParameterDialog) {
312
+ if (!(bSkipParameterDialog && bValuesProvidedForAllMandatoryParameters)) {
313
+ executionWitDialog = true;
314
+ const parameterDialog = getCoreUIFactory().newParameterDialog(convertedAction, oAction, mActionExecutionParameters, aParameterValues, mParameters.entitySetName, mParameters.view, mParameters.messageHandler, strictHandlingUtilities, {
315
+ actionToBeExecuted: _executeAction,
316
+ beforeShowingMessage: actionParameterShowMessageCallback
317
+ }, mParameters.ignoreETag);
318
+ await parameterDialog.createDialog();
319
+ operationResult = await parameterDialog.openDialog(mParameters.parentControl);
320
+ }
321
+ } else if (bIsCriticalAction) {
322
+ executionWitDialog = true;
323
+ operationResult = await confirmCriticalAction(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, actionParameters, aParameterValues, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler, strictHandlingUtilities, mParameters.view, mParameters.ignoreETag);
299
324
  }
300
- } else {
301
- // Take over all provided parameter values and call the action.
302
- // This shall only happen if values are provided for all the parameters, otherwise the parameter dialog shall be shown which is ensured earlier
325
+ } catch (e) {
326
+ reject(e);
327
+ }
328
+ if (executionWitDialog) {
329
+ afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
330
+ resolve(operationResult);
331
+ return;
332
+ }
303
333
 
304
- if (aParameterValues) {
305
- for (const i in mActionExecutionParameters.aActionParameters) {
306
- var _aParameterValues$fin;
307
- mActionExecutionParameters.defaultParametersValues[mActionExecutionParameters.aActionParameters[i].name] = aParameterValues === null || aParameterValues === void 0 ? void 0 : (_aParameterValues$fin = aParameterValues.find(element => element.name === mActionExecutionParameters.aActionParameters[i].name)) === null || _aParameterValues$fin === void 0 ? void 0 : _aParameterValues$fin.value;
308
- }
309
- } else {
310
- for (const i in mActionExecutionParameters.aActionParameters) {
311
- var _oStartupParameters$m, _mActionExecutionPara, _mActionExecutionPara2, _mActionExecutionPara3;
312
- mActionExecutionParameters.defaultParametersValues[mActionExecutionParameters.aActionParameters[i].name] = ((_oStartupParameters$m = oStartupParameters[mActionExecutionParameters.aActionParameters[i].name]) === null || _oStartupParameters$m === void 0 ? void 0 : _oStartupParameters$m[0]) || ((_mActionExecutionPara = mActionExecutionParameters.aActionParameters[i].annotations) === null || _mActionExecutionPara === void 0 ? void 0 : (_mActionExecutionPara2 = _mActionExecutionPara.UI) === null || _mActionExecutionPara2 === void 0 ? void 0 : (_mActionExecutionPara3 = _mActionExecutionPara2.ParameterDefaultValue) === null || _mActionExecutionPara3 === void 0 ? void 0 : _mActionExecutionPara3.valueOf());
313
- }
334
+ // Take over all provided parameter values and call the action.
335
+ // This shall only happen if values are provided for all the parameters, otherwise the parameter dialog shall be shown which is ensured earlier
336
+
337
+ if (aParameterValues) {
338
+ for (const i in mActionExecutionParameters.aActionParameters) {
339
+ var _aParameterValues$fin;
340
+ mActionExecutionParameters.defaultParametersValues[mActionExecutionParameters.aActionParameters[i].name] = aParameterValues === null || aParameterValues === void 0 ? void 0 : (_aParameterValues$fin = aParameterValues.find(element => element.name === mActionExecutionParameters.aActionParameters[i].name)) === null || _aParameterValues$fin === void 0 ? void 0 : _aParameterValues$fin.value;
314
341
  }
315
- let oOperationResult;
316
- try {
317
- oOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
318
- const messages = Messaging.getMessageModel().getData();
319
- if (strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
320
- strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
321
- }
322
- afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
323
- resolve(oOperationResult);
324
- } catch {
325
- reject(oOperationResult);
326
- } finally {
327
- var _mParameters$messageH;
328
- if (strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length && mParameters.aContexts.length > 1) {
329
- try {
330
- const strictHandlingFails = strictHandlingUtilities.strictHandlingTransitionFails;
331
- const aFailedContexts = [];
332
- strictHandlingFails.forEach(function (fail) {
333
- aFailedContexts.push(fail.oAction.getContext());
334
- });
335
- mActionExecutionParameters.aContexts = aFailedContexts;
336
- const oFailedOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
337
- strictHandlingUtilities.strictHandlingTransitionFails = [];
338
- Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
339
- afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
340
- resolve(oFailedOperationResult);
341
- } catch (oFailedOperationResult) {
342
- reject(oFailedOperationResult);
343
- }
344
- }
345
- let showGenericErrorMessageForChangeSet = false;
346
- if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
347
- showGenericErrorMessageForChangeSet = true;
348
- }
349
- let isActionSuccessful = false;
350
- if (Array.isArray(oOperationResult)) {
351
- var _oOperationResult;
352
- isActionSuccessful = (_oOperationResult = oOperationResult) === null || _oOperationResult === void 0 ? void 0 : _oOperationResult.every(res => res.status === "fulfilled");
342
+ } else {
343
+ let actionParameter, parameterValueNotConverted;
344
+ for (const i in mActionExecutionParameters.aActionParameters) {
345
+ var _oStartupParameters$a, _actionParameter$anno, _actionParameter$anno2, _actionParameter$anno3;
346
+ actionParameter = mActionExecutionParameters.aActionParameters[i];
347
+ parameterValueNotConverted = ((_oStartupParameters$a = oStartupParameters[actionParameter.name]) === null || _oStartupParameters$a === void 0 ? void 0 : _oStartupParameters$a[0]) || ((_actionParameter$anno = actionParameter.annotations) === null || _actionParameter$anno === void 0 ? void 0 : (_actionParameter$anno2 = _actionParameter$anno.UI) === null || _actionParameter$anno2 === void 0 ? void 0 : (_actionParameter$anno3 = _actionParameter$anno2.ParameterDefaultValue) === null || _actionParameter$anno3 === void 0 ? void 0 : _actionParameter$anno3.valueOf());
348
+ mActionExecutionParameters.defaultParametersValues[actionParameter.name] = parameterValueNotConverted === undefined ? parameterValueNotConverted : await checkParameterTypeAndReturnConvertedValue(actionParameter, parameterValueNotConverted);
349
+ }
350
+ }
351
+ let oOperationResult;
352
+ try {
353
+ oOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
354
+ const messages = Messaging.getMessageModel().getData();
355
+ if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
356
+ strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
357
+ }
358
+ afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
359
+ resolve(oOperationResult);
360
+ } catch {
361
+ reject(oOperationResult);
362
+ } finally {
363
+ var _mParameters$messageH;
364
+ if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length && mParameters.aContexts.length > 1) {
365
+ try {
366
+ const strictHandlingFails = strictHandlingUtilities.strictHandlingTransitionFails;
367
+ const aFailedContexts = [];
368
+ strictHandlingFails.forEach(function (fail) {
369
+ aFailedContexts.push(fail.oAction.getContext());
370
+ });
371
+ mActionExecutionParameters.aContexts = aFailedContexts;
372
+ const oFailedOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
373
+ strictHandlingUtilities.strictHandlingTransitionFails = [];
374
+ Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
375
+ afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
376
+ resolve(oFailedOperationResult);
377
+ } catch (oFailedOperationResult) {
378
+ reject(oFailedOperationResult);
353
379
  }
354
- mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$messageH = mParameters.messageHandler) === null || _mParameters$messageH === void 0 ? void 0 : _mParameters$messageH.showMessageDialog({
355
- control: mActionExecutionParameters === null || mActionExecutionParameters === void 0 ? void 0 : mActionExecutionParameters.control,
356
- onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
357
- return actionParameterShowMessageCallback(mActionExecutionParameters, aContexts, undefined, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet, isActionSuccessful);
358
- },
359
- aSelectedContexts: mParameters.aContexts,
360
- sActionName: sActionLabel
361
- }).then(() => {
362
- mParameters.messageHandler.clearStrictWarningMessages();
363
- return;
364
- });
380
+ }
381
+ let showGenericErrorMessageForChangeSet = false;
382
+ if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
383
+ showGenericErrorMessageForChangeSet = true;
384
+ }
385
+ let isActionSuccessful = false;
386
+ if (Array.isArray(oOperationResult)) {
387
+ var _oOperationResult;
388
+ isActionSuccessful = (_oOperationResult = oOperationResult) === null || _oOperationResult === void 0 ? void 0 : _oOperationResult.every(res => res.status === "fulfilled");
389
+ }
390
+ mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$messageH = mParameters.messageHandler) === null || _mParameters$messageH === void 0 ? void 0 : _mParameters$messageH.showMessageDialog({
391
+ control: mActionExecutionParameters === null || mActionExecutionParameters === void 0 ? void 0 : mActionExecutionParameters.control,
392
+ onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
393
+ return actionParameterShowMessageCallback(mActionExecutionParameters, aContexts, undefined, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet, isActionSuccessful);
394
+ },
395
+ aSelectedContexts: mParameters.aContexts,
396
+ sActionName: sActionLabel
397
+ }).then(() => {
398
+ mParameters.messageHandler.clearStrictWarningMessages();
399
+ return;
400
+ });
401
+ if (strictHandlingUtilities) {
365
402
  strictHandlingUtilities = {
366
403
  is412Executed: false,
367
404
  strictHandlingTransitionFails: [],
368
405
  strictHandlingPromises: [],
369
406
  strictHandlingWarningMessages: [],
370
407
  delaySuccessMessages: [],
371
- processedMessageIds: new Set()
408
+ processedMessageIds: new Set(),
409
+ strictResponseErrorExists: false
372
410
  };
373
411
  }
374
412
  }
@@ -402,64 +440,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
402
440
  });
403
441
  });
404
442
  }
405
- async function executeAPMAction(oAppComponent, mParameters, oParentControl, messageHandler, aContexts, oDialog, after412, strictHandlingUtilities, ignoreETag) {
406
- const aResult = await _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities, ignoreETag);
407
- // If some entries were successful, and others have failed, the overall process is still successful. However, this was treated as rejection
408
- // before, and this currently is still kept, as long as dialog handling is mixed with backend process handling.
409
- // TODO: Refactor to only reject in case of overall process error.
410
- // For the time being: map to old logic to reject if at least one entry has failed
411
- // This check is only done for bound actions => aContexts not empty
412
- if (mParameters.aContexts && mParameters.aContexts.length > 0) {
413
- if (aResult !== null && aResult !== void 0 && aResult.some(oSingleResult => oSingleResult.status === "rejected")) {
414
- throw aResult;
415
- }
416
- }
417
- const messages = Messaging.getMessageModel().getData();
418
- if (strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
419
- if (!after412) {
420
- strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
421
- } else {
422
- Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
423
- let showGenericErrorMessageForChangeSet = false;
424
- if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
425
- showGenericErrorMessageForChangeSet = true;
426
- }
427
- if (messages.length) {
428
- // BOUND TRANSITION AS PART OF SAP_MESSAGE
429
- oDialog.attachEventOnce("afterClose", function () {
430
- messageHandler.showMessageDialog({
431
- onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
432
- return actionParameterShowMessageCallback(mParameters, aContexts, oDialog, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet);
433
- },
434
- control: mParameters.control,
435
- aSelectedContexts: mParameters.aContexts,
436
- sActionName: mParameters.label
437
- });
438
- });
439
- }
440
- }
441
- } else if (messages.length) {
442
- // BOUND TRANSITION AS PART OF SAP_MESSAGE
443
- let showGenericErrorMessageForChangeSet = false;
444
- if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
445
- showGenericErrorMessageForChangeSet = true;
446
- }
447
- oDialog.attachEventOnce("afterClose", function () {
448
- var _mParameters$oDialog, _mParameters$oDialog2;
449
- messageHandler.showMessageDialog({
450
- isActionParameterDialogOpen: mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$oDialog = mParameters.oDialog) === null || _mParameters$oDialog === void 0 ? void 0 : _mParameters$oDialog.isOpen(),
451
- forceShowUIElement: (mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$oDialog2 = mParameters.oDialog) === null || _mParameters$oDialog2 === void 0 ? void 0 : _mParameters$oDialog2.isOpen()) ?? false,
452
- onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
453
- return actionParameterShowMessageCallback(mParameters, aContexts, oDialog, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet);
454
- },
455
- control: mParameters.control,
456
- aSelectedContexts: mParameters.aContexts,
457
- sActionName: mParameters.label
458
- });
459
- });
460
- }
461
- return aResult;
462
- }
463
443
  function afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition) {
464
444
  if (mActionExecutionParameters.internalModelContext && mActionExecutionParameters.operationAvailableMap && mActionExecutionParameters.aContexts && mActionExecutionParameters.aContexts.length && actionDefinition.$IsBound) {
465
445
  let selectedContexts = [];
@@ -479,6 +459,46 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
479
459
  DeleteHelper.updateDeleteInfoForSelectedContexts(mActionExecutionParameters.internalModelContext, selectedContexts);
480
460
  }
481
461
  }
462
+
463
+ /**
464
+ * Filters an array of messages based on various conditions and returns an object containing the filtered messages and other properties.
465
+ * @param messages The messages to filter.
466
+ * @param errorTargetsInAPD Indicates whether error targets are in APD.
467
+ * @param contexts An array of contexts.
468
+ * @param unboundMessages An array of unbound messages.
469
+ * @param control A control object.
470
+ * @param isAPDOPen Indicates whether APD is open.
471
+ * @param showMessageDialog Indicates whether to show the message dialog.
472
+ * @returns An object containing a boolean indicating whether the result contains a bound transition, an array of messages to show, and a boolean indicating whether to show the message in a dialog.
473
+ */
474
+ function filterAPDandContextMessages(messages, errorTargetsInAPD, contexts, unboundMessages, control, isAPDOPen, showMessageDialog) {
475
+ if (isAPDOPen && errorTargetsInAPD) {
476
+ /* When APD is open, we need to remove the messages which are related to the objectpage context */
477
+ messageHandling.removeContextMessagesfromModel(messages, contexts);
478
+ }
479
+
480
+ // Filter out messages which are not related to the action parameter dialog in the edit mode and display mode
481
+ let containsBoundTransistion;
482
+ if (!(control !== null && control !== void 0 && control.getModel("ui").getProperty("/isEditable"))) {
483
+ if (isAPDOPen && errorTargetsInAPD) {
484
+ if ((unboundMessages === null || unboundMessages === void 0 ? void 0 : unboundMessages.length) === 0) {
485
+ containsBoundTransistion = false;
486
+ showMessageDialog = false;
487
+ }
488
+ messages = messageHandling.removeMessagesForActionParameterDialog(messages);
489
+ }
490
+ } else {
491
+ if ((unboundMessages === null || unboundMessages === void 0 ? void 0 : unboundMessages.length) === 0) {
492
+ containsBoundTransistion = false;
493
+ }
494
+ messages = messageHandling.removeMessagesForActionParameterDialog(messages);
495
+ }
496
+ return {
497
+ messagesToShow: messages,
498
+ containsBoundTransistion: containsBoundTransistion,
499
+ showMessageInDialog: showMessageDialog
500
+ };
501
+ }
482
502
  function actionParameterShowMessageCallback(mParameters, aContexts, oDialog, messages, showMessageParametersIn, showGenericErrorMessageForChangeSet, isActionSuccessful) {
483
503
  let showMessageBox = showMessageParametersIn.showMessageBox,
484
504
  showMessageDialog = showMessageParametersIn.showMessageDialog;
@@ -499,10 +519,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
499
519
  APDMessage.isAPDTarget = true;
500
520
  });
501
521
  const errorTargetsInAPD = APDmessages.length ? true : false;
502
- let hasChangeSetModifiedMessage = false;
503
522
  //If Action is successful with warnings, dont show the generic error message for changeset in dialog
504
523
  if (showGenericErrorMessageForChangeSet && !errorTargetsInAPD && !isActionSuccessful) {
505
- hasChangeSetModifiedMessage = true;
506
524
  let sMessage = oResourceBundle.getText("C_COMMON_DIALOG_CANCEL_ERROR_MESSAGES_TEXT");
507
525
  let sDescriptionText = oResourceBundle.getText("C_COMMON_DIALOG_CANCEL_ERROR_MESSAGES_DETAIL_TEXT");
508
526
  const messageModel = Messaging.getMessageModel();
@@ -576,35 +594,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
576
594
  oDialog.destroy();
577
595
  }
578
596
  }
579
- let filteredMessages = [];
597
+ const filteredMessages = [];
580
598
  const bIsAPDOpen = oDialog && oDialog.isOpen();
581
- if (!hasChangeSetModifiedMessage) {
582
- var _messages$0$getTarget, _messages$0$getTarget2;
583
- if (messages.length === 1 && messages[0].getTargets && ((_messages$0$getTarget = messages[0].getTargets()) === null || _messages$0$getTarget === void 0 ? void 0 : _messages$0$getTarget[0]) !== undefined && ((_messages$0$getTarget2 = messages[0].getTargets()) === null || _messages$0$getTarget2 === void 0 ? void 0 : _messages$0$getTarget2[0]) !== "" && messages[0].getType() === "Error") {
584
- if (oControl && oControl.getModel("ui").getProperty("/isEditable") === false || !oControl) {
585
- // OP edit or LR
586
- showMessageBox = !errorTargetsInAPD;
587
- showMessageDialog = false;
588
- } else if (oControl && oControl.getModel("ui").getProperty("/isEditable") === true) {
589
- showMessageBox = false;
590
- showMessageDialog = false;
591
- }
592
- } else if (oControl) {
593
- if (oControl.getModel("ui").getProperty("/isEditable") === false) {
594
- if (bIsAPDOpen && errorTargetsInAPD) {
595
- showMessageDialog = false;
596
- }
597
- } else if (oControl.getModel("ui").getProperty("/isEditable") === true) {
598
- if (!bIsAPDOpen && errorTargetsInAPD) {
599
- showMessageDialog = true;
600
- filteredMessages = unboundMessages.concat(APDmessages);
601
- } else if (!bIsAPDOpen && unboundMessages.length === 0) {
602
- // error targets in APD => there is atleast one bound message. If there are unbound messages, dialog must be shown.
603
- // for draft entity, we already closed the APD
604
- showMessageDialog = false;
605
- }
606
- }
607
- }
599
+ const {
600
+ messagesToShow,
601
+ containsBoundTransistion,
602
+ showMessageInDialog
603
+ } = filterAPDandContextMessages(messages, errorTargetsInAPD, aContexts, unboundMessages, oControl, bIsAPDOpen);
604
+ messages = messagesToShow;
605
+ showMessageDialog = showMessageInDialog ?? showMessageDialog;
606
+ if (!bIsAPDOpen && errorTargetsInAPD && !mParameters.bGrouped) {
607
+ // If APD is not open and there are messages related to APD, then show in the message dialog. since
608
+ showMessageDialog = true;
609
+ messages = messages.concat(APDmessages);
608
610
  }
609
611
  let fnGetMessageSubtitle;
610
612
  if (oControl && oControl.isA("sap.ui.mdc.Table")) {
@@ -615,587 +617,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
615
617
  showMessageDialog: showMessageDialog,
616
618
  filteredMessages: filteredMessages.length ? filteredMessages : messages,
617
619
  fnGetMessageSubtitle: fnGetMessageSubtitle,
618
- showChangeSetErrorDialog: mParameters.bGrouped
620
+ showChangeSetErrorDialog: mParameters.bGrouped,
621
+ containsBoundTransistion: containsBoundTransistion
619
622
  };
620
623
  }
621
-
622
- /*
623
- * Currently, this method is responsible for showing the dialog and executing the action. The promise returned is pending while waiting for user input, as well as while the
624
- * back-end request is running. The promise is rejected when the user cancels the dialog and also when the back-end request fails.
625
- * TODO: Refactoring: Separate dialog handling from backend processing. Dialog handling should return a Promise resolving to parameters to be provided to backend. If dialog is
626
- * cancelled, that promise can be rejected. Method responsible for backend processing need to deal with multiple contexts - i.e. it should either return an array of Promises or
627
- * a Promise resolving to an array. In the latter case, that Promise should be resolved also when some or even all contexts failed in backend - the overall process still was
628
- * successful.
629
- *
630
- */
631
-
632
- async function showActionParameterDialog(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, aParameterValues, oActionContext, oParentControl, entitySetName, messageHandler, strictHandlingUtilities, view, ignoreETag) {
633
- const sPath = _getPath(oActionContext, sActionName),
634
- metaModel = oActionContext.getModel(),
635
- entitySetContext = metaModel.createBindingContext(sPath),
636
- sActionNamePath = oActionContext.getObject("$IsBound") ? oActionContext.getPath().split("/@$ui5.overload/0")[0] : oActionContext.getPath().split("/0")[0],
637
- actionNameContext = metaModel.createBindingContext(sActionNamePath),
638
- bIsCreateAction = mParameters.isCreateAction,
639
- sFragmentName = "sap/fe/core/controls/ActionParameterDialog";
640
- return new Promise(async function (resolve, reject) {
641
- let actionParameterInfos; // to be filled after fragment (for action parameter dialog) is loaded. Actually only needed during dialog processing, i.e. could be moved into the controller and directly initialized there, but only after moving all handlers (esp. press handler for action button) to controller.
642
-
643
- const _removeMessagesForActionParamter = parameter => {
644
- if (parameter) {
645
- const allMessages = Messaging.getMessageModel().getData();
646
- const controlId = generate(["APD_", parameter.name]);
647
- // also remove messages assigned to inner controls, but avoid removing messages for different paramters (with name being substring of another parameter name)
648
- const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(id => controlId.split("-").includes(id)));
649
- Messaging.removeMessages(relevantMessages);
650
- }
651
- };
652
- const oController = {
653
- handleChange: async function (oEvent) {
654
- const field = oEvent.getSource();
655
- const actionParameterInfo = actionParameterInfos.find(actionParameterInfo => actionParameterInfo.field === field);
656
- // field value is being changed, thus existing messages related to that field are not valid anymore
657
- _removeMessagesForActionParamter(actionParameterInfo.parameter);
658
- // adapt info. Promise is resolved to value or rejected with exception containing message
659
- actionParameterInfo.validationPromise = oEvent.getParameter("promise");
660
- try {
661
- actionParameterInfo.value = await actionParameterInfo.validationPromise;
662
- actionParameterInfo.hasError = false;
663
- } catch (error) {
664
- delete actionParameterInfo.value;
665
- actionParameterInfo.hasError = true;
666
- ActionRuntime._addMessageForActionParameter([{
667
- actionParameterInfo: actionParameterInfo,
668
- message: error.message
669
- }]);
670
- }
671
- }
672
- };
673
- const oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
674
- const oParameterModel = new JSONModel({
675
- $displayMode: {}
676
- });
677
- try {
678
- const createdFragment = await XMLPreprocessor.process(oFragment, {
679
- name: sFragmentName
680
- }, {
681
- bindingContexts: {
682
- action: oActionContext,
683
- actionName: actionNameContext,
684
- entitySet: entitySetContext
685
- },
686
- models: {
687
- action: oActionContext.getModel(),
688
- actionName: actionNameContext === null || actionNameContext === void 0 ? void 0 : actionNameContext.getModel(),
689
- entitySet: entitySetContext === null || entitySetContext === void 0 ? void 0 : entitySetContext.getModel(),
690
- metaModel: entitySetContext === null || entitySetContext === void 0 ? void 0 : entitySetContext.getModel()
691
- }
692
- });
693
- // TODO: move the dialog into the fragment and move the handlers to the oController
694
- const aContexts = mParameters.aContexts || [];
695
- const aFunctionParams = [];
696
- await CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true);
697
- const oDialogContent = await Fragment.load({
698
- definition: createdFragment,
699
- controller: oController
700
- });
701
- actionParameterInfos = aActionParameters.map(actionParameter => {
702
- const field = Element.getElementById(generate(["APD_", actionParameter.name]));
703
- const isMultiValue = field.isA("sap.ui.mdc.MultiValueField");
704
- return {
705
- parameter: actionParameter,
706
- field: field,
707
- isMultiValue: isMultiValue,
708
- hasError: false
709
- };
710
- });
711
- const resourceModel = getResourceModel(oParentControl);
712
- let actionResult = {
713
- dialogCancelled: true,
714
- // to be set to false in case of successful action exection
715
- result: undefined
716
- };
717
- let buttonLock = false;
718
- const oDialog = new Dialog(generate(["fe", "APD_", sActionName]), {
719
- title: sActionLabel || resourceModel.getText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_TITLE"),
720
- content: [oDialogContent],
721
- escapeHandler: function () {
722
- // escape handler is meant to possibly suppress or postpone closing the dialog on escape (by calling "reject" on the provided object, or "resolve" only when
723
- // done with all tasks to happen before dialog can be closed). It's not intended to explicetly close the dialog here (that happens automatically when no
724
- // escapeHandler is provided or the resolve-callback is called) or for own wrap up tasks (like removing validition messages - this should happen in the
725
- // afterClose).
726
- // TODO: Move wrap up tasks to afterClose, and remove this method completely. Take care to also adapt end button press handler accordingly.
727
- // Currently only still needed to differentiate closing dialog after successful execution (uses resolve) from user cancellation (using reject)
728
- oDialog.close();
729
- // reject(Constants.CancelActionDialog);
730
- },
731
-
732
- beginButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Ok"]), {
733
- text: bIsCreateAction ? resourceModel.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON") : _getActionParameterActionName(resourceModel, sActionLabel, sActionName, entitySetName),
734
- type: "Emphasized",
735
- press: async function () {
736
- try {
737
- // prevent multiple press events. The BusyLocker is not fast enough. (BCP: 2370130210)
738
- // buttonLock is set once and reset in
739
- // - after validation error
740
- // - in case of action error message is canceled
741
- // - in afterClose event
742
-
743
- if (buttonLock === true) {
744
- return;
745
- }
746
- buttonLock = true;
747
- if (!(await ActionRuntime.validateProperties(actionParameterInfos, resourceModel))) {
748
- buttonLock = false;
749
- return;
750
- }
751
- BusyLocker.lock(oDialog);
752
- let failedContexts = [];
753
- try {
754
- // TODO: due to using the search and value helps on the action dialog transient messages could appear
755
- // we need an UX design for those to show them to the user - for now remove them before continuing
756
- messageHandler.removeTransitionMessages();
757
- // move parameter values from Dialog (SimpleForm) to mParameters.actionParameters so that they are available in the operation bindings for all contexts
758
- let vParameterValue;
759
- let allNullParameters = true;
760
- const oParameterContext = oOperationBinding && oOperationBinding.getParameterContext();
761
- for (const i in aActionParameters) {
762
- if (aActionParameters[i].isCollection) {
763
- const aMVFContent = oDialog.getModel("mvfview").getProperty(`/${aActionParameters[i].name}`),
764
- aKeyValues = [];
765
- for (const j in aMVFContent) {
766
- aKeyValues.push(aMVFContent[j].Key);
767
- }
768
- vParameterValue = aKeyValues;
769
- } else {
770
- vParameterValue = oParameterContext === null || oParameterContext === void 0 ? void 0 : oParameterContext.getProperty(aActionParameters[i].name);
771
- }
772
- mParameters.defaultParametersValues[aActionParameters[i].name] = vParameterValue;
773
- if (vParameterValue !== null && vParameterValue !== undefined) {
774
- allNullParameters = false;
775
- }
776
- vParameterValue = undefined;
777
- }
778
- if (!allNullParameters) {
779
- oAppComponent.getModel("ui").setProperty(UiModelConstants.DocumentModified, true);
780
- }
781
- // avoid overriding incoming parameters
782
- const innerParameters = Object.assign({}, mParameters);
783
- innerParameters.label = sActionLabel;
784
- try {
785
- const aResult = await executeAPMAction(oAppComponent, innerParameters, oParentControl, messageHandler, aContexts, oDialog, false, strictHandlingUtilities, ignoreETag);
786
- actionResult = {
787
- dialogCancelled: false,
788
- result: aResult
789
- };
790
- oDialog.close();
791
- // resolve(aResult);
792
- } catch (oError) {
793
- const messages = Messaging.getMessageModel().getData();
794
- if (strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
795
- strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
796
- }
797
- throw oError;
798
- } finally {
799
- if (strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
800
- try {
801
- failedContexts = strictHandlingUtilities.strictHandlingTransitionFails.map(fail => fail.oAction.getContext());
802
- innerParameters.aContexts = failedContexts;
803
- const aResult = await executeAPMAction(oAppComponent, innerParameters, oParentControl, messageHandler, aContexts, oDialog, true, strictHandlingUtilities, ignoreETag);
804
- strictHandlingUtilities.strictHandlingTransitionFails = [];
805
- actionResult = {
806
- dialogCancelled: false,
807
- result: aResult
808
- };
809
- // resolve(aResult);
810
- } catch {
811
- if (strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
812
- Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
813
- }
814
- let showGenericErrorMessageForChangeSet = false;
815
- if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
816
- showGenericErrorMessageForChangeSet = true;
817
- }
818
- await messageHandler.showMessageDialog({
819
- isActionParameterDialogOpen: oDialog.isOpen(),
820
- forceShowUIElement: oDialog.isOpen(),
821
- onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
822
- return actionParameterShowMessageCallback(innerParameters, aContexts, oDialog, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet);
823
- },
824
- aSelectedContexts: undefined,
825
- // not used at all
826
- sActionName: sActionLabel
827
- });
828
- }
829
- }
830
- if (BusyLocker.isLocked(oDialog)) {
831
- BusyLocker.unlock(oDialog);
832
- }
833
- }
834
- } catch (oError) {
835
- let showMessageDialog = true;
836
- let showGenericErrorMessageForChangeSet = false;
837
- if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
838
- showGenericErrorMessageForChangeSet = true;
839
- }
840
- await messageHandler.showMessages({
841
- context: failedContexts[0],
842
- // only used in case of failed context to reset in messageHandling showMessagesInUI
843
- isActionParameterDialogOpen: oDialog.isOpen(),
844
- forceShowUIElement: oDialog.isOpen(),
845
- messagePageNavigationCallback: function () {
846
- oDialog.close();
847
- },
848
- onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
849
- // Why is this implemented as callback? Apparently, all needed information is available beforehand
850
- // TODO: refactor accordingly
851
- const showMessageParameters = actionParameterShowMessageCallback(mParameters, aContexts, oDialog, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet);
852
- showMessageDialog = showMessageParameters.showMessageDialog;
853
- return showMessageParameters;
854
- },
855
- aSelectedContexts: undefined,
856
- // not used at all!
857
- sActionName: sActionLabel,
858
- control: mParameters.control
859
- });
860
- buttonLock = false; //needed if the action fails with an error popup and this one is canceld (Journey: 412WarningHandling)
861
- // In case of backend validation error(s?), message shall not be shown in message dialog but next to the field on parameter dialog, which should
862
- // stay open in this case => in this case, we must not resolve or reject the promise controlling the parameter dialog.
863
- // In all other cases (e.g. other backend errors or user cancellation), the promise controlling the parameter dialog needs to be rejected to allow
864
- // callers to react. (Example: If creation in backend after navigation to transient context fails, back navigation needs to be triggered)
865
- // TODO: Refactor to separate dialog handling from backend request instead of taking decision based on message handling
866
- if (showMessageDialog) {
867
- if (oDialog.isOpen()) {
868
- // do nothing, do not reject promise here
869
- // We do not close the APM dialog if user enters a wrong value in of the fields that results in an error from the backend.
870
- // The user can close the message dialog and the APM dialog would still be open on which he could enter a new value and trigger the action again.
871
- // Earlier we were rejecting the promise on error here, and the call stack was destroyed as the promise was rejected and returned to EditFlow invoke action.
872
- // But since the APM dialog was still open, a new promise was resolved in case the user retried the action and the object was created, but the navigation to object page was not taking place.
873
- } else {
874
- reject(oError);
875
- }
876
- }
877
- }
878
- } finally {
879
- messageHandler.clearStrictWarningMessages();
880
- strictHandlingUtilities = {
881
- is412Executed: false,
882
- strictHandlingTransitionFails: [],
883
- strictHandlingPromises: [],
884
- strictHandlingWarningMessages: [],
885
- delaySuccessMessages: [],
886
- processedMessageIds: new Set()
887
- };
888
- if (BusyLocker.isLocked(oDialog)) {
889
- BusyLocker.unlock(oDialog);
890
- }
891
- }
892
- }
893
- }),
894
- endButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Cancel"]), {
895
- text: resourceModel.getText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL"),
896
- press: function () {
897
- // TODO: cancel button should just close the dialog (similar to using escape). All wrap up tasks should be moved to afterClose.
898
- oDialog.close();
899
- // reject(Constants.CancelActionDialog);
900
- }
901
- }),
902
-
903
- // TODO: beforeOpen is just an event, i.e. not waiting for the Promise to be resolved. Check if tasks of this function need to be done before opening the dialog
904
- // - if yes, they need to be moved outside.
905
- // Assumption: Sometimes dialog can be seen without any fields for a short time - maybe this is caused by this asynchronity
906
- beforeOpen: async function (oEvent) {
907
- // clone event for actionWrapper as oEvent.oSource gets lost during processing of beforeOpen event handler
908
- const oCloneEvent = Object.assign({}, oEvent);
909
- const hasVisibleParameter = actionParameterInfos.some(info => info.field.getVisible());
910
- messageHandler.removeTransitionMessages();
911
- const getDefaultValuesFunction = function () {
912
- const oMetaModel = oDialog.getModel().getMetaModel(),
913
- sActionPath = oActionContext.getPath() && oActionContext.getPath().split("/@")[0],
914
- sDefaultValuesFunction = oMetaModel.getObject(`${sActionPath}@com.sap.vocabularies.Common.v1.DefaultValuesFunction`);
915
- return sDefaultValuesFunction;
916
- };
917
- const fnSetDefaultsAndOpenDialog = async function (sBindingParameter) {
918
- const sBoundFunctionName = getDefaultValuesFunction();
919
- const parameterModelData = oParameterModel.getData();
920
- const prefillParameter = async function (sParamName, vParamDefaultValue) {
921
- // Case 1: There is a ParameterDefaultValue annotation
922
- if (vParamDefaultValue !== undefined) {
923
- if (aContexts.length > 0 && typeof vParamDefaultValue === "object" && vParamDefaultValue.$Path) {
924
- try {
925
- let vParamValue = await CommonUtils.requestSingletonProperty(vParamDefaultValue.$Path, oOperationBinding.getModel());
926
- if (vParamValue === null) {
927
- vParamValue = await oOperationBinding.getParameterContext().requestProperty(vParamDefaultValue.$Path);
928
- }
929
- if (aContexts.length > 1) {
930
- // For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
931
- let sPathForContext = vParamDefaultValue.$Path;
932
- if (sPathForContext.indexOf(`${sBindingParameter}/`) === 0) {
933
- sPathForContext = sPathForContext.replace(`${sBindingParameter}/`, "");
934
- }
935
- for (let i = 1; i < aContexts.length; i++) {
936
- if (aContexts[i].getProperty(sPathForContext) !== vParamValue) {
937
- // if the values from the contexts are not all the same, do not prefill
938
- return {
939
- paramName: sParamName,
940
- value: undefined,
941
- bNoPossibleValue: true
942
- };
943
- }
944
- }
945
- }
946
- return {
947
- paramName: sParamName,
948
- value: vParamValue
949
- };
950
- } catch (oError) {
951
- Log.error("Error while reading default action parameter", sParamName, mParameters.actionName);
952
- return {
953
- paramName: sParamName,
954
- value: undefined,
955
- bLatePropertyError: true
956
- };
957
- }
958
- } else {
959
- // Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
960
- return {
961
- paramName: sParamName,
962
- value: vParamDefaultValue
963
- };
964
- }
965
- } else if (parameterModelData.hasOwnProperty(sParamName)) {
966
- // Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
967
-
968
- return {
969
- paramName: sParamName,
970
- value: parameterModelData[sParamName]
971
- };
972
- } else {
973
- return {
974
- paramName: sParamName,
975
- value: undefined
976
- };
977
- }
978
- };
979
- const getParameterDefaultValue = function (sParamName) {
980
- const oMetaModel = oDialog.getModel().getMetaModel(),
981
- sActionParameterAnnotationPath = CommonUtils.getParameterPath(oActionContext.getPath(), sParamName) + "@",
982
- oParameterAnnotations = oMetaModel.getObject(sActionParameterAnnotationPath),
983
- oParameterDefaultValue = oParameterAnnotations && oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
984
- return oParameterDefaultValue;
985
- };
986
- const aCurrentParamDefaultValue = [];
987
- let sParamName, vParameterDefaultValue;
988
- for (const i in aActionParameters) {
989
- sParamName = aActionParameters[i].name;
990
- vParameterDefaultValue = getParameterDefaultValue(sParamName);
991
- aCurrentParamDefaultValue.push(prefillParameter(sParamName, vParameterDefaultValue));
992
- }
993
- if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
994
- if (sBoundFunctionName && sBoundFunctionName.length > 0 && typeof sBoundFunctionName === "string") {
995
- for (const i in aContexts) {
996
- aFunctionParams.push(operations.callBoundFunction(sBoundFunctionName, aContexts[i], mParameters.model));
997
- }
998
- }
999
- }
1000
- const aPrefillParamPromises = Promise.all(aCurrentParamDefaultValue);
1001
- let aExecFunctionPromises = Promise.resolve([]);
1002
- let oExecFunctionFromManifestPromise;
1003
- if (aFunctionParams && aFunctionParams.length > 0) {
1004
- aExecFunctionPromises = Promise.all(aFunctionParams);
1005
- }
1006
- if (mParameters.defaultValuesExtensionFunction) {
1007
- const sModule = mParameters.defaultValuesExtensionFunction.substring(0, mParameters.defaultValuesExtensionFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
1008
- sFunctionName = mParameters.defaultValuesExtensionFunction.substring(mParameters.defaultValuesExtensionFunction.lastIndexOf(".") + 1, mParameters.defaultValuesExtensionFunction.length);
1009
- oExecFunctionFromManifestPromise = FPMHelper.actionWrapper(oCloneEvent, sModule, sFunctionName, {
1010
- contexts: aContexts
1011
- });
1012
- }
1013
- try {
1014
- const aPromises = await Promise.all([aPrefillParamPromises, aExecFunctionPromises, oExecFunctionFromManifestPromise]);
1015
- const currentParamDefaultValue = aPromises[0];
1016
- const functionParams = aPromises[1];
1017
- const oFunctionParamsFromManifest = aPromises[2];
1018
- let sDialogParamName;
1019
-
1020
- // Fill the dialog with the earlier determined parameter values from the different sources
1021
- for (const i in aActionParameters) {
1022
- if (aActionParameters[i].name !== "ResultIsActiveEntity") {
1023
- var _aParameterValues$fin2;
1024
- sDialogParamName = aActionParameters[i].name;
1025
- // Parameter values provided in the call of invokeAction overrule other sources
1026
- const vParameterProvidedValue = aParameterValues === null || aParameterValues === void 0 ? void 0 : (_aParameterValues$fin2 = aParameterValues.find(element => element.name === aActionParameters[i].name)) === null || _aParameterValues$fin2 === void 0 ? void 0 : _aParameterValues$fin2.value;
1027
- if (vParameterProvidedValue) {
1028
- oOperationBinding.setParameter(aActionParameters[i].name, vParameterProvidedValue);
1029
- } else if (oFunctionParamsFromManifest && oFunctionParamsFromManifest.hasOwnProperty(sDialogParamName)) {
1030
- oOperationBinding.setParameter(aActionParameters[i].name, oFunctionParamsFromManifest[sDialogParamName]);
1031
- } else if (currentParamDefaultValue[i] && currentParamDefaultValue[i].value !== undefined) {
1032
- oOperationBinding.setParameter(aActionParameters[i].name, currentParamDefaultValue[i].value);
1033
- // if the default value had not been previously determined due to different contexts, we do nothing else
1034
- } else if (sBoundFunctionName && !currentParamDefaultValue[i].bNoPossibleValue) {
1035
- if (aContexts.length > 1) {
1036
- // we check if the function retrieves the same param value for all the contexts:
1037
- let j = 0;
1038
- while (j < aContexts.length - 1) {
1039
- if (functionParams[j] && functionParams[j + 1] && functionParams[j].getObject(sDialogParamName) === functionParams[j + 1].getObject(sDialogParamName)) {
1040
- j++;
1041
- } else {
1042
- break;
1043
- }
1044
- }
1045
- //param values are all the same:
1046
- if (j === aContexts.length - 1 && functionParams[j].getObject(sDialogParamName) !== undefined) {
1047
- oOperationBinding.setParameter(aActionParameters[i].name, functionParams[j].getObject(sDialogParamName));
1048
- }
1049
- } else if (functionParams[0] && functionParams[0].getObject(sDialogParamName) !== undefined) {
1050
- //Only one context, then the default param values are to be verified from the function:
1051
-
1052
- oOperationBinding.setParameter(aActionParameters[i].name, functionParams[0].getObject(sDialogParamName));
1053
- }
1054
- }
1055
- }
1056
- }
1057
- const bErrorFound = currentParamDefaultValue.some(function (oValue) {
1058
- if (oValue.bLatePropertyError) {
1059
- return oValue.bLatePropertyError;
1060
- }
1061
- });
1062
- const refresh = resourceModel.getText("C_COMMON_SAPFE_REFRESH");
1063
- const close = function (action) {
1064
- if (action === refresh) {
1065
- const extensionAPI = view === null || view === void 0 ? void 0 : view.getController().getExtensionAPI();
1066
- extensionAPI.refresh();
1067
- }
1068
- };
1069
-
1070
- // If at least one Default Property is a Late Property and an eTag error was raised.
1071
- if (bErrorFound) {
1072
- const sText = resourceModel.getText("C_APP_COMPONENT_SAPFE_ETAG_LATE_PROPERTY");
1073
- MessageBox.warning(sText, {
1074
- actions: [refresh, MessageBox.Action.OK],
1075
- emphasizedAction: refresh,
1076
- onClose: function (action) {
1077
- close(action);
1078
- },
1079
- contentWidth: "25em"
1080
- });
1081
- } else if (!hasVisibleParameter) {
1082
- // We execute the action if all parameters are hidden, otherwise all mandatory parameters without values are shown in the dialog
1083
- const beginButton = oDialog.getBeginButton();
1084
- beginButton.firePress();
1085
- }
1086
- } catch (oError) {
1087
- Log.error("Error while retrieving the parameter", oError);
1088
- // Remove messages relating to the function for default values as they aren't helpful for a user
1089
- messageHandler.removeTransitionMessages();
1090
- }
1091
- };
1092
- const fnAsyncBeforeOpen = async function () {
1093
- if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
1094
- const aParameters = oActionContext.getObject("$Parameter");
1095
- const sBindingParameter = aParameters[0] && aParameters[0].$Name;
1096
- try {
1097
- const oContextObject = await aContexts[0].requestObject();
1098
- if (oContextObject) {
1099
- oOperationBinding.setParameter(sBindingParameter, oContextObject);
1100
- }
1101
- await fnSetDefaultsAndOpenDialog(sBindingParameter);
1102
- } catch (oError) {
1103
- Log.error("Error while retrieving the parameter", oError);
1104
- }
1105
- } else {
1106
- await fnSetDefaultsAndOpenDialog();
1107
- }
1108
- };
1109
- await fnAsyncBeforeOpen();
1110
-
1111
- // adding defaulted values only here after they are not set to the fields
1112
- for (const actionParameterInfo of actionParameterInfos) {
1113
- const value = actionParameterInfo.isMultiValue ? actionParameterInfo.field.getItems() : actionParameterInfo.field.getValue();
1114
- actionParameterInfo.value = value;
1115
- actionParameterInfo.validationPromise = Promise.resolve(value);
1116
- }
1117
- },
1118
- afterClose: function () {
1119
- // when the dialog is cancelled, messages need to be removed in case the same action should be executed again
1120
- aActionParameters.forEach(_removeMessagesForActionParamter);
1121
- oDialog.destroy();
1122
- buttonLock = false; //needed here, not in the press events finally clause. In case the UI is sluggish, begin button could be pressed again.
1123
- if (actionResult.dialogCancelled) {
1124
- reject(Constants.CancelActionDialog);
1125
- } else {
1126
- resolve(actionResult.result);
1127
- }
1128
- }
1129
- });
1130
- mParameters.oDialog = oDialog;
1131
- oDialog.setModel(mParameters.model);
1132
- oDialog.setModel(oParameterModel, "paramsModel");
1133
- oDialog.bindElement({
1134
- path: "/",
1135
- model: "paramsModel"
1136
- });
1137
-
1138
- // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
1139
- const oMVFModel = new JSONModel({});
1140
- oDialog.setModel(oMVFModel, "mvfview");
1141
-
1142
- /* Event needed for removing messages of valid changed field */
1143
- for (const actionParameterInfo of actionParameterInfos) {
1144
- if (actionParameterInfo.isMultiValue) {
1145
- var _actionParameterInfo$, _actionParameterInfo$2;
1146
- actionParameterInfo === null || actionParameterInfo === void 0 ? void 0 : (_actionParameterInfo$ = actionParameterInfo.field) === null || _actionParameterInfo$ === void 0 ? void 0 : (_actionParameterInfo$2 = _actionParameterInfo$.getBinding("items")) === null || _actionParameterInfo$2 === void 0 ? void 0 : _actionParameterInfo$2.attachChange(() => {
1147
- _removeMessagesForActionParamter(actionParameterInfo.parameter);
1148
- });
1149
- } else {
1150
- var _actionParameterInfo$3, _actionParameterInfo$4;
1151
- actionParameterInfo === null || actionParameterInfo === void 0 ? void 0 : (_actionParameterInfo$3 = actionParameterInfo.field) === null || _actionParameterInfo$3 === void 0 ? void 0 : (_actionParameterInfo$4 = _actionParameterInfo$3.getBinding("value")) === null || _actionParameterInfo$4 === void 0 ? void 0 : _actionParameterInfo$4.attachChange(() => {
1152
- _removeMessagesForActionParamter(actionParameterInfo.parameter);
1153
- });
1154
- }
1155
- }
1156
- let sActionPath = `${sActionName}(...)`;
1157
- if (!aContexts.length) {
1158
- sActionPath = `/${sActionPath}`;
1159
- }
1160
- oDialog.bindElement({
1161
- path: sActionPath
1162
- });
1163
- if (oParentControl) {
1164
- // if there is a parent control specified add the dialog as dependent
1165
- oParentControl.addDependent(oDialog);
1166
- }
1167
- if (aContexts.length > 0) {
1168
- oDialog.setBindingContext(aContexts[0]); // use context of first selected line item
1169
- }
1170
-
1171
- const oOperationBinding = oDialog.getObjectBinding();
1172
- oDialog.open();
1173
- } catch (oError) {
1174
- reject(oError);
1175
- }
1176
- });
1177
- }
1178
- function _getActionParameterActionName(resourceModel, sActionLabel, sActionName, sEntitySetName) {
1179
- let boundActionName = sActionName;
1180
- const aActionName = boundActionName.split(".");
1181
- boundActionName = boundActionName.includes(".") ? aActionName[aActionName.length - 1] : boundActionName;
1182
- const suffixResourceKey = boundActionName && sEntitySetName ? `${sEntitySetName}|${boundActionName}` : "";
1183
- const sKey = "ACTION_PARAMETER_DIALOG_ACTION_NAME";
1184
- const bResourceKeyExists = resourceModel.checkIfResourceKeyExists(`${sKey}|${suffixResourceKey}`);
1185
- if (sActionLabel) {
1186
- if (bResourceKeyExists) {
1187
- return resourceModel.getText(sKey, undefined, suffixResourceKey);
1188
- } else if (resourceModel.checkIfResourceKeyExists(`${sKey}|${sEntitySetName}`)) {
1189
- return resourceModel.getText(sKey, undefined, `${sEntitySetName}`);
1190
- } else if (resourceModel.checkIfResourceKeyExists(`${sKey}`)) {
1191
- return resourceModel.getText(sKey);
1192
- } else {
1193
- return sActionLabel;
1194
- }
1195
- } else {
1196
- return resourceModel.getText("C_COMMON_DIALOG_OK");
1197
- }
1198
- }
1199
624
  async function executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, internalOperationsPromiseResolve, internalOperationsPromiseReject, strictHandlingUtilities, ignoreETag) {
1200
625
  let oActionPromise,
1201
626
  bEnableStrictHandling = true;
@@ -1243,7 +668,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
1243
668
  }
1244
669
  /**
1245
670
  * Updates the strictHandling utilities with the failed and successful transition messages.
1246
- *
1247
671
  * @param action Action executed
1248
672
  * @param groupId GroupId of the batch
1249
673
  * @param strictHandlingUtilities Utility flags and messages for strictHandling
@@ -1381,7 +805,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
1381
805
  await Promise.allSettled(aChangeSetLocalPromises);
1382
806
  if (strictHandlingUtilities.strictHandlingPromises.length) {
1383
807
  try {
1384
- if (!messageHandling.hasTransitionErrorsOrWarnings()) {
808
+ if (!messageHandling.hasTransitionErrorsOrWarnings() && strictHandlingUtilities.strictHandlingWarningMessages.length) {
1385
809
  await operationsHelper.renderMessageView(mParameters, resourceModel, messageHandler, strictHandlingUtilities.strictHandlingWarningMessages, strictHandlingUtilities, aContexts.length > 1);
1386
810
  } else {
1387
811
  strictHandlingUtilities.strictHandlingPromises.forEach(function (shPromise) {
@@ -1421,7 +845,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
1421
845
  await processOneAction(context, id + 1, aContexts.length);
1422
846
  }, Promise.resolve());
1423
847
  if (strictHandlingUtilities.strictHandlingPromises.length) {
1424
- await operationsHelper.renderMessageView(mParameters, resourceModel, messageHandler, strictHandlingUtilities.strictHandlingWarningMessages, strictHandlingUtilities, aContexts.length > 1);
848
+ if (strictHandlingUtilities.strictHandlingWarningMessages.length) {
849
+ await operationsHelper.renderMessageView(mParameters, resourceModel, messageHandler, strictHandlingUtilities.strictHandlingWarningMessages, strictHandlingUtilities, aContexts.length > 1);
850
+ } else {
851
+ strictHandlingUtilities.strictHandlingPromises.forEach(function (shPromise) {
852
+ shPromise.resolve(false);
853
+ });
854
+ }
1425
855
  }
1426
856
  fnHandleResults();
1427
857
  }
@@ -1486,11 +916,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
1486
916
  });
1487
917
  }
1488
918
  }
1489
- function _getPath(oActionContext, sActionName) {
1490
- let sPath = oActionContext.getPath();
1491
- sPath = oActionContext.getObject("$IsBound") ? sPath.split("@$ui5.overload")[0] : sPath.split("/0")[0];
1492
- return sPath.split(`/${sActionName}`)[0];
1493
- }
1494
919
  function _valuesProvidedForAllMandatoryParameters(isCreateAction, actionParameters, parameterValues, startupParameters) {
1495
920
  const hiddenAnnotationSetOnAllActions = actionParameters.every(parameter => {
1496
921
  var _parameter$annotation3, _parameter$annotation4, _parameter$annotation5;
@@ -1550,7 +975,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
1550
975
 
1551
976
  /**
1552
977
  * Static functions to call OData actions (bound/import) and functions (bound/import)
1553
- *
1554
978
  * @namespace
1555
979
  * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
1556
980
  * @since 1.56.0
@@ -1563,11 +987,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
1563
987
  executeDependingOnSelectedContexts: executeDependingOnSelectedContexts,
1564
988
  createinternalOperationsPromiseForActionExecution: createinternalOperationsPromiseForActionExecution,
1565
989
  valuesProvidedForAllMandatoryParameters: _valuesProvidedForAllMandatoryParameters,
1566
- getActionParameterActionName: _getActionParameterActionName,
1567
990
  actionParameterShowMessageCallback: actionParameterShowMessageCallback,
1568
991
  afterActionResolution: afterActionResolution,
1569
- fnRequestSideEffects: fnRequestSideEffects
992
+ fnRequestSideEffects: fnRequestSideEffects,
993
+ checkParameterTypeAndReturnConvertedValue: checkParameterTypeAndReturnConvertedValue
1570
994
  };
1571
995
  return operations;
1572
996
  }, false);
1573
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zdGFudHMiLCJGRUxpYnJhcnkiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJBY3Rpb24iLCJNZXNzYWdlQm94IiwiY2FsbEJvdW5kQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJjb250ZXh0cyIsIm9Nb2RlbCIsIm9BcHBDb21wb25lbnQiLCJtUGFyYW1ldGVycyIsImxlbmd0aCIsIkVycm9yIiwiaXNDYWxsZWRXaXRoQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJhQ29udGV4dHMiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImlzQ3JpdGljYWxBY3Rpb24iLCJBY3Rpb25SdW50aW1lIiwiZ2V0SXNBY3Rpb25Dcml0aWNhbCIsImV4dHJhY3RTaW5nbGVSZXN1bHQiLCJyZXN1bHQiLCJzdGF0dXMiLCJ2YWx1ZSIsInJlYXNvbiIsImNvbnZlcnRlZFR5cGVzIiwiY29udmVydFR5cGVzIiwiY29udmVydGVkQWN0aW9uIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJjYWxsQWN0aW9uIiwiZSIsImNhbGxBY3Rpb25JbXBvcnQiLCJhY3Rpb25OYW1lIiwibW9kZWwiLCJhcHBDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwibWV0YU1vZGVsIiwiYWN0aW9uUGF0aCIsImNvbnZlcnRlZEFjdGlvbkltcG9ydCIsImFjdGlvbiIsInVuYm91bmRBY3Rpb25JbmRleCIsImFjdGlvbnMiLCJmaWx0ZXIiLCJuYW1lIiwiZmluZEluZGV4IiwiaXNCb3VuZCIsImFjdGlvbk5hbWVGcm9tTW9kZWwiLCJhY3Rpb25JbXBvcnQiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0IiwiUHJvbWlzZSIsInJlamVjdCIsInNGdW5jdGlvblBhdGgiLCJvQm91bmRGdW5jdGlvbiIsIl9leGVjdXRlRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9GdW5jdGlvbkltcG9ydCIsImdldE9iamVjdCIsIm9GdW5jdGlvbiIsImZ1bmN0aW9uVG9DYWxsIiwiZ3JvdXBJZCIsImV4ZWN1dGlvblByb21pc2UiLCJleGVjdXRlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwic3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMiLCJpczQxMkV4ZWN1dGVkIiwic3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMiLCJzdHJpY3RIYW5kbGluZ1Byb21pc2VzIiwic3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMiLCJkZWxheVN1Y2Nlc3NNZXNzYWdlcyIsInByb2Nlc3NlZE1lc3NhZ2VJZHMiLCJTZXQiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJyZXBsYWNlIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJyZXNvbHZlIiwiZm5EaWFsb2ciLCJzQWN0aW9uTGFiZWwiLCJsYWJlbCIsImJTa2lwUGFyYW1ldGVyRGlhbG9nIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc0NyaXRpY2FsQWN0aW9uIiwic01lc3NhZ2VzUGF0aCIsImlNZXNzYWdlU2lkZUVmZmVjdCIsImlzU2FtZUVudGl0eSIsImJWYWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMiLCJhY3Rpb25EZWZpbml0aW9uIiwiYWN0aW9uUGFyYW1ldGVycyIsInNsaWNlIiwiYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nIiwiYVBhcmFtZXRlclZhbHVlcyIsInBhcmFtZXRlclZhbHVlcyIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwiZXZlcnkiLCJwYXJhbWV0ZXIiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsIl92YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwiY29uZmlybUNyaXRpY2FsQWN0aW9uIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJkZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsImZuT25TdWJtaXR0ZWQiLCJvblN1Ym1pdHRlZCIsImZuT25SZXNwb25zZSIsIm9uUmVzcG9uc2UiLCJhQWN0aW9uUGFyYW1ldGVycyIsImJHZXRCb3VuZENvbnRleHQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJzZWxlY3RlZEl0ZW1zIiwiY29udmVydGVkTWV0YURhdGEiLCJmaWx0ZXJlZEVudGl0eVNldCIsImVudGl0eVNldHMiLCJzaW5nbGVFbnRpdHlTZXQiLCJlbnRpdHlUeXBlIiwicmV0dXJuRW50aXR5VHlwZSIsImN1cnJlbnRFbnRpdHlTZXQiLCJ1bmRlZmluZWQiLCJyZXR1cm5Db2xsZWN0aW9uIiwic291cmNlRW50aXR5VHlwZSIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFJvb3QiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkc2VsZWN0IiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJwYXRoRXhwcmVzc2lvbnMiLCJnZXRNZXNzYWdlc1BhdGgiLCJleHAiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZmluZCIsInByb3BlcnR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInB1c2giLCJ0cmlnZ2VyQWN0aW9ucyIsInNwbGljZSIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiaXNDcmVhdGVBY3Rpb24iLCJiT2JqZWN0UGFnZSIsImRpc2FibGVTdHJpY3RIYW5kbGluZyIsImNvbnRyb2xJZCIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImlzU3RhdGljIiwiaXNDb2xsZWN0aW9uIiwib3BlcmF0aW9uUmVzdWx0IiwiZW50aXR5U2V0TmFtZSIsIm1lc3NhZ2VIYW5kbGVyIiwidmlldyIsImlnbm9yZUVUYWciLCJhZnRlckFjdGlvblJlc29sdXRpb24iLCJpIiwiZWxlbWVudCIsIlBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsIm9PcGVyYXRpb25SZXN1bHQiLCJfZXhlY3V0ZUFjdGlvbiIsIm1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImNvbmNhdCIsInN0cmljdEhhbmRsaW5nRmFpbHMiLCJhRmFpbGVkQ29udGV4dHMiLCJmb3JFYWNoIiwiZmFpbCIsImdldENvbnRleHQiLCJvRmFpbGVkT3BlcmF0aW9uUmVzdWx0IiwiYWRkTWVzc2FnZXMiLCJzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCIsIm1lc3NhZ2VIYW5kbGluZyIsImhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzIiwiaXNBY3Rpb25TdWNjZXNzZnVsIiwicmVzIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJvbkJlZm9yZVNob3dNZXNzYWdlIiwiYU1lc3NhZ2VzIiwic2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4iLCJhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJ0aGVuIiwiY2xlYXJTdHJpY3RXYXJuaW5nTWVzc2FnZXMiLCJvQWN0aW9uQ29udGV4dCIsIm9QYXJlbnRDb250cm9sIiwiYm91bmRBY3Rpb25OYW1lIiwic3VmZml4UmVzb3VyY2VLZXkiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInNDb25maXJtYXRpb25UZXh0IiwiZ2V0VGV4dCIsImNvbmZpcm0iLCJvbkNsb3NlIiwic0FjdGlvbiIsIk9LIiwib09wZXJhdGlvbiIsIm9FcnJvciIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImV4ZWN1dGVBUE1BY3Rpb24iLCJvRGlhbG9nIiwiYWZ0ZXI0MTIiLCJhUmVzdWx0Iiwic29tZSIsIm9TaW5nbGVSZXN1bHQiLCJhdHRhY2hFdmVudE9uY2UiLCJpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW4iLCJpc09wZW4iLCJmb3JjZVNob3dVSUVsZW1lbnQiLCIkSXNCb3VuZCIsInNlbGVjdGVkQ29udGV4dHMiLCJnZXRQcm9wZXJ0eSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJpc0EiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiRGVsZXRlSGVscGVyIiwidXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMiLCJzaG93TWVzc2FnZUJveCIsIm9Db250cm9sIiwib1Jlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwidW5ib3VuZE1lc3NhZ2VzIiwibWVzc2FnZSIsImdldFRhcmdldHMiLCJBUERtZXNzYWdlcyIsImFjdGlvblBhcmFtIiwiQVBETWVzc2FnZSIsImlzQVBEVGFyZ2V0IiwiZXJyb3JUYXJnZXRzSW5BUEQiLCJoYXNDaGFuZ2VTZXRNb2RpZmllZE1lc3NhZ2UiLCJzTWVzc2FnZSIsInNEZXNjcmlwdGlvblRleHQiLCJtZXNzYWdlTW9kZWwiLCJtZXNzYWdlc0luTW9kZWwiLCJhQm91bmRNZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiZ2VuZXJpY01lc3NhZ2UiLCJpc0VkaXRhYmxlIiwiZ2V0TW9kZWwiLCJub25FcnJvck1lc3NhZ2VFeGlzdHNJbkRpYWxvZyIsImdldFR5cGUiLCJub25FcnJvck1lc3NhZ2VFeGlzdHNJbk1vZGVsIiwic2V0TWVzc2FnZSIsImdldE1lc3NhZ2UiLCJNZXNzYWdlIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwicGVyc2lzdGVudCIsImRlc2NyaXB0aW9uIiwiY29kZSIsInVuc2hpZnQiLCJjbG9zZSIsImRlc3Ryb3kiLCJmaWx0ZXJlZE1lc3NhZ2VzIiwiYklzQVBET3BlbiIsImZuR2V0TWVzc2FnZVN1YnRpdGxlIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwiYmluZCIsInNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZyIsInNQYXRoIiwiX2dldFBhdGgiLCJlbnRpdHlTZXRDb250ZXh0Iiwic0FjdGlvbk5hbWVQYXRoIiwiYWN0aW9uTmFtZUNvbnRleHQiLCJzRnJhZ21lbnROYW1lIiwiYWN0aW9uUGFyYW1ldGVySW5mb3MiLCJfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlciIsImFsbE1lc3NhZ2VzIiwiZ2VuZXJhdGUiLCJyZWxldmFudE1lc3NhZ2VzIiwibXNnIiwiZ2V0Q29udHJvbElkcyIsImlkIiwicmVtb3ZlTWVzc2FnZXMiLCJvQ29udHJvbGxlciIsImhhbmRsZUNoYW5nZSIsIm9FdmVudCIsImZpZWxkIiwiZ2V0U291cmNlIiwiYWN0aW9uUGFyYW1ldGVySW5mbyIsInZhbGlkYXRpb25Qcm9taXNlIiwiZ2V0UGFyYW1ldGVyIiwiaGFzRXJyb3IiLCJlcnJvciIsIl9hZGRNZXNzYWdlRm9yQWN0aW9uUGFyYW1ldGVyIiwib0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJvUGFyYW1ldGVyTW9kZWwiLCJKU09OTW9kZWwiLCIkZGlzcGxheU1vZGUiLCJjcmVhdGVkRnJhZ21lbnQiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwibW9kZWxzIiwiYUZ1bmN0aW9uUGFyYW1zIiwiQ29tbW9uVXRpbHMiLCJzZXRVc2VyRGVmYXVsdHMiLCJvRGlhbG9nQ29udGVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwibWFwIiwiYWN0aW9uUGFyYW1ldGVyIiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiaXNNdWx0aVZhbHVlIiwiYWN0aW9uUmVzdWx0IiwiZGlhbG9nQ2FuY2VsbGVkIiwiYnV0dG9uTG9jayIsIkRpYWxvZyIsInRpdGxlIiwiY29udGVudCIsImVzY2FwZUhhbmRsZXIiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInRleHQiLCJfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZSIsInByZXNzIiwidmFsaWRhdGVQcm9wZXJ0aWVzIiwiQnVzeUxvY2tlciIsImxvY2siLCJmYWlsZWRDb250ZXh0cyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInZQYXJhbWV0ZXJWYWx1ZSIsImFsbE51bGxQYXJhbWV0ZXJzIiwib1BhcmFtZXRlckNvbnRleHQiLCJvT3BlcmF0aW9uQmluZGluZyIsImdldFBhcmFtZXRlckNvbnRleHQiLCJhTVZGQ29udGVudCIsImFLZXlWYWx1ZXMiLCJqIiwiS2V5Iiwic2V0UHJvcGVydHkiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsImlubmVyUGFyYW1ldGVycyIsIk9iamVjdCIsImFzc2lnbiIsImlzTG9ja2VkIiwidW5sb2NrIiwic2hvd01lc3NhZ2VzIiwibWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2siLCJzaG93TWVzc2FnZVBhcmFtZXRlcnMiLCJlbmRCdXR0b24iLCJiZWZvcmVPcGVuIiwib0Nsb25lRXZlbnQiLCJoYXNWaXNpYmxlUGFyYW1ldGVyIiwiaW5mbyIsImdldFZpc2libGUiLCJnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uIiwiZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2ciLCJzQmluZGluZ1BhcmFtZXRlciIsInNCb3VuZEZ1bmN0aW9uTmFtZSIsInBhcmFtZXRlck1vZGVsRGF0YSIsInByZWZpbGxQYXJhbWV0ZXIiLCJzUGFyYW1OYW1lIiwidlBhcmFtRGVmYXVsdFZhbHVlIiwiJFBhdGgiLCJ2UGFyYW1WYWx1ZSIsInJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eSIsInJlcXVlc3RQcm9wZXJ0eSIsInNQYXRoRm9yQ29udGV4dCIsImluZGV4T2YiLCJwYXJhbU5hbWUiLCJiTm9Qb3NzaWJsZVZhbHVlIiwiTG9nIiwiYkxhdGVQcm9wZXJ0eUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblBhdGgiLCJnZXRQYXJhbWV0ZXJQYXRoIiwib1BhcmFtZXRlckFubm90YXRpb25zIiwib1BhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUiLCJ2UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwib3BlcmF0aW9ucyIsImFQcmVmaWxsUGFyYW1Qcm9taXNlcyIsImFsbCIsImFFeGVjRnVuY3Rpb25Qcm9taXNlcyIsIm9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiRlBNSGVscGVyIiwiYWN0aW9uV3JhcHBlciIsImFQcm9taXNlcyIsImN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSIsImZ1bmN0aW9uUGFyYW1zIiwib0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Iiwic0RpYWxvZ1BhcmFtTmFtZSIsInZQYXJhbWV0ZXJQcm92aWRlZFZhbHVlIiwic2V0UGFyYW1ldGVyIiwiYkVycm9yRm91bmQiLCJvVmFsdWUiLCJyZWZyZXNoIiwiZXh0ZW5zaW9uQVBJIiwiZ2V0Q29udHJvbGxlciIsImdldEV4dGVuc2lvbkFQSSIsInNUZXh0Iiwid2FybmluZyIsImVtcGhhc2l6ZWRBY3Rpb24iLCJjb250ZW50V2lkdGgiLCJnZXRCZWdpbkJ1dHRvbiIsImZpcmVQcmVzcyIsImZuQXN5bmNCZWZvcmVPcGVuIiwiYVBhcmFtZXRlcnMiLCIkTmFtZSIsIm9Db250ZXh0T2JqZWN0IiwicmVxdWVzdE9iamVjdCIsImdldEl0ZW1zIiwiZ2V0VmFsdWUiLCJhZnRlckNsb3NlIiwic2V0TW9kZWwiLCJiaW5kRWxlbWVudCIsInBhdGgiLCJvTVZGTW9kZWwiLCJnZXRCaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwiYWRkRGVwZW5kZW50Iiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRPYmplY3RCaW5kaW5nIiwib3BlbiIsInNFbnRpdHlTZXROYW1lIiwiYUFjdGlvbk5hbWUiLCJzS2V5IiwiYlJlc291cmNlS2V5RXhpc3RzIiwiY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzIiwiZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyIsInNHcm91cElkIiwiaUNvbnRleHRMZW5ndGgiLCJjdXJyZW50X2NvbnRleHRfaW5kZXgiLCJpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSIsImludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QiLCJvQWN0aW9uUHJvbWlzZSIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsInNNZXRhUGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwib3BlcmF0aW9uc0hlbHBlciIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsInVwZGF0ZTQxMlRyYW5zaXRpb25NZXNzYWdlcyIsInJlYWxSZXN1bHQiLCJjYXRjaCIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIm9ubHlTdWNjZXNzTWVzc2FnZXMiLCJ1blByb2Nlc3NlZE1lc3NhZ2VzIiwicmVkdWNlIiwiYWNjIiwiaGFzIiwiZ2V0SWQiLCJuZXdUcmFuc2l0aW9uRXJyb3JNZXNzYWdlc0lkIiwiZ2V0UGVyc2lzdGVudCIsIlN1Y2Nlc3MiLCJmcm9tIiwidmFsdWVzIiwiY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbiIsIm9Mb2NhbEFjdGlvblByb21pc2UiLCJzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJkZWZhdWx0VmFsdWVzIiwiYUFjdGlvblByb21pc2VzIiwib2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3QiLCJmbkV4ZWN1dGVBY3Rpb24iLCJhY3Rpb25Db250ZXh0Iiwib1NpZGVFZmZlY3QiLCJpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZSIsImdldFVwZGF0ZUdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJmblJlcXVlc3RTaWRlRWZmZWN0cyIsImFsbFNldHRsZWQiLCJmbkV4ZWN1dGVTaW5nbGVBY3Rpb24iLCJmbkV4ZWN1dGVDaGFuZ2VzZXQiLCJhQ2hhbmdlU2V0TG9jYWxQcm9taXNlcyIsIm5vb3AiLCJyZW5kZXJNZXNzYWdlVmlldyIsInNoUHJvbWlzZSIsInNldERhdGEiLCJmbkhhbmRsZVJlc3VsdHMiLCJmbkV4ZWN1dGVTZXF1ZW50aWFsbHkiLCJjb250ZXh0c1RvRXhlY3V0ZSIsInByb2Nlc3NPbmVBY3Rpb24iLCJhY3Rpb25JbmRleCIsImluaXRpYWxUYWJsZUNvbnRleHQiLCJnZXRSb3dCaW5kaW5nIiwiZ2V0SGVhZGVyQ29udGV4dCIsInByb21pc2UiLCJmaW5hbGx5IiwiYWxsUHJvbWlzZSIsInNpZGVFZmZlY3QiLCJjdXJyZW50UHJvbWlzZVZhbHVlcyIsImN1cnJlbnRQcm9taXNlVmFsdWUiLCJoaWRkZW5Bbm5vdGF0aW9uU2V0T25BbGxBY3Rpb25zIiwiZmllbGRDb250cm9sIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiaXNNYW5kYXRvcnkiLCJ0b1N0cmluZyIsInBhcmFtZXRlclZhbHVlIiwibG9jYWxQcm9taXNlIiwic2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicHJvbWlzZXMiLCJleGVjdXRlQWN0aW9uIiwidmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzIiwiZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZmFjYWRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uSW1wb3J0LCBBY3Rpb24gYXMgRWRtQWN0aW9uLCBBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uUGFyYW1ldGVySW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNob3dNZXNzYWdlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCB0eXBlIE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IERlbGV0ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIExpc3RSZXBvcnRFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgeyBEaWFsb2ckQmVmb3JlT3BlbkV2ZW50IH0gZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uLy4uLy4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IG9wZXJhdGlvbnNIZWxwZXIsIHsgdHlwZSBTdHJpY3RIYW5kbGluZ1BhcmFtZXRlcnMsIHR5cGUgU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgfSBmcm9tIFwiLi4vLi4vLi4vb3BlcmF0aW9uc0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uLy4uL01lc3NhZ2VIYW5kbGVyXCI7XG5cbmNvbnN0IENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdEludm9jYXRpb25Hcm91cGluZyA9IEZFTGlicmFyeS5JbnZvY2F0aW9uR3JvdXBpbmc7XG5jb25zdCBBY3Rpb24gPSBNZXNzYWdlQm94LkFjdGlvbjtcblxuZXhwb3J0IHR5cGUgQWN0aW9uUmVzcG9uc2UgPSB1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0PltdO1xuXG50eXBlIFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzID0ge1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0Zm5PblN1Ym1pdHRlZDogRnVuY3Rpb247XG5cdGZuT25SZXNwb25zZTogRnVuY3Rpb247XG5cdGFjdGlvbk5hbWU6IHN0cmluZztcblx0bW9kZWw6IE9EYXRhTW9kZWw7XG5cdGFBY3Rpb25QYXJhbWV0ZXJzOiBFZG1BY3Rpb25QYXJhbWV0ZXJbXTtcblx0ZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIFByaW1pdGl2ZVR5cGU+O1xuXHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0c2VsZWN0ZWRJdGVtczogT0RhdGFWNENvbnRleHRbXTtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0bUJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRhZGRpdGlvbmFsU2lkZUVmZmVjdD86IEFjdGlvblNpZGVFZmZlY3RzVHlwZTtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcblx0aXNTdGF0aWM/OiBib29sZWFuO1xuXHRjb250cm9sPzogQ29udHJvbDtcblx0b0RpYWxvZz86IERpYWxvZztcblx0cmVxdWVzdFNpZGVFZmZlY3RzPzogRnVuY3Rpb247XG5cdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlPzogRnVuY3Rpb247XG59O1xuXG50eXBlIENhbGxBY3Rpb25QYXJhbWV0ZXJzID0ge1xuXHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRsYWJlbD86IHN0cmluZztcblx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdG9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0b25SZXNwb25zZTogRnVuY3Rpb247XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXI7XG5cdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdGNvbnRyb2xJZD86IHN0cmluZztcblx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdHZpZXc6IFZpZXcgfCBudWxsO1xufSAmIHtcblx0YkdldEJvdW5kQ29udGV4dD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcbn0gJiB7XG5cdGJHcm91cGVkPzogYm9vbGVhbjtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0c2VsZWN0ZWRJdGVtcz86IE9EYXRhVjRDb250ZXh0W107XG5cdGFkZGl0aW9uYWxTaWRlRWZmZWN0PzogQWN0aW9uU2lkZUVmZmVjdHNUeXBlO1xuXHRtQmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW47XG5cdGdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKlxuICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0gY29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgYmUgY2FsbGVkXG4gKiBAcGFyYW0gb01vZGVsIE9EYXRhIE1vZGVsXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnNdIEEgbWFwIG9mIGJpbmRpbmcgcGFyYW1ldGVycyB0aGF0IHdvdWxkIGJlIHBhcnQgb2YgJHNlbGVjdCBhbmQgJGV4cGFuZCBjb21pbmcgZnJvbSBzaWRlIGVmZmVjdHMgZm9yIGJvdW5kIGFjdGlvbnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3RdIEFycmF5IG9mIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBpbiBhZGRpdGlvbiB0byBhY3R1YWwgdGFyZ2V0IHByb3BlcnRpZXMgb2YgdGhlIHNpZGUgZWZmZWN0XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6IENoYW5nZXNldCB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsIElzb2xhdGVkIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0cywgZGVmYXVsdHMgdG8gSXNvbGF0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub25TdWJtaXR0ZWRdIEZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBvbmNlIHRoZSBhY3Rpb25zIGFyZSBzdWJtaXR0ZWQgd2l0aCBhbiBhcnJheSBvZiBwcm9taXNlc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbF0gSWYgc3BlY2lmaWVkLCB0aGUgZGlhbG9ncyBhcmUgYWRkZWQgYXMgZGVwZW5kZW50IG9mIHRoZSBwYXJlbnQgY29udHJvbFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gcHJvbWlzZSByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmlnbm9yZUVUYWddIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBFVGFnIGhhbmRsaW5nXG4gKiBAcGFyYW0gW3N0cmljdEhhbmRsaW5nVXRpbGl0aWVzXSBPcHRpb25hbCwgdXRpbGl0eSBmbGFncyBhbmQgbWVzc2FnZXMgZm9yIHN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEJvdW5kQWN0aW9uKFxuXHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRjb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0b01vZGVsOiBPRGF0YU1vZGVsLFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiBDYWxsQWN0aW9uUGFyYW1ldGVyc1xuKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRpZiAoIWNvbnRleHRzIHx8IGNvbnRleHRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vSW4gRnJlZXN0eWxlIGFwcHMgYm91bmQgYWN0aW9ucyBjYW4gaGF2ZSBubyBjb250ZXh0XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQm91bmQgYWN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbnRleHRcIik7XG5cdH1cblxuXHRjb25zdCBpc0NhbGxlZFdpdGhBcnJheSA9IEFycmF5LmlzQXJyYXkoY29udGV4dHMpO1xuXHQvLyB0aGlzIG1ldGhvZCBlaXRoZXIgYWNjZXB0cyBzaW5nbGUgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0c1xuXHQvLyBUT0RPOiBSZWZhY3RvciB0byBhbiB1bmFtYmlndW9zIEFQSVxuXHQvLyBpbiBjYXNlIG9mIHNpbmdsZSBjb250ZXh0IHdyYXAgaW50byBhbiBhcnJheSBmb3IgY2FsbGVkIG1ldGhvZHMgKGVzcC4gY2FsbEFjdGlvbilcblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBjb250ZXh0cyA6IFtjb250ZXh0c107XG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHQvLyBBbmFseXppbmcgbWV0YU1vZGVsUGF0aCBmb3IgYWN0aW9uIG9ubHkgZnJvbSBmaXJzdCBjb250ZXh0IHNlZW1zIHdlaXJkLCBidXQgcHJvYmFibHkgd29ya3MgaW4gYWxsIGV4aXN0aW5nIHNjZW5hcmlvcyAtIGlmIHNldmVyYWwgY29udGV4dHMgYXJlIHBhc3NlZCwgdGhleSBwcm9iYWJseVxuXHRcdC8vIGJlbG9uZyB0byB0aGUgc2FtZSBtZXRhbW9kZWxwYXRoLiBUT0RPOiBDaGVjaywgd2hldGhlciB0aGlzIGNhbiBiZSBpbXByb3ZlZCAvIHNjZW5hcmlvcyB3aXRoIGRpZmZlcmVudCBtZXRhTW9kZWxQYXRocyBtaWdodCBleGlzdFxuXHRcdHNBY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7c0FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKSE7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIG1QYXJhbWV0ZXJzLmFDb250ZXh0cyk7XG5cblx0Ly8gUHJvbWlzZSByZXR1cm5lZCBieSBjYWxsQWN0aW9uIGN1cnJlbnRseSBpcyByZWplY3RlZCBpbiBjYXNlIG9mIGV4ZWN1dGlvbiBmb3IgbXVsdGlwbGUgY29udGV4dHMgcGFydGx5IGZhaWxpbmcuIFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgKHNvbWUgZmFpbGluZyBjb250ZXh0cyBkbyBub3QgbWVhblxuXHQvLyB0aGF0IGZ1bmN0aW9uIGRpZCBub3QgZnVsZmlsbCBpdHMgdGFzayksIGJ1dCBhcyB0aGlzIGlzIGEgYmlnZ2VyIHJlZmFjdG9yaW5nLCBmb3IgdGhlIHRpbWUgYmVpbmcgd2UgbmVlZCB0byBkZWFsIHdpdGggdGhhdCBhdCB0aGUgY2FsbGluZyBwbGFjZSAoaS5lLiBoZXJlKVxuXHQvLyA9PiBwcm92aWRlIHRoZSBzYW1lIGhhbmRsZXIgKG1hcHBpbmcgYmFjayBmcm9tIGFycmF5IHRvIHNpbmdsZSByZXN1bHQvZXJyb3IgaWYgbmVlZGVkKSBmb3IgcmVzb2x2ZWQvcmVqZWN0ZWQgY2FzZVxuXHRjb25zdCBleHRyYWN0U2luZ2xlUmVzdWx0ID0gZnVuY3Rpb24gKHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gc2luZ2xlIGFjdGlvbiBjb3VsZCBiZSByZXNvbHZlZCBvciByZWplY3RlZFxuXHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0WzBdLnZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRpYWxvZyBjYW5jZWxsYXRpb24sIG5vIGFycmF5IGlzIHJldHVybmVkID0+IHRocm93IHRoZSByZXN1bHQuXG5cdFx0XHQvLyBJZGVhbGx5LCBkaWZmZXJlbnRpYXRpbmcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaGVyZSA9PiBUT0RPOiBGaW5kIGJldHRlciBzb2x1dGlvbiB3aGVuIHNlcGFyYXRpbmcgZGlhbG9nIGhhbmRsaW5nIChzaW5nbGUgb2JqZWN0IHdpdGggc2luZ2xlIHJlc3VsdCkgZnJvbSBiYWNrZW5kXG5cdFx0XHQvLyBleGVjdXRpb24gKHBvdGVudGlhbGx5IG11bHRpcGxlIG9iamVjdHMpXG5cdFx0XHR0aHJvdyByZXN1bHRbMF0ucmVhc29uIHx8IHJlc3VsdDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4ob0JvdW5kQWN0aW9uLmdldFBhdGgoKSkudGFyZ2V0O1xuXHRpZiAoIWNvbnZlcnRlZEFjdGlvbikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYm91bmQgYWN0aW9uXCIpO1xuXHR9XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbEFjdGlvbihjb252ZXJ0ZWRBY3Rpb24sIG9Nb2RlbCwgb0JvdW5kQWN0aW9uLCBvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycyk7XG5cdFx0aWYgKGlzQ2FsbGVkV2l0aEFycmF5KSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZXh0cmFjdFNpbmdsZVJlc3VsdChyZXN1bHQgYXMgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQ+W10pO1xuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmIChpc0NhbGxlZFdpdGhBcnJheSkge1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGV4dHJhY3RTaW5nbGVSZXN1bHQoZSBhcyBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dD5bXSk7XG5cdFx0fVxuXHR9XG59XG4vKipcbiAqIENhbGxzIGFuIGFjdGlvbiBpbXBvcnQuXG4gKlxuICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBpbXBvcnQgdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0gbW9kZWwgQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcbiAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIFtwYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXSBJZiBzZXQgYW5kIGlmIHBhcmFtZXRlcnMgZXhpc3QgdGhlIHVzZXIgcmV0cmlldmVzIGEgZGlhbG9nIHRvIGZpbGwgaW4gcGFyYW1ldGVycywgaWYgYWN0aW9uUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZXkgYXJlIHNob3duIHRvIHRoZSB1c2VyXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMub25TdWJtaXR0ZWRdIEZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBvbmNlIHRoZSBhY3Rpb25zIGFyZSBzdWJtaXR0ZWQgd2l0aCBhbiBhcnJheSBvZiBwcm9taXNlc1xuICogQHBhcmFtIFtwYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIFtwYXJhbWV0ZXJzLmlnbm9yZUVUYWddIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBFVGFnIGhhbmRsaW5nXG4gKiBAcGFyYW0gW3N0cmljdEhhbmRsaW5nVXRpbGl0aWVzXSBPcHRpb25hbCwgdXRpbGl0eSBmbGFncyBhbmQgbWVzc2FnZXMgZm9yIHN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFjdGlvbkltcG9ydChcblx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRtb2RlbDogT0RhdGFNb2RlbCxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdHBhcmFtZXRlcnM6IHtcblx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdFx0b25TdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xuXHRcdG9uUmVzcG9uc2U6IEZ1bmN0aW9uO1xuXHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0c2VsZWN0ZWRJdGVtcz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0dmlldzogVmlldyB8IG51bGw7XG5cdH0gJiB7XG5cdFx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdH1cbik6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IGFjdGlvblBhdGggPSBgLyR7YWN0aW9uTmFtZX1gO1xuXHRjb25zdCBjb252ZXJ0ZWRUeXBlcyA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRjb25zdCBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQgPSBjb252ZXJ0ZWRUeXBlcy5yZXNvbHZlUGF0aDxBY3Rpb25JbXBvcnQgfCB1bmRlZmluZWQ+KGFjdGlvblBhdGgpLnRhcmdldCxcblx0XHRjb252ZXJ0ZWRBY3Rpb24gPSBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQ/LmFjdGlvbjtcblx0aWYgKCFjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3QgdW5ib3VuZEFjdGlvbkluZGV4ID0gY29udmVydGVkVHlwZXMuYWN0aW9uc1xuXHRcdFx0LmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24ubmFtZSA9PT0gY29udmVydGVkQWN0aW9uLm5hbWUpXG5cdFx0XHQuZmluZEluZGV4KChhY3Rpb24pID0+ICFhY3Rpb24uaXNCb3VuZCksXG5cdFx0YWN0aW9uTmFtZUZyb21Nb2RlbCA9IGNvbnZlcnRlZEFjdGlvbkltcG9ydC5hY3Rpb25OYW1lLFxuXHRcdGFjdGlvbkltcG9ydCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7YWN0aW9uTmFtZUZyb21Nb2RlbH0vJHt1bmJvdW5kQWN0aW9uSW5kZXh9YCk7XG5cdHBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGF3YWl0IEFjdGlvblJ1bnRpbWUuZ2V0SXNBY3Rpb25Dcml0aWNhbChtZXRhTW9kZWwsIGAke2FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkYCk7XG5cdHJldHVybiBjYWxsQWN0aW9uKGNvbnZlcnRlZEFjdGlvbkltcG9ydC5hY3Rpb24sIG1vZGVsLCBhY3Rpb25JbXBvcnQsIGFwcENvbXBvbmVudCwgcGFyYW1ldGVycyk7XG59XG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFjb250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgZnVuY3Rpb25zIGFsd2F5cyByZXF1aXJlcyBhIGNvbnRleHRcIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRnVuY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEZ1bmN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRGdW5jdGlvbiwgY29udGV4dCk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBpbXBvcnQuXG4gKlxuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPHZvaWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBDb250ZXh0IHwgbnVsbCxcblx0Y29udGV4dD86IENvbnRleHRcbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFvRnVuY3Rpb24/LmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0Y29uc3QgZnVuY3Rpb25Ub0NhbGw6IE9EYXRhQ29udGV4dEJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7Y29udGV4dD8uZ2V0UGF0aCgpID8/IFwiXCJ9LyR7c0Z1bmN0aW9uTmFtZX0oLi4uKWApO1xuXHRjb25zdCBncm91cElkID0gY29udGV4dCA/IFwiZnVuY3Rpb25Hcm91cFwiIDogXCJmdW5jdGlvbkltcG9ydFwiO1xuXHRjb25zdCBleGVjdXRpb25Qcm9taXNlID0gZnVuY3Rpb25Ub0NhbGwuZXhlY3V0ZShncm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRhd2FpdCBleGVjdXRpb25Qcm9taXNlO1xuXHRyZXR1cm4gZnVuY3Rpb25Ub0NhbGwuZ2V0Qm91bmRDb250ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb24oXG5cdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BY3Rpb246IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdGxldCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRpczQxMkV4ZWN1dGVkOiBmYWxzZSxcblx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0c3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXM6IFtdLFxuXHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBuZXcgU2V0PHN0cmluZz4oKVxuXHR9O1xuXHRjb25zdCBzQWN0aW9uTmFtZSA9IGNvbnZlcnRlZEFjdGlvbi5pc0JvdW5kXG5cdFx0PyBjb252ZXJ0ZWRBY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lLnJlcGxhY2UoL1xcKC4qXFwpJC9nLCBcIlwiKSAvLyByZW1vdmUgdGhlIHBhcnQgcmVsYXRlZCB0byB0aGUgb3ZlcmxheVxuXHRcdDogY29udmVydGVkQWN0aW9uLm5hbWU7XG5cdG1QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRyZXR1cm4gbmV3IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+KGFzeW5jIGZ1bmN0aW9uIChcblx0XHRyZXNvbHZlOiAodmFsdWU6IEFjdGlvblJlc3BvbnNlKSA9PiB2b2lkLFxuXHRcdHJlamVjdDogKHJlYXNvbj86IEVycm9yIHwgQWN0aW9uUmVzcG9uc2UpID0+IHZvaWRcblx0KSB7XG5cdFx0bGV0IGZuRGlhbG9nOlxuXHRcdFx0fCAoKFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdHNBY3Rpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW10sXG5cdFx0XHRcdFx0YVBhcmFtZXRlclZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvQWN0aW9uOiBDb250ZXh0LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IFZpZXcsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllczogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0dmlldzogVmlldyB8IG51bGwsXG5cdFx0XHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW5cblx0XHRcdCAgKSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+KVxuXHRcdFx0fCBudWxsID0gbnVsbDtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNraXBQYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IGlNZXNzYWdlU2lkZUVmZmVjdDtcblx0XHRsZXQgaXNTYW1lRW50aXR5O1xuXHRcdGxldCBiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGFjdGlvbkRlZmluaXRpb24gPSBvQWN0aW9uLmdldE9iamVjdCgpIGFzIE1ldGFNb2RlbEFjdGlvbjtcblxuXHRcdC8vaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLCBpZ25vcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgY29uc2lkZXIgdGhlIHJlc3Rcblx0XHRjb25zdCBhY3Rpb25QYXJhbWV0ZXJzID0gY29udmVydGVkQWN0aW9uLmlzQm91bmQgPyBjb252ZXJ0ZWRBY3Rpb24ucGFyYW1ldGVycy5zbGljZSgxKSA6IGNvbnZlcnRlZEFjdGlvbi5wYXJhbWV0ZXJzO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBoYXMgcGFyYW1ldGVycyBhbmQgd291bGQgbmVlZCBhIHBhcmFtZXRlciBkaWFsb2dcblx0XHQvLyBUaGUgcGFyYW1ldGVyIFJlc3VsdElzQWN0aXZlRW50aXR5IGlzIGFsd2F5cyBoaWRkZW4gaW4gdGhlIGRpYWxvZyEgSGVuY2UgaWZcblx0XHQvLyB0aGlzIGlzIHRoZSBvbmx5IHBhcmFtZXRlciwgdGhpcyBpcyB0cmVhdGVkIGFzIG5vIHBhcmFtZXRlciBoZXJlIGJlY2F1c2UgdGhlXG5cdFx0Ly8gZGlhbG9nIHdvdWxkIGJlIGVtcHR5IVxuXHRcdC8vIEZJWE1FOiBTaG91bGQgb25seSBpZ25vcmUgdGhpcyBpZiB0aGlzIGlzIGEgJ2NyZWF0ZScgYWN0aW9uLCBvdGhlcndpc2UgaXQgaXMganVzdCBzb21lIG5vcm1hbCBwYXJhbWV0ZXIgdGhhdCBoYXBwZW5zIHRvIGhhdmUgdGhpcyBuYW1lXG5cdFx0Y29uc3QgYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiAhKGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAxICYmIGFjdGlvblBhcmFtZXRlcnNbMF0ubmFtZSA9PT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiKTtcblxuXHRcdC8vIFByb3ZpZGVkIHZhbHVlcyBmb3IgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzIGZyb20gaW52b2tlQWN0aW9uIGNhbGxcblx0XHRjb25zdCBhUGFyYW1ldGVyVmFsdWVzID0gbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHN0YXJ0dXAgcGFyYW1ldGVycyBpZiBwcm92aWRlZFxuXHRcdGNvbnN0IG9Db21wb25lbnREYXRhID0gb0FwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzID0gKG9Db21wb25lbnREYXRhICYmIG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fTtcblxuXHRcdC8vIElmIGFsbCBwYXJhbWV0ZXJzIGFyZSBoaWRkZW4gIGFuZCBhbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgdmFsdWVzIGFyZSBhdmFpbGFibGUsIHRoZW4gd2Ugc2tpcCB0aGUgZGlhbG9nLlxuXHRcdGJTa2lwUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoICYmIGFjdGlvblBhcmFtZXRlcnMuZXZlcnkoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmFubm90YXRpb25zLlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSlcblx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdDogYlNraXBQYXJhbWV0ZXJEaWFsb2c7XG5cdFx0Ly8gSW4gY2FzZSBhbiBhY3Rpb24gcGFyYW1ldGVyIGlzIG5lZWRlZCwgYW5kIHdlIHNoYWxsIHNraXAgdGhlIGRpYWxvZywgY2hlY2sgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIHBhcmFtZXRlcnNcblx0XHRpZiAoYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nICYmIGJTa2lwUGFyYW1ldGVyRGlhbG9nKSB7XG5cdFx0XHRiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzID0gX3ZhbHVlc1Byb3ZpZGVkRm9yQWxsTWFuZGF0b3J5UGFyYW1ldGVycyhcblx0XHRcdFx0ISFiSXNDcmVhdGVBY3Rpb24sXG5cdFx0XHRcdGFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBEZXBlbmRpbmcgb24gdGhlIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBkYXRhLCBlaXRoZXIgc2V0IGEgZGlhbG9nIG9yIGxlYXZlIGl0IGVtcHR5IHdoaWNoXG5cdFx0Ly8gd2lsbCBsZWFkIHRvIGRpcmVjdCBleGVjdXRpb24gb2YgdGhlIGFjdGlvbiB3aXRob3V0IGEgZGlhbG9nXG5cdFx0aWYgKGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0aWYgKCEoYlNraXBQYXJhbWV0ZXJEaWFsb2cgJiYgYlZhbHVlc1Byb3ZpZGVkRm9yQWxsTWFuZGF0b3J5UGFyYW1ldGVycykpIHtcblx0XHRcdFx0Zm5EaWFsb2cgPSBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdGZuRGlhbG9nID0gY29uZmlybUNyaXRpY2FsQWN0aW9uO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyA9IHtcblx0XHRcdGRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzOiB7fSxcblx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdGZuT25TdWJtaXR0ZWQ6IG1QYXJhbWV0ZXJzLm9uU3VibWl0dGVkLFxuXHRcdFx0Zm5PblJlc3BvbnNlOiBtUGFyYW1ldGVycy5vblJlc3BvbnNlLFxuXHRcdFx0YWN0aW9uTmFtZTogc0FjdGlvbk5hbWUsXG5cdFx0XHRtb2RlbDogb01vZGVsLFxuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnM6IGFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24sXG5cdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRzZWxlY3RlZEl0ZW1zOiBtUGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zIVxuXHRcdH07XG5cdFx0aWYgKGNvbnZlcnRlZEFjdGlvbi5pc0JvdW5kKSB7XG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhRGF0YSA9IGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IGZpbHRlcmVkRW50aXR5U2V0ID0gY29udmVydGVkTWV0YURhdGEuZW50aXR5U2V0cy5maWx0ZXIoXG5cdFx0XHRcdChzaW5nbGVFbnRpdHlTZXQpID0+IHNpbmdsZUVudGl0eVNldC5lbnRpdHlUeXBlID09PSBjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuRW50aXR5VHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBmaWx0ZXJlZEVudGl0eVNldC5sZW5ndGggPiAwID8gZmlsdGVyZWRFbnRpdHlTZXRbMF0gOiB1bmRlZmluZWQ7XG5cblx0XHRcdGlzU2FtZUVudGl0eSA9XG5cdFx0XHRcdCFjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuQ29sbGVjdGlvbiAmJlxuXHRcdFx0XHRjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRjb252ZXJ0ZWRBY3Rpb24uc291cmNlRW50aXR5VHlwZSA9PT0gY29udmVydGVkQWN0aW9uLnJldHVybkVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChpc1NhbWVFbnRpdHkgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID8/PSB7fTtcblx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdFxuXHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LEhhc0FjdGl2ZUVudGl0eWBcblx0XHRcdFx0XHQ6IFwiSGFzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdD8ucGF0aEV4cHJlc3Npb25zKSB7XG5cdFx0XHRcdHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgYUNvbnRleHRzIVswXS5nZXRQYXRoKCkpITtcblxuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdC8vICcqJyBlZmZlY3RpdmVseSBpbmNsdWRlcyB0aGUgbWVzc2FnZXMgcGF0aCBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdFx0XHRpTWVzc2FnZVNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuZmluZEluZGV4KFxuXHRcdFx0XHRcdFx0KGV4cCkgPT4gdHlwZW9mIGV4cCA9PT0gXCJzdHJpbmdcIiAmJiAoZXhwID09PSBzTWVzc2FnZXNQYXRoIHx8IGV4cCA9PT0gXCIqXCIpXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdC8vIEFkZCBTQVBfTWVzc2FnZXMgYnkgZGVmYXVsdCBpZiBub3QgYW5ub3RhdGVkIGJ5IHNpZGUgZWZmZWN0cywgYWN0aW9uIGRvZXMgbm90IHJldHVybiBhIGNvbGxlY3Rpb24gYW5kXG5cdFx0XHRcdFx0Ly8gdGhlIHJldHVybiB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSBib3VuZCB0eXBlXG5cdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xIHx8IGlzU2FtZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIG1lc3NhZ2UgcGF0aCBpcyBhbm5vdGF0ZWQgYXMgc2lkZSBlZmZlY3QuIEFzIHRoZXJlJ3Mgbm8gYmluZGluZyBmb3IgaXQgYW5kIHRoZSBtb2RlbCBkb2VzIGN1cnJlbnRseSBub3QgYWxsb3dcblx0XHRcdFx0XHRcdC8vIHRvIGFkZCBpdCBhdCBhIGxhdGVyIHBvaW50IG9mIHRpbWUgd2UgaGF2ZSB0byB0YWtlIGNhcmUgaXQncyBwYXJ0IG9mIHRoZSAkc2VsZWN0IG9mIHRoZSBQT1NULCB0aGVyZWZvcmUgbW92aW5nIGl0LlxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID8/PSB7fTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuRW50aXR5VHlwZT8uZW50aXR5UHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gc01lc3NhZ2VzUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0IShtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCA/PyBcIlwiKS5zcGxpdChcIixcIikuaW5jbHVkZXMoc01lc3NhZ2VzUGF0aClcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0XHRcdFx0PyBgJHttUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdH0sJHtzTWVzc2FnZXNQYXRofWBcblx0XHRcdFx0XHRcdFx0XHQ6IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdFx0XHRcdC8vIEFkZCBzaWRlIGVmZmVjdHMgYXQgZW50aXR5IGxldmVsIGJlY2F1c2UgJHNlbGVjdCBzdG9wcyB0aGVzZSBiZWluZyByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdFx0XHRcdFx0XHRcdC8vIE9ubHkgaWYgbm8gb3RoZXIgc2lkZSBlZmZlY3RzIHdlcmUgYWRkZWQgZm9yIE1lc3NhZ2VzXG5cdFx0XHRcdFx0XHRcdGlmIChpTWVzc2FnZVNpZGVFZmZlY3QgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCA9PT0gMCAmJiBpTWVzc2FnZVNpZGVFZmZlY3QgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG5vIHRyaWdnZXIgYWN0aW9uIHRoZXJlZm9yZSBubyBuZWVkIHRvIHJlcXVlc3QgbWVzc2FnZXMgYWdhaW5cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuc3BsaWNlKGlNZXNzYWdlU2lkZUVmZmVjdCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZTtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZyA9IG1QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmdyb3VwSWQgPSBtUGFyYW1ldGVycy5ncm91cElkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pc1N0YXRpYyA9IGNvbnZlcnRlZEFjdGlvbi5pc0JvdW5kICYmICEhY29udmVydGVkQWN0aW9uLnBhcmFtZXRlcnNbMF0/LmlzQ29sbGVjdGlvbjtcblx0XHRpZiAoZm5EaWFsb2cpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhdGlvblJlc3VsdCA9IGF3YWl0IGZuRGlhbG9nKFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0c0FjdGlvbkxhYmVsLFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YVBhcmFtZXRlclZhbHVlcyxcblx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy52aWV3LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0KTtcblx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdHJlc29sdmUob3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZWplY3QoZSBhcyBFcnJvciB8IEFjdGlvblJlc3BvbnNlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVGFrZSBvdmVyIGFsbCBwcm92aWRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZCBjYWxsIHRoZSBhY3Rpb24uXG5cdFx0XHQvLyBUaGlzIHNoYWxsIG9ubHkgaGFwcGVuIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCB0aGUgcGFyYW1ldGVycywgb3RoZXJ3aXNlIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIHNoYWxsIGJlIHNob3duIHdoaWNoIGlzIGVuc3VyZWQgZWFybGllclxuXG5cdFx0XHRpZiAoYVBhcmFtZXRlclZhbHVlcykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc1ZhbHVlc1ttQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lXSA9XG5cdFx0XHRcdFx0XHRhUGFyYW1ldGVyVmFsdWVzPy5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50Lm5hbWUgPT09IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWUpPy52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChjb25zdCBpIGluIG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXNbbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZV0gPVxuXHRcdFx0XHRcdFx0KG9TdGFydHVwUGFyYW1ldGVyc1ttQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lXT8uWzBdIGFzIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIpIHx8XG5cdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXS5hbm5vdGF0aW9ucz8uVUk/LlBhcmFtZXRlckRlZmF1bHRWYWx1ZT8udmFsdWVPZigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsZXQgb09wZXJhdGlvblJlc3VsdDogdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9PcGVyYXRpb25SZXN1bHQgPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcy5jb25jYXQobWVzc2FnZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFmdGVyQWN0aW9uUmVzb2x1dGlvbihtUGFyYW1ldGVycywgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsIGFjdGlvbkRlZmluaXRpb24pO1xuXHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHJlamVjdChvT3BlcmF0aW9uUmVzdWx0IGFzIEVycm9yIHwgQWN0aW9uUmVzcG9uc2UpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGggJiZcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMhLmxlbmd0aCA+IDFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHN0cmljdEhhbmRsaW5nRmFpbHMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscztcblx0XHRcdFx0XHRcdGNvbnN0IGFGYWlsZWRDb250ZXh0cyA9IFtdIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ0ZhaWxzLmZvckVhY2goZnVuY3Rpb24gKGZhaWw6IHsgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZzsgZ3JvdXBJZDogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHRcdFx0XHRcdFx0YUZhaWxlZENvbnRleHRzLnB1c2goZmFpbC5vQWN0aW9uLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFGYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IG9GYWlsZWRPcGVyYXRpb25SZXN1bHQgPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzID0gW107XG5cdFx0XHRcdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMpO1xuXHRcdFx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9GYWlsZWRPcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9GYWlsZWRPcGVyYXRpb25SZXN1bHQpIHtcblx0XHRcdFx0XHRcdHJlamVjdChcblx0XHRcdFx0XHRcdFx0b0ZhaWxlZE9wZXJhdGlvblJlc3VsdCBhc1xuXHRcdFx0XHRcdFx0XHRcdHwgRXJyb3Jcblx0XHRcdFx0XHRcdFx0XHR8IE9EYXRhVjRDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0fCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHR8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgc2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0XHQobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgbWVzc2FnZUhhbmRsaW5nLmhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzKCkpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgaXNBY3Rpb25TdWNjZXNzZnVsID0gZmFsc2U7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9PcGVyYXRpb25SZXN1bHQpKSB7XG5cdFx0XHRcdFx0aXNBY3Rpb25TdWNjZXNzZnVsID0gb09wZXJhdGlvblJlc3VsdD8uZXZlcnkoKHJlcykgPT4gcmVzLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhcmFtZXRlcnM/Lm1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdFx0Py5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRjb250cm9sOiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycz8uY29udHJvbCxcblx0XHRcdFx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2U6IGZ1bmN0aW9uIChhTWVzc2FnZXM6IE1lc3NhZ2VbXSwgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMhLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4sXG5cdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQsXG5cdFx0XHRcdFx0XHRcdFx0aXNBY3Rpb25TdWNjZXNzZnVsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHM6IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyxcblx0XHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWxcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLmNsZWFyU3RyaWN0V2FybmluZ01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdFx0XHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzOiBbXSxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0XHRcdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IG5ldyBTZXQoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm1Dcml0aWNhbEFjdGlvbihcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRzQWN0aW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW10sXG5cdGFQYXJhbWV0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfCB1bmRlZmluZWQsXG5cdG9BY3Rpb25Db250ZXh0OiBDb250ZXh0LFxuXHRvUGFyZW50Q29udHJvbDogVmlldyxcblx0ZW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzOiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0dmlldzogVmlldyB8IG51bGwsXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0bGV0IGJvdW5kQWN0aW9uTmFtZSA9IHNBY3Rpb25OYW1lO1xuXHRcdGJvdW5kQWN0aW9uTmFtZSA9IGJvdW5kQWN0aW9uTmFtZS5pbmNsdWRlcyhcIi5cIilcblx0XHRcdD8gYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKVtib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpLmxlbmd0aCAtIDFdXG5cdFx0XHQ6IGJvdW5kQWN0aW9uTmFtZTtcblx0XHRjb25zdCBzdWZmaXhSZXNvdXJjZUtleSA9IGJvdW5kQWN0aW9uTmFtZSAmJiBlbnRpdHlTZXROYW1lID8gYCR7ZW50aXR5U2V0TmFtZX18JHtib3VuZEFjdGlvbk5hbWV9YCA6IFwiXCI7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwob1BhcmVudENvbnRyb2wpO1xuXHRcdGNvbnN0IHNDb25maXJtYXRpb25UZXh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9DT05GSVJNX01FU1NBR0VcIiwgdW5kZWZpbmVkLCBzdWZmaXhSZXNvdXJjZUtleSk7XG5cblx0XHRNZXNzYWdlQm94LmNvbmZpcm0oc0NvbmZpcm1hdGlvblRleHQsIHtcblx0XHRcdG9uQ2xvc2U6IGFzeW5jIGZ1bmN0aW9uIChzQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKHNBY3Rpb24gPT09IEFjdGlvbi5PSykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvT3BlcmF0aW9uID0gYXdhaXQgX2V4ZWN1dGVBY3Rpb24oXG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRpZ25vcmVFVGFnXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFQTUFjdGlvbihcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdG9QYXJlbnRDb250cm9sOiBWaWV3LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdGFDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0b0RpYWxvZzogRGlhbG9nLFxuXHRhZnRlcjQxMjogYm9vbGVhbixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPiB7XG5cdGNvbnN0IGFSZXN1bHQgPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycywgb1BhcmVudENvbnRyb2wsIG1lc3NhZ2VIYW5kbGVyLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcywgaWdub3JlRVRhZyk7XG5cdC8vIElmIHNvbWUgZW50cmllcyB3ZXJlIHN1Y2Nlc3NmdWwsIGFuZCBvdGhlcnMgaGF2ZSBmYWlsZWQsIHRoZSBvdmVyYWxsIHByb2Nlc3MgaXMgc3RpbGwgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgdGhpcyB3YXMgdHJlYXRlZCBhcyByZWplY3Rpb25cblx0Ly8gYmVmb3JlLCBhbmQgdGhpcyBjdXJyZW50bHkgaXMgc3RpbGwga2VwdCwgYXMgbG9uZyBhcyBkaWFsb2cgaGFuZGxpbmcgaXMgbWl4ZWQgd2l0aCBiYWNrZW5kIHByb2Nlc3MgaGFuZGxpbmcuXG5cdC8vIFRPRE86IFJlZmFjdG9yIHRvIG9ubHkgcmVqZWN0IGluIGNhc2Ugb2Ygb3ZlcmFsbCBwcm9jZXNzIGVycm9yLlxuXHQvLyBGb3IgdGhlIHRpbWUgYmVpbmc6IG1hcCB0byBvbGQgbG9naWMgdG8gcmVqZWN0IGlmIGF0IGxlYXN0IG9uZSBlbnRyeSBoYXMgZmFpbGVkXG5cdC8vIFRoaXMgY2hlY2sgaXMgb25seSBkb25lIGZvciBib3VuZCBhY3Rpb25zID0+IGFDb250ZXh0cyBub3QgZW1wdHlcblx0aWYgKG1QYXJhbWV0ZXJzLmFDb250ZXh0cyAmJiBtUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChcblx0XHRcdChhUmVzdWx0IGFzIFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdKT8uc29tZShcblx0XHRcdFx0KG9TaW5nbGVSZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPikgPT4gb1NpbmdsZVJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIlxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0dGhyb3cgYVJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBtZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aCkge1xuXHRcdGlmICghYWZ0ZXI0MTIpIHtcblx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzKTtcblx0XHRcdGxldCBzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IGZhbHNlO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5sZW5ndGgpIHx8XG5cdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBtZXNzYWdlSGFuZGxpbmcuaGFzVHJhbnNpdGlvbkVycm9yc09yV2FybmluZ3MoKSlcblx0XHRcdCkge1xuXHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIEJPVU5EIFRSQU5TSVRJT04gQVMgUEFSVCBPRiBTQVBfTUVTU0FHRVxuXHRcdFx0XHRvRGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2U6IGZ1bmN0aW9uIChhTWVzc2FnZXM6IE1lc3NhZ2VbXSwgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZyxcblx0XHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4sXG5cdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb250cm9sOiBtUGFyYW1ldGVycy5jb250cm9sLFxuXHRcdFx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHM6IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyxcblx0XHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0Ly8gQk9VTkQgVFJBTlNJVElPTiBBUyBQQVJUIE9GIFNBUF9NRVNTQUdFXG5cdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0aWYgKFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB8fFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIG1lc3NhZ2VIYW5kbGluZy5oYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdCkge1xuXHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdH1cblx0XHRvRGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG1QYXJhbWV0ZXJzPy5vRGlhbG9nPy5pc09wZW4oKSxcblx0XHRcdFx0Zm9yY2VTaG93VUlFbGVtZW50OiBtUGFyYW1ldGVycz8ub0RpYWxvZz8uaXNPcGVuKCkgPz8gZmFsc2UsXG5cdFx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2U6IGZ1bmN0aW9uIChhTWVzc2FnZXM6IE1lc3NhZ2VbXSwgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdHJldHVybiBhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0YU1lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4sXG5cdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNvbnRyb2w6IG1QYXJhbWV0ZXJzLmNvbnRyb2wsXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiBtUGFyYW1ldGVycy5hQ29udGV4dHMsXG5cdFx0XHRcdHNBY3Rpb25OYW1lOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gYVJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKFxuXHRtUGFyYW1ldGVyczogQ2FsbEFjdGlvblBhcmFtZXRlcnMsXG5cdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YWN0aW9uRGVmaW5pdGlvbjogTWV0YU1vZGVsQWN0aW9uXG4pOiB2b2lkIHtcblx0aWYgKFxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzLmxlbmd0aCAmJlxuXHRcdGFjdGlvbkRlZmluaXRpb24uJElzQm91bmRcblx0KSB7XG5cdFx0bGV0IHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbXTtcblx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdGNvbnN0IGlzU3RhdGljID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaXNTdGF0aWM7XG5cdFx0aWYgKCFpc1N0YXRpYykge1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHRpZiAoY29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gY29udHJvbC5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0RGVsZXRlSGVscGVyLnVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LCBzZWxlY3RlZENvbnRleHRzKTtcblx0fVxufVxuXG5mdW5jdGlvbiBhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrKFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdGFDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSxcblx0b0RpYWxvZzogRGlhbG9nIHwgdW5kZWZpbmVkLFxuXHRtZXNzYWdlczogTWVzc2FnZVtdLFxuXHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzLFxuXHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldDogYm9vbGVhbixcblx0aXNBY3Rpb25TdWNjZXNzZnVsPzogYm9vbGVhblxuKTogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzIHtcblx0bGV0IHNob3dNZXNzYWdlQm94ID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4uc2hvd01lc3NhZ2VCb3gsXG5cdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbi5zaG93TWVzc2FnZURpYWxvZztcblx0Y29uc3Qgb0NvbnRyb2wgPSBtUGFyYW1ldGVycy5jb250cm9sO1xuXHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRjb25zdCB1bmJvdW5kTWVzc2FnZXMgPSBtZXNzYWdlcy5maWx0ZXIoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXRzKCk/LlswXSA9PT0gXCJcIjtcblx0fSk7XG5cdGNvbnN0IEFQRG1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cyAmJlxuXHRcdFx0bWVzc2FnZS5nZXRUYXJnZXRzKCk/LlswXS5pbmNsdWRlcyhtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAmJlxuXHRcdFx0bVBhcmFtZXRlcnM/LmFBY3Rpb25QYXJhbWV0ZXJzPy5zb21lKGZ1bmN0aW9uIChhY3Rpb25QYXJhbSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXRzKCk/LlswXS5pbmNsdWRlcyhhY3Rpb25QYXJhbS5uYW1lKTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fSk7XG5cdEFQRG1lc3NhZ2VzPy5mb3JFYWNoKGZ1bmN0aW9uIChBUERNZXNzYWdlKSB7XG5cdFx0KEFQRE1lc3NhZ2UgYXMgdW5rbm93biBhcyB7IGlzQVBEVGFyZ2V0OiBib29sZWFuIH0pLmlzQVBEVGFyZ2V0ID0gdHJ1ZTtcblx0fSk7XG5cblx0Y29uc3QgZXJyb3JUYXJnZXRzSW5BUEQgPSBBUERtZXNzYWdlcy5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG5cdGxldCBoYXNDaGFuZ2VTZXRNb2RpZmllZE1lc3NhZ2UgPSBmYWxzZTtcblx0Ly9JZiBBY3Rpb24gaXMgc3VjY2Vzc2Z1bCB3aXRoIHdhcm5pbmdzLCBkb250IHNob3cgdGhlIGdlbmVyaWMgZXJyb3IgbWVzc2FnZSBmb3IgY2hhbmdlc2V0IGluIGRpYWxvZ1xuXHRpZiAoc2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgJiYgIWVycm9yVGFyZ2V0c0luQVBEICYmICFpc0FjdGlvblN1Y2Nlc3NmdWwpIHtcblx0XHRoYXNDaGFuZ2VTZXRNb2RpZmllZE1lc3NhZ2UgPSB0cnVlO1xuXHRcdGxldCBzTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9FUlJPUl9NRVNTQUdFU19URVhUXCIpO1xuXHRcdGxldCBzRGVzY3JpcHRpb25UZXh0ID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX0VSUk9SX01FU1NBR0VTX0RFVEFJTF9URVhUXCIpO1xuXHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlc0luTW9kZWwgPSBtZXNzYWdlTW9kZWwuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGFCb3VuZE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUpO1xuXHRcdGxldCBnZW5lcmljTWVzc2FnZTtcblx0XHRjb25zdCBpc0VkaXRhYmxlID0gb0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblxuXHRcdGNvbnN0IG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nID0gbWVzc2FnZXMuZmluZEluZGV4KGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIiB8fCBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJXYXJuaW5nXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgbm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCA9IG1lc3NhZ2VzSW5Nb2RlbC5maW5kSW5kZXgoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiIHx8IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIldhcm5pbmdcIjtcblx0XHR9KTtcblxuXHRcdGlmIChcblx0XHRcdG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nICE9PSAxICYmXG5cdFx0XHRub25FcnJvck1lc3NhZ2VFeGlzdHNJbk1vZGVsICE9PSAtMSAmJlxuXHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoID4gMVxuXHRcdCkge1xuXHRcdFx0aWYgKG1lc3NhZ2VzSW5Nb2RlbC5sZW5ndGggPT09IDEgJiYgYUJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdG1lc3NhZ2VzSW5Nb2RlbFswXS5zZXRNZXNzYWdlKFxuXHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRcIikgK1xuXHRcdFx0XHRcdFx0XHRcIlxcblxcblwiICtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZXNJbk1vZGVsWzBdLmdldE1lc3NhZ2UoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01lc3NhZ2UgPSBpc0VkaXRhYmxlXG5cdFx0XHRcdFx0XHQ/IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9TSU5HTEVfRVJST1JfTUVTU0FHRV9URVhUX0VESVRcIilcblx0XHRcdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRcIik7XG5cdFx0XHRcdFx0c0Rlc2NyaXB0aW9uVGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBzTWVzc2FnZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25UZXh0LFxuXHRcdFx0XHRcdFx0Y29kZTogXCJGRV9DVVNUT01fTUVTU0FHRV9DSEFOR0VTRVRfQUxMX0ZBSUxFRFwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0bWVzc2FnZXMudW5zaGlmdChnZW5lcmljTWVzc2FnZSk7XG5cdFx0XHRcdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGdlbmVyaWNNZXNzYWdlID0gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdG1lc3NhZ2U6IHNNZXNzYWdlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdHRhcmdldDogXCJcIixcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25UZXh0LFxuXHRcdFx0XHRcdGNvZGU6IFwiRkVfQ1VTVE9NX01FU1NBR0VfQ0hBTkdFU0VUX0FMTF9GQUlMRURcIlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bWVzc2FnZXMudW5zaGlmdChnZW5lcmljTWVzc2FnZSk7XG5cdFx0XHRcdGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChvRGlhbG9nICYmIG9EaWFsb2cuaXNPcGVuKCkgJiYgYUNvbnRleHRzLmxlbmd0aCAhPT0gMCAmJiAhbVBhcmFtZXRlcnMuaXNTdGF0aWMpIHtcblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHQvL2lzb2xhdGVkXG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEgfHwgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdC8vIGRvZXMgbm90IG1hdHRlciBpZiBlcnJvciBpcyBpbiBBUEQgb3Igbm90LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29udGV4dHMgc2VsZWN0ZWQgb3IgaWYgdGhlIGVycm9yIGlzIG5vdCB0aGUgQVBELCB3ZSBjbG9zZSBpdC5cblx0XHRcdFx0Ly8gVE9ETzogRGlsYW9nIGhhbmRsaW5nIHNob3VsZCBub3QgYmUgcGFydCBvZiBtZXNzYWdlIGhhbmRsaW5nLiBSZWZhY3RvciBhY2NvcmRpbmdseSAtIGRpYWxvZyBzaG91bGQgbm90IGJlIG5lZWRlZCBpbnNpZGUgdGhpcyBtZXRob2QgLSBuZWl0aGVyXG5cdFx0XHRcdC8vIHRvIGFzayB3aGV0aGVyIGl0J3Mgb3Blbiwgbm9yIHRvIGNsb3NlL2Rlc3Ryb3kgaXQhXG5cdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdC8vY2hhbmdlc2V0XG5cdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblx0bGV0IGZpbHRlcmVkTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuXHRjb25zdCBiSXNBUERPcGVuID0gb0RpYWxvZyAmJiBvRGlhbG9nLmlzT3BlbigpO1xuXHRpZiAoIWhhc0NoYW5nZVNldE1vZGlmaWVkTWVzc2FnZSkge1xuXHRcdGlmIChcblx0XHRcdG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0bWVzc2FnZXNbMF0uZ2V0VGFyZ2V0cyAmJlxuXHRcdFx0bWVzc2FnZXNbMF0uZ2V0VGFyZ2V0cygpPy5bMF0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0bWVzc2FnZXNbMF0uZ2V0VGFyZ2V0cygpPy5bMF0gIT09IFwiXCIgJiZcblx0XHRcdG1lc3NhZ2VzWzBdLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiXG5cdFx0KSB7XG5cdFx0XHRpZiAoKG9Db250cm9sICYmIG9Db250cm9sLmdldE1vZGVsKFwidWlcIikhLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgPT09IGZhbHNlKSB8fCAhb0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gT1AgZWRpdCBvciBMUlxuXHRcdFx0XHRzaG93TWVzc2FnZUJveCA9ICFlcnJvclRhcmdldHNJbkFQRDtcblx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpIS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpID09PSBmYWxzZSkge1xuXHRcdFx0XHRpZiAoYklzQVBET3BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRpZiAoIWJJc0FQRE9wZW4gJiYgZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0ZmlsdGVyZWRNZXNzYWdlcyA9IHVuYm91bmRNZXNzYWdlcy5jb25jYXQoQVBEbWVzc2FnZXMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFiSXNBUERPcGVuICYmIHVuYm91bmRNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHQvLyBlcnJvciB0YXJnZXRzIGluIEFQRCA9PiB0aGVyZSBpcyBhdGxlYXN0IG9uZSBib3VuZCBtZXNzYWdlLiBJZiB0aGVyZSBhcmUgdW5ib3VuZCBtZXNzYWdlcywgZGlhbG9nIG11c3QgYmUgc2hvd24uXG5cdFx0XHRcdFx0Ly8gZm9yIGRyYWZ0IGVudGl0eSwgd2UgYWxyZWFkeSBjbG9zZWQgdGhlIEFQRFxuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRsZXQgZm5HZXRNZXNzYWdlU3VidGl0bGU7XG5cdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdGZuR2V0TWVzc2FnZVN1YnRpdGxlID0gbWVzc2FnZUhhbmRsaW5nLnNldE1lc3NhZ2VTdWJ0aXRsZS5iaW5kKHt9LCBvQ29udHJvbCwgYUNvbnRleHRzKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNob3dNZXNzYWdlQm94OiBzaG93TWVzc2FnZUJveCxcblx0XHRzaG93TWVzc2FnZURpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2csXG5cdFx0ZmlsdGVyZWRNZXNzYWdlczogZmlsdGVyZWRNZXNzYWdlcy5sZW5ndGggPyBmaWx0ZXJlZE1lc3NhZ2VzIDogbWVzc2FnZXMsXG5cdFx0Zm5HZXRNZXNzYWdlU3VidGl0bGU6IGZuR2V0TWVzc2FnZVN1YnRpdGxlLFxuXHRcdHNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZzogbVBhcmFtZXRlcnMuYkdyb3VwZWRcblx0fTtcbn1cblxuLypcbiAqIEN1cnJlbnRseSwgdGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIGRpYWxvZyBhbmQgZXhlY3V0aW5nIHRoZSBhY3Rpb24uIFRoZSBwcm9taXNlIHJldHVybmVkIGlzIHBlbmRpbmcgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBpbnB1dCwgYXMgd2VsbCBhcyB3aGlsZSB0aGVcbiAqIGJhY2stZW5kIHJlcXVlc3QgaXMgcnVubmluZy4gVGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBkaWFsb2cgYW5kIGFsc28gd2hlbiB0aGUgYmFjay1lbmQgcmVxdWVzdCBmYWlscy5cbiAqIFRPRE86IFJlZmFjdG9yaW5nOiBTZXBhcmF0ZSBkaWFsb2cgaGFuZGxpbmcgZnJvbSBiYWNrZW5kIHByb2Nlc3NpbmcuIERpYWxvZyBoYW5kbGluZyBzaG91bGQgcmV0dXJuIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gcGFyYW1ldGVycyB0byBiZSBwcm92aWRlZCB0byBiYWNrZW5kLiBJZiBkaWFsb2cgaXNcbiAqIGNhbmNlbGxlZCwgdGhhdCBwcm9taXNlIGNhbiBiZSByZWplY3RlZC4gTWV0aG9kIHJlc3BvbnNpYmxlIGZvciBiYWNrZW5kIHByb2Nlc3NpbmcgbmVlZCB0byBkZWFsIHdpdGggbXVsdGlwbGUgY29udGV4dHMgLSBpLmUuIGl0IHNob3VsZCBlaXRoZXIgcmV0dXJuIGFuIGFycmF5IG9mIFByb21pc2VzIG9yXG4gKiBhIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIGFycmF5LiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoYXQgUHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgYWxzbyB3aGVuIHNvbWUgb3IgZXZlbiBhbGwgY29udGV4dHMgZmFpbGVkIGluIGJhY2tlbmQgLSB0aGUgb3ZlcmFsbCBwcm9jZXNzIHN0aWxsIHdhc1xuICogc3VjY2Vzc2Z1bC5cbiAqXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyhcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRzQWN0aW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW10sXG5cdGFQYXJhbWV0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfCB1bmRlZmluZWQsXG5cdG9BY3Rpb25Db250ZXh0OiBDb250ZXh0LFxuXHRvUGFyZW50Q29udHJvbDogVmlldyxcblx0ZW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzOiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0dmlldzogVmlldyB8IG51bGwsXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0Y29uc3Qgc1BhdGggPSBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dCwgc0FjdGlvbk5hbWUpLFxuXHRcdG1ldGFNb2RlbCA9IG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbixcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+KGFzeW5jIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRsZXQgYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXTsgLy8gdG8gYmUgZmlsbGVkIGFmdGVyIGZyYWdtZW50IChmb3IgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cpIGlzIGxvYWRlZC4gQWN0dWFsbHkgb25seSBuZWVkZWQgZHVyaW5nIGRpYWxvZyBwcm9jZXNzaW5nLCBpLmUuIGNvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNvbnRyb2xsZXIgYW5kIGRpcmVjdGx5IGluaXRpYWxpemVkIHRoZXJlLCBidXQgb25seSBhZnRlciBtb3ZpbmcgYWxsIGhhbmRsZXJzIChlc3AuIHByZXNzIGhhbmRsZXIgZm9yIGFjdGlvbiBidXR0b24pIHRvIGNvbnRyb2xsZXIuXG5cblx0XHRjb25zdCBfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlciA9IChwYXJhbWV0ZXI/OiBFZG1BY3Rpb25QYXJhbWV0ZXIpOiB2b2lkID0+IHtcblx0XHRcdGlmIChwYXJhbWV0ZXIpIHtcblx0XHRcdFx0Y29uc3QgYWxsTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRjb25zdCBjb250cm9sSWQgPSBnZW5lcmF0ZShbXCJBUERfXCIsIHBhcmFtZXRlci5uYW1lXSk7XG5cdFx0XHRcdC8vIGFsc28gcmVtb3ZlIG1lc3NhZ2VzIGFzc2lnbmVkIHRvIGlubmVyIGNvbnRyb2xzLCBidXQgYXZvaWQgcmVtb3ZpbmcgbWVzc2FnZXMgZm9yIGRpZmZlcmVudCBwYXJhbXRlcnMgKHdpdGggbmFtZSBiZWluZyBzdWJzdHJpbmcgb2YgYW5vdGhlciBwYXJhbWV0ZXIgbmFtZSlcblx0XHRcdFx0Y29uc3QgcmVsZXZhbnRNZXNzYWdlcyA9IGFsbE1lc3NhZ2VzLmZpbHRlcigobXNnOiBNZXNzYWdlKSA9PlxuXHRcdFx0XHRcdG1zZy5nZXRDb250cm9sSWRzKCkuc29tZSgoaWQ6IHN0cmluZykgPT4gY29udHJvbElkLnNwbGl0KFwiLVwiKS5pbmNsdWRlcyhpZCkpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhyZWxldmFudE1lc3NhZ2VzKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRoYW5kbGVDaGFuZ2U6IGFzeW5jIGZ1bmN0aW9uIChvRXZlbnQ6IEV2ZW50PHsgcHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+IH0+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0XHRjb25zdCBhY3Rpb25QYXJhbWV0ZXJJbmZvID0gYWN0aW9uUGFyYW1ldGVySW5mb3MuZmluZChcblx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mbykgPT4gYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZCA9PT0gZmllbGRcblx0XHRcdFx0KSBhcyBBY3Rpb25QYXJhbWV0ZXJJbmZvO1xuXHRcdFx0XHQvLyBmaWVsZCB2YWx1ZSBpcyBiZWluZyBjaGFuZ2VkLCB0aHVzIGV4aXN0aW5nIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdGhhdCBmaWVsZCBhcmUgbm90IHZhbGlkIGFueW1vcmVcblx0XHRcdFx0X3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIoYWN0aW9uUGFyYW1ldGVySW5mby5wYXJhbWV0ZXIpO1xuXHRcdFx0XHQvLyBhZGFwdCBpbmZvLiBQcm9taXNlIGlzIHJlc29sdmVkIHRvIHZhbHVlIG9yIHJlamVjdGVkIHdpdGggZXhjZXB0aW9uIGNvbnRhaW5pbmcgbWVzc2FnZVxuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby52YWx1ZSA9IGF3YWl0IGFjdGlvblBhcmFtZXRlckluZm8udmFsaWRhdGlvblByb21pc2U7XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby5oYXNFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdGRlbGV0ZSBhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbHVlO1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8uaGFzRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvOiBhY3Rpb25QYXJhbWV0ZXJJbmZvLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlOiAoZXJyb3IgYXMgeyBtZXNzYWdlOiBzdHJpbmcgfSkubWVzc2FnZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdGNvbnN0IG9QYXJhbWV0ZXJNb2RlbCA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdFx0JGRpc3BsYXlNb2RlOiB7fVxuXHRcdH0pO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyZWF0ZWRGcmFnbWVudCA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQsXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiBvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQ/LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHQ/LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IGVudGl0eVNldENvbnRleHQ/LmdldE1vZGVsKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHQvLyBUT0RPOiBtb3ZlIHRoZSBkaWFsb2cgaW50byB0aGUgZnJhZ21lbnQgYW5kIG1vdmUgdGhlIGhhbmRsZXJzIHRvIHRoZSBvQ29udHJvbGxlclxuXHRcdFx0Y29uc3QgYUNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRcdFx0Y29uc3QgYUZ1bmN0aW9uUGFyYW1zOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PltdID0gW107XG5cblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhvQXBwQ29tcG9uZW50LCBhQWN0aW9uUGFyYW1ldGVycywgb1BhcmFtZXRlck1vZGVsLCB0cnVlKTtcblx0XHRcdGNvbnN0IG9EaWFsb2dDb250ZW50ID0gKGF3YWl0IEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0XHRkZWZpbml0aW9uOiBjcmVhdGVkRnJhZ21lbnQgYXMgdW5rbm93biBhcyBzdHJpbmcsXG5cdFx0XHRcdGNvbnRyb2xsZXI6IG9Db250cm9sbGVyXG5cdFx0XHR9KSkgYXMgQ29udHJvbDtcblxuXHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mb3MgPSBhQWN0aW9uUGFyYW1ldGVycy5tYXAoKGFjdGlvblBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWVsZCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2VuZXJhdGUoW1wiQVBEX1wiLCBhY3Rpb25QYXJhbWV0ZXIubmFtZV0pKSBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZDtcblx0XHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gZmllbGQuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyOiBhY3Rpb25QYXJhbWV0ZXIsXG5cdFx0XHRcdFx0ZmllbGQ6IGZpZWxkLFxuXHRcdFx0XHRcdGlzTXVsdGlWYWx1ZTogaXNNdWx0aVZhbHVlLFxuXHRcdFx0XHRcdGhhc0Vycm9yOiBmYWxzZVxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9QYXJlbnRDb250cm9sKTtcblx0XHRcdGxldCBhY3Rpb25SZXN1bHQ6IHtcblx0XHRcdFx0ZGlhbG9nQ2FuY2VsbGVkOiBib29sZWFuO1xuXHRcdFx0XHRyZXN1bHQ6IHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W107XG5cdFx0XHR9ID0ge1xuXHRcdFx0XHRkaWFsb2dDYW5jZWxsZWQ6IHRydWUsIC8vIHRvIGJlIHNldCB0byBmYWxzZSBpbiBjYXNlIG9mIHN1Y2Nlc3NmdWwgYWN0aW9uIGV4ZWN0aW9uXG5cdFx0XHRcdHJlc3VsdDogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXG5cdFx0XHRsZXQgYnV0dG9uTG9jayA9IGZhbHNlO1xuXG5cdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyhnZW5lcmF0ZShbXCJmZVwiLCBcIkFQRF9cIiwgc0FjdGlvbk5hbWVdKSwge1xuXHRcdFx0XHR0aXRsZTogc0FjdGlvbkxhYmVsIHx8IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19USVRMRVwiKSxcblx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0ZXNjYXBlSGFuZGxlcjogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdC8vIGVzY2FwZSBoYW5kbGVyIGlzIG1lYW50IHRvIHBvc3NpYmx5IHN1cHByZXNzIG9yIHBvc3Rwb25lIGNsb3NpbmcgdGhlIGRpYWxvZyBvbiBlc2NhcGUgKGJ5IGNhbGxpbmcgXCJyZWplY3RcIiBvbiB0aGUgcHJvdmlkZWQgb2JqZWN0LCBvciBcInJlc29sdmVcIiBvbmx5IHdoZW5cblx0XHRcdFx0XHQvLyBkb25lIHdpdGggYWxsIHRhc2tzIHRvIGhhcHBlbiBiZWZvcmUgZGlhbG9nIGNhbiBiZSBjbG9zZWQpLiBJdCdzIG5vdCBpbnRlbmRlZCB0byBleHBsaWNldGx5IGNsb3NlIHRoZSBkaWFsb2cgaGVyZSAodGhhdCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiBub1xuXHRcdFx0XHRcdC8vIGVzY2FwZUhhbmRsZXIgaXMgcHJvdmlkZWQgb3IgdGhlIHJlc29sdmUtY2FsbGJhY2sgaXMgY2FsbGVkKSBvciBmb3Igb3duIHdyYXAgdXAgdGFza3MgKGxpa2UgcmVtb3ZpbmcgdmFsaWRpdGlvbiBtZXNzYWdlcyAtIHRoaXMgc2hvdWxkIGhhcHBlbiBpbiB0aGVcblx0XHRcdFx0XHQvLyBhZnRlckNsb3NlKS5cblx0XHRcdFx0XHQvLyBUT0RPOiBNb3ZlIHdyYXAgdXAgdGFza3MgdG8gYWZ0ZXJDbG9zZSwgYW5kIHJlbW92ZSB0aGlzIG1ldGhvZCBjb21wbGV0ZWx5LiBUYWtlIGNhcmUgdG8gYWxzbyBhZGFwdCBlbmQgYnV0dG9uIHByZXNzIGhhbmRsZXIgYWNjb3JkaW5nbHkuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5IG9ubHkgc3RpbGwgbmVlZGVkIHRvIGRpZmZlcmVudGlhdGUgY2xvc2luZyBkaWFsb2cgYWZ0ZXIgc3VjY2Vzc2Z1bCBleGVjdXRpb24gKHVzZXMgcmVzb2x2ZSkgZnJvbSB1c2VyIGNhbmNlbGxhdGlvbiAodXNpbmcgcmVqZWN0KVxuXHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHQvL1x0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJPa1wiXSksIHtcblx0XHRcdFx0XHR0ZXh0OiBiSXNDcmVhdGVBY3Rpb25cblx0XHRcdFx0XHRcdD8gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURV9CVVRUT05cIilcblx0XHRcdFx0XHRcdDogX2dldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWUocmVzb3VyY2VNb2RlbCwgc0FjdGlvbkxhYmVsLCBzQWN0aW9uTmFtZSwgZW50aXR5U2V0TmFtZSksXG5cdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0cHJlc3M6IGFzeW5jIGZ1bmN0aW9uICgpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdC8vIHByZXZlbnQgbXVsdGlwbGUgcHJlc3MgZXZlbnRzLiBUaGUgQnVzeUxvY2tlciBpcyBub3QgZmFzdCBlbm91Z2guIChCQ1A6IDIzNzAxMzAyMTApXG5cdFx0XHRcdFx0XHRcdC8vIGJ1dHRvbkxvY2sgaXMgc2V0IG9uY2UgYW5kIHJlc2V0IGluXG5cdFx0XHRcdFx0XHRcdC8vIC0gYWZ0ZXIgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0XHRcdFx0XHQvLyAtIGluIGNhc2Ugb2YgYWN0aW9uIGVycm9yIG1lc3NhZ2UgaXMgY2FuY2VsZWRcblx0XHRcdFx0XHRcdFx0Ly8gLSBpbiBhZnRlckNsb3NlIGV2ZW50XG5cblx0XHRcdFx0XHRcdFx0aWYgKGJ1dHRvbkxvY2sgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnV0dG9uTG9jayA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCEoYXdhaXQgQWN0aW9uUnVudGltZS52YWxpZGF0ZVByb3BlcnRpZXMoYWN0aW9uUGFyYW1ldGVySW5mb3MsIHJlc291cmNlTW9kZWwpKSkge1xuXHRcdFx0XHRcdFx0XHRcdGJ1dHRvbkxvY2sgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGZhaWxlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBkdWUgdG8gdXNpbmcgdGhlIHNlYXJjaCBhbmQgdmFsdWUgaGVscHMgb24gdGhlIGFjdGlvbiBkaWFsb2cgdHJhbnNpZW50IG1lc3NhZ2VzIGNvdWxkIGFwcGVhclxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIG5lZWQgYW4gVVggZGVzaWduIGZvciB0aG9zZSB0byBzaG93IHRoZW0gdG8gdGhlIHVzZXIgLSBmb3Igbm93IHJlbW92ZSB0aGVtIGJlZm9yZSBjb250aW51aW5nXG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbW92ZSBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gRGlhbG9nIChTaW1wbGVGb3JtKSB0byBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGluIHRoZSBvcGVyYXRpb24gYmluZGluZ3MgZm9yIGFsbCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdGxldCB2UGFyYW1ldGVyVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGFsbE51bGxQYXJhbWV0ZXJzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUGFyYW1ldGVyQ29udGV4dCA9IG9PcGVyYXRpb25CaW5kaW5nICYmIG9PcGVyYXRpb25CaW5kaW5nLmdldFBhcmFtZXRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQWN0aW9uUGFyYW1ldGVyc1tpXS5pc0NvbGxlY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYU1WRkNvbnRlbnQgPSAob0RpYWxvZy5nZXRNb2RlbChcIm12ZnZpZXdcIikgYXMgSlNPTk1vZGVsKS5nZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGAvJHthQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lfWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBqIGluIGFNVkZDb250ZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUtleVZhbHVlcy5wdXNoKGFNVkZDb250ZW50W2pdLktleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gYUtleVZhbHVlcztcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IG9QYXJhbWV0ZXJDb250ZXh0Py5nZXRQcm9wZXJ0eShhQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzW2FBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWVdID0gdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbWV0ZXJWYWx1ZSAhPT0gbnVsbCAmJiB2UGFyYW1ldGVyVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxOdWxsUGFyYW1ldGVycyA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoIWFsbE51bGxQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIikuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYXZvaWQgb3ZlcnJpZGluZyBpbmNvbWluZyBwYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaW5uZXJQYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0XHRcdGlubmVyUGFyYW1ldGVycy5sYWJlbCA9IHNBY3Rpb25MYWJlbDtcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVBUE1BY3Rpb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlubmVyUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2csXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlRVRhZ1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvblJlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2FuY2VsbGVkOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0OiBhUmVzdWx0XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZShhUmVzdWx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuaXM0MTJFeGVjdXRlZCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcyA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFpbGVkQ29udGV4dHMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5tYXAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoZmFpbCkgPT4gZmFpbC5vQWN0aW9uLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJQYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGZhaWxlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHQgPSBhd2FpdCBleGVjdXRlQVBNQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlubmVyUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlRVRhZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvblJlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0NhbmNlbGxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQ6IGFSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlc29sdmUoYVJlc3VsdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIG1lc3NhZ2VIYW5kbGluZy5oYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3JjZVNob3dVSUVsZW1lbnQ6IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlczogTWVzc2FnZVtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiB1bmRlZmluZWQsIC8vIG5vdCB1c2VkIGF0IGFsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWU6IHNBY3Rpb25MYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvRGlhbG9nKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBzaG93TWVzc2FnZURpYWxvZzogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIG1lc3NhZ2VIYW5kbGluZy5oYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dDogZmFpbGVkQ29udGV4dHNbMF0sIC8vIG9ubHkgdXNlZCBpbiBjYXNlIG9mIGZhaWxlZCBjb250ZXh0IHRvIHJlc2V0IGluIG1lc3NhZ2VIYW5kbGluZyBzaG93TWVzc2FnZXNJblVJXG5cdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JjZVNob3dVSUVsZW1lbnQ6IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjazogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogZnVuY3Rpb24gKGFNZXNzYWdlczogTWVzc2FnZVtdLCBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFdoeSBpcyB0aGlzIGltcGxlbWVudGVkIGFzIGNhbGxiYWNrPyBBcHBhcmVudGx5LCBhbGwgbmVlZGVkIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBiZWZvcmVoYW5kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRPRE86IHJlZmFjdG9yIGFjY29yZGluZ2x5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNob3dNZXNzYWdlUGFyYW1ldGVycyA9IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2csXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlRGlhbG9nO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiB1bmRlZmluZWQsIC8vIG5vdCB1c2VkIGF0IGFsbCFcblx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250cm9sOiBtUGFyYW1ldGVycy5jb250cm9sXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnV0dG9uTG9jayA9IGZhbHNlOyAvL25lZWRlZCBpZiB0aGUgYWN0aW9uIGZhaWxzIHdpdGggYW4gZXJyb3IgcG9wdXAgYW5kIHRoaXMgb25lIGlzIGNhbmNlbGQgKEpvdXJuZXk6IDQxMldhcm5pbmdIYW5kbGluZylcblx0XHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIG9mIGJhY2tlbmQgdmFsaWRhdGlvbiBlcnJvcihzPyksIG1lc3NhZ2Ugc2hhbGwgbm90IGJlIHNob3duIGluIG1lc3NhZ2UgZGlhbG9nIGJ1dCBuZXh0IHRvIHRoZSBmaWVsZCBvbiBwYXJhbWV0ZXIgZGlhbG9nLCB3aGljaCBzaG91bGRcblx0XHRcdFx0XHRcdFx0XHQvLyBzdGF5IG9wZW4gaW4gdGhpcyBjYXNlID0+IGluIHRoaXMgY2FzZSwgd2UgbXVzdCBub3QgcmVzb2x2ZSBvciByZWplY3QgdGhlIHByb21pc2UgY29udHJvbGxpbmcgdGhlIHBhcmFtZXRlciBkaWFsb2cuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gYWxsIG90aGVyIGNhc2VzIChlLmcuIG90aGVyIGJhY2tlbmQgZXJyb3JzIG9yIHVzZXIgY2FuY2VsbGF0aW9uKSwgdGhlIHByb21pc2UgY29udHJvbGxpbmcgdGhlIHBhcmFtZXRlciBkaWFsb2cgbmVlZHMgdG8gYmUgcmVqZWN0ZWQgdG8gYWxsb3dcblx0XHRcdFx0XHRcdFx0XHQvLyBjYWxsZXJzIHRvIHJlYWN0LiAoRXhhbXBsZTogSWYgY3JlYXRpb24gaW4gYmFja2VuZCBhZnRlciBuYXZpZ2F0aW9uIHRvIHRyYW5zaWVudCBjb250ZXh0IGZhaWxzLCBiYWNrIG5hdmlnYXRpb24gbmVlZHMgdG8gYmUgdHJpZ2dlcmVkKVxuXHRcdFx0XHRcdFx0XHRcdC8vIFRPRE86IFJlZmFjdG9yIHRvIHNlcGFyYXRlIGRpYWxvZyBoYW5kbGluZyBmcm9tIGJhY2tlbmQgcmVxdWVzdCBpbnN0ZWFkIG9mIHRha2luZyBkZWNpc2lvbiBiYXNlZCBvbiBtZXNzYWdlIGhhbmRsaW5nXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNob3dNZXNzYWdlRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBkbyBub3RoaW5nLCBkbyBub3QgcmVqZWN0IHByb21pc2UgaGVyZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBXZSBkbyBub3QgY2xvc2UgdGhlIEFQTSBkaWFsb2cgaWYgdXNlciBlbnRlcnMgYSB3cm9uZyB2YWx1ZSBpbiBvZiB0aGUgZmllbGRzIHRoYXQgcmVzdWx0cyBpbiBhbiBlcnJvciBmcm9tIHRoZSBiYWNrZW5kLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBjYW4gY2xvc2UgdGhlIG1lc3NhZ2UgZGlhbG9nIGFuZCB0aGUgQVBNIGRpYWxvZyB3b3VsZCBzdGlsbCBiZSBvcGVuIG9uIHdoaWNoIGhlIGNvdWxkIGVudGVyIGEgbmV3IHZhbHVlIGFuZCB0cmlnZ2VyIHRoZSBhY3Rpb24gYWdhaW4uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEVhcmxpZXIgd2Ugd2VyZSByZWplY3RpbmcgdGhlIHByb21pc2Ugb24gZXJyb3IgaGVyZSwgYW5kIHRoZSBjYWxsIHN0YWNrIHdhcyBkZXN0cm95ZWQgYXMgdGhlIHByb21pc2Ugd2FzIHJlamVjdGVkIGFuZCByZXR1cm5lZCB0byBFZGl0RmxvdyBpbnZva2UgYWN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBCdXQgc2luY2UgdGhlIEFQTSBkaWFsb2cgd2FzIHN0aWxsIG9wZW4sIGEgbmV3IHByb21pc2Ugd2FzIHJlc29sdmVkIGluIGNhc2UgdGhlIHVzZXIgcmV0cmllZCB0aGUgYWN0aW9uIGFuZCB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBidXQgdGhlIG5hdmlnYXRpb24gdG8gb2JqZWN0IHBhZ2Ugd2FzIG5vdCB0YWtpbmcgcGxhY2UuXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLmNsZWFyU3RyaWN0V2FybmluZ01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdFx0XHRcdFx0XHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzOiBbXSxcblx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0XHRcdFx0XHRcdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IG5ldyBTZXQoKVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvRGlhbG9nKSkge1xuXHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJDYW5jZWxcIl0pLCB7XG5cdFx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBjYW5jZWwgYnV0dG9uIHNob3VsZCBqdXN0IGNsb3NlIHRoZSBkaWFsb2cgKHNpbWlsYXIgdG8gdXNpbmcgZXNjYXBlKS4gQWxsIHdyYXAgdXAgdGFza3Mgc2hvdWxkIGJlIG1vdmVkIHRvIGFmdGVyQ2xvc2UuXG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHQvLyByZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0Ly8gVE9ETzogYmVmb3JlT3BlbiBpcyBqdXN0IGFuIGV2ZW50LCBpLmUuIG5vdCB3YWl0aW5nIGZvciB0aGUgUHJvbWlzZSB0byBiZSByZXNvbHZlZC4gQ2hlY2sgaWYgdGFza3Mgb2YgdGhpcyBmdW5jdGlvbiBuZWVkIHRvIGJlIGRvbmUgYmVmb3JlIG9wZW5pbmcgdGhlIGRpYWxvZ1xuXHRcdFx0XHQvLyAtIGlmIHllcywgdGhleSBuZWVkIHRvIGJlIG1vdmVkIG91dHNpZGUuXG5cdFx0XHRcdC8vIEFzc3VtcHRpb246IFNvbWV0aW1lcyBkaWFsb2cgY2FuIGJlIHNlZW4gd2l0aG91dCBhbnkgZmllbGRzIGZvciBhIHNob3J0IHRpbWUgLSBtYXliZSB0aGlzIGlzIGNhdXNlZCBieSB0aGlzIGFzeW5jaHJvbml0eVxuXHRcdFx0XHRiZWZvcmVPcGVuOiBhc3luYyBmdW5jdGlvbiAob0V2ZW50OiBEaWFsb2ckQmVmb3JlT3BlbkV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblx0XHRcdFx0XHRjb25zdCBoYXNWaXNpYmxlUGFyYW1ldGVyID0gYWN0aW9uUGFyYW1ldGVySW5mb3Muc29tZSgoaW5mbykgPT4gaW5mby5maWVsZC5nZXRWaXNpYmxlKCkpO1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IChvRGlhbG9nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICYmIG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9AXCIpWzBdLFxuXHRcdFx0XHRcdFx0XHRzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRcdFx0YCR7c0FjdGlvblBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0RlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nID0gYXN5bmMgZnVuY3Rpb24gKHNCaW5kaW5nUGFyYW1ldGVyPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQm91bmRGdW5jdGlvbk5hbWUgPSBnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24oKTtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmFtZXRlck1vZGVsRGF0YSA9IG9QYXJhbWV0ZXJNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBwcmVmaWxsUGFyYW1ldGVyID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRcdFx0XHRcdFx0XHRzUGFyYW1OYW1lOiBzdHJpbmcsXG5cdFx0XHRcdFx0XHRcdHZQYXJhbURlZmF1bHRWYWx1ZT86IHN0cmluZyB8IHsgJFBhdGg/OiBzdHJpbmcgfVxuXHRcdFx0XHRcdFx0KTogUHJvbWlzZTx7IHBhcmFtTmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgYkxhdGVQcm9wZXJ0eUVycm9yPzogYm9vbGVhbjsgYk5vUG9zc2libGVWYWx1ZT86IGJvb2xlYW4gfT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBDYXNlIDE6IFRoZXJlIGlzIGEgUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbURlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAwICYmIHR5cGVvZiB2UGFyYW1EZWZhdWx0VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtVmFsdWUgPSBhd2FpdCBDb21tb25VdGlscy5yZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbVZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtVmFsdWUgPSBhd2FpdCBvT3BlcmF0aW9uQmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RQcm9wZXJ0eSh2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBtdWx0aSBzZWxlY3QsIG5lZWQgdG8gbG9vcCBvdmVyIGFDb250ZXh0cyAoYXMgY29udGV4dHMgY2Fubm90IGJlIHJldHJpZXZlZCB2aWEgYmluZGluZyBwYXJhbWV0ZXIgb2YgdGhlIG9wZXJhdGlvbiBiaW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzUGF0aEZvckNvbnRleHQgPSB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNQYXRoRm9yQ29udGV4dC5pbmRleE9mKGAke3NCaW5kaW5nUGFyYW1ldGVyfS9gKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhdGhGb3JDb250ZXh0ID0gc1BhdGhGb3JDb250ZXh0LnJlcGxhY2UoYCR7c0JpbmRpbmdQYXJhbWV0ZXJ9L2AsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0c1tpXS5nZXRQcm9wZXJ0eShzUGF0aEZvckNvbnRleHQpICE9PSB2UGFyYW1WYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRleHRzIGFyZSBub3QgYWxsIHRoZSBzYW1lLCBkbyBub3QgcHJlZmlsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJOb1Bvc3NpYmxlVmFsdWU6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtVmFsdWUgfTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWFkaW5nIGRlZmF1bHQgYWN0aW9uIHBhcmFtZXRlclwiLCBzUGFyYW1OYW1lLCBtUGFyYW1ldGVycy5hY3Rpb25OYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbU5hbWU6IHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTGF0ZVByb3BlcnR5RXJyb3I6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxLjI6IFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBkZWZpbmVzIGEgZml4ZWQgc3RyaW5nIHZhbHVlIChpLmUuIHZQYXJhbURlZmF1bHRWYWx1ZSA9ICdzb21lU3RyaW5nJylcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHZQYXJhbURlZmF1bHRWYWx1ZSB9O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJNb2RlbERhdGEuaGFzT3duUHJvcGVydHkoc1BhcmFtTmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDI6IFRoZXJlIGlzIG5vIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBhbm5vdGF0aW9uICg9PiBsb29rIGludG8gdGhlIEZMUCBVc2VyIERlZmF1bHRzKVxuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJhbWV0ZXJNb2RlbERhdGFbc1BhcmFtTmFtZV1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgeyAkUGF0aDogc3RyaW5nIH0ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gKG9EaWFsb2cuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblBhdGggPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSwgc1BhcmFtTmFtZSkgKyBcIkBcIixcblx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zICYmIG9QYXJhbWV0ZXJBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcIl07IC8vIGVpdGhlciB7ICRQYXRoOiAnc29tZVBhdGgnIH0gb3IgJ3NvbWVTdHJpbmcnXG5cdFx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFzIHN0cmluZyB8IHsgJFBhdGg6IHN0cmluZyB9O1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0bGV0IHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWU7XG5cdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUoc1BhcmFtTmFtZSk7XG5cdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUucHVzaChwcmVmaWxsUGFyYW1ldGVyKHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWUpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzQm91bmRGdW5jdGlvbk5hbWUgJiYgc0JvdW5kRnVuY3Rpb25OYW1lLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHNCb3VuZEZ1bmN0aW9uTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtcy5wdXNoKG9wZXJhdGlvbnMuY2FsbEJvdW5kRnVuY3Rpb24oc0JvdW5kRnVuY3Rpb25OYW1lLCBhQ29udGV4dHNbaV0sIG1QYXJhbWV0ZXJzLm1vZGVsKSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGFQcmVmaWxsUGFyYW1Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUpO1xuXHRcdFx0XHRcdFx0bGV0IGFFeGVjRnVuY3Rpb25Qcm9taXNlczogUHJvbWlzZTxPRGF0YVY0Q29udGV4dFtdPiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0XHRcdFx0XHRsZXQgb0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2U7XG5cdFx0XHRcdFx0XHRpZiAoYUZ1bmN0aW9uUGFyYW1zICYmIGFGdW5jdGlvblBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGFFeGVjRnVuY3Rpb25Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFGdW5jdGlvblBhcmFtcyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNNb2R1bGUgPSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdC5zdWJzdHJpbmcoMCwgbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0XHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlID0gRlBNSGVscGVyLmFjdGlvbldyYXBwZXIob0Nsb25lRXZlbnQsIHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0czogYUNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhUHJvbWlzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRcdFx0XHRcdFx0YVByZWZpbGxQYXJhbVByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRcdGFFeGVjRnVuY3Rpb25Qcm9taXNlcyxcblx0XHRcdFx0XHRcdFx0XHRvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZVxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlID0gYVByb21pc2VzWzBdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBmdW5jdGlvblBhcmFtcyA9IGFQcm9taXNlc1sxXTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGFQcm9taXNlc1syXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRcdFx0bGV0IHNEaWFsb2dQYXJhbU5hbWU6IHN0cmluZztcblxuXHRcdFx0XHRcdFx0XHQvLyBGaWxsIHRoZSBkaWFsb2cgd2l0aCB0aGUgZWFybGllciBkZXRlcm1pbmVkIHBhcmFtZXRlciB2YWx1ZXMgZnJvbSB0aGUgZGlmZmVyZW50IHNvdXJjZXNcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWUgIT09IFwiUmVzdWx0SXNBY3RpdmVFbnRpdHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0c0RpYWxvZ1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBQYXJhbWV0ZXIgdmFsdWVzIHByb3ZpZGVkIGluIHRoZSBjYWxsIG9mIGludm9rZUFjdGlvbiBvdmVycnVsZSBvdGhlciBzb3VyY2VzXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB2UGFyYW1ldGVyUHJvdmlkZWRWYWx1ZSA9IGFQYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChlbGVtZW50KSA9PiBlbGVtZW50Lm5hbWUgPT09IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCk/LnZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbWV0ZXJQcm92aWRlZFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihhQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lLCB2UGFyYW1ldGVyUHJvdmlkZWRWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Lmhhc093blByb3BlcnR5KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLm5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0W3NEaWFsb2dQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXSAmJiBjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0udmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZSwgY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLnZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIGRlZmF1bHQgdmFsdWUgaGFkIG5vdCBiZWVuIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBkdWUgdG8gZGlmZmVyZW50IGNvbnRleHRzLCB3ZSBkbyBub3RoaW5nIGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmICFjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0uYk5vUG9zc2libGVWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBjaGVjayBpZiB0aGUgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBzYW1lIHBhcmFtIHZhbHVlIGZvciBhbGwgdGhlIGNvbnRleHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoaiA8IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2pdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2ogKyAxXSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbaiArIDFdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGorKztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL3BhcmFtIHZhbHVlcyBhcmUgYWxsIHRoZSBzYW1lOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChqID09PSBhQ29udGV4dHMubGVuZ3RoIC0gMSAmJiBmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZ1bmN0aW9uUGFyYW1zWzBdICYmIGZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9Pbmx5IG9uZSBjb250ZXh0LCB0aGVuIHRoZSBkZWZhdWx0IHBhcmFtIHZhbHVlcyBhcmUgdG8gYmUgdmVyaWZpZWQgZnJvbSB0aGUgZnVuY3Rpb246XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS5uYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbMF0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBiRXJyb3JGb3VuZCA9IGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZS5zb21lKGZ1bmN0aW9uIChvVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAob1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCByZWZyZXNoID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfUkVGUkVTSFwiKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2xvc2UgPSBmdW5jdGlvbiAoYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9uID09PSByZWZyZXNoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBleHRlbnNpb25BUEkgPSAodmlldyBhcyBGRVZpZXcpPy5nZXRDb250cm9sbGVyKCkuZ2V0RXh0ZW5zaW9uQVBJKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHQoZXh0ZW5zaW9uQVBJIGFzIExpc3RSZXBvcnRFeHRlbnNpb25BUEkgfCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJKS5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIGF0IGxlYXN0IG9uZSBEZWZhdWx0IFByb3BlcnR5IGlzIGEgTGF0ZSBQcm9wZXJ0eSBhbmQgYW4gZVRhZyBlcnJvciB3YXMgcmFpc2VkLlxuXHRcdFx0XHRcdFx0XHRpZiAoYkVycm9yRm91bmQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVGV4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQVBQX0NPTVBPTkVOVF9TQVBGRV9FVEFHX0xBVEVfUFJPUEVSVFlcIik7XG5cdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC53YXJuaW5nKHNUZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25zOiBbcmVmcmVzaCwgTWVzc2FnZUJveC5BY3Rpb24uT0tdLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZW1waGFzaXplZEFjdGlvbjogcmVmcmVzaCxcblx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uIChhY3Rpb246IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbG9zZShhY3Rpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRXaWR0aDogXCIyNWVtXCJcblx0XHRcdFx0XHRcdFx0XHR9IGFzIG9iamVjdCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIWhhc1Zpc2libGVQYXJhbWV0ZXIpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSBleGVjdXRlIHRoZSBhY3Rpb24gaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGhpZGRlbiwgb3RoZXJ3aXNlIGFsbCBtYW5kYXRvcnkgcGFyYW1ldGVycyB3aXRob3V0IHZhbHVlcyBhcmUgc2hvd24gaW4gdGhlIGRpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJlZ2luQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uLmZpcmVQcmVzcygpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcGFyYW1ldGVyXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHQvLyBSZW1vdmUgbWVzc2FnZXMgcmVsYXRpbmcgdG8gdGhlIGZ1bmN0aW9uIGZvciBkZWZhdWx0IHZhbHVlcyBhcyB0aGV5IGFyZW4ndCBoZWxwZnVsIGZvciBhIHVzZXJcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmbkFzeW5jQmVmb3JlT3BlbiA9IGFzeW5jIGZ1bmN0aW9uICgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIik7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gYVBhcmFtZXRlcnNbMF0gJiYgYVBhcmFtZXRlcnNbMF0uJE5hbWU7XG5cblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dE9iamVjdCA9IGF3YWl0IGFDb250ZXh0c1swXS5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoc0JpbmRpbmdQYXJhbWV0ZXIsIG9Db250ZXh0T2JqZWN0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBwYXJhbWV0ZXJcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGF3YWl0IGZuQXN5bmNCZWZvcmVPcGVuKCk7XG5cblx0XHRcdFx0XHQvLyBhZGRpbmcgZGVmYXVsdGVkIHZhbHVlcyBvbmx5IGhlcmUgYWZ0ZXIgdGhleSBhcmUgbm90IHNldCB0byB0aGUgZmllbGRzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXJJbmZvIG9mIGFjdGlvblBhcmFtZXRlckluZm9zKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFjdGlvblBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlXG5cdFx0XHRcdFx0XHRcdD8gKGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQgYXMgTXVsdGlWYWx1ZUZpZWxkKS5nZXRJdGVtcygpXG5cdFx0XHRcdFx0XHRcdDogKGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQpLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHQvLyB3aGVuIHRoZSBkaWFsb2cgaXMgY2FuY2VsbGVkLCBtZXNzYWdlcyBuZWVkIHRvIGJlIHJlbW92ZWQgaW4gY2FzZSB0aGUgc2FtZSBhY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIGFnYWluXG5cdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnMuZm9yRWFjaChfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcik7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0YnV0dG9uTG9jayA9IGZhbHNlOyAvL25lZWRlZCBoZXJlLCBub3QgaW4gdGhlIHByZXNzIGV2ZW50cyBmaW5hbGx5IGNsYXVzZS4gSW4gY2FzZSB0aGUgVUkgaXMgc2x1Z2dpc2gsIGJlZ2luIGJ1dHRvbiBjb3VsZCBiZSBwcmVzc2VkIGFnYWluLlxuXHRcdFx0XHRcdGlmIChhY3Rpb25SZXN1bHQuZGlhbG9nQ2FuY2VsbGVkKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoYWN0aW9uUmVzdWx0LnJlc3VsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdG1QYXJhbWV0ZXJzLm9EaWFsb2cgPSBvRGlhbG9nO1xuXHRcdFx0b0RpYWxvZy5zZXRNb2RlbChtUGFyYW1ldGVycy5tb2RlbCk7XG5cdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9QYXJhbWV0ZXJNb2RlbCwgXCJwYXJhbXNNb2RlbFwiKTtcblx0XHRcdG9EaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRwYXRoOiBcIi9cIixcblx0XHRcdFx0bW9kZWw6IFwicGFyYW1zTW9kZWxcIlxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGVtcHR5IG1vZGVsIHRvIGFkZCBlbGVtZW50cyBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIE1WRiBmaWVsZHMgZGVmaW5lZCBvbiB0aGUgZGlhbG9nXG5cdFx0XHRjb25zdCBvTVZGTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob01WRk1vZGVsLCBcIm12ZnZpZXdcIik7XG5cblx0XHRcdC8qIEV2ZW50IG5lZWRlZCBmb3IgcmVtb3ZpbmcgbWVzc2FnZXMgb2YgdmFsaWQgY2hhbmdlZCBmaWVsZCAqL1xuXHRcdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXJJbmZvIG9mIGFjdGlvblBhcmFtZXRlckluZm9zKSB7XG5cdFx0XHRcdGlmIChhY3Rpb25QYXJhbWV0ZXJJbmZvLmlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8/LmZpZWxkPy5nZXRCaW5kaW5nKFwiaXRlbXNcIik/LmF0dGFjaENoYW5nZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcihhY3Rpb25QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mbz8uZmllbGQ/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKCgpID0+IHtcblx0XHRcdFx0XHRcdF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyKGFjdGlvblBhcmFtZXRlckluZm8ucGFyYW1ldGVyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgc0FjdGlvblBhdGggPSBgJHtzQWN0aW9uTmFtZX0oLi4uKWA7XG5cdFx0XHRpZiAoIWFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0c0FjdGlvblBhdGggPSBgLyR7c0FjdGlvblBhdGh9YDtcblx0XHRcdH1cblx0XHRcdG9EaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRwYXRoOiBzQWN0aW9uUGF0aFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAob1BhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBwYXJlbnQgY29udHJvbCBzcGVjaWZpZWQgYWRkIHRoZSBkaWFsb2cgYXMgZGVwZW5kZW50XG5cdFx0XHRcdG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudChvRGlhbG9nKTtcblx0XHRcdH1cblx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KGFDb250ZXh0c1swXSk7IC8vIHVzZSBjb250ZXh0IG9mIGZpcnN0IHNlbGVjdGVkIGxpbmUgaXRlbVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb09wZXJhdGlvbkJpbmRpbmcgPSBvRGlhbG9nLmdldE9iamVjdEJpbmRpbmcoKSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZShcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0c0FjdGlvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB7XG5cdGxldCBib3VuZEFjdGlvbk5hbWU6IHN0cmluZyA9IHNBY3Rpb25OYW1lO1xuXHRjb25zdCBhQWN0aW9uTmFtZSA9IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIik7XG5cdGJvdW5kQWN0aW9uTmFtZSA9IGJvdW5kQWN0aW9uTmFtZS5pbmNsdWRlcyhcIi5cIikgPyBhQWN0aW9uTmFtZVthQWN0aW9uTmFtZS5sZW5ndGggLSAxXSA6IGJvdW5kQWN0aW9uTmFtZTtcblx0Y29uc3Qgc3VmZml4UmVzb3VyY2VLZXkgPSBib3VuZEFjdGlvbk5hbWUgJiYgc0VudGl0eVNldE5hbWUgPyBgJHtzRW50aXR5U2V0TmFtZX18JHtib3VuZEFjdGlvbk5hbWV9YCA6IFwiXCI7XG5cdGNvbnN0IHNLZXkgPSBcIkFDVElPTl9QQVJBTUVURVJfRElBTE9HX0FDVElPTl9OQU1FXCI7XG5cdGNvbnN0IGJSZXNvdXJjZUtleUV4aXN0cyA9IHJlc291cmNlTW9kZWwuY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzKGAke3NLZXl9fCR7c3VmZml4UmVzb3VyY2VLZXl9YCk7XG5cdGlmIChzQWN0aW9uTGFiZWwpIHtcblx0XHRpZiAoYlJlc291cmNlS2V5RXhpc3RzKSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KHNLZXksIHVuZGVmaW5lZCwgc3VmZml4UmVzb3VyY2VLZXkpO1xuXHRcdH0gZWxzZSBpZiAocmVzb3VyY2VNb2RlbC5jaGVja0lmUmVzb3VyY2VLZXlFeGlzdHMoYCR7c0tleX18JHtzRW50aXR5U2V0TmFtZX1gKSkge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChzS2V5LCB1bmRlZmluZWQsIGAke3NFbnRpdHlTZXROYW1lfWApO1xuXHRcdH0gZWxzZSBpZiAocmVzb3VyY2VNb2RlbC5jaGVja0lmUmVzb3VyY2VLZXlFeGlzdHMoYCR7c0tleX1gKSkge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChzS2V5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNBY3Rpb25MYWJlbDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKFxuXHRvQWN0aW9uOiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdGJHZXRCb3VuZENvbnRleHQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG5cdHNHcm91cElkOiBzdHJpbmcsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlciB8IHVuZGVmaW5lZCxcblx0aUNvbnRleHRMZW5ndGg6IG51bWJlciB8IG51bGwsXG5cdGN1cnJlbnRfY29udGV4dF9pbmRleDogbnVtYmVyIHwgbnVsbCxcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uLFxuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0OiBGdW5jdGlvbixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRsZXQgb0FjdGlvblByb21pc2U6IFByb21pc2U8dW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQ+LFxuXHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IHRydWU7XG5cdGlmIChtUGFyYW1ldGVycykge1xuXHRcdG1QYXJhbWV0ZXJzLmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlID0gaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU7XG5cdH1cblx0aWYgKGJHZXRCb3VuZENvbnRleHQpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChzTWV0YVBhdGgpO1xuXHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5WzBdPy4ka2luZCAhPT0gXCJBY3Rpb25cIikge1xuXHRcdFx0Ly9kbyBub3QgZW5hYmxlIHRoZSBzdHJpY3QgaGFuZGxpbmcgaWYgaXRzIG5vdCBhbiBhY3Rpb25cblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMuZGlzYWJsZVN0cmljdEhhbmRsaW5nKSB7XG5cdFx0XHRiRW5hYmxlU3RyaWN0SGFuZGxpbmcgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIWJFbmFibGVTdHJpY3RIYW5kbGluZykge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gb0FjdGlvbi5leGVjdXRlKHNHcm91cElkLCBpZ25vcmVFVGFnKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlKG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkpO1xuXHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b0FjdGlvblByb21pc2UgPSBvQWN0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGlnbm9yZUVUYWcsXG5cdFx0XHRcdG9wZXJhdGlvbnNIZWxwZXIuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRvQWN0aW9uLmdldENvbnRleHQoKSxcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAocmVzdWx0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpdGlvbk1lc3NhZ2VzKG9BY3Rpb24sIHNHcm91cElkLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcywgbVBhcmFtZXRlcnMgYXMgU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByZWFsUmVzdWx0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCA/IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkgOiByZXN1bHQ7XG5cdFx0XHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlKHJlYWxSZXN1bHQpO1xuXHRcdFx0XHRyZXR1cm4gcmVhbFJlc3VsdDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpdGlvbk1lc3NhZ2VzKG9BY3Rpb24sIHNHcm91cElkLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcywgbVBhcmFtZXRlcnMgYXMgU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0KCk7XG5cdFx0XHRcdHRocm93IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQ7XG5cdFx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG5cdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCgpO1xuXHRcdHRocm93IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQ7XG5cdH0pO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSBzdHJpY3RIYW5kbGluZyB1dGlsaXRpZXMgd2l0aCB0aGUgZmFpbGVkIGFuZCBzdWNjZXNzZnVsIHRyYW5zaXRpb24gbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZXhlY3V0ZWRcbiAqIEBwYXJhbSBncm91cElkIEdyb3VwSWQgb2YgdGhlIGJhdGNoXG4gKiBAcGFyYW0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgVXRpbGl0eSBmbGFncyBhbmQgbWVzc2FnZXMgZm9yIHN0cmljdEhhbmRsaW5nXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBTdHJpY3QgSGFuZGxpbmcgcGFyYW1ldGVyc1xuICogQHBhcmFtIG9ubHlTdWNjZXNzTWVzc2FnZXMgVG8gdXBkYXRlIG9ubHkgc3VjY2Vzc2Z1bCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZTQxMlRyYW5zaXRpb25NZXNzYWdlcyhcblx0YWN0aW9uOiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRncm91cElkOiBzdHJpbmcsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzOiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0cGFyYW1ldGVycz86IFN0cmljdEhhbmRsaW5nUGFyYW1ldGVycyxcblx0b25seVN1Y2Nlc3NNZXNzYWdlcyA9IGZhbHNlXG4pOiB2b2lkIHtcblx0Y29uc3QgbWVzc2FnZXM6IEFycmF5PE1lc3NhZ2U+ID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0Y29uc3QgeyBwcm9jZXNzZWRNZXNzYWdlSWRzLCBkZWxheVN1Y2Nlc3NNZXNzYWdlcywgc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMgfSA9IHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzO1xuXHRjb25zdCB1blByb2Nlc3NlZE1lc3NhZ2VzID0gbWVzc2FnZXMucmVkdWNlKChhY2M6IE1lc3NhZ2VbXSwgbWVzc2FnZSkgPT4ge1xuXHRcdGlmICghcHJvY2Vzc2VkTWVzc2FnZUlkcy5oYXMobWVzc2FnZS5nZXRJZCgpKSkge1xuXHRcdFx0YWNjLnB1c2gobWVzc2FnZSk7XG5cdFx0fVxuXHRcdHJldHVybiBhY2M7XG5cdH0sIFtdKTtcblxuXHRjb25zdCBuZXdUcmFuc2l0aW9uRXJyb3JNZXNzYWdlc0lkID0gdW5Qcm9jZXNzZWRNZXNzYWdlc1xuXHRcdC5maWx0ZXIoXG5cdFx0XHQobWVzc2FnZSkgPT5cblx0XHRcdFx0bWVzc2FnZS5nZXRQZXJzaXN0ZW50KCkgPT09IHRydWUgJiYgbWVzc2FnZS5nZXRUeXBlKCkgIT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MgJiYgIXByb2Nlc3NlZE1lc3NhZ2VJZHMuaGFzKG1lc3NhZ2UuZ2V0SWQoKSlcblx0XHQpXG5cdFx0Lm1hcCgobWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRJZCgpKTtcblxuXHRpZiAobmV3VHJhbnNpdGlvbkVycm9yTWVzc2FnZXNJZC5sZW5ndGgpIHtcblx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5wcm9jZXNzZWRNZXNzYWdlSWRzID0gbmV3IFNldChbLi4uQXJyYXkuZnJvbShwcm9jZXNzZWRNZXNzYWdlSWRzKSwgLi4ubmV3VHJhbnNpdGlvbkVycm9yTWVzc2FnZXNJZF0pO1xuXHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzLnB1c2goLi4uT2JqZWN0LnZhbHVlcyh1blByb2Nlc3NlZE1lc3NhZ2VzKS5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzKSk7XG5cdFx0aWYgKCFvbmx5U3VjY2Vzc01lc3NhZ2VzICYmIHBhcmFtZXRlcnM/LmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5wdXNoKHtcblx0XHRcdFx0b0FjdGlvbjogYWN0aW9uLFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbigpOiB7XG5cdG9Mb2NhbEFjdGlvblByb21pc2U6IFByb21pc2U8dW5rbm93bj47XG5cdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlOiBGdW5jdGlvbjtcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdDogRnVuY3Rpb247XG59IHtcblx0bGV0IGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlITogRnVuY3Rpb247XG5cdGxldCBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0ITogRnVuY3Rpb247XG5cdGNvbnN0IG9Mb2NhbEFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTx1bmtub3duPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuXHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QgPSByZWplY3Q7XG5cdH0pLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3IpIHtcblx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgYWN0aW9uIFwiLCBvRXJyb3IpO1xuXHR9KTtcblxuXHRyZXR1cm4geyBvTG9jYWxBY3Rpb25Qcm9taXNlLCBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSwgaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUFjdGlvbihcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdG9QYXJlbnRDb250cm9sOiBWaWV3LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzOiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0aWdub3JlRVRhZz86IGJvb2xlYW5cbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXT4ge1xuXHRjb25zdCBhQ29udGV4dHMgPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdGNvbnN0IG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRjb25zdCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRjb25zdCBzQWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWU7XG5cdGNvbnN0IGZuT25TdWJtaXR0ZWQgPSBtUGFyYW1ldGVycy5mbk9uU3VibWl0dGVkO1xuXHRjb25zdCBmbk9uUmVzcG9uc2UgPSBtUGFyYW1ldGVycy5mbk9uUmVzcG9uc2U7XG5cdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9QYXJlbnRDb250cm9sKTtcblx0bGV0IG9BY3Rpb246IE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdG1QYXJhbWV0ZXJzLmFwcENvbXBvbmVudCA9IG9BcHBDb21wb25lbnQ7XG5cblx0ZnVuY3Rpb24gc2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk6IHZvaWQge1xuXHRcdGlmIChhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBtUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyA/PyB7fTtcblx0XHRcdGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBwYXJhbWV0ZXIubmFtZTtcblx0XHRcdFx0aWYgKCFkZWZhdWx0VmFsdWVzW25hbWVdKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChwYXJhbWV0ZXIudHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5TdHJpbmdcIjpcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc1tuYW1lXSA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNbbmFtZV0gPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50MTZcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50NjRcIjpcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc1tuYW1lXSA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gdGJjXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0FjdGlvbi5zZXRQYXJhbWV0ZXIobmFtZSwgZGVmYXVsdFZhbHVlc1tuYW1lXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmIChhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0Ly8gVE9ETzogcmVmYWN0b3IgdG8gZGlyZWN0IHVzZSBvZiBQcm9taXNlLmFsbFNldHRsZWRcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXT4oZnVuY3Rpb24gKFxuXHRcdFx0cmVzb2x2ZTogKHZhbHVlOiBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdKSA9PiB2b2lkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0XHRjb25zdCBiR3JvdXBlZCA9IG1QYXJhbWV0ZXJzLmJHcm91cGVkO1xuXHRcdFx0Y29uc3QgYkdldEJvdW5kQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQ7XG5cdFx0XHRjb25zdCBhQWN0aW9uUHJvbWlzZXM6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10gPSBbXTtcblx0XHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IHNHcm91cElkOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdCA9IGNyZWF0ZWludGVybmFsT3BlcmF0aW9uc1Byb21pc2VGb3JBY3Rpb25FeGVjdXRpb24oKTtcblx0XHRcdGNvbnN0IGZuRXhlY3V0ZUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRcdFx0YWN0aW9uQ29udGV4dDogT0RhdGFDb250ZXh0QmluZGluZyxcblx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4OiBudW1iZXIgfCBudWxsLFxuXHRcdFx0XHRvU2lkZUVmZmVjdDogQWN0aW9uU2lkZUVmZmVjdHNUeXBlICYgeyBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCB9LFxuXHRcdFx0XHRpQ29udGV4dExlbmd0aDogbnVtYmVyXG5cdFx0XHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRcdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0XHRcdGNvbnN0IGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiIG5lZWQgYmF0Y2ggZ3JvdXAgcGVyIGFjdGlvbiBjYWxsXG5cdFx0XHRcdHNHcm91cElkID0gIWJHcm91cGVkID8gYCRhdXRvLiR7Y3VycmVudF9jb250ZXh0X2luZGV4fWAgOiBhY3Rpb25Db250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gZm5SZXF1ZXN0U2lkZUVmZmVjdHMuYmluZChcblx0XHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0aW5kaXZpZHVhbEFjdGlvblByb21pc2Vcblx0XHRcdFx0KTtcblx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKFxuXHRcdFx0XHRcdGFjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoLFxuXHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSxcblx0XHRcdFx0XHRvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0LFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWdcblx0XHRcdFx0KTtcblx0XHRcdFx0YUFjdGlvblByb21pc2VzLnB1c2gob0FjdGlvblByb21pc2UpO1xuXHRcdFx0XHRpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZS5wdXNoKG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0Lm9Mb2NhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0XHRmblJlcXVlc3RTaWRlRWZmZWN0cyhvQXBwQ29tcG9uZW50LCBvU2lkZUVmZmVjdCwgbVBhcmFtZXRlcnMsIHNHcm91cElkLCBpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaW5kaXZpZHVhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuRXhlY3V0ZVNpbmdsZUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRcdFx0YWN0aW9uQ29udGV4dDogT0RhdGFDb250ZXh0QmluZGluZyxcblx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4OiBudW1iZXIgfCBudWxsLFxuXHRcdFx0XHRvU2lkZUVmZmVjdDogKEFjdGlvblNpZGVFZmZlY3RzVHlwZSAmIHsgY29udGV4dDogT0RhdGFWNENvbnRleHQgfSkgfCB1bmRlZmluZWQsXG5cdFx0XHRcdGlDb250ZXh0TGVuZ3RoOiBudW1iZXJcblx0XHRcdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4ge1xuXHRcdFx0XHRjb25zdCBpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPltdID0gW107XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSBtUGFyYW1ldGVycy5ncm91cElkIHx8IGBhcGlNb2RlJHtjdXJyZW50X2NvbnRleHRfaW5kZXh9YDtcblx0XHRcdFx0bVBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gZm5SZXF1ZXN0U2lkZUVmZmVjdHMuYmluZChcblx0XHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0aW5kaXZpZHVhbEFjdGlvblByb21pc2Vcblx0XHRcdFx0KTtcblx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKFxuXHRcdFx0XHRcdGFjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoLFxuXHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSxcblx0XHRcdFx0XHRvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0LFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWdcblx0XHRcdFx0KTtcblx0XHRcdFx0YUFjdGlvblByb21pc2VzLnB1c2gob0FjdGlvblByb21pc2UpO1xuXHRcdFx0XHRpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZS5wdXNoKG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0Lm9Mb2NhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0XHRmblJlcXVlc3RTaWRlRWZmZWN0cyhvQXBwQ29tcG9uZW50LCBvU2lkZUVmZmVjdCwgbVBhcmFtZXRlcnMsIHNHcm91cElkLCBpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdG9Nb2RlbC5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaW5kaXZpZHVhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0fTtcblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gZm5FeGVjdXRlQ2hhbmdlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRjb25zdCBhQ2hhbmdlU2V0TG9jYWxQcm9taXNlczogdW5rbm93bltdID0gW107XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KGAke3NBY3Rpb25OYW1lfSguLi4pYCwgYUNvbnRleHRzW2ldLCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdGFDaGFuZ2VTZXRMb2NhbFByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRmbkV4ZWN1dGVBY3Rpb24oXG5cdFx0XHRcdFx0XHRcdG9BY3Rpb24sXG5cdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5sZW5ndGggPCAxID8gbnVsbCA6IGkgKyAxLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dDogYUNvbnRleHRzW2ldLFxuXHRcdFx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubGVuZ3RoXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGFDaGFuZ2VTZXRMb2NhbFByb21pc2VzKTtcblx0XHRcdFx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmICghbWVzc2FnZUhhbmRsaW5nLmhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzKCkpIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb3BlcmF0aW9uc0hlbHBlci5yZW5kZXJNZXNzYWdlVmlldyhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5sZW5ndGggPiAxXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmZvckVhY2goZnVuY3Rpb24gKHNoUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0XHRcdHNoUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZXNJbk1vZGVsID0gbWVzc2FnZU1vZGVsLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZU1vZGVsLnNldERhdGEobWVzc2FnZXNJbk1vZGVsLmNvbmNhdChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlcykpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiUmV0cmlnZ2VyaW5nIG9mIHN0cmljdCBoYW5kbGluZyBhY3Rpb25zIGZhaWxlZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuRXhlY3V0ZVNlcXVlbnRpYWxseShjb250ZXh0c1RvRXhlY3V0ZTogT0RhdGFWNENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oXG5cdFx0XHRcdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0YWN0aW9uSW5kZXg6IG51bWJlcixcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aDogbnVtYmVyXG5cdFx0XHRcdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4ge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0FjdGlvbk5hbWV9KC4uLilgLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdC8vIEFjdGlvbiBvbiB0aGUgdGFibGUgbGV2ZWwgaXMgYm91bmQgb24gYSBjb3B5IG9mIHRoZSBvRGF0YUxpc3RCaW5kaW5nLCB0byBleGVjdXRlIHRoZSBTaWRlRWZmZWN0cyB3ZSBuZWVkXG5cdFx0XHRcdFx0Ly8gdG8gZG8gaXQgb24gdGhlIG9yaWdpbmFsIG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBpbml0aWFsVGFibGVDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLmNvbnRyb2wgYXMgVGFibGUpPy5nZXRSb3dCaW5kaW5nPy4oKT8uZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24oXG5cdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0YWN0aW9uSW5kZXgsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQ6XG5cdFx0XHRcdFx0XHRcdFx0aW5pdGlhbFRhYmxlQ29udGV4dCAmJiBpbml0aWFsVGFibGVDb250ZXh0LmdldFBhdGgoKSA9PT0gY29udGV4dC5nZXRQYXRoKCkgPyBpbml0aWFsVGFibGVDb250ZXh0IDogY29udGV4dCxcblx0XHRcdFx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNlcmlhbGl6YXRpb246IHByb2Nlc3NPbmVBY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIGNvbnRleHRzVG9FeGVjdXRlIG9ubHkgYWZ0ZXIgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBoYXMgYmVlbiByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBjb250ZXh0c1RvRXhlY3V0ZS5yZWR1Y2UoYXN5bmMgKHByb21pc2U6IFByb21pc2U8dm9pZD4sIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgcHJvbWlzZTtcblx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkICsgMSwgYUNvbnRleHRzLmxlbmd0aCk7XG5cdFx0XHRcdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblxuXHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRhd2FpdCBvcGVyYXRpb25zSGVscGVyLnJlbmRlck1lc3NhZ2VWaWV3KFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlcyxcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzLmxlbmd0aCA+IDFcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWJHcm91cGVkKSB7XG5cdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiwgZW5zdXJlIHRoYXQgZWFjaCBhY3Rpb24gYW5kIG1hdGNoaW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyBhcmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgbmV4dCBzZXQgaXMgc3VibWl0dGVkLiBXb3JrYXJvdW5kIHVudGlsIEpTT04gYmF0Y2ggaXMgYXZhaWxhYmxlLlxuXHRcdFx0XHQvLyBBbGxvdyBhbHNvIGZvciBMaXN0IFJlcG9ydC5cblx0XHRcdFx0Zm5FeGVjdXRlU2VxdWVudGlhbGx5KGFDb250ZXh0cyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmbkV4ZWN1dGVDaGFuZ2VzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gZm5IYW5kbGVSZXN1bHRzKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHQvLyBQcm9taXNlLmFsbFNldHRsZWQgd2lsbCBuZXZlciBiZSByZWplY3RlZC4gSG93ZXZlciwgZXNsaW50IHJlcXVpcmVzIGVpdGhlciBjYXRjaCBvciByZXR1cm4gLSB0aHVzIHdlIHJldHVybiB0aGUgcmVzdWx0aW5nIFByb21pc2UgYWx0aG91Z2ggbm8gb25lIHdpbGwgdXNlIGl0LlxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGFBY3Rpb25Qcm9taXNlcykudGhlbihyZXNvbHZlKTtcblx0XHRcdH1cblx0XHR9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdChcblx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHR9XG5cdFx0XHQpKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgLyR7c0FjdGlvbk5hbWV9KC4uLilgKTtcblx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiYWN0aW9uSW1wb3J0XCI7XG5cdFx0Y29uc3Qgb0FjdGlvblByb21pc2U6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+ID0gb0FjdGlvbi5leGVjdXRlKFxuXHRcdFx0c0dyb3VwSWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0eyBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsIG1vZGVsOiBvTW9kZWwgfSxcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG5cdFx0XHQpXG5cdFx0KTtcblx0XHRjb25zdCBhbGxQcm9taXNlOiBQcm9taXNlPHVua25vd24+W10gPSBbb0FjdGlvblByb21pc2VdO1xuXHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChcIi91bkJvdW5kQWN0aW9uXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdCA9IHtcblx0XHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0fTtcblx0XHRcdG9wZXJhdGlvbnMuZm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgc2lkZUVmZmVjdCwgbVBhcmFtZXRlcnMsIHNHcm91cElkLCBhbGxQcm9taXNlKTtcblx0XHRcdGNvbnRleHQuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdC8vIHRyaWdnZXIgb25TdWJtaXR0ZWQgXCJldmVudFwiXG5cdFx0KFxuXHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0ZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcblx0XHRcdFx0LyoqL1xuXHRcdFx0fVxuXHRcdCkob0FjdGlvblByb21pc2UpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhbGxQcm9taXNlKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGN1cnJlbnRQcm9taXNlVmFsdWVzOiB1bmtub3duW10pIHtcblx0XHRcdFx0Ly8gSGVyZSB3ZSBlbnN1cmUgdGhhdCB3ZSByZXR1cm4gdGhlIHJlc3BvbnNlIHdlIGdvdCBmcm9tIGFuIHVuYm91bmQgYWN0aW9uIHRvIHRoZVxuXHRcdFx0XHQvLyBjYWxsZXIgQkNQIDogMjI3MDEzOTI3OVxuXHRcdFx0XHRjb25zdCBjdXJyZW50UHJvbWlzZVZhbHVlID0gY3VycmVudFByb21pc2VWYWx1ZXNbMF07XG5cdFx0XHRcdGlmIChjdXJyZW50UHJvbWlzZVZhbHVlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGN1cnJlbnRQcm9taXNlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0Py4oKT8uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgYWN0aW9uIFwiICsgc0FjdGlvbk5hbWUsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoKTtcblx0XHRcdH0pO1xuXHR9XG59XG5mdW5jdGlvbiBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dDogQ29udGV4dCwgc0FjdGlvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGxldCBzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKTtcblx0c1BhdGggPSBvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSA/IHNQYXRoLnNwbGl0KFwiQCR1aTUub3ZlcmxvYWRcIilbMF0gOiBzUGF0aC5zcGxpdChcIi8wXCIpWzBdO1xuXHRyZXR1cm4gc1BhdGguc3BsaXQoYC8ke3NBY3Rpb25OYW1lfWApWzBdO1xufVxuXG5mdW5jdGlvbiBfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzKFxuXHRpc0NyZWF0ZUFjdGlvbjogYm9vbGVhbixcblx0YWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW10sXG5cdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdHN0YXJ0dXBQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IGJvb2xlYW4ge1xuXHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uU2V0T25BbGxBY3Rpb25zID0gYWN0aW9uUGFyYW1ldGVycy5ldmVyeSgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXI/LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpO1xuXG5cdGlmIChwYXJhbWV0ZXJWYWx1ZXM/Lmxlbmd0aCAmJiAhaGlkZGVuQW5ub3RhdGlvblNldE9uQWxsQWN0aW9ucykge1xuXHRcdC8vIElmIHNob3dEaWFsb2cgaXMgZmFsc2UgYnV0IHRoZXJlIGFyZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGludm9rZUFjdGlvbiBjYWxsIHdoaWNoIG5lZWQgdG8gYmUgY2hlY2tlZCBvbiBleGlzdGFuY2Vcblx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlciBvZiBhY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFjdGlvblBhcmFtZXRlci5uYW1lICE9PSBcIlJlc3VsdElzQWN0aXZlRW50aXR5XCIgJiZcblx0XHRcdFx0IXBhcmFtZXRlclZhbHVlcz8uZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5uYW1lID09PSBhY3Rpb25QYXJhbWV0ZXIubmFtZSlcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBBdCBsZWFzdCBmb3Igb25lIHBhcmFtZXRlciBubyB2YWx1ZSBoYXMgYmVlbiBwcm92aWRlZCwgc28gd2UgY2FuJ3Qgc2tpcCB0aGUgZGlhbG9nXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoaXNDcmVhdGVBY3Rpb24gJiYgc3RhcnR1cFBhcmFtZXRlcnM/Lmxlbmd0aCAmJiAhaGlkZGVuQW5ub3RhdGlvblNldE9uQWxsQWN0aW9ucykge1xuXHRcdC8vIElmIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGR1cmluZyBhcHBsaWNhdGlvbiBsYXVuY2gsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNldCBpcyBjb21wbGV0ZVxuXHRcdC8vIElmIG5vdCwgdGhlIHBhcmFtZXRlciBkaWFsb2cgc3RpbGwgbmVlZHMgdG8gYmUgc2hvd24uXG5cdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXIgb2YgYWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKHN0YXJ0dXBQYXJhbWV0ZXJzICYmICFzdGFydHVwUGFyYW1ldGVyc1thY3Rpb25QYXJhbWV0ZXIubmFtZV0pIHtcblx0XHRcdFx0Ly8gQXQgbGVhc3QgZm9yIG9uZSBwYXJhbWV0ZXIgbm8gdmFsdWUgaGFzIGJlZW4gcHJvdmlkZWQsIHNvIHdlIGNhbid0IHNraXAgdGhlIGRpYWxvZ1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoICYmIGhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMpIHtcblx0XHRyZXR1cm4gYWN0aW9uUGFyYW1ldGVycy5ldmVyeShmdW5jdGlvbiAocGFyYW1ldGVyKSB7XG5cdFx0XHRjb25zdCBmaWVsZENvbnRyb2wgPSBwYXJhbWV0ZXIuYW5ub3RhdGlvbnM/LkNvbW1vbj8uRmllbGRDb250cm9sO1xuXHRcdFx0Y29uc3QgaXNNYW5kYXRvcnkgPSBmaWVsZENvbnRyb2w/LnRvU3RyaW5nKCkgPT09IFwiQ29tbW9uLkZpZWxkQ29udHJvbFR5cGUvTWFuZGF0b3J5XCI7XG5cblx0XHRcdC8vIFBvc3NpYmxlIHNvdXJjZXMgbWF5IGJlIHN0YXJ0dXBQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJWYWx1ZXMsIGRlZmF1bHRWYWx1ZXMgcGVyIGFubm90YXRpb24gKFBhcmFtZXRlckRlZmF1bHRWYWx1ZSlcblx0XHRcdC8vIElmIG5vbmUgaXMgZm91bmQsIHJldHVybiBmYWxzZVxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0IWlzTWFuZGF0b3J5IHx8XG5cdFx0XHRcdChzdGFydHVwUGFyYW1ldGVycyAmJiBzdGFydHVwUGFyYW1ldGVyc1twYXJhbWV0ZXIubmFtZV0pIHx8XG5cdFx0XHRcdHBhcmFtZXRlclZhbHVlcz8uZmluZCgocGFyYW1ldGVyVmFsdWUpID0+IHBhcmFtZXRlclZhbHVlLm5hbWUgPT09IHBhcmFtZXRlci5uYW1lKSB8fFxuXHRcdFx0XHRwYXJhbWV0ZXI/LmFubm90YXRpb25zPy5VST8uUGFyYW1ldGVyRGVmYXVsdFZhbHVlPy52YWx1ZU9mKClcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZm5SZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRzaWRlRWZmZWN0OiAoQWN0aW9uU2lkZUVmZmVjdHNUeXBlICYgeyBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCB9KSB8IHVuZGVmaW5lZCxcblx0cGFyYW1ldGVyczoge1xuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRzZWxlY3RlZEl0ZW1zOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHR9LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdGxvY2FsUHJvbWlzZT86IFByb21pc2U8dW5rbm93bj5bXVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0bGV0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBsb2NhbFByb21pc2UgPz8gW107XG5cdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRpZiAoc2lkZUVmZmVjdCkge1xuXHRcdHByb21pc2VzID0gcHJvbWlzZXMuY29uY2F0KFxuXHRcdFx0KHNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgPz8gW10pLm1hcChhc3luYyAoYWN0aW9uKSA9PiBzaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihhY3Rpb24sIHNpZGVFZmZlY3QuY29udGV4dCwgZ3JvdXBJZCkpLFxuXHRcdFx0c2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMgPyBzaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLCBzaWRlRWZmZWN0LmNvbnRleHQsIGdyb3VwSWQpIDogW11cblx0XHQpO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJiBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdEpTT04ucGFyc2UocGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zLFxuXHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTYuMFxuICovXG5jb25zdCBvcGVyYXRpb25zID0ge1xuXHRjYWxsQm91bmRBY3Rpb246IGNhbGxCb3VuZEFjdGlvbixcblx0Y2FsbEFjdGlvbkltcG9ydDogY2FsbEFjdGlvbkltcG9ydCxcblx0Y2FsbEJvdW5kRnVuY3Rpb246IGNhbGxCb3VuZEZ1bmN0aW9uLFxuXHRjYWxsRnVuY3Rpb25JbXBvcnQ6IGNhbGxGdW5jdGlvbkltcG9ydCxcblx0ZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0czogZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyxcblx0Y3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbjogY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbixcblx0dmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzOiBfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzLFxuXHRnZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lOiBfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZSxcblx0YWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjazogYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayxcblx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uOiBhZnRlckFjdGlvblJlc29sdXRpb24sXG5cdGZuUmVxdWVzdFNpZGVFZmZlY3RzOiBmblJlcXVlc3RTaWRlRWZmZWN0c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgb3BlcmF0aW9ucztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7OztFQW1EQSxNQUFNQSxTQUFTLEdBQUdDLFNBQVMsQ0FBQ0QsU0FBUztJQUNwQ0Usa0JBQWtCLEdBQUdELFNBQVMsQ0FBQ0Msa0JBQWtCO0VBQ2xELE1BQU1DLE1BQU0sR0FBR0MsVUFBVSxDQUFDRCxNQUFNO0VBbUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVFLGVBQWUsQ0FDN0JDLFdBQW1CLEVBQ25CQyxRQUEwQixFQUMxQkMsTUFBa0IsRUFDbEJDLGFBQTJCLEVBQzNCQyxXQUFpQyxFQUNQO0lBQzFCLElBQUksQ0FBQ0gsUUFBUSxJQUFJQSxRQUFRLENBQUNJLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDdkM7TUFDQSxNQUFNLElBQUlDLEtBQUssQ0FBQyxvREFBb0QsQ0FBQztJQUN0RTtJQUVBLE1BQU1DLGlCQUFpQixHQUFHQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ1IsUUFBUSxDQUFDO0lBQ2pEO0lBQ0E7SUFDQTtJQUNBRyxXQUFXLENBQUNNLFNBQVMsR0FBR0YsS0FBSyxDQUFDQyxPQUFPLENBQUNSLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBUSxDQUFDO0lBRXZFLE1BQU1VLFVBQVUsR0FBR1QsTUFBTSxDQUFDVSxZQUFZLEVBQUU7TUFDdkM7TUFDQTtNQUNBQyxXQUFXLEdBQUksR0FBRUYsVUFBVSxDQUFDRyxXQUFXLENBQUNWLFdBQVcsQ0FBQ00sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDSyxPQUFPLEVBQUUsQ0FBRSxJQUFHZixXQUFZLEVBQUM7TUFDNUZnQixZQUFZLEdBQUdMLFVBQVUsQ0FBQ00sb0JBQW9CLENBQUUsR0FBRUosV0FBWSxtQkFBa0IsQ0FBRTtJQUNuRlQsV0FBVyxDQUFDYyxnQkFBZ0IsR0FBRyxNQUFNQyxhQUFhLENBQUNDLG1CQUFtQixDQUFDVCxVQUFVLEVBQUVFLFdBQVcsRUFBRVQsV0FBVyxDQUFDTSxTQUFTLENBQUM7O0lBRXRIO0lBQ0E7SUFDQTtJQUNBLE1BQU1XLG1CQUFtQixHQUFHLFVBQVVDLE1BQTBELEVBQThCO01BQzdIO01BQ0EsSUFBSUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxNQUFNLEtBQUssV0FBVyxFQUFFO1FBQ3JDLE9BQU9ELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ0UsS0FBSztNQUN2QixDQUFDLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQSxNQUFNRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNHLE1BQU0sSUFBSUgsTUFBTTtNQUNqQztJQUNELENBQUM7SUFDRCxNQUFNSSxjQUFjLEdBQUdDLFlBQVksQ0FBQ3pCLE1BQU0sQ0FBQ1UsWUFBWSxFQUFFLENBQUM7SUFDMUQsTUFBTWdCLGVBQWUsR0FBR0YsY0FBYyxDQUFDRyxXQUFXLENBQXdCYixZQUFZLENBQUNELE9BQU8sRUFBRSxDQUFDLENBQUNlLE1BQU07SUFDeEcsSUFBSSxDQUFDRixlQUFlLEVBQUU7TUFDckIsTUFBTSxJQUFJdEIsS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBQ3hDO0lBQ0EsSUFBSTtNQUNILE1BQU1nQixNQUFNLEdBQUcsTUFBTVMsVUFBVSxDQUFDSCxlQUFlLEVBQUUxQixNQUFNLEVBQUVjLFlBQVksRUFBRWIsYUFBYSxFQUFFQyxXQUFXLENBQUM7TUFDbEcsSUFBSUcsaUJBQWlCLEVBQUU7UUFDdEIsT0FBT2UsTUFBTTtNQUNkLENBQUMsTUFBTTtRQUNOLE9BQU9ELG1CQUFtQixDQUFDQyxNQUFNLENBQTJDO01BQzdFO0lBQ0QsQ0FBQyxDQUFDLE9BQU9VLENBQUMsRUFBRTtNQUNYLElBQUl6QixpQkFBaUIsRUFBRTtRQUN0QixNQUFNeUIsQ0FBQztNQUNSLENBQUMsTUFBTTtRQUNOLE9BQU9YLG1CQUFtQixDQUFDVyxDQUFDLENBQTJDO01BQ3hFO0lBQ0Q7RUFDRDtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZUMsZ0JBQWdCLENBQzlCQyxVQUFrQixFQUNsQkMsS0FBaUIsRUFDakJDLFlBQTBCLEVBQzFCQyxVQW1CQyxFQUN5QjtJQUMxQixNQUFNQyxTQUFTLEdBQUdILEtBQUssQ0FBQ3ZCLFlBQVksRUFBRTtJQUN0QyxNQUFNMkIsVUFBVSxHQUFJLElBQUdMLFVBQVcsRUFBQztJQUNuQyxNQUFNUixjQUFjLEdBQUdDLFlBQVksQ0FBQ1csU0FBUyxDQUFDO0lBQzlDLE1BQU1FLHFCQUFxQixHQUFHZCxjQUFjLENBQUNHLFdBQVcsQ0FBMkJVLFVBQVUsQ0FBQyxDQUFDVCxNQUFNO01BQ3BHRixlQUFlLEdBQUdZLHFCQUFxQixhQUFyQkEscUJBQXFCLHVCQUFyQkEscUJBQXFCLENBQUVDLE1BQU07SUFDaEQsSUFBSSxDQUFDYixlQUFlLEVBQUU7TUFDckI7SUFDRDtJQUNBLE1BQU1jLGtCQUFrQixHQUFHaEIsY0FBYyxDQUFDaUIsT0FBTyxDQUM5Q0MsTUFBTSxDQUFFSCxNQUFNLElBQUtBLE1BQU0sQ0FBQ0ksSUFBSSxLQUFLakIsZUFBZSxDQUFDaUIsSUFBSSxDQUFDLENBQ3hEQyxTQUFTLENBQUVMLE1BQU0sSUFBSyxDQUFDQSxNQUFNLENBQUNNLE9BQU8sQ0FBQztNQUN4Q0MsbUJBQW1CLEdBQUdSLHFCQUFxQixDQUFDTixVQUFVO01BQ3REZSxZQUFZLEdBQUdYLFNBQVMsQ0FBQ3JCLG9CQUFvQixDQUFFLElBQUcrQixtQkFBb0IsSUFBR04sa0JBQW1CLEVBQUMsQ0FBQztJQUMvRkwsVUFBVSxDQUFDbkIsZ0JBQWdCLEdBQUcsTUFBTUMsYUFBYSxDQUFDQyxtQkFBbUIsQ0FBQ2tCLFNBQVMsRUFBRyxHQUFFQyxVQUFXLGlCQUFnQixDQUFDO0lBQ2hILE9BQU9SLFVBQVUsQ0FBQ1MscUJBQXFCLENBQUNDLE1BQU0sRUFBRU4sS0FBSyxFQUFFYyxZQUFZLEVBQUViLFlBQVksRUFBRUMsVUFBVSxDQUFDO0VBQy9GO0VBQ0EsZUFBZWEsaUJBQWlCLENBQUNDLGFBQXFCLEVBQUVDLE9BQWdCLEVBQUVsRCxNQUFrQixFQUEyQjtJQUN0SCxJQUFJLENBQUNrRCxPQUFPLEVBQUU7TUFDYixPQUFPQyxPQUFPLENBQUNDLE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQztJQUNuRTtJQUNBLE1BQU0zQyxVQUFVLEdBQUdULE1BQU0sQ0FBQ1UsWUFBWSxFQUFFO01BQ3ZDMkMsYUFBYSxHQUFJLEdBQUU1QyxVQUFVLENBQUNHLFdBQVcsQ0FBQ3NDLE9BQU8sQ0FBQ3JDLE9BQU8sRUFBRSxDQUFFLElBQUdvQyxhQUFjLEVBQUM7TUFDL0VLLGNBQWMsR0FBRzdDLFVBQVUsQ0FBQ00sb0JBQW9CLENBQUNzQyxhQUFhLENBQUM7SUFDaEUsT0FBT0UsZ0JBQWdCLENBQUNOLGFBQWEsRUFBRWpELE1BQU0sRUFBRXNELGNBQWMsRUFBRUosT0FBTyxDQUFDO0VBQ3hFOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZU0sa0JBQWtCLENBQUNQLGFBQXFCLEVBQUVqRCxNQUFrQixFQUFrQztJQUM1RyxNQUFNUyxVQUFVLEdBQUdULE1BQU0sQ0FBQ1UsWUFBWSxFQUFFO01BQ3ZDMkMsYUFBYSxHQUFHckQsTUFBTSxDQUFDeUQsV0FBVyxDQUFFLElBQUdSLGFBQWMsRUFBQyxDQUFDLENBQUNwQyxPQUFPLEVBQUU7TUFDakU2QyxlQUFlLEdBQUdqRCxVQUFVLENBQUNNLG9CQUFvQixDQUFFLElBQUdOLFVBQVUsQ0FBQ00sb0JBQW9CLENBQUNzQyxhQUFhLENBQUMsQ0FBRU0sU0FBUyxDQUFDLFdBQVcsQ0FBRSxJQUFHLENBQUM7SUFDbEksT0FBT0osZ0JBQWdCLENBQUNOLGFBQWEsRUFBRWpELE1BQU0sRUFBRTBELGVBQWUsQ0FBQztFQUNoRTtFQUNBLGVBQWVILGdCQUFnQixDQUM5Qk4sYUFBcUIsRUFDckJqRCxNQUFrQixFQUNsQjRELFNBQXlCLEVBQ3pCVixPQUFpQixFQUNTO0lBQzFCLElBQUksRUFBQ1UsU0FBUyxhQUFUQSxTQUFTLGVBQVRBLFNBQVMsQ0FBRUQsU0FBUyxFQUFFLEdBQUU7TUFDNUIsT0FBT1IsT0FBTyxDQUFDQyxNQUFNLENBQUMsSUFBSWhELEtBQUssQ0FBRSxZQUFXNkMsYUFBYyxZQUFXLENBQUMsQ0FBQztJQUN4RTtJQUNBLE1BQU1ZLGNBQW1DLEdBQUc3RCxNQUFNLENBQUN5RCxXQUFXLENBQUUsR0FBRSxDQUFBUCxPQUFPLGFBQVBBLE9BQU8sdUJBQVBBLE9BQU8sQ0FBRXJDLE9BQU8sRUFBRSxLQUFJLEVBQUcsSUFBR29DLGFBQWMsT0FBTSxDQUFDO0lBQ25ILE1BQU1hLE9BQU8sR0FBR1osT0FBTyxHQUFHLGVBQWUsR0FBRyxnQkFBZ0I7SUFDNUQsTUFBTWEsZ0JBQWdCLEdBQUdGLGNBQWMsQ0FBQ0csT0FBTyxDQUFDRixPQUFPLENBQUM7SUFDeEQ5RCxNQUFNLENBQUNpRSxXQUFXLENBQUNILE9BQU8sQ0FBQztJQUMzQixNQUFNQyxnQkFBZ0I7SUFDdEIsT0FBT0YsY0FBYyxDQUFDSyxlQUFlLEVBQUU7RUFDeEM7RUFFQSxlQUFlckMsVUFBVSxDQUN4QkgsZUFBMEIsRUFDMUIxQixNQUFrQixFQUNsQm1FLE9BQWdCLEVBQ2hCbEUsYUFBMkIsRUFDM0JDLFdBQWlDLEVBQ1A7SUFDMUIsSUFBSWtFLHVCQUF1QixHQUFHO01BQzdCQyxhQUFhLEVBQUUsS0FBSztNQUNwQkMsNkJBQTZCLEVBQUUsRUFBRTtNQUNqQ0Msc0JBQXNCLEVBQUUsRUFBRTtNQUMxQkMsNkJBQTZCLEVBQUUsRUFBRTtNQUNqQ0Msb0JBQW9CLEVBQUUsRUFBRTtNQUN4QkMsbUJBQW1CLEVBQUUsSUFBSUMsR0FBRztJQUM3QixDQUFDO0lBQ0QsTUFBTTdFLFdBQVcsR0FBRzRCLGVBQWUsQ0FBQ21CLE9BQU8sR0FDeENuQixlQUFlLENBQUNrRCxrQkFBa0IsQ0FBQ0MsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUFBLEVBQzNEbkQsZUFBZSxDQUFDaUIsSUFBSTtJQUN2QnpDLFdBQVcsQ0FBQzRFLFFBQVEsR0FBRzVFLFdBQVcsQ0FBQzZFLGtCQUFrQixLQUFLckYsa0JBQWtCLENBQUNzRixTQUFTO0lBQ3RGLE9BQU8sSUFBSTdCLE9BQU8sQ0FBaUIsZ0JBQ2xDOEIsT0FBd0MsRUFDeEM3QixNQUFpRCxFQUNoRDtNQUFBO01BQ0QsSUFBSThCLFFBZ0JHLEdBQUcsSUFBSTtNQUNkLE1BQU1DLFlBQVksR0FBR2pGLFdBQVcsQ0FBQ2tGLEtBQUs7TUFDdEMsSUFBSUMsb0JBQW9CLEdBQUduRixXQUFXLENBQUNvRixtQkFBbUI7TUFDMUQsTUFBTTlFLFNBQVMsR0FBR04sV0FBVyxDQUFDTSxTQUFTO01BQ3ZDLE1BQU0rRSxlQUFlLEdBQUdyRixXQUFXLENBQUNxRixlQUFlO01BQ25ELE1BQU1DLGlCQUFpQixHQUFHdEYsV0FBVyxDQUFDYyxnQkFBZ0I7TUFDdEQsSUFBSVAsVUFBVTtNQUNkLElBQUlnRixhQUFxQjtNQUN6QixJQUFJQyxrQkFBa0I7TUFDdEIsSUFBSUMsWUFBWTtNQUNoQixJQUFJQyx3Q0FBd0M7TUFDNUMsTUFBTUMsZ0JBQWdCLEdBQUcxQixPQUFPLENBQUNSLFNBQVMsRUFBcUI7O01BRS9EO01BQ0EsTUFBTW1DLGdCQUFnQixHQUFHcEUsZUFBZSxDQUFDbUIsT0FBTyxHQUFHbkIsZUFBZSxDQUFDUyxVQUFVLENBQUM0RCxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUdyRSxlQUFlLENBQUNTLFVBQVU7O01BRW5IO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxNQUFNNkQsMkJBQTJCLEdBQ2hDRixnQkFBZ0IsQ0FBQzNGLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRTJGLGdCQUFnQixDQUFDM0YsTUFBTSxLQUFLLENBQUMsSUFBSTJGLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDbkQsSUFBSSxLQUFLLHNCQUFzQixDQUFDOztNQUV2SDtNQUNBLE1BQU1zRCxnQkFBZ0IsR0FBRy9GLFdBQVcsQ0FBQ2dHLGVBQWU7O01BRXBEO01BQ0EsTUFBTUMsY0FBYyxHQUFHbEcsYUFBYSxDQUFDbUcsZ0JBQWdCLEVBQUU7TUFDdkQsTUFBTUMsa0JBQWtCLEdBQUlGLGNBQWMsSUFBSUEsY0FBYyxDQUFDRyxpQkFBaUIsSUFBSyxDQUFDLENBQUM7O01BRXJGO01BQ0FqQixvQkFBb0IsR0FDbkJTLGdCQUFnQixDQUFDM0YsTUFBTSxJQUFJMkYsZ0JBQWdCLENBQUNTLEtBQUssQ0FBRUMsU0FBUztRQUFBO1FBQUEsT0FBSywwQkFBQUEsU0FBUyxDQUFDQyxXQUFXLENBQUNDLEVBQUUsb0ZBQXhCLHNCQUEwQkMsTUFBTSwyREFBaEMsdUJBQWtDQyxPQUFPLEVBQUUsTUFBSyxJQUFJO01BQUEsRUFBQyxHQUNuSCxJQUFJLEdBQ0p2QixvQkFBb0I7TUFDeEI7TUFDQSxJQUFJVywyQkFBMkIsSUFBSVgsb0JBQW9CLEVBQUU7UUFDeERPLHdDQUF3QyxHQUFHaUIsd0NBQXdDLENBQ2xGLENBQUMsQ0FBQ3RCLGVBQWUsRUFDakJPLGdCQUFnQixFQUNoQkcsZ0JBQWdCLEVBQ2hCSSxrQkFBa0IsQ0FDbEI7TUFDRjs7TUFFQTtNQUNBO01BQ0EsSUFBSUwsMkJBQTJCLEVBQUU7UUFDaEMsSUFBSSxFQUFFWCxvQkFBb0IsSUFBSU8sd0NBQXdDLENBQUMsRUFBRTtVQUN4RVYsUUFBUSxHQUFHNEIseUJBQXlCO1FBQ3JDO01BQ0QsQ0FBQyxNQUFNLElBQUl0QixpQkFBaUIsRUFBRTtRQUM3Qk4sUUFBUSxHQUFHNkIscUJBQXFCO01BQ2pDO01BRUEsTUFBTUMsMEJBQXNELEdBQUc7UUFDOURDLHVCQUF1QixFQUFFLENBQUMsQ0FBQztRQUMzQi9FLFlBQVksRUFBRWpDLGFBQWE7UUFDM0JpSCxhQUFhLEVBQUVoSCxXQUFXLENBQUNpSCxXQUFXO1FBQ3RDQyxZQUFZLEVBQUVsSCxXQUFXLENBQUNtSCxVQUFVO1FBQ3BDckYsVUFBVSxFQUFFbEMsV0FBVztRQUN2Qm1DLEtBQUssRUFBRWpDLE1BQU07UUFDYnNILGlCQUFpQixFQUFFeEIsZ0JBQWdCO1FBQ25DeUIsZ0JBQWdCLEVBQUVySCxXQUFXLENBQUNxSCxnQkFBZ0I7UUFDOUNDLDhCQUE4QixFQUFFdEgsV0FBVyxDQUFDc0gsOEJBQThCO1FBQzFFcEMsS0FBSyxFQUFFbEYsV0FBVyxDQUFDa0YsS0FBSztRQUN4QnFDLGFBQWEsRUFBRXZILFdBQVcsQ0FBQ3VIO01BQzVCLENBQUM7TUFDRCxJQUFJL0YsZUFBZSxDQUFDbUIsT0FBTyxFQUFFO1FBQUE7UUFDNUJwQyxVQUFVLEdBQUdULE1BQU0sQ0FBQ1UsWUFBWSxFQUFFO1FBRWxDLE1BQU1nSCxpQkFBaUIsR0FBR2pHLFlBQVksQ0FBQ2hCLFVBQVUsQ0FBQztRQUNsRCxNQUFNa0gsaUJBQWlCLEdBQUdELGlCQUFpQixDQUFDRSxVQUFVLENBQUNsRixNQUFNLENBQzNEbUYsZUFBZSxJQUFLQSxlQUFlLENBQUNDLFVBQVUsS0FBS3BHLGVBQWUsQ0FBQ3FHLGdCQUFnQixDQUNwRjtRQUNELE1BQU1DLGdCQUFnQixHQUFHTCxpQkFBaUIsQ0FBQ3hILE1BQU0sR0FBRyxDQUFDLEdBQUd3SCxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBR00sU0FBUztRQUV4RnRDLFlBQVksR0FDWCxDQUFDakUsZUFBZSxDQUFDd0csZ0JBQWdCLElBQ2pDeEcsZUFBZSxDQUFDcUcsZ0JBQWdCLElBQ2hDckcsZUFBZSxDQUFDeUcsZ0JBQWdCLEtBQUt6RyxlQUFlLENBQUNxRyxnQkFBZ0I7UUFFdEUsSUFBSXBDLFlBQVksSUFBSXlDLFdBQVcsQ0FBQ0MsV0FBVyxDQUFDTCxnQkFBZ0IsQ0FBQyxFQUFFO1VBQzlEOUgsV0FBVyxDQUFDb0ksa0JBQWtCLEtBQUssQ0FBQyxDQUFDO1VBQ3JDcEksV0FBVyxDQUFDb0ksa0JBQWtCLENBQUNDLE9BQU8sR0FBR3JJLFdBQVcsQ0FBQ29JLGtCQUFrQixDQUFDQyxPQUFPLEdBQzNFLEdBQUVySSxXQUFXLENBQUNvSSxrQkFBa0IsQ0FBQ0MsT0FBUSxrQkFBaUIsR0FDM0QsaUJBQWlCO1FBQ3JCO1FBRUEsNkJBQUlySSxXQUFXLENBQUNzSSxvQkFBb0Isa0RBQWhDLHNCQUFrQ0MsZUFBZSxFQUFFO1VBQ3REaEQsYUFBYSxHQUFHMkMsV0FBVyxDQUFDTSxlQUFlLENBQUNqSSxVQUFVLEVBQUVELFNBQVMsQ0FBRSxDQUFDLENBQUMsQ0FBQ0ssT0FBTyxFQUFFLENBQUU7VUFFakYsSUFBSTRFLGFBQWEsRUFBRTtZQUNsQjtZQUNBQyxrQkFBa0IsR0FBR3hGLFdBQVcsQ0FBQ3NJLG9CQUFvQixDQUFDQyxlQUFlLENBQUM3RixTQUFTLENBQzdFK0YsR0FBRyxJQUFLLE9BQU9BLEdBQUcsS0FBSyxRQUFRLEtBQUtBLEdBQUcsS0FBS2xELGFBQWEsSUFBSWtELEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FDMUU7O1lBRUQ7WUFDQTtZQUNBLElBQUlqRCxrQkFBa0IsR0FBRyxDQUFDLENBQUMsSUFBSUMsWUFBWSxFQUFFO2NBQUE7Y0FDNUM7Y0FDQTtjQUNBekYsV0FBVyxDQUFDb0ksa0JBQWtCLEtBQUssQ0FBQyxDQUFDO2NBRXJDLElBQ0MseUJBQUE1RyxlQUFlLENBQUNxRyxnQkFBZ0Isa0RBQWhDLHNCQUFrQ2EsZ0JBQWdCLENBQUNDLElBQUksQ0FBRUMsUUFBUSxJQUFLQSxRQUFRLENBQUNuRyxJQUFJLEtBQUs4QyxhQUFhLENBQUMsSUFDdEcsQ0FBQyxDQUFDdkYsV0FBVyxDQUFDb0ksa0JBQWtCLENBQUNDLE9BQU8sSUFBSSxFQUFFLEVBQUVRLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsUUFBUSxDQUFDdkQsYUFBYSxDQUFDLEVBQ2pGO2dCQUFBO2dCQUNEdkYsV0FBVyxDQUFDb0ksa0JBQWtCLENBQUNDLE9BQU8sR0FBR3JJLFdBQVcsQ0FBQ29JLGtCQUFrQixDQUFDQyxPQUFPLEdBQzNFLEdBQUVySSxXQUFXLENBQUNvSSxrQkFBa0IsQ0FBQ0MsT0FBUSxJQUFHOUMsYUFBYyxFQUFDLEdBQzVEQSxhQUFhO2dCQUNoQjtnQkFDQTtnQkFDQSxJQUFJQyxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRTtrQkFDOUJ4RixXQUFXLENBQUNzSSxvQkFBb0IsQ0FBQ0MsZUFBZSxDQUFDUSxJQUFJLENBQUN4RCxhQUFhLENBQUM7Z0JBQ3JFO2dCQUVBLElBQUksMkJBQUF2RixXQUFXLENBQUNzSSxvQkFBb0IsQ0FBQ1UsY0FBYywyREFBL0MsdUJBQWlEL0ksTUFBTSxNQUFLLENBQUMsSUFBSXVGLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxFQUFFO2tCQUM3RjtrQkFDQXhGLFdBQVcsQ0FBQ3NJLG9CQUFvQixDQUFDQyxlQUFlLENBQUNVLE1BQU0sQ0FBQ3pELGtCQUFrQixFQUFFLENBQUMsQ0FBQztnQkFDL0U7Y0FDRDtZQUNEO1VBQ0Q7UUFDRDtRQUVBc0IsMEJBQTBCLENBQUN4RyxTQUFTLEdBQUdBLFNBQVM7UUFDaER3RywwQkFBMEIsQ0FBQ3NCLGtCQUFrQixHQUFHcEksV0FBVyxDQUFDb0ksa0JBQWtCO1FBQzlFdEIsMEJBQTBCLENBQUN3QixvQkFBb0IsR0FBR3RJLFdBQVcsQ0FBQ3NJLG9CQUFvQjtRQUNsRnhCLDBCQUEwQixDQUFDbEMsUUFBUSxHQUFHNUUsV0FBVyxDQUFDNkUsa0JBQWtCLEtBQUtyRixrQkFBa0IsQ0FBQ3NGLFNBQVM7UUFDckdnQywwQkFBMEIsQ0FBQ29DLG9CQUFvQixHQUFHbEosV0FBVyxDQUFDa0osb0JBQW9CO1FBQ2xGcEMsMEJBQTBCLENBQUNxQyxxQkFBcUIsR0FBR25KLFdBQVcsQ0FBQ21KLHFCQUFxQjtRQUNwRnJDLDBCQUEwQixDQUFDc0MsY0FBYyxHQUFHL0QsZUFBZTtRQUMzRHlCLDBCQUEwQixDQUFDdUMsV0FBVyxHQUFHckosV0FBVyxDQUFDcUosV0FBVztRQUNoRXZDLDBCQUEwQixDQUFDd0MscUJBQXFCLEdBQUd0SixXQUFXLENBQUNzSixxQkFBcUI7UUFDcEZ4QywwQkFBMEIsQ0FBQ2xELE9BQU8sR0FBRzVELFdBQVcsQ0FBQzRELE9BQU87UUFDeEQsSUFBSTVELFdBQVcsQ0FBQ3VKLFNBQVMsRUFBRTtVQUMxQnpDLDBCQUEwQixDQUFDMEMsT0FBTyxHQUFHeEosV0FBVyxDQUFDeUosYUFBYSxDQUFDQyxJQUFJLENBQUMxSixXQUFXLENBQUN1SixTQUFTLENBQVk7VUFDckd2SixXQUFXLENBQUN3SixPQUFPLEdBQUcxQywwQkFBMEIsQ0FBQzBDLE9BQU87UUFDekQsQ0FBQyxNQUFNO1VBQ04xQywwQkFBMEIsQ0FBQzBDLE9BQU8sR0FBR3hKLFdBQVcsQ0FBQ3lKLGFBQWE7VUFDOUR6SixXQUFXLENBQUN3SixPQUFPLEdBQUd4SixXQUFXLENBQUN5SixhQUFhO1FBQ2hEO01BQ0Q7TUFDQTNDLDBCQUEwQixDQUFDd0Isb0JBQW9CLEdBQUd0SSxXQUFXLENBQUNzSSxvQkFBb0I7TUFDbEYsSUFBSWpELGVBQWUsRUFBRTtRQUNwQnlCLDBCQUEwQixDQUFDekIsZUFBZSxHQUFHQSxlQUFlO01BQzdEO01BQ0F5QiwwQkFBMEIsQ0FBQzZDLFFBQVEsR0FBR25JLGVBQWUsQ0FBQ21CLE9BQU8sSUFBSSxDQUFDLDJCQUFDbkIsZUFBZSxDQUFDUyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtEQUE3QixzQkFBK0IySCxZQUFZO01BQzlHLElBQUk1RSxRQUFRLEVBQUU7UUFDYixJQUFJO1VBQ0gsTUFBTTZFLGVBQWUsR0FBRyxNQUFNN0UsUUFBUSxDQUNyQ3BGLFdBQVcsRUFDWEcsYUFBYSxFQUNia0YsWUFBWSxFQUNaNkIsMEJBQTBCLEVBQzFCbEIsZ0JBQWdCLEVBQ2hCRyxnQkFBZ0IsRUFDaEI5QixPQUFPLEVBQ1BqRSxXQUFXLENBQUN5SixhQUFhLEVBQ3pCekosV0FBVyxDQUFDOEosYUFBYSxFQUN6QjlKLFdBQVcsQ0FBQytKLGNBQWMsRUFDMUI3Rix1QkFBdUIsRUFDdkJsRSxXQUFXLENBQUNnSyxJQUFJLEVBQ2hCaEssV0FBVyxDQUFDaUssVUFBVSxDQUN0QjtVQUNEQyxxQkFBcUIsQ0FBQ2xLLFdBQVcsRUFBRThHLDBCQUEwQixFQUFFbkIsZ0JBQWdCLENBQUM7VUFDaEZaLE9BQU8sQ0FBQzhFLGVBQWUsQ0FBQztVQUN4QjtRQUNELENBQUMsQ0FBQyxPQUFPakksQ0FBQyxFQUFFO1VBQ1hzQixNQUFNLENBQUN0QixDQUFDLENBQTJCO1FBQ3BDO01BQ0QsQ0FBQyxNQUFNO1FBQ047UUFDQTs7UUFFQSxJQUFJbUUsZ0JBQWdCLEVBQUU7VUFDckIsS0FBSyxNQUFNb0UsQ0FBQyxJQUFJckQsMEJBQTBCLENBQUNNLGlCQUFpQixFQUFFO1lBQUE7WUFDN0ROLDBCQUEwQixDQUFDQyx1QkFBdUIsQ0FBQ0QsMEJBQTBCLENBQUNNLGlCQUFpQixDQUFDK0MsQ0FBQyxDQUFDLENBQUMxSCxJQUFJLENBQUMsR0FDdkdzRCxnQkFBZ0IsYUFBaEJBLGdCQUFnQixnREFBaEJBLGdCQUFnQixDQUFFNEMsSUFBSSxDQUFFeUIsT0FBTyxJQUFLQSxPQUFPLENBQUMzSCxJQUFJLEtBQUtxRSwwQkFBMEIsQ0FBQ00saUJBQWlCLENBQUMrQyxDQUFDLENBQUMsQ0FBQzFILElBQUksQ0FBQywwREFBMUcsc0JBQTRHckIsS0FBSztVQUNuSDtRQUNELENBQUMsTUFBTTtVQUNOLEtBQUssTUFBTStJLENBQUMsSUFBSXJELDBCQUEwQixDQUFDTSxpQkFBaUIsRUFBRTtZQUFBO1lBQzdETiwwQkFBMEIsQ0FBQ0MsdUJBQXVCLENBQUNELDBCQUEwQixDQUFDTSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxDQUFDLEdBQ3ZHLDBCQUFDMEQsa0JBQWtCLENBQUNXLDBCQUEwQixDQUFDTSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxDQUFDLDBEQUF4RSxzQkFBMkUsQ0FBQyxDQUFDLCtCQUM5RXFFLDBCQUEwQixDQUFDTSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDNUQsV0FBVyxvRkFBM0Qsc0JBQTZEQyxFQUFFLHFGQUEvRCx1QkFBaUU2RCxxQkFBcUIsMkRBQXRGLHVCQUF3RjNELE9BQU8sRUFBRTtVQUNuRztRQUNEO1FBQ0EsSUFBSTRELGdCQUFpRztRQUNyRyxJQUFJO1VBQ0hBLGdCQUFnQixHQUFHLE1BQU1DLGNBQWMsQ0FDdEN4SyxhQUFhLEVBQ2IrRywwQkFBMEIsRUFDMUI5RyxXQUFXLENBQUN5SixhQUFhLEVBQ3pCekosV0FBVyxDQUFDK0osY0FBYyxFQUMxQjdGLHVCQUF1QixFQUN2QmxFLFdBQVcsQ0FBQ2lLLFVBQVUsQ0FDdEI7VUFFRCxNQUFNTyxRQUFRLEdBQUdDLFNBQVMsQ0FBQ0MsZUFBZSxFQUFFLENBQUNDLE9BQU8sRUFBRTtVQUN0RCxJQUFJekcsdUJBQXVCLENBQUNDLGFBQWEsSUFBSUQsdUJBQXVCLENBQUNFLDZCQUE2QixDQUFDbkUsTUFBTSxFQUFFO1lBQzFHaUUsdUJBQXVCLENBQUNLLG9CQUFvQixHQUFHTCx1QkFBdUIsQ0FBQ0ssb0JBQW9CLENBQUNxRyxNQUFNLENBQUNKLFFBQVEsQ0FBQztVQUM3RztVQUNBTixxQkFBcUIsQ0FBQ2xLLFdBQVcsRUFBRThHLDBCQUEwQixFQUFFbkIsZ0JBQWdCLENBQUM7VUFDaEZaLE9BQU8sQ0FBQ3VGLGdCQUFnQixDQUFDO1FBQzFCLENBQUMsQ0FBQyxNQUFNO1VBQ1BwSCxNQUFNLENBQUNvSCxnQkFBZ0IsQ0FBMkI7UUFDbkQsQ0FBQyxTQUFTO1VBQUE7VUFDVCxJQUNDcEcsdUJBQXVCLENBQUNDLGFBQWEsSUFDckNELHVCQUF1QixDQUFDRSw2QkFBNkIsQ0FBQ25FLE1BQU0sSUFDNURELFdBQVcsQ0FBQ00sU0FBUyxDQUFFTCxNQUFNLEdBQUcsQ0FBQyxFQUNoQztZQUNELElBQUk7Y0FDSCxNQUFNNEssbUJBQW1CLEdBQUczRyx1QkFBdUIsQ0FBQ0UsNkJBQTZCO2NBQ2pGLE1BQU0wRyxlQUFlLEdBQUcsRUFBc0I7Y0FDOUNELG1CQUFtQixDQUFDRSxPQUFPLENBQUMsVUFBVUMsSUFBdUQsRUFBUTtnQkFDcEdGLGVBQWUsQ0FBQy9CLElBQUksQ0FBQ2lDLElBQUksQ0FBQy9HLE9BQU8sQ0FBQ2dILFVBQVUsRUFBRSxDQUFtQjtjQUNsRSxDQUFDLENBQUM7Y0FDRm5FLDBCQUEwQixDQUFDeEcsU0FBUyxHQUFHd0ssZUFBZTtjQUN0RCxNQUFNSSxzQkFBc0IsR0FBRyxNQUFNWCxjQUFjLENBQ2xEeEssYUFBYSxFQUNiK0csMEJBQTBCLEVBQzFCOUcsV0FBVyxDQUFDeUosYUFBYSxFQUN6QnpKLFdBQVcsQ0FBQytKLGNBQWMsRUFDMUI3Rix1QkFBdUIsRUFDdkJsRSxXQUFXLENBQUNpSyxVQUFVLENBQ3RCO2NBQ0QvRix1QkFBdUIsQ0FBQ0UsNkJBQTZCLEdBQUcsRUFBRTtjQUMxRHFHLFNBQVMsQ0FBQ1UsV0FBVyxDQUFDakgsdUJBQXVCLENBQUNLLG9CQUFvQixDQUFDO2NBQ25FMkYscUJBQXFCLENBQUNsSyxXQUFXLEVBQUU4RywwQkFBMEIsRUFBRW5CLGdCQUFnQixDQUFDO2NBQ2hGWixPQUFPLENBQUNtRyxzQkFBc0IsQ0FBQztZQUNoQyxDQUFDLENBQUMsT0FBT0Esc0JBQXNCLEVBQUU7Y0FDaENoSSxNQUFNLENBQ0xnSSxzQkFBc0IsQ0FLdEI7WUFDRjtVQUNEO1VBQ0EsSUFBSUUsbUNBQW1DLEdBQUcsS0FBSztVQUMvQyxJQUNFcEwsV0FBVyxDQUFDNEUsUUFBUSxJQUFJVix1QkFBdUIsQ0FBQ0csc0JBQXNCLENBQUNwRSxNQUFNLElBQzdFRCxXQUFXLENBQUM0RSxRQUFRLElBQUl5RyxlQUFlLENBQUNDLDZCQUE2QixFQUFHLEVBQ3hFO1lBQ0RGLG1DQUFtQyxHQUFHLElBQUk7VUFDM0M7VUFDQSxJQUFJRyxrQkFBa0IsR0FBRyxLQUFLO1VBQzlCLElBQUluTCxLQUFLLENBQUNDLE9BQU8sQ0FBQ2lLLGdCQUFnQixDQUFDLEVBQUU7WUFBQTtZQUNwQ2lCLGtCQUFrQix3QkFBR2pCLGdCQUFnQixzREFBaEIsa0JBQWtCakUsS0FBSyxDQUFFbUYsR0FBRyxJQUFLQSxHQUFHLENBQUNySyxNQUFNLEtBQUssV0FBVyxDQUFDO1VBQ2xGO1VBQ0FuQixXQUFXLGFBQVhBLFdBQVcsZ0RBQVhBLFdBQVcsQ0FBRStKLGNBQWMsMERBQTNCLHNCQUNHMEIsaUJBQWlCLENBQUM7WUFDbkJqQyxPQUFPLEVBQUUxQywwQkFBMEIsYUFBMUJBLDBCQUEwQix1QkFBMUJBLDBCQUEwQixDQUFFMEMsT0FBTztZQUM1Q2tDLG1CQUFtQixFQUFFLFVBQVVDLFNBQW9CLEVBQUVDLHVCQUE4QyxFQUFFO2NBQ3BHLE9BQU9DLGtDQUFrQyxDQUN4Qy9FLDBCQUEwQixFQUMxQnhHLFNBQVMsRUFDVHlILFNBQVMsRUFDVDRELFNBQVMsRUFDVEMsdUJBQXVCLEVBQ3ZCUixtQ0FBbUMsRUFDbkNHLGtCQUFrQixDQUNsQjtZQUNGLENBQUM7WUFDRE8saUJBQWlCLEVBQUU5TCxXQUFXLENBQUNNLFNBQVM7WUFDeENWLFdBQVcsRUFBRXFGO1VBQ2QsQ0FBQyxDQUFDLENBQ0Q4RyxJQUFJLENBQUMsTUFBTTtZQUNYL0wsV0FBVyxDQUFDK0osY0FBYyxDQUFDaUMsMEJBQTBCLEVBQUU7WUFDdkQ7VUFDRCxDQUFDLENBQUM7VUFDSDlILHVCQUF1QixHQUFHO1lBQ3pCQyxhQUFhLEVBQUUsS0FBSztZQUNwQkMsNkJBQTZCLEVBQUUsRUFBRTtZQUNqQ0Msc0JBQXNCLEVBQUUsRUFBRTtZQUMxQkMsNkJBQTZCLEVBQUUsRUFBRTtZQUNqQ0Msb0JBQW9CLEVBQUUsRUFBRTtZQUN4QkMsbUJBQW1CLEVBQUUsSUFBSUMsR0FBRztVQUM3QixDQUFDO1FBQ0Y7TUFDRDtJQUNELENBQUMsQ0FBQztFQUNIO0VBRUEsZUFBZW9DLHFCQUFxQixDQUNuQ2pILFdBQW1CLEVBQ25CRyxhQUEyQixFQUMzQmtGLFlBQWdDLEVBQ2hDakYsV0FBdUMsRUFDdkNvSCxpQkFBdUMsRUFDdkNyQixnQkFBdUQsRUFDdkRrRyxjQUF1QixFQUN2QkMsY0FBb0IsRUFDcEJwQyxhQUFpQyxFQUNqQ0MsY0FBOEIsRUFDOUI3Rix1QkFBZ0QsRUFDaEQ4RixJQUFpQixFQUNqQkMsVUFBb0IsRUFDTTtJQUMxQixPQUFPLElBQUloSCxPQUFPLENBQUMsQ0FBQzhCLE9BQU8sRUFBRTdCLE1BQU0sS0FBSztNQUN2QyxJQUFJaUosZUFBZSxHQUFHdk0sV0FBVztNQUNqQ3VNLGVBQWUsR0FBR0EsZUFBZSxDQUFDckQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUM1Q3FELGVBQWUsQ0FBQ3RELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ3NELGVBQWUsQ0FBQ3RELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzVJLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FDakVrTSxlQUFlO01BQ2xCLE1BQU1DLGlCQUFpQixHQUFHRCxlQUFlLElBQUlyQyxhQUFhLEdBQUksR0FBRUEsYUFBYyxJQUFHcUMsZUFBZ0IsRUFBQyxHQUFHLEVBQUU7TUFDdkcsTUFBTUUsYUFBYSxHQUFHQyxnQkFBZ0IsQ0FBQ0osY0FBYyxDQUFDO01BQ3RELE1BQU1LLGlCQUFpQixHQUFHRixhQUFhLENBQUNHLE9BQU8sQ0FBQyxxQ0FBcUMsRUFBRXpFLFNBQVMsRUFBRXFFLGlCQUFpQixDQUFDO01BRXBIMU0sVUFBVSxDQUFDK00sT0FBTyxDQUFDRixpQkFBaUIsRUFBRTtRQUNyQ0csT0FBTyxFQUFFLGdCQUFnQkMsT0FBZSxFQUFFO1VBQ3pDLElBQUlBLE9BQU8sS0FBS2xOLE1BQU0sQ0FBQ21OLEVBQUUsRUFBRTtZQUMxQixJQUFJO2NBQ0gsTUFBTUMsVUFBVSxHQUFHLE1BQU10QyxjQUFjLENBQ3RDeEssYUFBYSxFQUNiQyxXQUFXLEVBQ1hrTSxjQUFjLEVBQ2RuQyxjQUFjLEVBQ2Q3Rix1QkFBdUIsRUFDdkIrRixVQUFVLENBQ1Y7Y0FDRGxGLE9BQU8sQ0FBQzhILFVBQVUsQ0FBQztZQUNwQixDQUFDLENBQUMsT0FBT0MsTUFBZSxFQUFFO2NBQ3pCLElBQUk7Z0JBQ0gsTUFBTS9DLGNBQWMsQ0FBQzBCLGlCQUFpQixFQUFFO2dCQUN4Q3ZJLE1BQU0sQ0FBQzRKLE1BQU0sQ0FBQztjQUNmLENBQUMsQ0FBQyxPQUFPbEwsQ0FBQyxFQUFFO2dCQUNYc0IsTUFBTSxDQUFDNEosTUFBTSxDQUFDO2NBQ2Y7WUFDRDtVQUNELENBQUMsTUFBTTtZQUNOL0gsT0FBTyxDQUFDekYsU0FBUyxDQUFDeU4sa0JBQWtCLENBQUM7VUFDdEM7UUFDRDtNQUNELENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztFQUNIO0VBRUEsZUFBZUMsZ0JBQWdCLENBQzlCak4sYUFBMkIsRUFDM0JDLFdBQXVDLEVBQ3ZDa00sY0FBb0IsRUFDcEJuQyxjQUE4QixFQUM5QnpKLFNBQTJCLEVBQzNCMk0sT0FBZSxFQUNmQyxRQUFpQixFQUNqQmhKLHVCQUFnRCxFQUNoRCtGLFVBQW9CLEVBQ3VFO0lBQzNGLE1BQU1rRCxPQUFPLEdBQUcsTUFBTTVDLGNBQWMsQ0FBQ3hLLGFBQWEsRUFBRUMsV0FBVyxFQUFFa00sY0FBYyxFQUFFbkMsY0FBYyxFQUFFN0YsdUJBQXVCLEVBQUUrRixVQUFVLENBQUM7SUFDckk7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUlqSyxXQUFXLENBQUNNLFNBQVMsSUFBSU4sV0FBVyxDQUFDTSxTQUFTLENBQUNMLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDOUQsSUFDRWtOLE9BQU8sYUFBUEEsT0FBTyxlQUFQQSxPQUFPLENBQXlEQyxJQUFJLENBQ25FQyxhQUErRCxJQUFLQSxhQUFhLENBQUNsTSxNQUFNLEtBQUssVUFBVSxDQUN4RyxFQUNBO1FBQ0QsTUFBTWdNLE9BQU87TUFDZDtJQUNEO0lBRUEsTUFBTTNDLFFBQVEsR0FBR0MsU0FBUyxDQUFDQyxlQUFlLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFO0lBQ3RELElBQUl6Ryx1QkFBdUIsQ0FBQ0MsYUFBYSxJQUFJRCx1QkFBdUIsQ0FBQ0UsNkJBQTZCLENBQUNuRSxNQUFNLEVBQUU7TUFDMUcsSUFBSSxDQUFDaU4sUUFBUSxFQUFFO1FBQ2RoSix1QkFBdUIsQ0FBQ0ssb0JBQW9CLEdBQUdMLHVCQUF1QixDQUFDSyxvQkFBb0IsQ0FBQ3FHLE1BQU0sQ0FBQ0osUUFBUSxDQUFDO01BQzdHLENBQUMsTUFBTTtRQUNOQyxTQUFTLENBQUNVLFdBQVcsQ0FBQ2pILHVCQUF1QixDQUFDSyxvQkFBb0IsQ0FBQztRQUNuRSxJQUFJNkcsbUNBQW1DLEdBQUcsS0FBSztRQUMvQyxJQUNFcEwsV0FBVyxDQUFDNEUsUUFBUSxJQUFJVix1QkFBdUIsQ0FBQ0csc0JBQXNCLENBQUNwRSxNQUFNLElBQzdFRCxXQUFXLENBQUM0RSxRQUFRLElBQUl5RyxlQUFlLENBQUNDLDZCQUE2QixFQUFHLEVBQ3hFO1VBQ0RGLG1DQUFtQyxHQUFHLElBQUk7UUFDM0M7UUFDQSxJQUFJWixRQUFRLENBQUN2SyxNQUFNLEVBQUU7VUFDcEI7VUFDQWdOLE9BQU8sQ0FBQ0ssZUFBZSxDQUFDLFlBQVksRUFBRSxZQUFZO1lBQ2pEdkQsY0FBYyxDQUFDMEIsaUJBQWlCLENBQUM7Y0FDaENDLG1CQUFtQixFQUFFLFVBQVVDLFNBQW9CLEVBQUVDLHVCQUE4QyxFQUFFO2dCQUNwRyxPQUFPQyxrQ0FBa0MsQ0FDeEM3TCxXQUFXLEVBQ1hNLFNBQVMsRUFDVDJNLE9BQU8sRUFDUHRCLFNBQVMsRUFDVEMsdUJBQXVCLEVBQ3ZCUixtQ0FBbUMsQ0FDbkM7Y0FDRixDQUFDO2NBQ0Q1QixPQUFPLEVBQUV4SixXQUFXLENBQUN3SixPQUFPO2NBQzVCc0MsaUJBQWlCLEVBQUU5TCxXQUFXLENBQUNNLFNBQVM7Y0FDeENWLFdBQVcsRUFBRUksV0FBVyxDQUFDa0Y7WUFDMUIsQ0FBQyxDQUFDO1VBQ0gsQ0FBQyxDQUFDO1FBQ0g7TUFDRDtJQUNELENBQUMsTUFBTSxJQUFJc0YsUUFBUSxDQUFDdkssTUFBTSxFQUFFO01BQzNCO01BQ0EsSUFBSW1MLG1DQUFtQyxHQUFHLEtBQUs7TUFDL0MsSUFDRXBMLFdBQVcsQ0FBQzRFLFFBQVEsSUFBSVYsdUJBQXVCLENBQUNHLHNCQUFzQixDQUFDcEUsTUFBTSxJQUM3RUQsV0FBVyxDQUFDNEUsUUFBUSxJQUFJeUcsZUFBZSxDQUFDQyw2QkFBNkIsRUFBRyxFQUN4RTtRQUNERixtQ0FBbUMsR0FBRyxJQUFJO01BQzNDO01BQ0E2QixPQUFPLENBQUNLLGVBQWUsQ0FBQyxZQUFZLEVBQUUsWUFBWTtRQUFBO1FBQ2pEdkQsY0FBYyxDQUFDMEIsaUJBQWlCLENBQUM7VUFDaEM4QiwyQkFBMkIsRUFBRXZOLFdBQVcsYUFBWEEsV0FBVywrQ0FBWEEsV0FBVyxDQUFFaU4sT0FBTyx5REFBcEIscUJBQXNCTyxNQUFNLEVBQUU7VUFDM0RDLGtCQUFrQixFQUFFLENBQUF6TixXQUFXLGFBQVhBLFdBQVcsZ0RBQVhBLFdBQVcsQ0FBRWlOLE9BQU8sMERBQXBCLHNCQUFzQk8sTUFBTSxFQUFFLEtBQUksS0FBSztVQUMzRDlCLG1CQUFtQixFQUFFLFVBQVVDLFNBQW9CLEVBQUVDLHVCQUE4QyxFQUFFO1lBQ3BHLE9BQU9DLGtDQUFrQyxDQUN4QzdMLFdBQVcsRUFDWE0sU0FBUyxFQUNUMk0sT0FBTyxFQUNQdEIsU0FBUyxFQUNUQyx1QkFBdUIsRUFDdkJSLG1DQUFtQyxDQUNuQztVQUNGLENBQUM7VUFDRDVCLE9BQU8sRUFBRXhKLFdBQVcsQ0FBQ3dKLE9BQU87VUFDNUJzQyxpQkFBaUIsRUFBRTlMLFdBQVcsQ0FBQ00sU0FBUztVQUN4Q1YsV0FBVyxFQUFFSSxXQUFXLENBQUNrRjtRQUMxQixDQUFDLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSDtJQUVBLE9BQU9pSSxPQUFPO0VBQ2Y7RUFFQSxTQUFTakQscUJBQXFCLENBQzdCbEssV0FBaUMsRUFDakM4RywwQkFBc0QsRUFDdERuQixnQkFBaUMsRUFDMUI7SUFDUCxJQUNDbUIsMEJBQTBCLENBQUNvQyxvQkFBb0IsSUFDL0NwQywwQkFBMEIsQ0FBQ3FDLHFCQUFxQixJQUNoRHJDLDBCQUEwQixDQUFDeEcsU0FBUyxJQUNwQ3dHLDBCQUEwQixDQUFDeEcsU0FBUyxDQUFDTCxNQUFNLElBQzNDMEYsZ0JBQWdCLENBQUMrSCxRQUFRLEVBQ3hCO01BQ0QsSUFBSUMsZ0JBQWtDLEdBQUcsRUFBRTtNQUMzQztNQUNBLE1BQU1oRSxRQUFRLEdBQUc3QywwQkFBMEIsQ0FBQzZDLFFBQVE7TUFDcEQsSUFBSSxDQUFDQSxRQUFRLEVBQUU7UUFDZGdFLGdCQUFnQixHQUFHN0csMEJBQTBCLENBQUNvQyxvQkFBb0IsQ0FBQzBFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUU7UUFDeEc3TSxhQUFhLENBQUM4TSxtQkFBbUIsQ0FDaEMvRywwQkFBMEIsQ0FBQ29DLG9CQUFvQixFQUMvQzRFLElBQUksQ0FBQ0MsS0FBSyxDQUFDakgsMEJBQTBCLENBQUNxQyxxQkFBcUIsQ0FBQyxFQUM1RHdFLGdCQUFnQixFQUNoQixPQUFPLENBQ1A7TUFDRixDQUFDLE1BQU0sSUFBSTdHLDBCQUEwQixDQUFDMEMsT0FBTyxFQUFFO1FBQzlDLE1BQU1BLE9BQU8sR0FBRzFDLDBCQUEwQixDQUFDMEMsT0FBTztRQUNsRCxJQUFJQSxPQUFPLENBQUN3RSxHQUFHLENBQVEsa0JBQWtCLENBQUMsRUFBRTtVQUMzQ0wsZ0JBQWdCLEdBQUduRSxPQUFPLENBQUN5RSxtQkFBbUIsRUFBc0I7VUFDcEVsTixhQUFhLENBQUM4TSxtQkFBbUIsQ0FDaEMvRywwQkFBMEIsQ0FBQ29DLG9CQUFvQixFQUMvQzRFLElBQUksQ0FBQ0MsS0FBSyxDQUFDakgsMEJBQTBCLENBQUNxQyxxQkFBcUIsQ0FBQyxFQUM1RHdFLGdCQUFnQixFQUNoQixPQUFPLENBQ1A7UUFDRjtNQUNEO01BQ0E7TUFDQU8sWUFBWSxDQUFDQyxtQ0FBbUMsQ0FBQ3JILDBCQUEwQixDQUFDb0Msb0JBQW9CLEVBQUV5RSxnQkFBZ0IsQ0FBQztJQUNwSDtFQUNEO0VBRUEsU0FBUzlCLGtDQUFrQyxDQUMxQzdMLFdBQXVDLEVBQ3ZDTSxTQUEyQixFQUMzQjJNLE9BQTJCLEVBQzNCekMsUUFBbUIsRUFDbkJvQix1QkFBOEMsRUFDOUNSLG1DQUE0QyxFQUM1Q0csa0JBQTRCLEVBQ0o7SUFDeEIsSUFBSTZDLGNBQWMsR0FBR3hDLHVCQUF1QixDQUFDd0MsY0FBYztNQUMxRDNDLGlCQUFpQixHQUFHRyx1QkFBdUIsQ0FBQ0gsaUJBQWlCO0lBQzlELE1BQU00QyxRQUFRLEdBQUdyTyxXQUFXLENBQUN3SixPQUFPO0lBQ3BDLE1BQU04RSxlQUFlLEdBQUdDLE9BQU8sQ0FBQ0Msb0JBQW9CLENBQUMsYUFBYSxDQUFFO0lBQ3BFLE1BQU1DLGVBQWUsR0FBR2pFLFFBQVEsQ0FBQ2hJLE1BQU0sQ0FBQyxVQUFVa00sT0FBZ0IsRUFBRTtNQUFBO01BQ25FLE9BQU8sd0JBQUFBLE9BQU8sQ0FBQ0MsVUFBVSxFQUFFLHdEQUFwQixvQkFBdUIsQ0FBQyxDQUFDLE1BQUssRUFBRTtJQUN4QyxDQUFDLENBQUM7SUFDRixNQUFNQyxXQUFXLEdBQUdwRSxRQUFRLENBQUNoSSxNQUFNLENBQUMsVUFBVWtNLE9BQU8sRUFBRTtNQUFBO01BQ3RELE9BQ0NBLE9BQU8sQ0FBQ0MsVUFBVSw2QkFDbEJELE9BQU8sQ0FBQ0MsVUFBVSxFQUFFLHlEQUFwQixxQkFBdUIsQ0FBQyxDQUFDLENBQUM3RixRQUFRLENBQUM5SSxXQUFXLENBQUM4QixVQUFVLENBQUMsTUFDMUQ5QixXQUFXLGFBQVhBLFdBQVcsZ0RBQVhBLFdBQVcsQ0FBRW9ILGlCQUFpQiwwREFBOUIsc0JBQWdDZ0csSUFBSSxDQUFDLFVBQVV5QixXQUFXLEVBQUU7UUFBQTtRQUMzRCwrQkFBT0gsT0FBTyxDQUFDQyxVQUFVLEVBQUUseURBQXBCLHFCQUF1QixDQUFDLENBQUMsQ0FBQzdGLFFBQVEsQ0FBQytGLFdBQVcsQ0FBQ3BNLElBQUksQ0FBQztNQUM1RCxDQUFDLENBQUM7SUFFSixDQUFDLENBQUM7SUFDRm1NLFdBQVcsYUFBWEEsV0FBVyx1QkFBWEEsV0FBVyxDQUFFN0QsT0FBTyxDQUFDLFVBQVUrRCxVQUFVLEVBQUU7TUFDekNBLFVBQVUsQ0FBeUNDLFdBQVcsR0FBRyxJQUFJO0lBQ3ZFLENBQUMsQ0FBQztJQUVGLE1BQU1DLGlCQUFpQixHQUFHSixXQUFXLENBQUMzTyxNQUFNLEdBQUcsSUFBSSxHQUFHLEtBQUs7SUFDM0QsSUFBSWdQLDJCQUEyQixHQUFHLEtBQUs7SUFDdkM7SUFDQSxJQUFJN0QsbUNBQW1DLElBQUksQ0FBQzRELGlCQUFpQixJQUFJLENBQUN6RCxrQkFBa0IsRUFBRTtNQUNyRjBELDJCQUEyQixHQUFHLElBQUk7TUFDbEMsSUFBSUMsUUFBUSxHQUFHWixlQUFlLENBQUM5QixPQUFPLENBQUMsNENBQTRDLENBQUM7TUFDcEYsSUFBSTJDLGdCQUFnQixHQUFHYixlQUFlLENBQUM5QixPQUFPLENBQUMsbURBQW1ELENBQUM7TUFDbkcsTUFBTTRDLFlBQVksR0FBRzNFLFNBQVMsQ0FBQ0MsZUFBZSxFQUFFO01BQ2hELE1BQU0yRSxlQUFlLEdBQUdELFlBQVksQ0FBQ3pFLE9BQU8sRUFBRTtNQUM5QyxNQUFNMkUsY0FBYyxHQUFHakUsZUFBZSxDQUFDa0UsV0FBVyxDQUFDLElBQUksQ0FBQztNQUN4RCxJQUFJQyxjQUFjO01BQ2xCLE1BQU1DLFVBQVUsR0FBR3BCLFFBQVEsSUFBSUEsUUFBUSxDQUFDcUIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFFOUIsV0FBVyxDQUFDLGFBQWEsQ0FBQztNQUVsRixNQUFNK0IsNkJBQTZCLEdBQUduRixRQUFRLENBQUM5SCxTQUFTLENBQUMsVUFBVWdNLE9BQWdCLEVBQUU7UUFDcEYsT0FBT0EsT0FBTyxDQUFDa0IsT0FBTyxFQUFFLEtBQUssT0FBTyxJQUFJbEIsT0FBTyxDQUFDa0IsT0FBTyxFQUFFLEtBQUssU0FBUztNQUN4RSxDQUFDLENBQUM7TUFDRixNQUFNQyw0QkFBNEIsR0FBR1IsZUFBZSxDQUFDM00sU0FBUyxDQUFDLFVBQVVnTSxPQUFnQixFQUFFO1FBQzFGLE9BQU9BLE9BQU8sQ0FBQ2tCLE9BQU8sRUFBRSxLQUFLLE9BQU8sSUFBSWxCLE9BQU8sQ0FBQ2tCLE9BQU8sRUFBRSxLQUFLLFNBQVM7TUFDeEUsQ0FBQyxDQUFDO01BRUYsSUFDQ0QsNkJBQTZCLEtBQUssQ0FBQyxJQUNuQ0UsNEJBQTRCLEtBQUssQ0FBQyxDQUFDLElBQ25DN1AsV0FBVyxDQUFDTSxTQUFTLElBQ3JCTixXQUFXLENBQUNNLFNBQVMsQ0FBQ0wsTUFBTSxHQUFHLENBQUMsRUFDL0I7UUFDRCxJQUFJb1AsZUFBZSxDQUFDcFAsTUFBTSxLQUFLLENBQUMsSUFBSXFQLGNBQWMsQ0FBQ3JQLE1BQU0sS0FBSyxDQUFDLEVBQUU7VUFDaEUsSUFBSXdQLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDekJKLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQ1MsVUFBVSxDQUM1QnhCLGVBQWUsQ0FBQzlCLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxHQUMxRSxNQUFNLEdBQ042QyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUNVLFVBQVUsRUFBRSxDQUNoQztVQUNGLENBQUMsTUFBTTtZQUNOYixRQUFRLEdBQUdPLFVBQVUsR0FDbEJuQixlQUFlLENBQUM5QixPQUFPLENBQUMsdURBQXVELENBQUMsR0FDaEY4QixlQUFlLENBQUM5QixPQUFPLENBQUMsa0RBQWtELENBQUM7WUFDOUUyQyxnQkFBZ0IsR0FBRyxFQUFFO1lBQ3JCSyxjQUFjLEdBQUcsSUFBSVEsT0FBTyxDQUFDO2NBQzVCdEIsT0FBTyxFQUFFUSxRQUFRO2NBQ2pCZSxJQUFJLEVBQUVDLFdBQVcsQ0FBQ2hRLEtBQUs7Y0FDdkJ3QixNQUFNLEVBQUUsRUFBRTtjQUNWeU8sVUFBVSxFQUFFLElBQUk7Y0FDaEJDLFdBQVcsRUFBRWpCLGdCQUFnQjtjQUM3QmtCLElBQUksRUFBRTtZQUNQLENBQUMsQ0FBQztZQUNGN0YsUUFBUSxDQUFDOEYsT0FBTyxDQUFDZCxjQUFjLENBQUM7WUFDaEMsSUFBSWhGLFFBQVEsQ0FBQ3ZLLE1BQU0sS0FBSyxDQUFDLEVBQUU7Y0FDMUJtTyxjQUFjLEdBQUcsSUFBSTtjQUNyQjNDLGlCQUFpQixHQUFHLEtBQUs7WUFDMUIsQ0FBQyxNQUFNO2NBQ05BLGlCQUFpQixHQUFHLElBQUk7Y0FDeEIyQyxjQUFjLEdBQUcsS0FBSztZQUN2QjtVQUNEO1FBQ0QsQ0FBQyxNQUFNO1VBQ05vQixjQUFjLEdBQUcsSUFBSVEsT0FBTyxDQUFDO1lBQzVCdEIsT0FBTyxFQUFFUSxRQUFRO1lBQ2pCZSxJQUFJLEVBQUVDLFdBQVcsQ0FBQ2hRLEtBQUs7WUFDdkJ3QixNQUFNLEVBQUUsRUFBRTtZQUNWeU8sVUFBVSxFQUFFLElBQUk7WUFDaEJDLFdBQVcsRUFBRWpCLGdCQUFnQjtZQUM3QmtCLElBQUksRUFBRTtVQUNQLENBQUMsQ0FBQztVQUNGN0YsUUFBUSxDQUFDOEYsT0FBTyxDQUFDZCxjQUFjLENBQUM7VUFDaEMsSUFBSWhGLFFBQVEsQ0FBQ3ZLLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUJtTyxjQUFjLEdBQUcsSUFBSTtZQUNyQjNDLGlCQUFpQixHQUFHLEtBQUs7VUFDMUIsQ0FBQyxNQUFNO1lBQ05BLGlCQUFpQixHQUFHLElBQUk7WUFDeEIyQyxjQUFjLEdBQUcsS0FBSztVQUN2QjtRQUNEO01BQ0Q7SUFDRDtJQUVBLElBQUluQixPQUFPLElBQUlBLE9BQU8sQ0FBQ08sTUFBTSxFQUFFLElBQUlsTixTQUFTLENBQUNMLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQ0QsV0FBVyxDQUFDMkosUUFBUSxFQUFFO01BQ25GLElBQUksQ0FBQzNKLFdBQVcsQ0FBQzRFLFFBQVEsRUFBRTtRQUMxQjtRQUNBLElBQUl0RSxTQUFTLENBQUNMLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQytPLGlCQUFpQixFQUFFO1VBQy9DO1VBQ0E7VUFDQTtVQUNBL0IsT0FBTyxDQUFDc0QsS0FBSyxFQUFFO1VBQ2Z0RCxPQUFPLENBQUN1RCxPQUFPLEVBQUU7UUFDbEI7TUFDRCxDQUFDLE1BQU0sSUFBSSxDQUFDeEIsaUJBQWlCLEVBQUU7UUFDOUI7UUFDQS9CLE9BQU8sQ0FBQ3NELEtBQUssRUFBRTtRQUNmdEQsT0FBTyxDQUFDdUQsT0FBTyxFQUFFO01BQ2xCO0lBQ0Q7SUFDQSxJQUFJQyxnQkFBMkIsR0FBRyxFQUFFO0lBQ3BDLE1BQU1DLFVBQVUsR0FBR3pELE9BQU8sSUFBSUEsT0FBTyxDQUFDTyxNQUFNLEVBQUU7SUFDOUMsSUFBSSxDQUFDeUIsMkJBQTJCLEVBQUU7TUFBQTtNQUNqQyxJQUNDekUsUUFBUSxDQUFDdkssTUFBTSxLQUFLLENBQUMsSUFDckJ1SyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUNtRSxVQUFVLElBQ3RCLDBCQUFBbkUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDbUUsVUFBVSxFQUFFLDBEQUF4QixzQkFBMkIsQ0FBQyxDQUFDLE1BQUs1RyxTQUFTLElBQzNDLDJCQUFBeUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDbUUsVUFBVSxFQUFFLDJEQUF4Qix1QkFBMkIsQ0FBQyxDQUFDLE1BQUssRUFBRSxJQUNwQ25FLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ29GLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFDaEM7UUFDRCxJQUFLdkIsUUFBUSxJQUFJQSxRQUFRLENBQUNxQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUU5QixXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssS0FBSyxJQUFLLENBQUNTLFFBQVEsRUFBRTtVQUM3RjtVQUNBRCxjQUFjLEdBQUcsQ0FBQ1ksaUJBQWlCO1VBQ25DdkQsaUJBQWlCLEdBQUcsS0FBSztRQUMxQixDQUFDLE1BQU0sSUFBSTRDLFFBQVEsSUFBSUEsUUFBUSxDQUFDcUIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFFOUIsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRTtVQUNwRlEsY0FBYyxHQUFHLEtBQUs7VUFDdEIzQyxpQkFBaUIsR0FBRyxLQUFLO1FBQzFCO01BQ0QsQ0FBQyxNQUFNLElBQUk0QyxRQUFRLEVBQUU7UUFDcEIsSUFBSUEsUUFBUSxDQUFDcUIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFFOUIsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssRUFBRTtVQUNsRSxJQUFJOEMsVUFBVSxJQUFJMUIsaUJBQWlCLEVBQUU7WUFDcEN2RCxpQkFBaUIsR0FBRyxLQUFLO1VBQzFCO1FBQ0QsQ0FBQyxNQUFNLElBQUk0QyxRQUFRLENBQUNxQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUU5QixXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFO1VBQ3hFLElBQUksQ0FBQzhDLFVBQVUsSUFBSTFCLGlCQUFpQixFQUFFO1lBQ3JDdkQsaUJBQWlCLEdBQUcsSUFBSTtZQUN4QmdGLGdCQUFnQixHQUFHaEMsZUFBZSxDQUFDN0QsTUFBTSxDQUFDZ0UsV0FBVyxDQUFDO1VBQ3ZELENBQUMsTUFBTSxJQUFJLENBQUM4QixVQUFVLElBQUlqQyxlQUFlLENBQUN4TyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZEO1lBQ0E7WUFDQXdMLGlCQUFpQixHQUFHLEtBQUs7VUFDMUI7UUFDRDtNQUNEO0lBQ0Q7SUFFQSxJQUFJa0Ysb0JBQW9CO0lBQ3hCLElBQUl0QyxRQUFRLElBQUlBLFFBQVEsQ0FBQ0wsR0FBRyxDQUFRLGtCQUFrQixDQUFDLEVBQUU7TUFDeEQyQyxvQkFBb0IsR0FBR3RGLGVBQWUsQ0FBQ3VGLGtCQUFrQixDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUV4QyxRQUFRLEVBQUUvTixTQUFTLENBQUM7SUFDeEY7SUFDQSxPQUFPO01BQ044TixjQUFjLEVBQUVBLGNBQWM7TUFDOUIzQyxpQkFBaUIsRUFBRUEsaUJBQWlCO01BQ3BDZ0YsZ0JBQWdCLEVBQUVBLGdCQUFnQixDQUFDeFEsTUFBTSxHQUFHd1EsZ0JBQWdCLEdBQUdqRyxRQUFRO01BQ3ZFbUcsb0JBQW9CLEVBQUVBLG9CQUFvQjtNQUMxQ0csd0JBQXdCLEVBQUU5USxXQUFXLENBQUM0RTtJQUN2QyxDQUFDO0VBQ0Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVBLGVBQWVnQyx5QkFBeUIsQ0FDdkNoSCxXQUFtQixFQUNuQkcsYUFBMkIsRUFDM0JrRixZQUFnQyxFQUNoQ2pGLFdBQXVDLEVBQ3ZDb0gsaUJBQXVDLEVBQ3ZDckIsZ0JBQXVELEVBQ3ZEa0csY0FBdUIsRUFDdkJDLGNBQW9CLEVBQ3BCcEMsYUFBaUMsRUFDakNDLGNBQThCLEVBQzlCN0YsdUJBQWdELEVBQ2hEOEYsSUFBaUIsRUFDakJDLFVBQW9CLEVBQ3VFO0lBQzNGLE1BQU04RyxLQUFLLEdBQUdDLFFBQVEsQ0FBQy9FLGNBQWMsRUFBRXJNLFdBQVcsQ0FBQztNQUNsRHNDLFNBQVMsR0FBRytKLGNBQWMsQ0FBQ3lELFFBQVEsRUFBRTtNQUNyQ3VCLGdCQUFnQixHQUFHL08sU0FBUyxDQUFDckIsb0JBQW9CLENBQUNrUSxLQUFLLENBQUM7TUFDeERHLGVBQWUsR0FBR2pGLGNBQWMsQ0FBQ3hJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FDbkR3SSxjQUFjLENBQUN0TCxPQUFPLEVBQUUsQ0FBQ2tJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUN0RG9ELGNBQWMsQ0FBQ3RMLE9BQU8sRUFBRSxDQUFDa0ksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMxQ3NJLGlCQUFpQixHQUFHalAsU0FBUyxDQUFDckIsb0JBQW9CLENBQUNxUSxlQUFlLENBQUM7TUFDbkU3TCxlQUFlLEdBQUdyRixXQUFXLENBQUNvSixjQUFjO01BQzVDZ0ksYUFBYSxHQUFHLDRDQUE0QztJQUM3RCxPQUFPLElBQUluTyxPQUFPLENBQWtGLGdCQUFnQjhCLE9BQU8sRUFBRTdCLE1BQU0sRUFBRTtNQUNwSSxJQUFJbU8sb0JBQTJDLENBQUMsQ0FBQzs7TUFFakQsTUFBTUMsZ0NBQWdDLEdBQUloTCxTQUE4QixJQUFXO1FBQ2xGLElBQUlBLFNBQVMsRUFBRTtVQUNkLE1BQU1pTCxXQUFXLEdBQUc5RyxTQUFTLENBQUNDLGVBQWUsRUFBRSxDQUFDQyxPQUFPLEVBQUU7VUFDekQsTUFBTXBCLFNBQVMsR0FBR2lJLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRWxMLFNBQVMsQ0FBQzdELElBQUksQ0FBQyxDQUFDO1VBQ3BEO1VBQ0EsTUFBTWdQLGdCQUFnQixHQUFHRixXQUFXLENBQUMvTyxNQUFNLENBQUVrUCxHQUFZLElBQ3hEQSxHQUFHLENBQUNDLGFBQWEsRUFBRSxDQUFDdkUsSUFBSSxDQUFFd0UsRUFBVSxJQUFLckksU0FBUyxDQUFDVixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNDLFFBQVEsQ0FBQzhJLEVBQUUsQ0FBQyxDQUFDLENBQzNFO1VBQ0RuSCxTQUFTLENBQUNvSCxjQUFjLENBQUNKLGdCQUFnQixDQUFDO1FBQzNDO01BQ0QsQ0FBQztNQUVELE1BQU1LLFdBQVcsR0FBRztRQUNuQkMsWUFBWSxFQUFFLGdCQUFnQkMsTUFBMkMsRUFBaUI7VUFDekYsTUFBTUMsS0FBSyxHQUFHRCxNQUFNLENBQUNFLFNBQVMsRUFBRTtVQUNoQyxNQUFNQyxtQkFBbUIsR0FBR2Qsb0JBQW9CLENBQUMxSSxJQUFJLENBQ25Ed0osbUJBQW1CLElBQUtBLG1CQUFtQixDQUFDRixLQUFLLEtBQUtBLEtBQUssQ0FDckM7VUFDeEI7VUFDQVgsZ0NBQWdDLENBQUNhLG1CQUFtQixDQUFDN0wsU0FBUyxDQUFDO1VBQy9EO1VBQ0E2TCxtQkFBbUIsQ0FBQ0MsaUJBQWlCLEdBQUdKLE1BQU0sQ0FBQ0ssWUFBWSxDQUFDLFNBQVMsQ0FBQztVQUN0RSxJQUFJO1lBQ0hGLG1CQUFtQixDQUFDL1EsS0FBSyxHQUFHLE1BQU0rUSxtQkFBbUIsQ0FBQ0MsaUJBQWlCO1lBQ3ZFRCxtQkFBbUIsQ0FBQ0csUUFBUSxHQUFHLEtBQUs7VUFDckMsQ0FBQyxDQUFDLE9BQU9DLEtBQUssRUFBRTtZQUNmLE9BQU9KLG1CQUFtQixDQUFDL1EsS0FBSztZQUNoQytRLG1CQUFtQixDQUFDRyxRQUFRLEdBQUcsSUFBSTtZQUNuQ3ZSLGFBQWEsQ0FBQ3lSLDZCQUE2QixDQUFDLENBQzNDO2NBQ0NMLG1CQUFtQixFQUFFQSxtQkFBbUI7Y0FDeEN6RCxPQUFPLEVBQUc2RCxLQUFLLENBQXlCN0Q7WUFDekMsQ0FBQyxDQUNELENBQUM7VUFDSDtRQUNEO01BQ0QsQ0FBQztNQUVELE1BQU0rRCxTQUFTLEdBQUdDLG9CQUFvQixDQUFDQyxZQUFZLENBQUN2QixhQUFhLEVBQUUsVUFBVSxDQUFDO01BQzlFLE1BQU13QixlQUFlLEdBQUcsSUFBSUMsU0FBUyxDQUFDO1FBQ3JDQyxZQUFZLEVBQUUsQ0FBQztNQUNoQixDQUFDLENBQUM7TUFFRixJQUFJO1FBQ0gsTUFBTUMsZUFBZSxHQUFHLE1BQU1DLGVBQWUsQ0FBQ0MsT0FBTyxDQUNwRFIsU0FBUyxFQUNUO1VBQUVoUSxJQUFJLEVBQUUyTztRQUFjLENBQUMsRUFDdkI7VUFDQzhCLGVBQWUsRUFBRTtZQUNoQjdRLE1BQU0sRUFBRTRKLGNBQWM7WUFDdEJuSyxVQUFVLEVBQUVxUCxpQkFBaUI7WUFDN0JnQyxTQUFTLEVBQUVsQztVQUNaLENBQUM7VUFDRG1DLE1BQU0sRUFBRTtZQUNQL1EsTUFBTSxFQUFFNEosY0FBYyxDQUFDeUQsUUFBUSxFQUFFO1lBQ2pDNU4sVUFBVSxFQUFFcVAsaUJBQWlCLGFBQWpCQSxpQkFBaUIsdUJBQWpCQSxpQkFBaUIsQ0FBRXpCLFFBQVEsRUFBRTtZQUN6Q3lELFNBQVMsRUFBRWxDLGdCQUFnQixhQUFoQkEsZ0JBQWdCLHVCQUFoQkEsZ0JBQWdCLENBQUV2QixRQUFRLEVBQUU7WUFDdkN4TixTQUFTLEVBQUUrTyxnQkFBZ0IsYUFBaEJBLGdCQUFnQix1QkFBaEJBLGdCQUFnQixDQUFFdkIsUUFBUTtVQUN0QztRQUNELENBQUMsQ0FDRDtRQUNEO1FBQ0EsTUFBTXBQLFNBQTJCLEdBQUdOLFdBQVcsQ0FBQ00sU0FBUyxJQUFJLEVBQUU7UUFDL0QsTUFBTStTLGVBQTBDLEdBQUcsRUFBRTtRQUVyRCxNQUFNQyxXQUFXLENBQUNDLGVBQWUsQ0FBQ3hULGFBQWEsRUFBRXFILGlCQUFpQixFQUFFd0wsZUFBZSxFQUFFLElBQUksQ0FBQztRQUMxRixNQUFNWSxjQUFjLEdBQUksTUFBTUMsUUFBUSxDQUFDQyxJQUFJLENBQUM7VUFDM0NDLFVBQVUsRUFBRVosZUFBb0M7VUFDaERhLFVBQVUsRUFBRTlCO1FBQ2IsQ0FBQyxDQUFhO1FBRWRULG9CQUFvQixHQUFHakssaUJBQWlCLENBQUN5TSxHQUFHLENBQUVDLGVBQWUsSUFBSztVQUNqRSxNQUFNN0IsS0FBSyxHQUFHOEIsT0FBTyxDQUFDQyxjQUFjLENBQUN4QyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUVzQyxlQUFlLENBQUNyUixJQUFJLENBQUMsQ0FBQyxDQUE0QjtVQUN6RyxNQUFNd1IsWUFBWSxHQUFHaEMsS0FBSyxDQUFDakUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1VBQzVELE9BQU87WUFDTjFILFNBQVMsRUFBRXdOLGVBQWU7WUFDMUI3QixLQUFLLEVBQUVBLEtBQUs7WUFDWmdDLFlBQVksRUFBRUEsWUFBWTtZQUMxQjNCLFFBQVEsRUFBRTtVQUNYLENBQUM7UUFDRixDQUFDLENBQUM7UUFFRixNQUFNakcsYUFBYSxHQUFHQyxnQkFBZ0IsQ0FBQ0osY0FBYyxDQUFDO1FBQ3RELElBQUlnSSxZQUdILEdBQUc7VUFDSEMsZUFBZSxFQUFFLElBQUk7VUFBRTtVQUN2QmpULE1BQU0sRUFBRTZHO1FBQ1QsQ0FBQztRQUVELElBQUlxTSxVQUFVLEdBQUcsS0FBSztRQUV0QixNQUFNbkgsT0FBTyxHQUFHLElBQUlvSCxNQUFNLENBQUM3QyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFNVIsV0FBVyxDQUFDLENBQUMsRUFBRTtVQUNqRTBVLEtBQUssRUFBRXJQLFlBQVksSUFBSW9ILGFBQWEsQ0FBQ0csT0FBTyxDQUFDLDRDQUE0QyxDQUFDO1VBQzFGK0gsT0FBTyxFQUFFLENBQUNmLGNBQWMsQ0FBQztVQUN6QmdCLGFBQWEsRUFBRSxZQUFrQjtZQUNoQztZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQXZILE9BQU8sQ0FBQ3NELEtBQUssRUFBRTtZQUNmO1VBQ0QsQ0FBQzs7VUFDRGtFLFdBQVcsRUFBRSxJQUFJQyxNQUFNLENBQUNsRCxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFNVIsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQzlFK1UsSUFBSSxFQUFFdFAsZUFBZSxHQUNsQmdILGFBQWEsQ0FBQ0csT0FBTyxDQUFDLGlEQUFpRCxDQUFDLEdBQ3hFb0ksNkJBQTZCLENBQUN2SSxhQUFhLEVBQUVwSCxZQUFZLEVBQUVyRixXQUFXLEVBQUVrSyxhQUFhLENBQUM7WUFDekZtRyxJQUFJLEVBQUUsWUFBWTtZQUNsQjRFLEtBQUssRUFBRSxrQkFBb0M7Y0FDMUMsSUFBSTtnQkFDSDtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTs7Z0JBRUEsSUFBSVQsVUFBVSxLQUFLLElBQUksRUFBRTtrQkFDeEI7Z0JBQ0Q7Z0JBQ0FBLFVBQVUsR0FBRyxJQUFJO2dCQUVqQixJQUFJLEVBQUUsTUFBTXJULGFBQWEsQ0FBQytULGtCQUFrQixDQUFDekQsb0JBQW9CLEVBQUVoRixhQUFhLENBQUMsQ0FBQyxFQUFFO2tCQUNuRitILFVBQVUsR0FBRyxLQUFLO2tCQUNsQjtnQkFDRDtnQkFFQVcsVUFBVSxDQUFDQyxJQUFJLENBQUMvSCxPQUFPLENBQUM7Z0JBRXhCLElBQUlnSSxjQUFnQyxHQUFHLEVBQUU7Z0JBRXpDLElBQUk7a0JBQ0g7a0JBQ0E7a0JBQ0FsTCxjQUFjLENBQUNtTCx3QkFBd0IsRUFBRTtrQkFDekM7a0JBQ0EsSUFBSUMsZUFBZTtrQkFDbkIsSUFBSUMsaUJBQWlCLEdBQUcsSUFBSTtrQkFDNUIsTUFBTUMsaUJBQWlCLEdBQUdDLGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQ0MsbUJBQW1CLEVBQUU7a0JBQ3RGLEtBQUssTUFBTXBMLENBQUMsSUFBSS9DLGlCQUFpQixFQUFFO29CQUNsQyxJQUFJQSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDUCxZQUFZLEVBQUU7c0JBQ3RDLE1BQU00TCxXQUFXLEdBQUl2SSxPQUFPLENBQUN5QyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQWU5QixXQUFXLENBQ3ZFLElBQUd4RyxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSyxFQUFDLENBQy9CO3dCQUNEZ1QsVUFBVSxHQUFHLEVBQUU7c0JBQ2hCLEtBQUssTUFBTUMsQ0FBQyxJQUFJRixXQUFXLEVBQUU7d0JBQzVCQyxVQUFVLENBQUMxTSxJQUFJLENBQUN5TSxXQUFXLENBQUNFLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUM7c0JBQ3BDO3NCQUNBUixlQUFlLEdBQUdNLFVBQVU7b0JBQzdCLENBQUMsTUFBTTtzQkFDTk4sZUFBZSxHQUFHRSxpQkFBaUIsYUFBakJBLGlCQUFpQix1QkFBakJBLGlCQUFpQixDQUFFekgsV0FBVyxDQUFDeEcsaUJBQWlCLENBQUMrQyxDQUFDLENBQUMsQ0FBQzFILElBQUksQ0FBQztvQkFDNUU7b0JBQ0F6QyxXQUFXLENBQUMrRyx1QkFBdUIsQ0FBQ0ssaUJBQWlCLENBQUMrQyxDQUFDLENBQUMsQ0FBQzFILElBQUksQ0FBQyxHQUFHMFMsZUFBZTtvQkFDaEYsSUFBSUEsZUFBZSxLQUFLLElBQUksSUFBSUEsZUFBZSxLQUFLcE4sU0FBUyxFQUFFO3NCQUM5RHFOLGlCQUFpQixHQUFHLEtBQUs7b0JBQzFCO29CQUNBRCxlQUFlLEdBQUdwTixTQUFTO2tCQUM1QjtrQkFDQSxJQUFJLENBQUNxTixpQkFBaUIsRUFBRTtvQkFDdkJyVixhQUFhLENBQUMyUCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUNrRyxXQUFXLENBQUNDLGdCQUFnQixDQUFDQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7a0JBQ2xGO2tCQUNBO2tCQUNBLE1BQU1DLGVBQWUsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVqVyxXQUFXLENBQUM7a0JBQ3REK1YsZUFBZSxDQUFDN1EsS0FBSyxHQUFHRCxZQUFZO2tCQUNwQyxJQUFJO29CQUNILE1BQU1rSSxPQUFPLEdBQUcsTUFBTUgsZ0JBQWdCLENBQ3JDak4sYUFBYSxFQUNiZ1csZUFBZSxFQUNmN0osY0FBYyxFQUNkbkMsY0FBYyxFQUNkekosU0FBUyxFQUNUMk0sT0FBTyxFQUNQLEtBQUssRUFDTC9JLHVCQUF1QixFQUN2QitGLFVBQVUsQ0FDVjtvQkFDRGlLLFlBQVksR0FBRztzQkFDZEMsZUFBZSxFQUFFLEtBQUs7c0JBQ3RCalQsTUFBTSxFQUFFaU07b0JBQ1QsQ0FBQztvQkFDREYsT0FBTyxDQUFDc0QsS0FBSyxFQUFFO29CQUNmO2tCQUNELENBQUMsQ0FBQyxPQUFPekQsTUFBZSxFQUFFO29CQUN6QixNQUFNdEMsUUFBUSxHQUFHQyxTQUFTLENBQUNDLGVBQWUsRUFBRSxDQUFDQyxPQUFPLEVBQUU7b0JBQ3RELElBQ0N6Ryx1QkFBdUIsQ0FBQ0MsYUFBYSxJQUNyQ0QsdUJBQXVCLENBQUNFLDZCQUE2QixDQUFDbkUsTUFBTSxFQUMzRDtzQkFDRGlFLHVCQUF1QixDQUFDSyxvQkFBb0IsR0FDM0NMLHVCQUF1QixDQUFDSyxvQkFBb0IsQ0FBQ3FHLE1BQU0sQ0FBQ0osUUFBUSxDQUFDO29CQUMvRDtvQkFDQSxNQUFNc0MsTUFBTTtrQkFDYixDQUFDLFNBQVM7b0JBQ1QsSUFDQzVJLHVCQUF1QixDQUFDQyxhQUFhLElBQ3JDRCx1QkFBdUIsQ0FBQ0UsNkJBQTZCLENBQUNuRSxNQUFNLEVBQzNEO3NCQUNELElBQUk7d0JBQ0hnVixjQUFjLEdBQUcvUSx1QkFBdUIsQ0FBQ0UsNkJBQTZCLENBQUN5UCxHQUFHLENBQ3hFN0ksSUFBSSxJQUFLQSxJQUFJLENBQUMvRyxPQUFPLENBQUNnSCxVQUFVLEVBQW9CLENBQ3JEO3dCQUNEOEssZUFBZSxDQUFDelYsU0FBUyxHQUFHMlUsY0FBYzt3QkFDMUMsTUFBTTlILE9BQU8sR0FBRyxNQUFNSCxnQkFBZ0IsQ0FDckNqTixhQUFhLEVBQ2JnVyxlQUFlLEVBQ2Y3SixjQUFjLEVBQ2RuQyxjQUFjLEVBQ2R6SixTQUFTLEVBQ1QyTSxPQUFPLEVBQ1AsSUFBSSxFQUNKL0ksdUJBQXVCLEVBQ3ZCK0YsVUFBVSxDQUNWO3dCQUVEL0YsdUJBQXVCLENBQUNFLDZCQUE2QixHQUFHLEVBQUU7d0JBQzFEOFAsWUFBWSxHQUFHOzBCQUNkQyxlQUFlLEVBQUUsS0FBSzswQkFDdEJqVCxNQUFNLEVBQUVpTTt3QkFDVCxDQUFDO3dCQUNEO3NCQUNELENBQUMsQ0FBQyxNQUFNO3dCQUNQLElBQ0NqSix1QkFBdUIsQ0FBQ0MsYUFBYSxJQUNyQ0QsdUJBQXVCLENBQUNFLDZCQUE2QixDQUFDbkUsTUFBTSxFQUMzRDswQkFDRHdLLFNBQVMsQ0FBQ1UsV0FBVyxDQUFDakgsdUJBQXVCLENBQUNLLG9CQUFvQixDQUFDO3dCQUNwRTt3QkFDQSxJQUFJNkcsbUNBQW1DLEdBQUcsS0FBSzt3QkFDL0MsSUFDRXBMLFdBQVcsQ0FBQzRFLFFBQVEsSUFBSVYsdUJBQXVCLENBQUNHLHNCQUFzQixDQUFDcEUsTUFBTSxJQUM3RUQsV0FBVyxDQUFDNEUsUUFBUSxJQUFJeUcsZUFBZSxDQUFDQyw2QkFBNkIsRUFBRyxFQUN4RTswQkFDREYsbUNBQW1DLEdBQUcsSUFBSTt3QkFDM0M7d0JBQ0EsTUFBTXJCLGNBQWMsQ0FBQzBCLGlCQUFpQixDQUFDOzBCQUN0QzhCLDJCQUEyQixFQUFFTixPQUFPLENBQUNPLE1BQU0sRUFBRTswQkFDN0NDLGtCQUFrQixFQUFFUixPQUFPLENBQUNPLE1BQU0sRUFBRTswQkFDcEM5QixtQkFBbUIsRUFBRSxVQUNwQkMsU0FBb0IsRUFDcEJDLHVCQUE4QyxFQUM3Qzs0QkFDRCxPQUFPQyxrQ0FBa0MsQ0FDeENrSyxlQUFlLEVBQ2Z6VixTQUFTLEVBQ1QyTSxPQUFPLEVBQ1B0QixTQUFTLEVBQ1RDLHVCQUF1QixFQUN2QlIsbUNBQW1DLENBQ25DOzBCQUNGLENBQUM7MEJBQ0RVLGlCQUFpQixFQUFFL0QsU0FBUzswQkFBRTswQkFDOUJuSSxXQUFXLEVBQUVxRjt3QkFDZCxDQUFDLENBQUM7c0JBQ0g7b0JBQ0Q7b0JBQ0EsSUFBSThQLFVBQVUsQ0FBQ21CLFFBQVEsQ0FBQ2pKLE9BQU8sQ0FBQyxFQUFFO3NCQUNqQzhILFVBQVUsQ0FBQ29CLE1BQU0sQ0FBQ2xKLE9BQU8sQ0FBQztvQkFDM0I7a0JBQ0Q7Z0JBQ0QsQ0FBQyxDQUFDLE9BQU9ILE1BQWUsRUFBRTtrQkFDekIsSUFBSXJCLGlCQUFzQyxHQUFHLElBQUk7a0JBQ2pELElBQUlMLG1DQUFtQyxHQUFHLEtBQUs7a0JBQy9DLElBQ0VwTCxXQUFXLENBQUM0RSxRQUFRLElBQUlWLHVCQUF1QixDQUFDRyxzQkFBc0IsQ0FBQ3BFLE1BQU0sSUFDN0VELFdBQVcsQ0FBQzRFLFFBQVEsSUFBSXlHLGVBQWUsQ0FBQ0MsNkJBQTZCLEVBQUcsRUFDeEU7b0JBQ0RGLG1DQUFtQyxHQUFHLElBQUk7a0JBQzNDO2tCQUNBLE1BQU1yQixjQUFjLENBQUNxTSxZQUFZLENBQUM7b0JBQ2pDcFQsT0FBTyxFQUFFaVMsY0FBYyxDQUFDLENBQUMsQ0FBQztvQkFBRTtvQkFDNUIxSCwyQkFBMkIsRUFBRU4sT0FBTyxDQUFDTyxNQUFNLEVBQUU7b0JBQzdDQyxrQkFBa0IsRUFBRVIsT0FBTyxDQUFDTyxNQUFNLEVBQUU7b0JBQ3BDNkksNkJBQTZCLEVBQUUsWUFBWTtzQkFDMUNwSixPQUFPLENBQUNzRCxLQUFLLEVBQUU7b0JBQ2hCLENBQUM7b0JBQ0Q3RSxtQkFBbUIsRUFBRSxVQUFVQyxTQUFvQixFQUFFQyx1QkFBOEMsRUFBRTtzQkFDcEc7c0JBQ0E7c0JBQ0EsTUFBTTBLLHFCQUFxQixHQUFHekssa0NBQWtDLENBQy9EN0wsV0FBVyxFQUNYTSxTQUFTLEVBQ1QyTSxPQUFPLEVBQ1B0QixTQUFTLEVBQ1RDLHVCQUF1QixFQUN2QlIsbUNBQW1DLENBQ25DO3NCQUNESyxpQkFBaUIsR0FBRzZLLHFCQUFxQixDQUFDN0ssaUJBQWlCO3NCQUMzRCxPQUFPNksscUJBQXFCO29CQUM3QixDQUFDO29CQUNEeEssaUJBQWlCLEVBQUUvRCxTQUFTO29CQUFFO29CQUM5Qm5JLFdBQVcsRUFBRXFGLFlBQVk7b0JBQ3pCdUUsT0FBTyxFQUFFeEosV0FBVyxDQUFDd0o7a0JBQ3RCLENBQUMsQ0FBQztrQkFDRjRLLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQztrQkFDcEI7a0JBQ0E7a0JBQ0E7a0JBQ0E7a0JBQ0E7a0JBQ0EsSUFBSTNJLGlCQUFpQixFQUFFO29CQUN0QixJQUFJd0IsT0FBTyxDQUFDTyxNQUFNLEVBQUUsRUFBRTtzQkFDckI7c0JBQ0E7c0JBQ0E7c0JBQ0E7c0JBQ0E7b0JBQUEsQ0FDQSxNQUFNO3NCQUNOdEssTUFBTSxDQUFDNEosTUFBTSxDQUFDO29CQUNmO2tCQUNEO2dCQUNEO2NBQ0QsQ0FBQyxTQUFTO2dCQUNUL0MsY0FBYyxDQUFDaUMsMEJBQTBCLEVBQUU7Z0JBQzNDOUgsdUJBQXVCLEdBQUc7a0JBQ3pCQyxhQUFhLEVBQUUsS0FBSztrQkFDcEJDLDZCQUE2QixFQUFFLEVBQUU7a0JBQ2pDQyxzQkFBc0IsRUFBRSxFQUFFO2tCQUMxQkMsNkJBQTZCLEVBQUUsRUFBRTtrQkFDakNDLG9CQUFvQixFQUFFLEVBQUU7a0JBQ3hCQyxtQkFBbUIsRUFBRSxJQUFJQyxHQUFHO2dCQUM3QixDQUFDO2dCQUNELElBQUlzUSxVQUFVLENBQUNtQixRQUFRLENBQUNqSixPQUFPLENBQUMsRUFBRTtrQkFDakM4SCxVQUFVLENBQUNvQixNQUFNLENBQUNsSixPQUFPLENBQUM7Z0JBQzNCO2NBQ0Q7WUFDRDtVQUNELENBQUMsQ0FBQztVQUNGc0osU0FBUyxFQUFFLElBQUk3QixNQUFNLENBQUNsRCxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFNVIsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO1lBQ2hGK1UsSUFBSSxFQUFFdEksYUFBYSxDQUFDRyxPQUFPLENBQUMseUNBQXlDLENBQUM7WUFDdEVxSSxLQUFLLEVBQUUsWUFBa0I7Y0FDeEI7Y0FDQTVILE9BQU8sQ0FBQ3NELEtBQUssRUFBRTtjQUNmO1lBQ0Q7VUFDRCxDQUFDLENBQUM7O1VBQ0Y7VUFDQTtVQUNBO1VBQ0FpRyxVQUFVLEVBQUUsZ0JBQWdCeEUsTUFBOEIsRUFBaUI7WUFDMUU7WUFDQSxNQUFNeUUsV0FBVyxHQUFHVCxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRWpFLE1BQU0sQ0FBQztZQUM3QyxNQUFNMEUsbUJBQW1CLEdBQUdyRixvQkFBb0IsQ0FBQ2pFLElBQUksQ0FBRXVKLElBQUksSUFBS0EsSUFBSSxDQUFDMUUsS0FBSyxDQUFDMkUsVUFBVSxFQUFFLENBQUM7WUFDeEY3TSxjQUFjLENBQUNtTCx3QkFBd0IsRUFBRTtZQUN6QyxNQUFNMkIsd0JBQXdCLEdBQUcsWUFBb0I7Y0FDcEQsTUFBTXRXLFVBQVUsR0FBSTBNLE9BQU8sQ0FBQ3lDLFFBQVEsRUFBRSxDQUFnQmxQLFlBQVksRUFBRTtnQkFDbkVDLFdBQVcsR0FBR3dMLGNBQWMsQ0FBQ3RMLE9BQU8sRUFBRSxJQUFJc0wsY0FBYyxDQUFDdEwsT0FBTyxFQUFFLENBQUNrSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRmlPLHNCQUFzQixHQUFHdlcsVUFBVSxDQUFDa0QsU0FBUyxDQUMzQyxHQUFFaEQsV0FBWSx1REFBc0QsQ0FDckU7Y0FDRixPQUFPcVcsc0JBQXNCO1lBQzlCLENBQUM7WUFDRCxNQUFNQywwQkFBMEIsR0FBRyxnQkFBZ0JDLGlCQUEwQixFQUFpQjtjQUM3RixNQUFNQyxrQkFBa0IsR0FBR0osd0JBQXdCLEVBQUU7Y0FDckQsTUFBTUssa0JBQWtCLEdBQUd0RSxlQUFlLENBQUNqSSxPQUFPLEVBQUU7Y0FDcEQsTUFBTXdNLGdCQUFnQixHQUFHLGdCQUN4QkMsVUFBa0IsRUFDbEJDLGtCQUFnRCxFQUMyRDtnQkFDM0c7Z0JBQ0EsSUFBSUEsa0JBQWtCLEtBQUt0UCxTQUFTLEVBQUU7a0JBQ3JDLElBQUl6SCxTQUFTLENBQUNMLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBT29YLGtCQUFrQixLQUFLLFFBQVEsSUFBSUEsa0JBQWtCLENBQUNDLEtBQUssRUFBRTtvQkFDL0YsSUFBSTtzQkFDSCxJQUFJQyxXQUFXLEdBQUcsTUFBTWpFLFdBQVcsQ0FBQ2tFLHdCQUF3QixDQUMzREgsa0JBQWtCLENBQUNDLEtBQUssRUFDeEJoQyxpQkFBaUIsQ0FBQzVGLFFBQVEsRUFBRSxDQUM1QjtzQkFDRCxJQUFJNkgsV0FBVyxLQUFLLElBQUksRUFBRTt3QkFDekJBLFdBQVcsR0FBRyxNQUFNakMsaUJBQWlCLENBQ25DQyxtQkFBbUIsRUFBRSxDQUNyQmtDLGVBQWUsQ0FBQ0osa0JBQWtCLENBQUNDLEtBQUssQ0FBQztzQkFDNUM7c0JBQ0EsSUFBSWhYLFNBQVMsQ0FBQ0wsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDekI7d0JBQ0EsSUFBSXlYLGVBQWUsR0FBR0wsa0JBQWtCLENBQUNDLEtBQUs7d0JBQzlDLElBQUlJLGVBQWUsQ0FBQ0MsT0FBTyxDQUFFLEdBQUVYLGlCQUFrQixHQUFFLENBQUMsS0FBSyxDQUFDLEVBQUU7MEJBQzNEVSxlQUFlLEdBQUdBLGVBQWUsQ0FBQy9TLE9BQU8sQ0FBRSxHQUFFcVMsaUJBQWtCLEdBQUUsRUFBRSxFQUFFLENBQUM7d0JBQ3ZFO3dCQUNBLEtBQUssSUFBSTdNLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzdKLFNBQVMsQ0FBQ0wsTUFBTSxFQUFFa0ssQ0FBQyxFQUFFLEVBQUU7MEJBQzFDLElBQUk3SixTQUFTLENBQUM2SixDQUFDLENBQUMsQ0FBQ3lELFdBQVcsQ0FBQzhKLGVBQWUsQ0FBQyxLQUFLSCxXQUFXLEVBQUU7NEJBQzlEOzRCQUNBLE9BQU87OEJBQ05LLFNBQVMsRUFBRVIsVUFBVTs4QkFDckJoVyxLQUFLLEVBQUUyRyxTQUFTOzhCQUNoQjhQLGdCQUFnQixFQUFFOzRCQUNuQixDQUFDOzBCQUNGO3dCQUNEO3NCQUNEO3NCQUNBLE9BQU87d0JBQUVELFNBQVMsRUFBRVIsVUFBVTt3QkFBRWhXLEtBQUssRUFBRW1XO3NCQUFZLENBQUM7b0JBQ3JELENBQUMsQ0FBQyxPQUFPekssTUFBTSxFQUFFO3NCQUNoQmdMLEdBQUcsQ0FBQ3ZGLEtBQUssQ0FBQyw4Q0FBOEMsRUFBRTZFLFVBQVUsRUFBRXBYLFdBQVcsQ0FBQzhCLFVBQVUsQ0FBQztzQkFDN0YsT0FBTzt3QkFDTjhWLFNBQVMsRUFBRVIsVUFBVTt3QkFDckJoVyxLQUFLLEVBQUUyRyxTQUFTO3dCQUNoQmdRLGtCQUFrQixFQUFFO3NCQUNyQixDQUFDO29CQUNGO2tCQUNELENBQUMsTUFBTTtvQkFDTjtvQkFDQSxPQUFPO3NCQUFFSCxTQUFTLEVBQUVSLFVBQVU7c0JBQUVoVyxLQUFLLEVBQUVpVztvQkFBbUIsQ0FBQztrQkFDNUQ7Z0JBQ0QsQ0FBQyxNQUFNLElBQUlILGtCQUFrQixDQUFDYyxjQUFjLENBQUNaLFVBQVUsQ0FBQyxFQUFFO2tCQUN6RDs7a0JBRUEsT0FBTztvQkFDTlEsU0FBUyxFQUFFUixVQUFVO29CQUNyQmhXLEtBQUssRUFBRThWLGtCQUFrQixDQUFDRSxVQUFVO2tCQUNyQyxDQUFDO2dCQUNGLENBQUMsTUFBTTtrQkFDTixPQUFPO29CQUFFUSxTQUFTLEVBQUVSLFVBQVU7b0JBQUVoVyxLQUFLLEVBQUUyRztrQkFBVSxDQUFDO2dCQUNuRDtjQUNELENBQUM7Y0FFRCxNQUFNa1Esd0JBQXdCLEdBQUcsVUFBVWIsVUFBa0IsRUFBOEI7Z0JBQzFGLE1BQU03VyxVQUFVLEdBQUkwTSxPQUFPLENBQUN5QyxRQUFRLEVBQUUsQ0FBZ0JsUCxZQUFZLEVBQUU7a0JBQ25FMFgsOEJBQThCLEdBQUc1RSxXQUFXLENBQUM2RSxnQkFBZ0IsQ0FBQ2xNLGNBQWMsQ0FBQ3RMLE9BQU8sRUFBRSxFQUFFeVcsVUFBVSxDQUFDLEdBQUcsR0FBRztrQkFDekdnQixxQkFBcUIsR0FBRzdYLFVBQVUsQ0FBQ2tELFNBQVMsQ0FBQ3lVLDhCQUE4QixDQUFDO2tCQUM1RUcsc0JBQXNCLEdBQ3JCRCxxQkFBcUIsSUFBSUEscUJBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQyxDQUFDO2dCQUN2RyxPQUFPQyxzQkFBc0I7Y0FDOUIsQ0FBQztjQUVELE1BQU1DLHlCQUF5QixHQUFHLEVBQUU7Y0FDcEMsSUFBSWxCLFVBQVUsRUFBRW1CLHNCQUFzQjtjQUN0QyxLQUFLLE1BQU1wTyxDQUFDLElBQUkvQyxpQkFBaUIsRUFBRTtnQkFDbENnUSxVQUFVLEdBQUdoUSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSTtnQkFDdEM4VixzQkFBc0IsR0FBR04sd0JBQXdCLENBQUNiLFVBQVUsQ0FBQztnQkFDN0RrQix5QkFBeUIsQ0FBQ3ZQLElBQUksQ0FBQ29PLGdCQUFnQixDQUFDQyxVQUFVLEVBQUVtQixzQkFBc0IsQ0FBQyxDQUFDO2NBQ3JGO2NBRUEsSUFBSXRNLGNBQWMsQ0FBQ3hJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSW5ELFNBQVMsQ0FBQ0wsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDakUsSUFBSWdYLGtCQUFrQixJQUFJQSxrQkFBa0IsQ0FBQ2hYLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBT2dYLGtCQUFrQixLQUFLLFFBQVEsRUFBRTtrQkFDbEcsS0FBSyxNQUFNOU0sQ0FBQyxJQUFJN0osU0FBUyxFQUFFO29CQUMxQitTLGVBQWUsQ0FBQ3RLLElBQUksQ0FBQ3lQLFVBQVUsQ0FBQzFWLGlCQUFpQixDQUFDbVUsa0JBQWtCLEVBQUUzVyxTQUFTLENBQUM2SixDQUFDLENBQUMsRUFBRW5LLFdBQVcsQ0FBQytCLEtBQUssQ0FBQyxDQUFDO2tCQUN4RztnQkFDRDtjQUNEO2NBRUEsTUFBTTBXLHFCQUFxQixHQUFHeFYsT0FBTyxDQUFDeVYsR0FBRyxDQUFDSix5QkFBeUIsQ0FBQztjQUNwRSxJQUFJSyxxQkFBZ0QsR0FBRzFWLE9BQU8sQ0FBQzhCLE9BQU8sQ0FBQyxFQUFFLENBQUM7Y0FDMUUsSUFBSTZULGdDQUFnQztjQUNwQyxJQUFJdkYsZUFBZSxJQUFJQSxlQUFlLENBQUNwVCxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNsRDBZLHFCQUFxQixHQUFHMVYsT0FBTyxDQUFDeVYsR0FBRyxDQUFDckYsZUFBZSxDQUFDO2NBQ3JEO2NBQ0EsSUFBSXJULFdBQVcsQ0FBQ3NILDhCQUE4QixFQUFFO2dCQUMvQyxNQUFNdVIsT0FBTyxHQUFHN1ksV0FBVyxDQUFDc0gsOEJBQThCLENBQ3ZEd1IsU0FBUyxDQUFDLENBQUMsRUFBRTlZLFdBQVcsQ0FBQ3NILDhCQUE4QixDQUFDeVIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQy9FcFUsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7a0JBQ3RCNUIsYUFBYSxHQUFHL0MsV0FBVyxDQUFDc0gsOEJBQThCLENBQUN3UixTQUFTLENBQ25FOVksV0FBVyxDQUFDc0gsOEJBQThCLENBQUN5UixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUMvRC9ZLFdBQVcsQ0FBQ3NILDhCQUE4QixDQUFDckgsTUFBTSxDQUNqRDtnQkFDRjJZLGdDQUFnQyxHQUFHSSxTQUFTLENBQUNDLGFBQWEsQ0FBQ3hDLFdBQVcsRUFBRW9DLE9BQU8sRUFBRTlWLGFBQWEsRUFBRTtrQkFDL0ZsRCxRQUFRLEVBQUVTO2dCQUNYLENBQUMsQ0FBQztjQUNIO2NBRUEsSUFBSTtnQkFDSCxNQUFNNFksU0FBUyxHQUFHLE1BQU1qVyxPQUFPLENBQUN5VixHQUFHLENBQUMsQ0FDbkNELHFCQUFxQixFQUNyQkUscUJBQXFCLEVBQ3JCQyxnQ0FBZ0MsQ0FDaEMsQ0FBQztnQkFDRixNQUFNTyx3QkFBd0IsR0FBR0QsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsTUFBTUUsY0FBYyxHQUFHRixTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNRywyQkFBb0QsR0FBR0gsU0FBUyxDQUFDLENBQUMsQ0FBNEI7Z0JBQ3BHLElBQUlJLGdCQUF3Qjs7Z0JBRTVCO2dCQUNBLEtBQUssTUFBTW5QLENBQUMsSUFBSS9DLGlCQUFpQixFQUFFO2tCQUNsQyxJQUFJQSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxLQUFLLHNCQUFzQixFQUFFO29CQUFBO29CQUN6RDZXLGdCQUFnQixHQUFHbFMsaUJBQWlCLENBQUMrQyxDQUFDLENBQUMsQ0FBQzFILElBQUk7b0JBQzVDO29CQUNBLE1BQU04Vyx1QkFBdUIsR0FBR3hULGdCQUFnQixhQUFoQkEsZ0JBQWdCLGlEQUFoQkEsZ0JBQWdCLENBQUU0QyxJQUFJLENBQ3BEeUIsT0FBTyxJQUFLQSxPQUFPLENBQUMzSCxJQUFJLEtBQUsyRSxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxDQUN2RCwyREFGK0IsdUJBRTdCckIsS0FBSztvQkFDUixJQUFJbVksdUJBQXVCLEVBQUU7c0JBQzVCakUsaUJBQWlCLENBQUNrRSxZQUFZLENBQUNwUyxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxFQUFFOFcsdUJBQXVCLENBQUM7b0JBQ25GLENBQUMsTUFBTSxJQUNORiwyQkFBMkIsSUFDM0JBLDJCQUEyQixDQUFDckIsY0FBYyxDQUFDc0IsZ0JBQWdCLENBQUMsRUFDM0Q7c0JBQ0RoRSxpQkFBaUIsQ0FBQ2tFLFlBQVksQ0FDN0JwUyxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxFQUN6QjRXLDJCQUEyQixDQUFDQyxnQkFBZ0IsQ0FBQyxDQUM3QztvQkFDRixDQUFDLE1BQU0sSUFBSUgsd0JBQXdCLENBQUNoUCxDQUFDLENBQUMsSUFBSWdQLHdCQUF3QixDQUFDaFAsQ0FBQyxDQUFDLENBQUMvSSxLQUFLLEtBQUsyRyxTQUFTLEVBQUU7c0JBQzFGdU4saUJBQWlCLENBQUNrRSxZQUFZLENBQUNwUyxpQkFBaUIsQ0FBQytDLENBQUMsQ0FBQyxDQUFDMUgsSUFBSSxFQUFFMFcsd0JBQXdCLENBQUNoUCxDQUFDLENBQUMsQ0FBQy9JLEtBQUssQ0FBQztzQkFDNUY7b0JBQ0QsQ0FBQyxNQUFNLElBQUk2VixrQkFBa0IsSUFBSSxDQUFDa0Msd0JBQXdCLENBQUNoUCxDQUFDLENBQUMsQ0FBQzBOLGdCQUFnQixFQUFFO3NCQUMvRSxJQUFJdlgsU0FBUyxDQUFDTCxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN6Qjt3QkFDQSxJQUFJeVYsQ0FBQyxHQUFHLENBQUM7d0JBQ1QsT0FBT0EsQ0FBQyxHQUFHcFYsU0FBUyxDQUFDTCxNQUFNLEdBQUcsQ0FBQyxFQUFFOzBCQUNoQyxJQUNDbVosY0FBYyxDQUFDMUQsQ0FBQyxDQUFDLElBQ2pCMEQsY0FBYyxDQUFDMUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUNyQjBELGNBQWMsQ0FBQzFELENBQUMsQ0FBQyxDQUFDalMsU0FBUyxDQUFDNlYsZ0JBQWdCLENBQUMsS0FDNUNGLGNBQWMsQ0FBQzFELENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQ2pTLFNBQVMsQ0FBQzZWLGdCQUFnQixDQUFDLEVBQ2pEOzRCQUNENUQsQ0FBQyxFQUFFOzBCQUNKLENBQUMsTUFBTTs0QkFDTjswQkFDRDt3QkFDRDt3QkFDQTt3QkFDQSxJQUFJQSxDQUFDLEtBQUtwVixTQUFTLENBQUNMLE1BQU0sR0FBRyxDQUFDLElBQUltWixjQUFjLENBQUMxRCxDQUFDLENBQUMsQ0FBQ2pTLFNBQVMsQ0FBQzZWLGdCQUFnQixDQUFDLEtBQUt2UixTQUFTLEVBQUU7MEJBQzlGdU4saUJBQWlCLENBQUNrRSxZQUFZLENBQzdCcFMsaUJBQWlCLENBQUMrQyxDQUFDLENBQUMsQ0FBQzFILElBQUksRUFDekIyVyxjQUFjLENBQUMxRCxDQUFDLENBQUMsQ0FBQ2pTLFNBQVMsQ0FBQzZWLGdCQUFnQixDQUFDLENBQzdDO3dCQUNGO3NCQUNELENBQUMsTUFBTSxJQUFJRixjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUlBLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzNWLFNBQVMsQ0FBQzZWLGdCQUFnQixDQUFDLEtBQUt2UixTQUFTLEVBQUU7d0JBQzVGOzt3QkFFQXVOLGlCQUFpQixDQUFDa0UsWUFBWSxDQUM3QnBTLGlCQUFpQixDQUFDK0MsQ0FBQyxDQUFDLENBQUMxSCxJQUFJLEVBQ3pCMlcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDM1YsU0FBUyxDQUFDNlYsZ0JBQWdCLENBQUMsQ0FDN0M7c0JBQ0Y7b0JBQ0Q7a0JBQ0Q7Z0JBQ0Q7Z0JBQ0EsTUFBTUcsV0FBVyxHQUFHTix3QkFBd0IsQ0FBQy9MLElBQUksQ0FBQyxVQUFVc00sTUFBTSxFQUFFO2tCQUNuRSxJQUFJQSxNQUFNLENBQUMzQixrQkFBa0IsRUFBRTtvQkFDOUIsT0FBTzJCLE1BQU0sQ0FBQzNCLGtCQUFrQjtrQkFDakM7Z0JBQ0QsQ0FBQyxDQUFDO2dCQUVGLE1BQU00QixPQUFPLEdBQUd0TixhQUFhLENBQUNHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztnQkFDL0QsTUFBTStELEtBQUssR0FBRyxVQUFVbE8sTUFBYyxFQUFRO2tCQUM3QyxJQUFJQSxNQUFNLEtBQUtzWCxPQUFPLEVBQUU7b0JBQ3ZCLE1BQU1DLFlBQVksR0FBSTVQLElBQUksYUFBSkEsSUFBSSx1QkFBSkEsSUFBSSxDQUFhNlAsYUFBYSxFQUFFLENBQUNDLGVBQWUsRUFBRTtvQkFDdkVGLFlBQVksQ0FBcURELE9BQU8sRUFBRTtrQkFDNUU7Z0JBQ0QsQ0FBQzs7Z0JBRUQ7Z0JBQ0EsSUFBSUYsV0FBVyxFQUFFO2tCQUNoQixNQUFNTSxLQUFLLEdBQUcxTixhQUFhLENBQUNHLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQztrQkFDL0U5TSxVQUFVLENBQUNzYSxPQUFPLENBQUNELEtBQUssRUFBRTtvQkFDekJ4WCxPQUFPLEVBQUUsQ0FBQ29YLE9BQU8sRUFBRWphLFVBQVUsQ0FBQ0QsTUFBTSxDQUFDbU4sRUFBRSxDQUFDO29CQUN4Q3FOLGdCQUFnQixFQUFFTixPQUFPO29CQUN6QmpOLE9BQU8sRUFBRSxVQUFVckssTUFBYyxFQUFFO3NCQUNsQ2tPLEtBQUssQ0FBQ2xPLE1BQU0sQ0FBQztvQkFDZCxDQUFDO29CQUNENlgsWUFBWSxFQUFFO2tCQUNmLENBQUMsQ0FBVztnQkFDYixDQUFDLE1BQU0sSUFBSSxDQUFDeEQsbUJBQW1CLEVBQUU7a0JBQ2hDO2tCQUNBLE1BQU1qQyxXQUFXLEdBQUd4SCxPQUFPLENBQUNrTixjQUFjLEVBQUU7a0JBQzVDMUYsV0FBVyxDQUFDMkYsU0FBUyxFQUFFO2dCQUN4QjtjQUNELENBQUMsQ0FBQyxPQUFPdE4sTUFBZSxFQUFFO2dCQUN6QmdMLEdBQUcsQ0FBQ3ZGLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRXpGLE1BQU0sQ0FBVztnQkFDbkU7Z0JBQ0EvQyxjQUFjLENBQUNtTCx3QkFBd0IsRUFBRTtjQUMxQztZQUNELENBQUM7WUFDRCxNQUFNbUYsaUJBQWlCLEdBQUcsa0JBQWlDO2NBQzFELElBQUlwTyxjQUFjLENBQUN4SSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUluRCxTQUFTLENBQUNMLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pFLE1BQU1xYSxXQUFXLEdBQUdyTyxjQUFjLENBQUN4SSxTQUFTLENBQUMsWUFBWSxDQUFDO2dCQUMxRCxNQUFNdVQsaUJBQWlCLEdBQUdzRCxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUlBLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsS0FBSztnQkFFaEUsSUFBSTtrQkFDSCxNQUFNQyxjQUFjLEdBQUcsTUFBTWxhLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ21hLGFBQWEsRUFBRTtrQkFDekQsSUFBSUQsY0FBYyxFQUFFO29CQUNuQmxGLGlCQUFpQixDQUFDa0UsWUFBWSxDQUFDeEMsaUJBQWlCLEVBQUV3RCxjQUFjLENBQUM7a0JBQ2xFO2tCQUNBLE1BQU16RCwwQkFBMEIsQ0FBQ0MsaUJBQWlCLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxPQUFPbEssTUFBZSxFQUFFO2tCQUN6QmdMLEdBQUcsQ0FBQ3ZGLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRXpGLE1BQU0sQ0FBVztnQkFDcEU7Y0FDRCxDQUFDLE1BQU07Z0JBQ04sTUFBTWlLLDBCQUEwQixFQUFFO2NBQ25DO1lBQ0QsQ0FBQztZQUVELE1BQU1zRCxpQkFBaUIsRUFBRTs7WUFFekI7WUFDQSxLQUFLLE1BQU1sSSxtQkFBbUIsSUFBSWQsb0JBQW9CLEVBQUU7Y0FDdkQsTUFBTWpRLEtBQUssR0FBRytRLG1CQUFtQixDQUFDOEIsWUFBWSxHQUMxQzlCLG1CQUFtQixDQUFDRixLQUFLLENBQXFCeUksUUFBUSxFQUFFLEdBQ3hEdkksbUJBQW1CLENBQUNGLEtBQUssQ0FBVzBJLFFBQVEsRUFBRTtjQUNsRHhJLG1CQUFtQixDQUFDL1EsS0FBSyxHQUFHQSxLQUFLO2NBQ2pDK1EsbUJBQW1CLENBQUNDLGlCQUFpQixHQUFHblAsT0FBTyxDQUFDOEIsT0FBTyxDQUFDM0QsS0FBSyxDQUFDO1lBQy9EO1VBQ0QsQ0FBQztVQUNEd1osVUFBVSxFQUFFLFlBQWtCO1lBQzdCO1lBQ0F4VCxpQkFBaUIsQ0FBQzJELE9BQU8sQ0FBQ3VHLGdDQUFnQyxDQUFDO1lBQzNEckUsT0FBTyxDQUFDdUQsT0FBTyxFQUFFO1lBQ2pCNEQsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLElBQUlGLFlBQVksQ0FBQ0MsZUFBZSxFQUFFO2NBQ2pDalIsTUFBTSxDQUFDNUQsU0FBUyxDQUFDeU4sa0JBQWtCLENBQUM7WUFDckMsQ0FBQyxNQUFNO2NBQ05oSSxPQUFPLENBQUNtUCxZQUFZLENBQUNoVCxNQUFNLENBQUM7WUFDN0I7VUFDRDtRQUNELENBQUMsQ0FBQztRQUNGbEIsV0FBVyxDQUFDaU4sT0FBTyxHQUFHQSxPQUFPO1FBQzdCQSxPQUFPLENBQUM0TixRQUFRLENBQUM3YSxXQUFXLENBQUMrQixLQUFLLENBQUM7UUFDbkNrTCxPQUFPLENBQUM0TixRQUFRLENBQUNqSSxlQUFlLEVBQUUsYUFBYSxDQUFDO1FBQ2hEM0YsT0FBTyxDQUFDNk4sV0FBVyxDQUFDO1VBQ25CQyxJQUFJLEVBQUUsR0FBRztVQUNUaFosS0FBSyxFQUFFO1FBQ1IsQ0FBQyxDQUFDOztRQUVGO1FBQ0EsTUFBTWlaLFNBQVMsR0FBRyxJQUFJbkksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DNUYsT0FBTyxDQUFDNE4sUUFBUSxDQUFDRyxTQUFTLEVBQUUsU0FBUyxDQUFDOztRQUV0QztRQUNBLEtBQUssTUFBTTdJLG1CQUFtQixJQUFJZCxvQkFBb0IsRUFBRTtVQUN2RCxJQUFJYyxtQkFBbUIsQ0FBQzhCLFlBQVksRUFBRTtZQUFBO1lBQ3JDOUIsbUJBQW1CLGFBQW5CQSxtQkFBbUIsZ0RBQW5CQSxtQkFBbUIsQ0FBRUYsS0FBSyxvRkFBMUIsc0JBQTRCZ0osVUFBVSxDQUFDLE9BQU8sQ0FBQywyREFBL0MsdUJBQWlEQyxZQUFZLENBQUMsTUFBTTtjQUNuRTVKLGdDQUFnQyxDQUFDYSxtQkFBbUIsQ0FBQzdMLFNBQVMsQ0FBQztZQUNoRSxDQUFDLENBQUM7VUFDSCxDQUFDLE1BQU07WUFBQTtZQUNONkwsbUJBQW1CLGFBQW5CQSxtQkFBbUIsaURBQW5CQSxtQkFBbUIsQ0FBRUYsS0FBSyxxRkFBMUIsdUJBQTRCZ0osVUFBVSxDQUFDLE9BQU8sQ0FBQywyREFBL0MsdUJBQWlEQyxZQUFZLENBQUMsTUFBTTtjQUNuRTVKLGdDQUFnQyxDQUFDYSxtQkFBbUIsQ0FBQzdMLFNBQVMsQ0FBQztZQUNoRSxDQUFDLENBQUM7VUFDSDtRQUNEO1FBRUEsSUFBSTdGLFdBQVcsR0FBSSxHQUFFYixXQUFZLE9BQU07UUFDdkMsSUFBSSxDQUFDVSxTQUFTLENBQUNMLE1BQU0sRUFBRTtVQUN0QlEsV0FBVyxHQUFJLElBQUdBLFdBQVksRUFBQztRQUNoQztRQUNBd00sT0FBTyxDQUFDNk4sV0FBVyxDQUFDO1VBQ25CQyxJQUFJLEVBQUV0YTtRQUNQLENBQUMsQ0FBQztRQUNGLElBQUl5TCxjQUFjLEVBQUU7VUFDbkI7VUFDQUEsY0FBYyxDQUFDaVAsWUFBWSxDQUFDbE8sT0FBTyxDQUFDO1FBQ3JDO1FBQ0EsSUFBSTNNLFNBQVMsQ0FBQ0wsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUN6QmdOLE9BQU8sQ0FBQ21PLGlCQUFpQixDQUFDOWEsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQzs7UUFDQSxNQUFNZ1YsaUJBQWlCLEdBQUdySSxPQUFPLENBQUNvTyxnQkFBZ0IsRUFBeUI7UUFDM0VwTyxPQUFPLENBQUNxTyxJQUFJLEVBQUU7TUFDZixDQUFDLENBQUMsT0FBT3hPLE1BQWUsRUFBRTtRQUN6QjVKLE1BQU0sQ0FBQzRKLE1BQU0sQ0FBQztNQUNmO0lBQ0QsQ0FBQyxDQUFDO0VBQ0g7RUFFQSxTQUFTOEgsNkJBQTZCLENBQ3JDdkksYUFBNEIsRUFDNUJwSCxZQUFnQyxFQUNoQ3JGLFdBQW1CLEVBQ25CMmIsY0FBa0MsRUFDekI7SUFDVCxJQUFJcFAsZUFBdUIsR0FBR3ZNLFdBQVc7SUFDekMsTUFBTTRiLFdBQVcsR0FBR3JQLGVBQWUsQ0FBQ3RELEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDOUNzRCxlQUFlLEdBQUdBLGVBQWUsQ0FBQ3JELFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRzBTLFdBQVcsQ0FBQ0EsV0FBVyxDQUFDdmIsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHa00sZUFBZTtJQUN2RyxNQUFNQyxpQkFBaUIsR0FBR0QsZUFBZSxJQUFJb1AsY0FBYyxHQUFJLEdBQUVBLGNBQWUsSUFBR3BQLGVBQWdCLEVBQUMsR0FBRyxFQUFFO0lBQ3pHLE1BQU1zUCxJQUFJLEdBQUcscUNBQXFDO0lBQ2xELE1BQU1DLGtCQUFrQixHQUFHclAsYUFBYSxDQUFDc1Asd0JBQXdCLENBQUUsR0FBRUYsSUFBSyxJQUFHclAsaUJBQWtCLEVBQUMsQ0FBQztJQUNqRyxJQUFJbkgsWUFBWSxFQUFFO01BQ2pCLElBQUl5VyxrQkFBa0IsRUFBRTtRQUN2QixPQUFPclAsYUFBYSxDQUFDRyxPQUFPLENBQUNpUCxJQUFJLEVBQUUxVCxTQUFTLEVBQUVxRSxpQkFBaUIsQ0FBQztNQUNqRSxDQUFDLE1BQU0sSUFBSUMsYUFBYSxDQUFDc1Asd0JBQXdCLENBQUUsR0FBRUYsSUFBSyxJQUFHRixjQUFlLEVBQUMsQ0FBQyxFQUFFO1FBQy9FLE9BQU9sUCxhQUFhLENBQUNHLE9BQU8sQ0FBQ2lQLElBQUksRUFBRTFULFNBQVMsRUFBRyxHQUFFd1QsY0FBZSxFQUFDLENBQUM7TUFDbkUsQ0FBQyxNQUFNLElBQUlsUCxhQUFhLENBQUNzUCx3QkFBd0IsQ0FBRSxHQUFFRixJQUFLLEVBQUMsQ0FBQyxFQUFFO1FBQzdELE9BQU9wUCxhQUFhLENBQUNHLE9BQU8sQ0FBQ2lQLElBQUksQ0FBQztNQUNuQyxDQUFDLE1BQU07UUFDTixPQUFPeFcsWUFBWTtNQUNwQjtJQUNELENBQUMsTUFBTTtNQUNOLE9BQU9vSCxhQUFhLENBQUNHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztJQUNuRDtFQUNEO0VBRUEsZUFBZW9QLGtDQUFrQyxDQUNoRDNYLE9BQTRCLEVBQzVCakUsV0FBdUMsRUFDdkNxSCxnQkFBcUMsRUFDckN3VSxRQUFnQixFQUNoQnhQLGFBQTRCLEVBQzVCdEMsY0FBMEMsRUFDMUMrUixjQUE2QixFQUM3QkMscUJBQW9DLEVBQ3BDQyxnQ0FBMEMsRUFDMUNDLCtCQUF5QyxFQUN6Qy9YLHVCQUFnRCxFQUNoRCtGLFVBQW9CLEVBQ2tCO0lBQ3RDLElBQUlpUyxjQUFtRDtNQUN0REMscUJBQXFCLEdBQUcsSUFBSTtJQUM3QixJQUFJbmMsV0FBVyxFQUFFO01BQ2hCQSxXQUFXLENBQUNnYyxnQ0FBZ0MsR0FBR0EsZ0NBQWdDO0lBQ2hGO0lBQ0EsSUFBSTNVLGdCQUFnQixFQUFFO01BQUE7TUFDckIsTUFBTTBKLEtBQUssR0FBRzlNLE9BQU8sQ0FBQ0QsZUFBZSxFQUFFLENBQUNyRCxPQUFPLEVBQUU7TUFDakQsTUFBTXliLFNBQVMsR0FBR25ZLE9BQU8sQ0FBQ3lMLFFBQVEsRUFBRSxDQUFDbFAsWUFBWSxFQUFFLENBQUNFLFdBQVcsQ0FBQ3FRLEtBQUssQ0FBQztNQUN0RSxNQUFNc0wsU0FBUyxHQUFHcFksT0FBTyxDQUFDeUwsUUFBUSxFQUFFLENBQUNsUCxZQUFZLEVBQUUsQ0FBQ2lELFNBQVMsQ0FBQzJZLFNBQVMsQ0FBQztNQUN4RSxJQUFJQyxTQUFTLElBQUksZ0JBQUFBLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0RBQVosWUFBY0MsS0FBSyxNQUFLLFFBQVEsRUFBRTtRQUNsRDtRQUNBSCxxQkFBcUIsR0FBRyxLQUFLO01BQzlCO01BQ0EsSUFBSW5jLFdBQVcsQ0FBQ3NKLHFCQUFxQixFQUFFO1FBQ3RDNlMscUJBQXFCLEdBQUcsS0FBSztNQUM5QjtJQUNEO0lBRUEsSUFBSSxDQUFDQSxxQkFBcUIsRUFBRTtNQUMzQkQsY0FBYyxHQUFHalksT0FBTyxDQUFDSCxPQUFPLENBQUMrWCxRQUFRLEVBQUU1UixVQUFVLENBQUMsQ0FBQzhCLElBQUksQ0FBQyxZQUFZO1FBQ3ZFaVEsZ0NBQWdDLENBQUMvWCxPQUFPLENBQUNELGVBQWUsRUFBRSxDQUFDO1FBQzNELE9BQU9DLE9BQU8sQ0FBQ0QsZUFBZSxFQUFFO01BQ2pDLENBQUMsQ0FBQztJQUNILENBQUMsTUFBTTtNQUNOa1ksY0FBYyxHQUFHalksT0FBTyxDQUN0QkgsT0FBTyxDQUNQK1gsUUFBUSxFQUNSNVIsVUFBVSxFQUNWc1MsZ0JBQWdCLENBQUNDLHdCQUF3QixDQUFDM0wsSUFBSSxDQUM3QzJILFVBQVUsRUFDVnFELFFBQVEsRUFDUjdiLFdBQVcsRUFDWHFNLGFBQWEsRUFDYjBQLHFCQUFxQixFQUNyQjlYLE9BQU8sQ0FBQ2dILFVBQVUsRUFBRSxFQUNwQjZRLGNBQWMsRUFDZC9SLGNBQWMsRUFDZDdGLHVCQUF1QixDQUN2QixDQUNELENBQ0E2SCxJQUFJLENBQUMsVUFBVTdLLE1BQWtDLEVBQUU7UUFDbkQsSUFBSSxDQUFDbEIsV0FBVyxDQUFDNEUsUUFBUSxFQUFFO1VBQzFCNlgsMkJBQTJCLENBQUN4WSxPQUFPLEVBQUU0WCxRQUFRLEVBQUUzWCx1QkFBdUIsRUFBRWxFLFdBQVcsRUFBOEIsSUFBSSxDQUFDO1FBQ3ZIO1FBQ0EsTUFBTTBjLFVBQVUsR0FBRzFjLFdBQVcsQ0FBQ3FILGdCQUFnQixJQUFJbkcsTUFBTSxLQUFLNkcsU0FBUyxHQUFHOUQsT0FBTyxDQUFDRCxlQUFlLEVBQUUsR0FBRzlDLE1BQU07UUFDNUc4YSxnQ0FBZ0MsQ0FBQ1UsVUFBVSxDQUFDO1FBQzVDLE9BQU9BLFVBQVU7TUFDbEIsQ0FBQyxDQUFDLENBQ0RDLEtBQUssQ0FBQyxZQUFZO1FBQ2xCLElBQUksQ0FBQzNjLFdBQVcsQ0FBQzRFLFFBQVEsRUFBRTtVQUMxQjZYLDJCQUEyQixDQUFDeFksT0FBTyxFQUFFNFgsUUFBUSxFQUFFM1gsdUJBQXVCLEVBQUVsRSxXQUFXLENBQTZCO1FBQ2pIO1FBQ0FpYywrQkFBK0IsRUFBRTtRQUNqQyxNQUFNM2MsU0FBUyxDQUFDc2QscUJBQXFCO01BQ3RDLENBQUMsQ0FBQztJQUNKO0lBRUEsT0FBT1YsY0FBYyxDQUFDUyxLQUFLLENBQUMsTUFBTTtNQUNqQ1YsK0JBQStCLEVBQUU7TUFDakMsTUFBTTNjLFNBQVMsQ0FBQ3NkLHFCQUFxQjtJQUN0QyxDQUFDLENBQUM7RUFDSDtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNILDJCQUEyQixDQUNuQ3BhLE1BQTJCLEVBQzNCdUIsT0FBZSxFQUNmTSx1QkFBZ0QsRUFDaERqQyxVQUFxQyxFQUU5QjtJQUFBLElBRFA0YSxtQkFBbUIsdUVBQUcsS0FBSztJQUUzQixNQUFNclMsUUFBd0IsR0FBR0MsU0FBUyxDQUFDQyxlQUFlLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFO0lBQ3RFLE1BQU07TUFBRW5HLG1CQUFtQjtNQUFFRCxvQkFBb0I7TUFBRUg7SUFBOEIsQ0FBQyxHQUFHRix1QkFBdUI7SUFDNUcsTUFBTTRZLG1CQUFtQixHQUFHdFMsUUFBUSxDQUFDdVMsTUFBTSxDQUFDLENBQUNDLEdBQWMsRUFBRXRPLE9BQU8sS0FBSztNQUN4RSxJQUFJLENBQUNsSyxtQkFBbUIsQ0FBQ3lZLEdBQUcsQ0FBQ3ZPLE9BQU8sQ0FBQ3dPLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDOUNGLEdBQUcsQ0FBQ2pVLElBQUksQ0FBQzJGLE9BQU8sQ0FBQztNQUNsQjtNQUNBLE9BQU9zTyxHQUFHO0lBQ1gsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUVOLE1BQU1HLDRCQUE0QixHQUFHTCxtQkFBbUIsQ0FDdER0YSxNQUFNLENBQ0xrTSxPQUFPLElBQ1BBLE9BQU8sQ0FBQzBPLGFBQWEsRUFBRSxLQUFLLElBQUksSUFBSTFPLE9BQU8sQ0FBQ2tCLE9BQU8sRUFBRSxLQUFLTSxXQUFXLENBQUNtTixPQUFPLElBQUksQ0FBQzdZLG1CQUFtQixDQUFDeVksR0FBRyxDQUFDdk8sT0FBTyxDQUFDd08sS0FBSyxFQUFFLENBQUMsQ0FDM0gsQ0FDQXJKLEdBQUcsQ0FBRW5GLE9BQU8sSUFBS0EsT0FBTyxDQUFDd08sS0FBSyxFQUFFLENBQUM7SUFFbkMsSUFBSUMsNEJBQTRCLENBQUNsZCxNQUFNLEVBQUU7TUFDeENpRSx1QkFBdUIsQ0FBQ00sbUJBQW1CLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUMsR0FBR3JFLEtBQUssQ0FBQ2tkLElBQUksQ0FBQzlZLG1CQUFtQixDQUFDLEVBQUUsR0FBRzJZLDRCQUE0QixDQUFDLENBQUM7TUFDNUg1WSxvQkFBb0IsQ0FBQ3dFLElBQUksQ0FBQyxHQUFHaU4sTUFBTSxDQUFDdUgsTUFBTSxDQUFDVCxtQkFBbUIsQ0FBQyxDQUFDdGEsTUFBTSxDQUFFa00sT0FBTyxJQUFLQSxPQUFPLENBQUNrQixPQUFPLEVBQUUsS0FBS00sV0FBVyxDQUFDbU4sT0FBTyxDQUFDLENBQUM7TUFDL0gsSUFBSSxDQUFDUixtQkFBbUIsSUFBSTVhLFVBQVUsYUFBVkEsVUFBVSxlQUFWQSxVQUFVLENBQUVpSCxvQkFBb0IsRUFBRTtRQUM3RDlFLDZCQUE2QixDQUFDMkUsSUFBSSxDQUFDO1VBQ2xDOUUsT0FBTyxFQUFFNUIsTUFBTTtVQUNmdUI7UUFDRCxDQUFDLENBQUM7TUFDSDtJQUNEO0VBQ0Q7RUFFQSxTQUFTNFosaURBQWlELEdBSXhEO0lBQ0QsSUFBSXhCLGdDQUEyQztJQUMvQyxJQUFJQywrQkFBMEM7SUFDOUMsTUFBTXdCLG1CQUFtQixHQUFHLElBQUl4YSxPQUFPLENBQVUsVUFBVThCLE9BQU8sRUFBRTdCLE1BQU0sRUFBRTtNQUMzRThZLGdDQUFnQyxHQUFHalgsT0FBTztNQUMxQ2tYLCtCQUErQixHQUFHL1ksTUFBTTtJQUN6QyxDQUFDLENBQUMsQ0FBQ3laLEtBQUssQ0FBQyxVQUFVN1AsTUFBTSxFQUFFO01BQzFCZ0wsR0FBRyxDQUFDdkYsS0FBSyxDQUFDLCtCQUErQixFQUFFekYsTUFBTSxDQUFDO0lBQ25ELENBQUMsQ0FBQztJQUVGLE9BQU87TUFBRTJRLG1CQUFtQjtNQUFFekIsZ0NBQWdDO01BQUVDO0lBQWdDLENBQUM7RUFDbEc7RUFFQSxlQUFlMVIsY0FBYyxDQUM1QnhLLGFBQTJCLEVBQzNCQyxXQUF1QyxFQUN2Q2tNLGNBQW9CLEVBQ3BCbkMsY0FBOEIsRUFDOUI3Rix1QkFBZ0QsRUFDaEQrRixVQUFvQixFQUMyRDtJQUMvRSxNQUFNM0osU0FBUyxHQUFHTixXQUFXLENBQUNNLFNBQVMsSUFBSSxFQUFFO0lBQzdDLE1BQU1SLE1BQU0sR0FBR0UsV0FBVyxDQUFDK0IsS0FBSztJQUNoQyxNQUFNcUYsaUJBQWlCLEdBQUdwSCxXQUFXLENBQUNvSCxpQkFBaUIsSUFBSSxFQUFFO0lBQzdELE1BQU14SCxXQUFXLEdBQUdJLFdBQVcsQ0FBQzhCLFVBQVU7SUFDMUMsTUFBTWtGLGFBQWEsR0FBR2hILFdBQVcsQ0FBQ2dILGFBQWE7SUFDL0MsTUFBTUUsWUFBWSxHQUFHbEgsV0FBVyxDQUFDa0gsWUFBWTtJQUM3QyxNQUFNbUYsYUFBYSxHQUFHQyxnQkFBZ0IsQ0FBQ0osY0FBYyxDQUFDO0lBQ3RELElBQUlqSSxPQUE0QjtJQUNoQ2pFLFdBQVcsQ0FBQ2dDLFlBQVksR0FBR2pDLGFBQWE7SUFFeEMsU0FBUzJkLDhCQUE4QixHQUFTO01BQy9DLElBQUl0VyxpQkFBaUIsQ0FBQ25ILE1BQU0sRUFBRTtRQUM3QixNQUFNMGQsYUFBYSxHQUFHM2QsV0FBVyxDQUFDK0csdUJBQXVCLElBQUksQ0FBQyxDQUFDO1FBQy9ELEtBQUssTUFBTVQsU0FBUyxJQUFJYyxpQkFBaUIsRUFBRTtVQUMxQyxNQUFNM0UsSUFBSSxHQUFHNkQsU0FBUyxDQUFDN0QsSUFBSTtVQUMzQixJQUFJLENBQUNrYixhQUFhLENBQUNsYixJQUFJLENBQUMsRUFBRTtZQUN6QixRQUFRNkQsU0FBUyxDQUFDMkosSUFBSTtjQUNyQixLQUFLLFlBQVk7Z0JBQ2hCME4sYUFBYSxDQUFDbGIsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDeEI7Y0FDRCxLQUFLLGFBQWE7Z0JBQ2pCa2IsYUFBYSxDQUFDbGIsSUFBSSxDQUFDLEdBQUcsS0FBSztnQkFDM0I7Y0FDRCxLQUFLLFVBQVU7Y0FDZixLQUFLLFdBQVc7Y0FDaEIsS0FBSyxXQUFXO2NBQ2hCLEtBQUssV0FBVztnQkFDZmtiLGFBQWEsQ0FBQ2xiLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZCO2NBQ0Q7Y0FDQTtnQkFDQztZQUFNO1VBRVQ7VUFDQXdCLE9BQU8sQ0FBQ3VWLFlBQVksQ0FBQy9XLElBQUksRUFBRWtiLGFBQWEsQ0FBQ2xiLElBQUksQ0FBQyxDQUFDO1FBQ2hEO01BQ0Q7SUFDRDtJQUNBLElBQUluQyxTQUFTLENBQUNMLE1BQU0sRUFBRTtNQUNyQjtNQUNBLE9BQU8sSUFBSWdELE9BQU8sQ0FBc0UsVUFDdkY4QixPQUE2RixFQUM1RjtRQUNELE1BQU1xRCxrQkFBa0IsR0FBR3BJLFdBQVcsQ0FBQ29JLGtCQUFrQjtRQUN6RCxNQUFNeEQsUUFBUSxHQUFHNUUsV0FBVyxDQUFDNEUsUUFBUTtRQUNyQyxNQUFNeUMsZ0JBQWdCLEdBQUdySCxXQUFXLENBQUNxSCxnQkFBZ0I7UUFDckQsTUFBTXVXLGVBQXNELEdBQUcsRUFBRTtRQUNqRSxJQUFJMUIsY0FBYztRQUNsQixJQUFJL1IsQ0FBQztRQUNMLElBQUkwUixRQUFnQjtRQUNwQixNQUFNZ0MsZ0NBQWdDLEdBQUdMLGlEQUFpRCxFQUFFO1FBQzVGLE1BQU1NLGVBQWUsR0FBRyxnQkFDdkJDLGFBQWtDLEVBQ2xDaEMscUJBQW9DLEVBQ3BDaUMsV0FBZ0UsRUFDaEVsQyxjQUFzQixFQUNIO1VBQ25CNEIsOEJBQThCLEVBQUU7VUFDaEMsTUFBTU8sdUJBQTJDLEdBQUcsRUFBRTtVQUN0RDtVQUNBcEMsUUFBUSxHQUFHLENBQUNqWCxRQUFRLEdBQUksU0FBUW1YLHFCQUFzQixFQUFDLEdBQUdnQyxhQUFhLENBQUNHLGdCQUFnQixFQUFFO1VBQzFGbGUsV0FBVyxDQUFDbWUsa0JBQWtCLEdBQUdDLG9CQUFvQixDQUFDdk4sSUFBSSxDQUN6RDJILFVBQVUsRUFDVnpZLGFBQWEsRUFDYmllLFdBQVcsRUFDWGhlLFdBQVcsRUFDWDZiLFFBQVEsRUFDUm9DLHVCQUF1QixDQUN2QjtVQUNEL0IsY0FBYyxHQUFHTixrQ0FBa0MsQ0FDbERtQyxhQUFhLEVBQ2IvZCxXQUFXLEVBQ1hxSCxnQkFBZ0IsRUFDaEJ3VSxRQUFRLEVBQ1J4UCxhQUFhLEVBQ2J0QyxjQUFjLEVBQ2QrUixjQUFjLEVBQ2RDLHFCQUFxQixFQUNyQjhCLGdDQUFnQyxDQUFDN0IsZ0NBQWdDLEVBQ2pFNkIsZ0NBQWdDLENBQUM1QiwrQkFBK0IsRUFDaEUvWCx1QkFBdUIsRUFDdkIrRixVQUFVLENBQ1Y7VUFDRDJULGVBQWUsQ0FBQzdVLElBQUksQ0FBQ21ULGNBQWMsQ0FBQztVQUNwQytCLHVCQUF1QixDQUFDbFYsSUFBSSxDQUFDOFUsZ0NBQWdDLENBQUNKLG1CQUFtQixDQUFDO1VBQ2xGVyxvQkFBb0IsQ0FBQ3JlLGFBQWEsRUFBRWllLFdBQVcsRUFBRWhlLFdBQVcsRUFBRTZiLFFBQVEsRUFBRW9DLHVCQUF1QixDQUFDO1VBQ2hHLE9BQU9oYixPQUFPLENBQUNvYixVQUFVLENBQUNKLHVCQUF1QixDQUFDO1FBQ25ELENBQUM7UUFDRCxNQUFNSyxxQkFBcUIsR0FBRyxnQkFDN0JQLGFBQWtDLEVBQ2xDaEMscUJBQW9DLEVBQ3BDaUMsV0FBOEUsRUFDOUVsQyxjQUFzQixFQUNxQjtVQUMzQyxNQUFNbUMsdUJBQTJDLEdBQUcsRUFBRTtVQUN0RFAsOEJBQThCLEVBQUU7VUFDaEM7VUFDQTdCLFFBQVEsR0FBRzdiLFdBQVcsQ0FBQzRELE9BQU8sSUFBSyxVQUFTbVkscUJBQXNCLEVBQUM7VUFDbkUvYixXQUFXLENBQUNtZSxrQkFBa0IsR0FBR0Msb0JBQW9CLENBQUN2TixJQUFJLENBQ3pEMkgsVUFBVSxFQUNWelksYUFBYSxFQUNiaWUsV0FBVyxFQUNYaGUsV0FBVyxFQUNYNmIsUUFBUSxFQUNSb0MsdUJBQXVCLENBQ3ZCO1VBQ0QvQixjQUFjLEdBQUdOLGtDQUFrQyxDQUNsRG1DLGFBQWEsRUFDYi9kLFdBQVcsRUFDWHFILGdCQUFnQixFQUNoQndVLFFBQVEsRUFDUnhQLGFBQWEsRUFDYnRDLGNBQWMsRUFDZCtSLGNBQWMsRUFDZEMscUJBQXFCLEVBQ3JCOEIsZ0NBQWdDLENBQUM3QixnQ0FBZ0MsRUFDakU2QixnQ0FBZ0MsQ0FBQzVCLCtCQUErQixFQUNoRS9YLHVCQUF1QixFQUN2QitGLFVBQVUsQ0FDVjtVQUNEMlQsZUFBZSxDQUFDN1UsSUFBSSxDQUFDbVQsY0FBYyxDQUFDO1VBQ3BDK0IsdUJBQXVCLENBQUNsVixJQUFJLENBQUM4VSxnQ0FBZ0MsQ0FBQ0osbUJBQW1CLENBQUM7VUFDbEZXLG9CQUFvQixDQUFDcmUsYUFBYSxFQUFFaWUsV0FBVyxFQUFFaGUsV0FBVyxFQUFFNmIsUUFBUSxFQUFFb0MsdUJBQXVCLENBQUM7VUFDaEduZSxNQUFNLENBQUNpRSxXQUFXLENBQUM4WCxRQUFRLENBQUM7VUFDNUIsT0FBTzVZLE9BQU8sQ0FBQ29iLFVBQVUsQ0FBQ0osdUJBQXVCLENBQUM7UUFDbkQsQ0FBQztRQUVELGVBQWVNLGtCQUFrQixHQUFrQjtVQUNsRCxNQUFNQyx1QkFBa0MsR0FBRyxFQUFFO1VBQzdDLEtBQUtyVSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUc3SixTQUFTLENBQUNMLE1BQU0sRUFBRWtLLENBQUMsRUFBRSxFQUFFO1lBQ3RDbEcsT0FBTyxHQUFHbkUsTUFBTSxDQUFDeUQsV0FBVyxDQUFFLEdBQUUzRCxXQUFZLE9BQU0sRUFBRVUsU0FBUyxDQUFDNkosQ0FBQyxDQUFDLEVBQUUvQixrQkFBa0IsQ0FBQztZQUNyRm9XLHVCQUF1QixDQUFDelYsSUFBSSxDQUMzQitVLGVBQWUsQ0FDZDdaLE9BQU8sRUFDUDNELFNBQVMsQ0FBQ0wsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUdrSyxDQUFDLEdBQUcsQ0FBQyxFQUNuQztjQUNDbkgsT0FBTyxFQUFFMUMsU0FBUyxDQUFDNkosQ0FBQyxDQUFDO2NBQ3JCNUIsZUFBZSxFQUFFdkksV0FBVyxDQUFDc0ksb0JBQW9CLElBQUl0SSxXQUFXLENBQUNzSSxvQkFBb0IsQ0FBQ0MsZUFBZTtjQUNyR1MsY0FBYyxFQUFFaEosV0FBVyxDQUFDc0ksb0JBQW9CLElBQUl0SSxXQUFXLENBQUNzSSxvQkFBb0IsQ0FBQ1U7WUFDdEYsQ0FBQyxFQUNEMUksU0FBUyxDQUFDTCxNQUFNLENBQ2hCLENBQ0Q7VUFDRjtVQUNBLENBQ0MrRyxhQUFhLElBQ2IsU0FBU3lYLElBQUksR0FBUztZQUNyQjtVQUFBLENBQ0EsRUFDQWIsZUFBZSxDQUFDO1VBRWxCLE1BQU0zYSxPQUFPLENBQUNvYixVQUFVLENBQUNHLHVCQUF1QixDQUFDO1VBQ2pELElBQUl0YSx1QkFBdUIsQ0FBQ0csc0JBQXNCLENBQUNwRSxNQUFNLEVBQUU7WUFDMUQsSUFBSTtjQUNILElBQUksQ0FBQ29MLGVBQWUsQ0FBQ0MsNkJBQTZCLEVBQUUsRUFBRTtnQkFDckQsTUFBTWlSLGdCQUFnQixDQUFDbUMsaUJBQWlCLENBQ3ZDMWUsV0FBVyxFQUNYcU0sYUFBYSxFQUNidEMsY0FBYyxFQUNkN0YsdUJBQXVCLENBQUNJLDZCQUE2QixFQUNyREosdUJBQXVCLEVBQ3ZCNUQsU0FBUyxDQUFDTCxNQUFNLEdBQUcsQ0FBQyxDQUNwQjtjQUNGLENBQUMsTUFBTTtnQkFDTmlFLHVCQUF1QixDQUFDRyxzQkFBc0IsQ0FBQzBHLE9BQU8sQ0FBQyxVQUFVNFQsU0FBUyxFQUFFO2tCQUMzRUEsU0FBUyxDQUFDNVosT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDekIsQ0FBQyxDQUFDO2dCQUNGLE1BQU1xSyxZQUFZLEdBQUczRSxTQUFTLENBQUNDLGVBQWUsRUFBRTtnQkFDaEQsTUFBTTJFLGVBQWUsR0FBR0QsWUFBWSxDQUFDekUsT0FBTyxFQUFFO2dCQUM5Q3lFLFlBQVksQ0FBQ3dQLE9BQU8sQ0FBQ3ZQLGVBQWUsQ0FBQ3pFLE1BQU0sQ0FBQzFHLHVCQUF1QixDQUFDSSw2QkFBNkIsQ0FBQyxDQUFDO2NBQ3BHO1lBQ0QsQ0FBQyxDQUFDLE1BQU07Y0FDUHdULEdBQUcsQ0FBQ3ZGLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQztZQUM1RDtVQUNEO1VBQ0FzTSxlQUFlLEVBQUU7UUFDbEI7UUFFQSxlQUFlQyxxQkFBcUIsQ0FBQ0MsaUJBQW1DLEVBQWlCO1VBQ3hGO1VBQ0EsQ0FDQy9YLGFBQWEsSUFDYixTQUFTeVgsSUFBSSxHQUFTO1lBQ3JCO1VBQUEsQ0FDQSxFQUNBYixlQUFlLENBQUM7VUFDbEIsZUFBZW9CLGdCQUFnQixDQUM5QmhjLE9BQXVCLEVBQ3ZCaWMsV0FBbUIsRUFDbkJuRCxjQUFzQixFQUNxQjtZQUFBO1lBQzNDN1gsT0FBTyxHQUFHbkUsTUFBTSxDQUFDeUQsV0FBVyxDQUFFLEdBQUUzRCxXQUFZLE9BQU0sRUFBRW9ELE9BQU8sRUFBRW9GLGtCQUFrQixDQUFDO1lBQ2hGO1lBQ0E7WUFDQSxNQUFNOFcsbUJBQW1CLDJCQUFJbGYsV0FBVyxDQUFDd0osT0FBTyxrRkFBcEIscUJBQWdDMlYsYUFBYSxvRkFBN0MsZ0RBQWlELDJEQUFqRCx1QkFBbURDLGdCQUFnQixFQUFFO1lBQ2pHLE9BQU9kLHFCQUFxQixDQUMzQnJhLE9BQU8sRUFDUGdiLFdBQVcsRUFDWDtjQUNDamMsT0FBTyxFQUNOa2MsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDdmUsT0FBTyxFQUFFLEtBQUtxQyxPQUFPLENBQUNyQyxPQUFPLEVBQUUsR0FBR3VlLG1CQUFtQixHQUFHbGMsT0FBTztjQUMzR3VGLGVBQWUsRUFBRXZJLFdBQVcsQ0FBQ3NJLG9CQUFvQixJQUFJdEksV0FBVyxDQUFDc0ksb0JBQW9CLENBQUNDLGVBQWU7Y0FDckdTLGNBQWMsRUFBRWhKLFdBQVcsQ0FBQ3NJLG9CQUFvQixJQUFJdEksV0FBVyxDQUFDc0ksb0JBQW9CLENBQUNVO1lBQ3RGLENBQUMsRUFDRDhTLGNBQWMsQ0FDZDtVQUNGOztVQUVBO1VBQ0EsTUFBTWlELGlCQUFpQixDQUFDaEMsTUFBTSxDQUFDLE9BQU9zQyxPQUFzQixFQUFFcmMsT0FBdUIsRUFBRTRPLEVBQVUsS0FBb0I7WUFDcEgsTUFBTXlOLE9BQU87WUFDYixNQUFNTCxnQkFBZ0IsQ0FBQ2hjLE9BQU8sRUFBRTRPLEVBQUUsR0FBRyxDQUFDLEVBQUV0UixTQUFTLENBQUNMLE1BQU0sQ0FBQztVQUMxRCxDQUFDLEVBQUVnRCxPQUFPLENBQUM4QixPQUFPLEVBQUUsQ0FBQztVQUVyQixJQUFJYix1QkFBdUIsQ0FBQ0csc0JBQXNCLENBQUNwRSxNQUFNLEVBQUU7WUFDMUQsTUFBTXNjLGdCQUFnQixDQUFDbUMsaUJBQWlCLENBQ3ZDMWUsV0FBVyxFQUNYcU0sYUFBYSxFQUNidEMsY0FBYyxFQUNkN0YsdUJBQXVCLENBQUNJLDZCQUE2QixFQUNyREosdUJBQXVCLEVBQ3ZCNUQsU0FBUyxDQUFDTCxNQUFNLEdBQUcsQ0FBQyxDQUNwQjtVQUNGO1VBQ0E0ZSxlQUFlLEVBQUU7UUFDbEI7UUFFQSxJQUFJLENBQUNqYSxRQUFRLEVBQUU7VUFDZDtVQUNBO1VBQ0E7VUFDQWthLHFCQUFxQixDQUFDeGUsU0FBUyxDQUFDO1FBQ2pDLENBQUMsTUFBTTtVQUNOaWUsa0JBQWtCLEVBQUU7UUFDckI7UUFFQSxlQUFlTSxlQUFlLEdBQWtCO1VBQy9DO1VBQ0EsT0FBTzViLE9BQU8sQ0FBQ29iLFVBQVUsQ0FBQ1QsZUFBZSxDQUFDLENBQUM3UixJQUFJLENBQUNoSCxPQUFPLENBQUM7UUFDekQ7TUFDRCxDQUFDLENBQUMsQ0FBQ3VhLE9BQU8sQ0FBQyxZQUFZO1FBQ3RCLENBQ0NwWSxZQUFZLElBQ1osU0FBU3VYLElBQUksR0FBUztVQUNyQjtRQUFBLENBQ0EsR0FDQztNQUNKLENBQUMsQ0FBQztJQUNILENBQUMsTUFBTTtNQUNOeGEsT0FBTyxHQUFHbkUsTUFBTSxDQUFDeUQsV0FBVyxDQUFFLElBQUczRCxXQUFZLE9BQU0sQ0FBQztNQUNwRDhkLDhCQUE4QixFQUFFO01BQ2hDLE1BQU03QixRQUFRLEdBQUcsY0FBYztNQUMvQixNQUFNSyxjQUFtRCxHQUFHalksT0FBTyxDQUFDSCxPQUFPLENBQzFFK1gsUUFBUSxFQUNSOVQsU0FBUyxFQUNUd1UsZ0JBQWdCLENBQUNDLHdCQUF3QixDQUFDM0wsSUFBSSxDQUM3QzJILFVBQVUsRUFDVnFELFFBQVEsRUFDUjtRQUFFM1csS0FBSyxFQUFFbEYsV0FBVyxDQUFDa0YsS0FBSztRQUFFbkQsS0FBSyxFQUFFakM7TUFBTyxDQUFDLEVBQzNDdU0sYUFBYSxFQUNiLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKdEMsY0FBYyxFQUNkN0YsdUJBQXVCLENBQ3ZCLENBQ0Q7TUFDRCxNQUFNcWIsVUFBOEIsR0FBRyxDQUFDckQsY0FBYyxDQUFDO01BQ3ZELElBQUlsYyxXQUFXLENBQUNzSSxvQkFBb0IsRUFBRTtRQUNyQyxNQUFNdEYsT0FBTyxHQUFHbEQsTUFBTSxDQUFDeUQsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUNTLGVBQWUsRUFBRTtRQUN0RSxNQUFNd2IsVUFBVSxHQUFHO1VBQ2xCeGMsT0FBTyxFQUFFQSxPQUFPO1VBQ2hCdUYsZUFBZSxFQUFFdkksV0FBVyxDQUFDc0ksb0JBQW9CLENBQUNDLGVBQWU7VUFDakVTLGNBQWMsRUFBRWhKLFdBQVcsQ0FBQ3NJLG9CQUFvQixDQUFDVTtRQUNsRCxDQUFDO1FBQ0R3UCxVQUFVLENBQUM0RixvQkFBb0IsQ0FBQ3JlLGFBQWEsRUFBRXlmLFVBQVUsRUFBRXhmLFdBQVcsRUFBRTZiLFFBQVEsRUFBRTBELFVBQVUsQ0FBQztRQUM3RnZjLE9BQU8sQ0FBQ3dOLE9BQU8sRUFBRTtNQUNsQjtNQUNBMVEsTUFBTSxDQUFDaUUsV0FBVyxDQUFDOFgsUUFBUSxDQUFDO01BQzVCO01BQ0EsQ0FDQzdVLGFBQWEsSUFDYixTQUFTeVgsSUFBSSxHQUFTO1FBQ3JCO01BQUEsQ0FDQSxFQUNBdkMsY0FBYyxDQUFDO01BQ2pCLE9BQU9qWixPQUFPLENBQUN5VixHQUFHLENBQUM2RyxVQUFVLENBQUMsQ0FDNUJ4VCxJQUFJLENBQUMsVUFBVTBULG9CQUErQixFQUFFO1FBQ2hEO1FBQ0E7UUFDQSxNQUFNQyxtQkFBbUIsR0FBR0Qsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUlDLG1CQUFtQixFQUFFO1VBQ3hCLE9BQU9BLG1CQUFtQjtRQUMzQixDQUFDLE1BQU07VUFBQTtVQUNOLGdDQUFPLFlBQUF6YixPQUFPLEVBQUNELGVBQWUsb0ZBQXZCLG9DQUEyQiwyREFBM0IsdUJBQTZCUCxTQUFTLEVBQUU7UUFDaEQ7TUFDRCxDQUFDLENBQUMsQ0FDRGtaLEtBQUssQ0FBQyxVQUFVN1AsTUFBZSxFQUFFO1FBQ2pDZ0wsR0FBRyxDQUFDdkYsS0FBSyxDQUFDLCtCQUErQixHQUFHM1MsV0FBVyxFQUFFa04sTUFBTSxDQUFXO1FBQzFFLE1BQU1BLE1BQU07TUFDYixDQUFDLENBQUMsQ0FDRHdTLE9BQU8sQ0FBQyxZQUFZO1FBQ3BCLENBQ0NwWSxZQUFZLElBQ1osU0FBU3VYLElBQUksR0FBUztVQUNyQjtRQUFBLENBQ0EsR0FDQztNQUNKLENBQUMsQ0FBQztJQUNKO0VBQ0Q7RUFDQSxTQUFTek4sUUFBUSxDQUFDL0UsY0FBdUIsRUFBRXJNLFdBQW1CLEVBQVU7SUFDdkUsSUFBSW1SLEtBQUssR0FBRzlFLGNBQWMsQ0FBQ3RMLE9BQU8sRUFBRTtJQUNwQ29RLEtBQUssR0FBRzlFLGNBQWMsQ0FBQ3hJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBR3NOLEtBQUssQ0FBQ2xJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHa0ksS0FBSyxDQUFDbEksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RyxPQUFPa0ksS0FBSyxDQUFDbEksS0FBSyxDQUFFLElBQUdqSixXQUFZLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6QztFQUVBLFNBQVMrRyx3Q0FBd0MsQ0FDaER5QyxjQUF1QixFQUN2QnhELGdCQUFzQyxFQUN0Q0ksZUFBMkMsRUFDM0NJLGlCQUEyQyxFQUNqQztJQUNWLE1BQU11WiwrQkFBK0IsR0FBRy9aLGdCQUFnQixDQUFDUyxLQUFLLENBQUVDLFNBQVM7TUFBQTtNQUFBLE9BQUssQ0FBQUEsU0FBUyxhQUFUQSxTQUFTLGlEQUFUQSxTQUFTLENBQUVDLFdBQVcscUZBQXRCLHVCQUF3QkMsRUFBRSxxRkFBMUIsdUJBQTRCQyxNQUFNLDJEQUFsQyx1QkFBb0NDLE9BQU8sRUFBRSxNQUFLLElBQUk7SUFBQSxFQUFDO0lBRXJJLElBQUlWLGVBQWUsYUFBZkEsZUFBZSxlQUFmQSxlQUFlLENBQUUvRixNQUFNLElBQUksQ0FBQzBmLCtCQUErQixFQUFFO01BQ2hFO01BQ0EsS0FBSyxNQUFNN0wsZUFBZSxJQUFJbE8sZ0JBQWdCLEVBQUU7UUFDL0MsSUFDQ2tPLGVBQWUsQ0FBQ3JSLElBQUksS0FBSyxzQkFBc0IsSUFDL0MsRUFBQ3VELGVBQWUsYUFBZkEsZUFBZSxlQUFmQSxlQUFlLENBQUUyQyxJQUFJLENBQUV5QixPQUFPLElBQUtBLE9BQU8sQ0FBQzNILElBQUksS0FBS3FSLGVBQWUsQ0FBQ3JSLElBQUksQ0FBQyxHQUN6RTtVQUNEO1VBQ0EsT0FBTyxLQUFLO1FBQ2I7TUFDRDtJQUNEO0lBRUEsSUFBSTJHLGNBQWMsSUFBSWhELGlCQUFpQixhQUFqQkEsaUJBQWlCLGVBQWpCQSxpQkFBaUIsQ0FBRW5HLE1BQU0sSUFBSSxDQUFDMGYsK0JBQStCLEVBQUU7TUFDcEY7TUFDQTtNQUNBLEtBQUssTUFBTTdMLGVBQWUsSUFBSWxPLGdCQUFnQixFQUFFO1FBQy9DLElBQUlRLGlCQUFpQixJQUFJLENBQUNBLGlCQUFpQixDQUFDME4sZUFBZSxDQUFDclIsSUFBSSxDQUFDLEVBQUU7VUFDbEU7VUFDQSxPQUFPLEtBQUs7UUFDYjtNQUNEO0lBQ0Q7SUFFQSxJQUFJbUQsZ0JBQWdCLENBQUMzRixNQUFNLElBQUkwZiwrQkFBK0IsRUFBRTtNQUMvRCxPQUFPL1osZ0JBQWdCLENBQUNTLEtBQUssQ0FBQyxVQUFVQyxTQUFTLEVBQUU7UUFBQTtRQUNsRCxNQUFNc1osWUFBWSw2QkFBR3RaLFNBQVMsQ0FBQ0MsV0FBVyxxRkFBckIsdUJBQXVCc1osTUFBTSwyREFBN0IsdUJBQStCQyxZQUFZO1FBQ2hFLE1BQU1DLFdBQVcsR0FBRyxDQUFBSCxZQUFZLGFBQVpBLFlBQVksdUJBQVpBLFlBQVksQ0FBRUksUUFBUSxFQUFFLE1BQUssbUNBQW1DOztRQUVwRjtRQUNBO1FBQ0EsT0FDQyxDQUFDRCxXQUFXLElBQ1gzWixpQkFBaUIsSUFBSUEsaUJBQWlCLENBQUNFLFNBQVMsQ0FBQzdELElBQUksQ0FBRSxLQUN4RHVELGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFMkMsSUFBSSxDQUFFc1gsY0FBYyxJQUFLQSxjQUFjLENBQUN4ZCxJQUFJLEtBQUs2RCxTQUFTLENBQUM3RCxJQUFJLENBQUMsTUFDakY2RCxTQUFTLGFBQVRBLFNBQVMsaURBQVRBLFNBQVMsQ0FBRUMsV0FBVyxxRkFBdEIsdUJBQXdCQyxFQUFFLHNGQUExQix1QkFBNEI2RCxxQkFBcUIsNERBQWpELHdCQUFtRDNELE9BQU8sRUFBRTtNQUU5RCxDQUFDLENBQUM7SUFDSDtJQUVBLE9BQU8sSUFBSTtFQUNaO0VBRUEsZUFBZTBYLG9CQUFvQixDQUNsQ3BjLFlBQTBCLEVBQzFCd2QsVUFBNkUsRUFDN0V2ZCxVQUlDLEVBQ0QyQixPQUFlLEVBQ2ZzYyxZQUFpQyxFQUNqQjtJQUNoQixNQUFNQyxrQkFBa0IsR0FBR25lLFlBQVksQ0FBQ29lLHFCQUFxQixFQUFFO0lBQy9ELElBQUlDLFFBQTRCLEdBQUdILFlBQVksSUFBSSxFQUFFO0lBQ3JEO0lBQ0EsSUFBSVYsVUFBVSxFQUFFO01BQ2ZhLFFBQVEsR0FBR0EsUUFBUSxDQUFDelYsTUFBTSxDQUN6QixDQUFDNFUsVUFBVSxDQUFDeFcsY0FBYyxJQUFJLEVBQUUsRUFBRTZLLEdBQUcsQ0FBQyxNQUFPeFIsTUFBTSxJQUFLOGQsa0JBQWtCLENBQUNHLGFBQWEsQ0FBQ2plLE1BQU0sRUFBRW1kLFVBQVUsQ0FBQ3hjLE9BQU8sRUFBRVksT0FBTyxDQUFDLENBQUMsRUFDOUg0YixVQUFVLENBQUNqWCxlQUFlLEdBQUc0WCxrQkFBa0IsQ0FBQ2hDLGtCQUFrQixDQUFDcUIsVUFBVSxDQUFDalgsZUFBZSxFQUFFaVgsVUFBVSxDQUFDeGMsT0FBTyxFQUFFWSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQ2hJO01BRUQsSUFBSTRiLFVBQVUsQ0FBQ2pYLGVBQWUsRUFBRTtRQUMvQixJQUFJO1VBQ0gsTUFBTXRGLE9BQU8sQ0FBQ3lWLEdBQUcsQ0FBQzJILFFBQVEsQ0FBQztVQUMzQixJQUFJcGUsVUFBVSxDQUFDa0gscUJBQXFCLElBQUlsSCxVQUFVLENBQUNpSCxvQkFBb0IsRUFBRTtZQUN4RW5JLGFBQWEsQ0FBQzhNLG1CQUFtQixDQUNoQzVMLFVBQVUsQ0FBQ2lILG9CQUFvQixFQUMvQjRFLElBQUksQ0FBQ0MsS0FBSyxDQUFDOUwsVUFBVSxDQUFDa0gscUJBQXFCLENBQUMsRUFDNUNsSCxVQUFVLENBQUNzRixhQUFhLEVBQ3hCLE9BQU8sQ0FDUDtVQUNGO1VBQ0E7UUFDRCxDQUFDLENBQUMsT0FBT2dMLEtBQWMsRUFBRTtVQUN4QnVGLEdBQUcsQ0FBQ3ZGLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRUEsS0FBSyxDQUFXO1FBQ2xFO01BQ0Q7SUFDRDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTWlHLFVBQVUsR0FBRztJQUNsQjdZLGVBQWUsRUFBRUEsZUFBZTtJQUNoQ2tDLGdCQUFnQixFQUFFQSxnQkFBZ0I7SUFDbENpQixpQkFBaUIsRUFBRUEsaUJBQWlCO0lBQ3BDUSxrQkFBa0IsRUFBRUEsa0JBQWtCO0lBQ3RDc1ksa0NBQWtDLEVBQUVBLGtDQUFrQztJQUN0RTRCLGlEQUFpRCxFQUFFQSxpREFBaUQ7SUFDcEcrQyx1Q0FBdUMsRUFBRTVaLHdDQUF3QztJQUNqRjZaLDRCQUE0QixFQUFFNUwsNkJBQTZCO0lBQzNEL0ksa0NBQWtDLEVBQUVBLGtDQUFrQztJQUN0RTNCLHFCQUFxQixFQUFFQSxxQkFBcUI7SUFDNUNrVSxvQkFBb0IsRUFBRUE7RUFDdkIsQ0FBQztFQUFDLE9BRWE1RixVQUFVO0FBQUEifQ==
997
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zdGFudHMiLCJGRUxpYnJhcnkiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJBY3Rpb24iLCJNZXNzYWdlQm94IiwiY2FsbEJvdW5kQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJjb250ZXh0cyIsIm9Nb2RlbCIsIm9BcHBDb21wb25lbnQiLCJtUGFyYW1ldGVycyIsImxlbmd0aCIsIkVycm9yIiwiaXNDYWxsZWRXaXRoQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJhQ29udGV4dHMiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImlzQ3JpdGljYWxBY3Rpb24iLCJBY3Rpb25SdW50aW1lIiwiZ2V0SXNBY3Rpb25Dcml0aWNhbCIsImV4dHJhY3RTaW5nbGVSZXN1bHQiLCJyZXN1bHQiLCJzdGF0dXMiLCJ2YWx1ZSIsInJlYXNvbiIsImNvbnZlcnRlZFR5cGVzIiwiY29udmVydFR5cGVzIiwiY29udmVydGVkQWN0aW9uIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJjYWxsQWN0aW9uIiwiZSIsImNhbGxBY3Rpb25JbXBvcnQiLCJhY3Rpb25OYW1lIiwibW9kZWwiLCJhcHBDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwibWV0YU1vZGVsIiwiYWN0aW9uUGF0aCIsImNvbnZlcnRlZEFjdGlvbkltcG9ydCIsImFjdGlvbiIsInVuYm91bmRBY3Rpb25JbmRleCIsImFjdGlvbnMiLCJmaWx0ZXIiLCJuYW1lIiwiZmluZEluZGV4IiwiaXNCb3VuZCIsImFjdGlvbk5hbWVGcm9tTW9kZWwiLCJhY3Rpb25JbXBvcnQiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0IiwiUHJvbWlzZSIsInJlamVjdCIsInNGdW5jdGlvblBhdGgiLCJvQm91bmRGdW5jdGlvbiIsIl9leGVjdXRlRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9GdW5jdGlvbkltcG9ydCIsImdldE9iamVjdCIsIm9GdW5jdGlvbiIsImZ1bmN0aW9uVG9DYWxsIiwiZ3JvdXBJZCIsImV4ZWN1dGlvblByb21pc2UiLCJleGVjdXRlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZSIsInBhcmFtZXRlciIsInVuZGVmaW5lZCIsIkJhc2VUeXBlIiwiX191aTVfcmVxdWlyZV9hc3luYyIsImRlZmF1bHQiLCJUeXBlTWFwIiwicGFyYW1ldGVyVHlwZSIsInR5cGUiLCJnZXRCYXNlVHlwZSIsIlN0cmluZyIsInR5cGVJbnN0YW5jZSIsImdldERhdGFUeXBlSW5zdGFuY2UiLCJwYXJzZVZhbHVlIiwib0FjdGlvbiIsInN0cmljdEhhbmRsaW5nVXRpbGl0aWVzIiwiaXM0MTJFeGVjdXRlZCIsInN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzIiwic3RyaWN0SGFuZGxpbmdQcm9taXNlcyIsInN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzIiwiZGVsYXlTdWNjZXNzTWVzc2FnZXMiLCJwcm9jZXNzZWRNZXNzYWdlSWRzIiwiU2V0Iiwic3RyaWN0UmVzcG9uc2VFcnJvckV4aXN0cyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInJlcGxhY2UiLCJiR3JvdXBlZCIsImludm9jYXRpb25Hcm91cGluZyIsIkNoYW5nZVNldCIsInJlc29sdmUiLCJfY29udmVydGVkQWN0aW9uJHBhcmEiLCJzQWN0aW9uTGFiZWwiLCJsYWJlbCIsImJTa2lwUGFyYW1ldGVyRGlhbG9nIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc0NyaXRpY2FsQWN0aW9uIiwic01lc3NhZ2VzUGF0aCIsImlNZXNzYWdlU2lkZUVmZmVjdCIsImlzU2FtZUVudGl0eSIsImJWYWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMiLCJhY3Rpb25EZWZpbml0aW9uIiwiYWN0aW9uUGFyYW1ldGVycyIsInNsaWNlIiwiYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nIiwiYVBhcmFtZXRlclZhbHVlcyIsInBhcmFtZXRlclZhbHVlcyIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwiZXZlcnkiLCJfcGFyYW1ldGVyJGFubm90YXRpb24iLCJfcGFyYW1ldGVyJGFubm90YXRpb24yIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJkZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsImZuT25TdWJtaXR0ZWQiLCJvblN1Ym1pdHRlZCIsImZuT25SZXNwb25zZSIsIm9uUmVzcG9uc2UiLCJhQWN0aW9uUGFyYW1ldGVycyIsImJHZXRCb3VuZENvbnRleHQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJzZWxlY3RlZEl0ZW1zIiwiX21QYXJhbWV0ZXJzJGFkZGl0aW9uIiwiY29udmVydGVkTWV0YURhdGEiLCJmaWx0ZXJlZEVudGl0eVNldCIsImVudGl0eVNldHMiLCJzaW5nbGVFbnRpdHlTZXQiLCJlbnRpdHlUeXBlIiwicmV0dXJuRW50aXR5VHlwZSIsImN1cnJlbnRFbnRpdHlTZXQiLCJyZXR1cm5Db2xsZWN0aW9uIiwic291cmNlRW50aXR5VHlwZSIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFJvb3QiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkc2VsZWN0IiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJwYXRoRXhwcmVzc2lvbnMiLCJnZXRNZXNzYWdlc1BhdGgiLCJleHAiLCJfY29udmVydGVkQWN0aW9uJHJldHUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZmluZCIsInByb3BlcnR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsIl9tUGFyYW1ldGVycyRhZGRpdGlvbjIiLCJwdXNoIiwidHJpZ2dlckFjdGlvbnMiLCJzcGxpY2UiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImlzQ3JlYXRlQWN0aW9uIiwiYk9iamVjdFBhZ2UiLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb250cm9sSWQiLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJpc1N0YXRpYyIsImlzQ29sbGVjdGlvbiIsIm9wZXJhdGlvblJlc3VsdCIsImV4ZWN1dGlvbldpdERpYWxvZyIsInBhcmFtZXRlckRpYWxvZyIsImdldENvcmVVSUZhY3RvcnkiLCJuZXdQYXJhbWV0ZXJEaWFsb2ciLCJlbnRpdHlTZXROYW1lIiwidmlldyIsIm1lc3NhZ2VIYW5kbGVyIiwiYWN0aW9uVG9CZUV4ZWN1dGVkIiwiX2V4ZWN1dGVBY3Rpb24iLCJiZWZvcmVTaG93aW5nTWVzc2FnZSIsImFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2siLCJpZ25vcmVFVGFnIiwiY3JlYXRlRGlhbG9nIiwib3BlbkRpYWxvZyIsImNvbmZpcm1Dcml0aWNhbEFjdGlvbiIsImFmdGVyQWN0aW9uUmVzb2x1dGlvbiIsImkiLCJfYVBhcmFtZXRlclZhbHVlcyRmaW4iLCJlbGVtZW50IiwiYWN0aW9uUGFyYW1ldGVyIiwicGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQiLCJfb1N0YXJ0dXBQYXJhbWV0ZXJzJGEiLCJfYWN0aW9uUGFyYW1ldGVyJGFubm8iLCJfYWN0aW9uUGFyYW1ldGVyJGFubm8yIiwiX2FjdGlvblBhcmFtZXRlciRhbm5vMyIsIlBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsIm9PcGVyYXRpb25SZXN1bHQiLCJtZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJjb25jYXQiLCJfbVBhcmFtZXRlcnMkbWVzc2FnZUgiLCJzdHJpY3RIYW5kbGluZ0ZhaWxzIiwiYUZhaWxlZENvbnRleHRzIiwiZm9yRWFjaCIsImZhaWwiLCJnZXRDb250ZXh0Iiwib0ZhaWxlZE9wZXJhdGlvblJlc3VsdCIsImFkZE1lc3NhZ2VzIiwic2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncyIsImlzQWN0aW9uU3VjY2Vzc2Z1bCIsIl9vT3BlcmF0aW9uUmVzdWx0IiwicmVzIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJvbkJlZm9yZVNob3dNZXNzYWdlIiwiYU1lc3NhZ2VzIiwic2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4iLCJhU2VsZWN0ZWRDb250ZXh0cyIsInRoZW4iLCJjbGVhclN0cmljdFdhcm5pbmdNZXNzYWdlcyIsIm9BY3Rpb25Db250ZXh0Iiwib1BhcmVudENvbnRyb2wiLCJib3VuZEFjdGlvbk5hbWUiLCJzdWZmaXhSZXNvdXJjZUtleSIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwic0NvbmZpcm1hdGlvblRleHQiLCJnZXRUZXh0IiwiY29uZmlybSIsIm9uQ2xvc2UiLCJzQWN0aW9uIiwiT0siLCJvT3BlcmF0aW9uIiwib0Vycm9yIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiJElzQm91bmQiLCJzZWxlY3RlZENvbnRleHRzIiwiZ2V0UHJvcGVydHkiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiaXNBIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkRlbGV0ZUhlbHBlciIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiZmlsdGVyQVBEYW5kQ29udGV4dE1lc3NhZ2VzIiwiZXJyb3JUYXJnZXRzSW5BUEQiLCJ1bmJvdW5kTWVzc2FnZXMiLCJpc0FQRE9QZW4iLCJyZW1vdmVDb250ZXh0TWVzc2FnZXNmcm9tTW9kZWwiLCJjb250YWluc0JvdW5kVHJhbnNpc3Rpb24iLCJnZXRNb2RlbCIsInJlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibWVzc2FnZXNUb1Nob3ciLCJzaG93TWVzc2FnZUluRGlhbG9nIiwib0RpYWxvZyIsInNob3dNZXNzYWdlQm94Iiwib0NvbnRyb2wiLCJvUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJtZXNzYWdlIiwiX21lc3NhZ2UkZ2V0VGFyZ2V0cyIsImdldFRhcmdldHMiLCJBUERtZXNzYWdlcyIsIl9tZXNzYWdlJGdldFRhcmdldHMyIiwiX21QYXJhbWV0ZXJzJGFBY3Rpb25QIiwic29tZSIsImFjdGlvblBhcmFtIiwiX21lc3NhZ2UkZ2V0VGFyZ2V0czMiLCJBUERNZXNzYWdlIiwiaXNBUERUYXJnZXQiLCJzTWVzc2FnZSIsInNEZXNjcmlwdGlvblRleHQiLCJtZXNzYWdlTW9kZWwiLCJtZXNzYWdlc0luTW9kZWwiLCJhQm91bmRNZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiZ2VuZXJpY01lc3NhZ2UiLCJpc0VkaXRhYmxlIiwibm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5EaWFsb2ciLCJnZXRUeXBlIiwibm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCIsInNldE1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiTWVzc2FnZSIsIk1lc3NhZ2VUeXBlIiwicGVyc2lzdGVudCIsImRlc2NyaXB0aW9uIiwiY29kZSIsInVuc2hpZnQiLCJpc09wZW4iLCJjbG9zZSIsImRlc3Ryb3kiLCJmaWx0ZXJlZE1lc3NhZ2VzIiwiYklzQVBET3BlbiIsImZuR2V0TWVzc2FnZVN1YnRpdGxlIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwiYmluZCIsInNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZyIsImV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMiLCJzR3JvdXBJZCIsImlDb250ZXh0TGVuZ3RoIiwiY3VycmVudF9jb250ZXh0X2luZGV4IiwiaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUiLCJpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0Iiwib0FjdGlvblByb21pc2UiLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJfb1Byb3BlcnR5JCIsInNQYXRoIiwic01ldGFQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJvcGVyYXRpb25zSGVscGVyIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwib3BlcmF0aW9ucyIsInVwZGF0ZTQxMlRyYW5zaXRpb25NZXNzYWdlcyIsInJlYWxSZXN1bHQiLCJjYXRjaCIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIm9ubHlTdWNjZXNzTWVzc2FnZXMiLCJhcmd1bWVudHMiLCJ1blByb2Nlc3NlZE1lc3NhZ2VzIiwicmVkdWNlIiwiYWNjIiwiaGFzIiwiZ2V0SWQiLCJuZXdUcmFuc2l0aW9uRXJyb3JNZXNzYWdlc0lkIiwiZ2V0UGVyc2lzdGVudCIsIlN1Y2Nlc3MiLCJtYXAiLCJmcm9tIiwiT2JqZWN0IiwidmFsdWVzIiwiY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbiIsIm9Mb2NhbEFjdGlvblByb21pc2UiLCJMb2ciLCJlcnJvciIsInNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImRlZmF1bHRWYWx1ZXMiLCJzZXRQYXJhbWV0ZXIiLCJhQWN0aW9uUHJvbWlzZXMiLCJvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdCIsImZuRXhlY3V0ZUFjdGlvbiIsImFjdGlvbkNvbnRleHQiLCJvU2lkZUVmZmVjdCIsImluZGl2aWR1YWxBY3Rpb25Qcm9taXNlIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImZuUmVxdWVzdFNpZGVFZmZlY3RzIiwiYWxsU2V0dGxlZCIsImZuRXhlY3V0ZVNpbmdsZUFjdGlvbiIsImZuRXhlY3V0ZUNoYW5nZXNldCIsImFDaGFuZ2VTZXRMb2NhbFByb21pc2VzIiwibm9vcCIsInJlbmRlck1lc3NhZ2VWaWV3Iiwic2hQcm9taXNlIiwic2V0RGF0YSIsImZuSGFuZGxlUmVzdWx0cyIsImZuRXhlY3V0ZVNlcXVlbnRpYWxseSIsImNvbnRleHRzVG9FeGVjdXRlIiwicHJvY2Vzc09uZUFjdGlvbiIsImFjdGlvbkluZGV4IiwiX21QYXJhbWV0ZXJzJGNvbnRyb2wiLCJfbVBhcmFtZXRlcnMkY29udHJvbCQiLCJfbVBhcmFtZXRlcnMkY29udHJvbCQyIiwiaW5pdGlhbFRhYmxlQ29udGV4dCIsImdldFJvd0JpbmRpbmciLCJjYWxsIiwiZ2V0SGVhZGVyQ29udGV4dCIsInByb21pc2UiLCJpZCIsImZpbmFsbHkiLCJhbGxQcm9taXNlIiwic2lkZUVmZmVjdCIsImFsbCIsImN1cnJlbnRQcm9taXNlVmFsdWVzIiwiY3VycmVudFByb21pc2VWYWx1ZSIsIl9vQWN0aW9uJGdldEJvdW5kQ29udCIsIl9vQWN0aW9uIiwiX29BY3Rpb24kZ2V0Qm91bmRDb250MiIsImhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMiLCJfcGFyYW1ldGVyJGFubm90YXRpb24zIiwiX3BhcmFtZXRlciRhbm5vdGF0aW9uNCIsIl9wYXJhbWV0ZXIkYW5ub3RhdGlvbjUiLCJfcGFyYW1ldGVyJGFubm90YXRpb242IiwiX3BhcmFtZXRlciRhbm5vdGF0aW9uNyIsIl9wYXJhbWV0ZXIkYW5ub3RhdGlvbjgiLCJfcGFyYW1ldGVyJGFubm90YXRpb245IiwiX3BhcmFtZXRlciRhbm5vdGF0aW9uMTAiLCJmaWVsZENvbnRyb2wiLCJDb21tb24iLCJGaWVsZENvbnRyb2wiLCJpc01hbmRhdG9yeSIsInRvU3RyaW5nIiwicGFyYW1ldGVyVmFsdWUiLCJsb2NhbFByb21pc2UiLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJwcm9taXNlcyIsImV4ZWN1dGVBY3Rpb24iLCJ2YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImZhY2FkZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG5cdEFjdGlvbkltcG9ydCxcblx0QWN0aW9uUGFyYW1ldGVyLFxuXHRBY3Rpb24gYXMgRWRtQWN0aW9uLFxuXHRBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLFxuXHRQcmltaXRpdmVUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB0eXBlIHsgU2hvd01lc3NhZ2VQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIHR5cGUgTWV0YU1vZGVsQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgRGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEl0ZW0gZnJvbSBcInNhcC91aS9tZGMvZmllbGQvTXVsdGlWYWx1ZUZpZWxkSXRlbVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uLy4uLy4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IG9wZXJhdGlvbnNIZWxwZXIsIHsgdHlwZSBTdHJpY3RIYW5kbGluZ1BhcmFtZXRlcnMsIHR5cGUgU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgfSBmcm9tIFwiLi4vLi4vLi4vb3BlcmF0aW9uc0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uLy4uL01lc3NhZ2VIYW5kbGVyXCI7XG5jb25zdCBDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHRJbnZvY2F0aW9uR3JvdXBpbmcgPSBGRUxpYnJhcnkuSW52b2NhdGlvbkdyb3VwaW5nO1xuY29uc3QgQWN0aW9uID0gTWVzc2FnZUJveC5BY3Rpb247XG5cbmV4cG9ydCB0eXBlIEFjdGlvblJlc3BvbnNlID0gdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD5bXTtcblxuZXhwb3J0IHR5cGUgU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMgPSB7XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRmbk9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0Zm5PblJlc3BvbnNlOiBGdW5jdGlvbjtcblx0YWN0aW9uTmFtZTogc3RyaW5nO1xuXHRtb2RlbDogT0RhdGFNb2RlbDtcblx0YUFjdGlvblBhcmFtZXRlcnM6IEVkbUFjdGlvblBhcmFtZXRlcltdO1xuXHRkZWZhdWx0UGFyYW1ldGVyc1ZhbHVlczogUmVjb3JkPHN0cmluZywgUHJpbWl0aXZlVHlwZT47XG5cdGJHZXRCb3VuZENvbnRleHQ/OiBib29sZWFuO1xuXHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHRzZWxlY3RlZEl0ZW1zOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W107XG5cdG1CaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdGJHcm91cGVkPzogYm9vbGVhbjtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW47XG5cdGJJc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdGlzU3RhdGljPzogYm9vbGVhbjtcblx0Y29udHJvbD86IENvbnRyb2w7XG5cdG9EaWFsb2c/OiBEaWFsb2c7XG5cdHJlcXVlc3RTaWRlRWZmZWN0cz86IEZ1bmN0aW9uO1xuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZT86IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQ2FsbEFjdGlvblBhcmFtZXRlcnMgPSB7XG5cdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W107XG5cdGxhYmVsPzogc3RyaW5nO1xuXHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0b25TdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xuXHRvblJlc3BvbnNlOiBGdW5jdGlvbjtcblx0cGFyZW50Q29udHJvbDogVmlldztcblx0Y29udHJvbD86IENvbnRyb2w7XG5cdGJJc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0Yk9iamVjdFBhZ2U/OiBib29sZWFuO1xuXHRpc0NyaXRpY2FsQWN0aW9uPzogYm9vbGVhbjtcblx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0dmlldzogVmlldyB8IG51bGw7XG59ICYge1xuXHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xufSAmIHtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRhQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRzZWxlY3RlZEl0ZW1zPzogT0RhdGFWNENvbnRleHRbXTtcblx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdG1CaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcbn07XG5cbnR5cGUgQmFzZVR5cGVQYXJhbWV0ZXIgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBjb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgT0RhdGEgTW9kZWxcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQsIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaWdub3JlRVRhZ10gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdGlmICghY29udGV4dHMgfHwgY29udGV4dHMubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly9JbiBGcmVlc3R5bGUgYXBwcyBib3VuZCBhY3Rpb25zIGNhbiBoYXZlIG5vIGNvbnRleHRcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZCBhY3Rpb25zIGFsd2F5cyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgY29udGV4dFwiKTtcblx0fVxuXG5cdGNvbnN0IGlzQ2FsbGVkV2l0aEFycmF5ID0gQXJyYXkuaXNBcnJheShjb250ZXh0cyk7XG5cdC8vIHRoaXMgbWV0aG9kIGVpdGhlciBhY2NlcHRzIHNpbmdsZSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzXG5cdC8vIFRPRE86IFJlZmFjdG9yIHRvIGFuIHVuYW1iaWd1b3MgQVBJXG5cdC8vIGluIGNhc2Ugb2Ygc2luZ2xlIGNvbnRleHQgd3JhcCBpbnRvIGFuIGFycmF5IGZvciBjYWxsZWQgbWV0aG9kcyAoZXNwLiBjYWxsQWN0aW9uKVxuXHRtUGFyYW1ldGVycy5hQ29udGV4dHMgPSBBcnJheS5pc0FycmF5KGNvbnRleHRzKSA/IGNvbnRleHRzIDogW2NvbnRleHRzXTtcblxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdC8vIEFuYWx5emluZyBtZXRhTW9kZWxQYXRoIGZvciBhY3Rpb24gb25seSBmcm9tIGZpcnN0IGNvbnRleHQgc2VlbXMgd2VpcmQsIGJ1dCBwcm9iYWJseSB3b3JrcyBpbiBhbGwgZXhpc3Rpbmcgc2NlbmFyaW9zIC0gaWYgc2V2ZXJhbCBjb250ZXh0cyBhcmUgcGFzc2VkLCB0aGV5IHByb2JhYmx5XG5cdFx0Ly8gYmVsb25nIHRvIHRoZSBzYW1lIG1ldGFtb2RlbHBhdGguIFRPRE86IENoZWNrLCB3aGV0aGVyIHRoaXMgY2FuIGJlIGltcHJvdmVkIC8gc2NlbmFyaW9zIHdpdGggZGlmZmVyZW50IG1ldGFNb2RlbFBhdGhzIG1pZ2h0IGV4aXN0XG5cdFx0c0FjdGlvblBhdGggPSBgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG1QYXJhbWV0ZXJzLmFDb250ZXh0c1swXS5nZXRQYXRoKCkpfS8ke3NBY3Rpb25OYW1lfWAsXG5cdFx0b0JvdW5kQWN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzQWN0aW9uUGF0aH0vQCR1aTUub3ZlcmxvYWQvMGApITtcblx0bVBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGF3YWl0IEFjdGlvblJ1bnRpbWUuZ2V0SXNBY3Rpb25Dcml0aWNhbChvTWV0YU1vZGVsLCBzQWN0aW9uUGF0aCwgbVBhcmFtZXRlcnMuYUNvbnRleHRzKTtcblxuXHQvLyBQcm9taXNlIHJldHVybmVkIGJ5IGNhbGxBY3Rpb24gY3VycmVudGx5IGlzIHJlamVjdGVkIGluIGNhc2Ugb2YgZXhlY3V0aW9uIGZvciBtdWx0aXBsZSBjb250ZXh0cyBwYXJ0bHkgZmFpbGluZy4gVGhpcyBzaG91bGQgYmUgY2hhbmdlZCAoc29tZSBmYWlsaW5nIGNvbnRleHRzIGRvIG5vdCBtZWFuXG5cdC8vIHRoYXQgZnVuY3Rpb24gZGlkIG5vdCBmdWxmaWxsIGl0cyB0YXNrKSwgYnV0IGFzIHRoaXMgaXMgYSBiaWdnZXIgcmVmYWN0b3JpbmcsIGZvciB0aGUgdGltZSBiZWluZyB3ZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGF0IGF0IHRoZSBjYWxsaW5nIHBsYWNlIChpLmUuIGhlcmUpXG5cdC8vID0+IHByb3ZpZGUgdGhlIHNhbWUgaGFuZGxlciAobWFwcGluZyBiYWNrIGZyb20gYXJyYXkgdG8gc2luZ2xlIHJlc3VsdC9lcnJvciBpZiBuZWVkZWQpIGZvciByZXNvbHZlZC9yZWplY3RlZCBjYXNlXG5cdGNvbnN0IGV4dHJhY3RTaW5nbGVSZXN1bHQgPSBmdW5jdGlvbiAocmVzdWx0OiBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSk6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBzaW5nbGUgYWN0aW9uIGNvdWxkIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkXG5cdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHtcblx0XHRcdHJldHVybiByZXN1bHRbMF0udmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEluIGNhc2Ugb2YgZGlhbG9nIGNhbmNlbGxhdGlvbiwgbm8gYXJyYXkgaXMgcmV0dXJuZWQgPT4gdGhyb3cgdGhlIHJlc3VsdC5cblx0XHRcdC8vIElkZWFsbHksIGRpZmZlcmVudGlhdGluZyBzaG91bGQgbm90IGJlIG5lZWRlZCBoZXJlID0+IFRPRE86IEZpbmQgYmV0dGVyIHNvbHV0aW9uIHdoZW4gc2VwYXJhdGluZyBkaWFsb2cgaGFuZGxpbmcgKHNpbmdsZSBvYmplY3Qgd2l0aCBzaW5nbGUgcmVzdWx0KSBmcm9tIGJhY2tlbmRcblx0XHRcdC8vIGV4ZWN1dGlvbiAocG90ZW50aWFsbHkgbXVsdGlwbGUgb2JqZWN0cylcblx0XHRcdHRocm93IHJlc3VsdFswXS5yZWFzb24gfHwgcmVzdWx0O1xuXHRcdH1cblx0fTtcblx0Y29uc3QgY29udmVydGVkVHlwZXMgPSBjb252ZXJ0VHlwZXMob01vZGVsLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGg8RWRtQWN0aW9uIHwgdW5kZWZpbmVkPihvQm91bmRBY3Rpb24uZ2V0UGF0aCgpKS50YXJnZXQ7XG5cdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBib3VuZCBhY3Rpb25cIik7XG5cdH1cblx0dHJ5IHtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsQWN0aW9uKGNvbnZlcnRlZEFjdGlvbiwgb01vZGVsLCBvQm91bmRBY3Rpb24sIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcblx0XHRpZiAoaXNDYWxsZWRXaXRoQXJyYXkpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBleHRyYWN0U2luZ2xlUmVzdWx0KHJlc3VsdCBhcyBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dD5bXSk7XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKGlzQ2FsbGVkV2l0aEFycmF5KSB7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZXh0cmFjdFNpbmdsZVJlc3VsdChlIGFzIFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0PltdKTtcblx0XHR9XG5cdH1cbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gaW1wb3J0IHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG1vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuICogQHBhcmFtIFtwYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5pZ25vcmVFVGFnXSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb25JbXBvcnQoXG5cdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0bW9kZWw6IE9EYXRhTW9kZWwsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRwYXJhbWV0ZXJzOiB7XG5cdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXTtcblx0XHRsYWJlbD86IHN0cmluZztcblx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0PzogQWN0aW9uU2lkZUVmZmVjdHNUeXBlO1xuXHRcdG9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0XHRvblJlc3BvbnNlOiBGdW5jdGlvbjtcblx0XHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXI7XG5cdFx0Yk9iamVjdFBhZ2U/OiBib29sZWFuO1xuXHRcdHNlbGVjdGVkSXRlbXM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdHZpZXc6IFZpZXcgfCBudWxsO1xuXHR9ICYge1xuXHRcdGlzQ3JpdGljYWxBY3Rpb24/OiBib29sZWFuO1xuXHR9XG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBhY3Rpb25QYXRoID0gYC8ke2FjdGlvbk5hbWV9YDtcblx0Y29uc3QgY29udmVydGVkVHlwZXMgPSBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKTtcblx0Y29uc3QgY29udmVydGVkQWN0aW9uSW1wb3J0ID0gY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGg8QWN0aW9uSW1wb3J0IHwgdW5kZWZpbmVkPihhY3Rpb25QYXRoKS50YXJnZXQsXG5cdFx0Y29udmVydGVkQWN0aW9uID0gY29udmVydGVkQWN0aW9uSW1wb3J0Py5hY3Rpb247XG5cdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHVuYm91bmRBY3Rpb25JbmRleCA9IGNvbnZlcnRlZFR5cGVzLmFjdGlvbnNcblx0XHRcdC5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLm5hbWUgPT09IGNvbnZlcnRlZEFjdGlvbi5uYW1lKVxuXHRcdFx0LmZpbmRJbmRleCgoYWN0aW9uKSA9PiAhYWN0aW9uLmlzQm91bmQpLFxuXHRcdGFjdGlvbk5hbWVGcm9tTW9kZWwgPSBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uTmFtZSxcblx0XHRhY3Rpb25JbXBvcnQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke2FjdGlvbk5hbWVGcm9tTW9kZWx9LyR7dW5ib3VuZEFjdGlvbkluZGV4fWApO1xuXHRwYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwobWV0YU1vZGVsLCBgJHthY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZGApO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uLCBtb2RlbCwgYWN0aW9uSW1wb3J0LCBhcHBDb21wb25lbnQsIHBhcmFtZXRlcnMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0LCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YCxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24sIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPHZvaWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBDb250ZXh0IHwgbnVsbCxcblx0Y29udGV4dD86IENvbnRleHRcbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFvRnVuY3Rpb24/LmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0Y29uc3QgZnVuY3Rpb25Ub0NhbGw6IE9EYXRhQ29udGV4dEJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7Y29udGV4dD8uZ2V0UGF0aCgpID8/IFwiXCJ9LyR7c0Z1bmN0aW9uTmFtZX0oLi4uKWApO1xuXHRjb25zdCBncm91cElkID0gY29udGV4dCA/IFwiZnVuY3Rpb25Hcm91cFwiIDogXCJmdW5jdGlvbkltcG9ydFwiO1xuXHRjb25zdCBleGVjdXRpb25Qcm9taXNlID0gZnVuY3Rpb25Ub0NhbGwuZXhlY3V0ZShncm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRhd2FpdCBleGVjdXRpb25Qcm9taXNlO1xuXHRyZXR1cm4gZnVuY3Rpb25Ub0NhbGwuZ2V0Qm91bmRDb250ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGFyYW1ldGVyVHlwZUFuZFJldHVybkNvbnZlcnRlZFZhbHVlKFxuXHRwYXJhbWV0ZXI6IEFjdGlvblBhcmFtZXRlcixcblx0dmFsdWU/OiBCYXNlVHlwZVBhcmFtZXRlciB8IG51bGxcbik6IFByb21pc2U8QmFzZVR5cGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQgfCBudWxsPiB7XG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGNvbnN0IEJhc2VUeXBlID0gKGF3YWl0IGltcG9ydChcInNhcC91aS9tZGMvZW51bXMvQmFzZVR5cGVcIikpLmRlZmF1bHQ7XG5cdGNvbnN0IFR5cGVNYXAgPSAoYXdhaXQgaW1wb3J0KFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCIpKS5kZWZhdWx0O1xuXHRjb25zdCBwYXJhbWV0ZXJUeXBlID0gKFxuXHRcdHBhcmFtZXRlciBhcyB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdH1cblx0KS50eXBlXG5cdFx0PyBUeXBlTWFwLmdldEJhc2VUeXBlKFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0cGFyYW1ldGVyIGFzIHtcblx0XHRcdFx0XHRcdG5hbWU6IHN0cmluZztcblx0XHRcdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkudHlwZVxuXHRcdCAgKVxuXHRcdDogQmFzZVR5cGUuU3RyaW5nO1xuXHRjb25zdCB0eXBlSW5zdGFuY2UgPSBUeXBlTWFwLmdldERhdGFUeXBlSW5zdGFuY2UocGFyYW1ldGVyVHlwZSk7XG5cdHJldHVybiB0eXBlSW5zdGFuY2UucGFyc2VWYWx1ZSh2YWx1ZSwgXCJzdHJpbmdcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb24oXG5cdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BY3Rpb246IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdGxldCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllczogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgPSB7XG5cdFx0aXM0MTJFeGVjdXRlZDogZmFsc2UsXG5cdFx0c3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHM6IFtdLFxuXHRcdHN0cmljdEhhbmRsaW5nUHJvbWlzZXM6IFtdLFxuXHRcdHN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzOiBbXSxcblx0XHRkZWxheVN1Y2Nlc3NNZXNzYWdlczogW10sXG5cdFx0cHJvY2Vzc2VkTWVzc2FnZUlkczogbmV3IFNldDxzdHJpbmc+KCksXG5cdFx0c3RyaWN0UmVzcG9uc2VFcnJvckV4aXN0czogZmFsc2Vcblx0fTtcblx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBjb252ZXJ0ZWRBY3Rpb24uaXNCb3VuZFxuXHRcdD8gY29udmVydGVkQWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKC9cXCguKlxcKSQvZywgXCJcIikgLy8gcmVtb3ZlIHRoZSBwYXJ0IHJlbGF0ZWQgdG8gdGhlIG92ZXJsYXlcblx0XHQ6IGNvbnZlcnRlZEFjdGlvbi5uYW1lO1xuXHRtUGFyYW1ldGVycy5iR3JvdXBlZCA9IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyA9PT0gSW52b2NhdGlvbkdyb3VwaW5nLkNoYW5nZVNldDtcblx0cmV0dXJuIG5ldyBQcm9taXNlPEFjdGlvblJlc3BvbnNlPihhc3luYyBmdW5jdGlvbiAoXG5cdFx0cmVzb2x2ZTogKHZhbHVlOiBBY3Rpb25SZXNwb25zZSkgPT4gdm9pZCxcblx0XHRyZWplY3Q6IChyZWFzb24/OiBFcnJvciB8IEFjdGlvblJlc3BvbnNlKSA9PiB2b2lkXG5cdCkge1xuXHRcdGNvbnN0IHNBY3Rpb25MYWJlbCA9IG1QYXJhbWV0ZXJzLmxhYmVsO1xuXHRcdGxldCBiU2tpcFBhcmFtZXRlckRpYWxvZyA9IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2c7XG5cdFx0Y29uc3QgYUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzO1xuXHRcdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0XHRjb25zdCBiSXNDcml0aWNhbEFjdGlvbiA9IG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb247XG5cdFx0bGV0IG9NZXRhTW9kZWw7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg6IHN0cmluZztcblx0XHRsZXQgaU1lc3NhZ2VTaWRlRWZmZWN0O1xuXHRcdGxldCBpc1NhbWVFbnRpdHk7XG5cdFx0bGV0IGJWYWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnM7XG5cdFx0Y29uc3QgYWN0aW9uRGVmaW5pdGlvbiA9IG9BY3Rpb24uZ2V0T2JqZWN0KCkgYXMgTWV0YU1vZGVsQWN0aW9uO1xuXG5cdFx0Ly9pbiBjYXNlIG9mIGJvdW5kIGFjdGlvbnMsIGlnbm9yZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCBjb25zaWRlciB0aGUgcmVzdFxuXHRcdGNvbnN0IGFjdGlvblBhcmFtZXRlcnMgPSBjb252ZXJ0ZWRBY3Rpb24uaXNCb3VuZCA/IGNvbnZlcnRlZEFjdGlvbi5wYXJhbWV0ZXJzLnNsaWNlKDEpIDogY29udmVydGVkQWN0aW9uLnBhcmFtZXRlcnM7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGhhcyBwYXJhbWV0ZXJzIGFuZCB3b3VsZCBuZWVkIGEgcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdC8vIFRoZSBwYXJhbWV0ZXIgUmVzdWx0SXNBY3RpdmVFbnRpdHkgaXMgYWx3YXlzIGhpZGRlbiBpbiB0aGUgZGlhbG9nISBIZW5jZSBpZlxuXHRcdC8vIHRoaXMgaXMgdGhlIG9ubHkgcGFyYW1ldGVyLCB0aGlzIGlzIHRyZWF0ZWQgYXMgbm8gcGFyYW1ldGVyIGhlcmUgYmVjYXVzZSB0aGVcblx0XHQvLyBkaWFsb2cgd291bGQgYmUgZW1wdHkhXG5cdFx0Ly8gRklYTUU6IFNob3VsZCBvbmx5IGlnbm9yZSB0aGlzIGlmIHRoaXMgaXMgYSAnY3JlYXRlJyBhY3Rpb24sIG90aGVyd2lzZSBpdCBpcyBqdXN0IHNvbWUgbm9ybWFsIHBhcmFtZXRlciB0aGF0IGhhcHBlbnMgdG8gaGF2ZSB0aGlzIG5hbWVcblx0XHRjb25zdCBiQWN0aW9uTmVlZHNQYXJhbWV0ZXJEaWFsb2cgPVxuXHRcdFx0YWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwICYmICEoYWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDEgJiYgYWN0aW9uUGFyYW1ldGVyc1swXS5uYW1lID09PSBcIlJlc3VsdElzQWN0aXZlRW50aXR5XCIpO1xuXG5cdFx0Ly8gUHJvdmlkZWQgdmFsdWVzIGZvciB0aGUgYWN0aW9uIHBhcmFtZXRlcnMgZnJvbSBpbnZva2VBY3Rpb24gY2FsbFxuXHRcdGNvbnN0IGFQYXJhbWV0ZXJWYWx1ZXMgPSBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXM7XG5cblx0XHQvLyBEZXRlcm1pbmUgc3RhcnR1cCBwYXJhbWV0ZXJzIGlmIHByb3ZpZGVkXG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSBvQXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9O1xuXG5cdFx0Ly8gSWYgYWxsIHBhcmFtZXRlcnMgYXJlIGhpZGRlbiAgYW5kIGFsbCBtYW5kYXRvcnkgcGFyYW1ldGVycyB2YWx1ZXMgYXJlIGF2YWlsYWJsZSwgdGhlbiB3ZSBza2lwIHRoZSBkaWFsb2cuXG5cdFx0YlNraXBQYXJhbWV0ZXJEaWFsb2cgPVxuXHRcdFx0YWN0aW9uUGFyYW1ldGVycy5sZW5ndGggJiYgYWN0aW9uUGFyYW1ldGVycy5ldmVyeSgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIuYW5ub3RhdGlvbnMuVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKVxuXHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0OiBiU2tpcFBhcmFtZXRlckRpYWxvZztcblx0XHQvLyBJbiBjYXNlIGFuIGFjdGlvbiBwYXJhbWV0ZXIgaXMgbmVlZGVkLCBhbmQgd2Ugc2hhbGwgc2tpcCB0aGUgZGlhbG9nLCBjaGVjayBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgcGFyYW1ldGVyc1xuXHRcdGlmIChiQWN0aW9uTmVlZHNQYXJhbWV0ZXJEaWFsb2cgJiYgYlNraXBQYXJhbWV0ZXJEaWFsb2cpIHtcblx0XHRcdGJWYWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMgPSBfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzKFxuXHRcdFx0XHQhIWJJc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0YWN0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0YVBhcmFtZXRlclZhbHVlcyxcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIERlcGVuZGluZyBvbiB0aGUgcHJldmlvdXNseSBkZXRlcm1pbmVkIGRhdGEsIGVpdGhlciBzZXQgYSBkaWFsb2cgb3IgbGVhdmUgaXQgZW1wdHkgd2hpY2hcblx0XHQvLyB3aWxsIGxlYWQgdG8gZGlyZWN0IGV4ZWN1dGlvbiBvZiB0aGUgYWN0aW9uIHdpdGhvdXQgYSBkaWFsb2dcblxuXHRcdGNvbnN0IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyA9IHtcblx0XHRcdGRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzOiB7fSxcblx0XHRcdGFwcENvbXBvbmVudDogb0FwcENvbXBvbmVudCxcblx0XHRcdGZuT25TdWJtaXR0ZWQ6IG1QYXJhbWV0ZXJzLm9uU3VibWl0dGVkLFxuXHRcdFx0Zm5PblJlc3BvbnNlOiBtUGFyYW1ldGVycy5vblJlc3BvbnNlLFxuXHRcdFx0YWN0aW9uTmFtZTogc0FjdGlvbk5hbWUsXG5cdFx0XHRhQ29udGV4dHM6IFtdLFxuXHRcdFx0bW9kZWw6IG9Nb2RlbCxcblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzOiBhY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLFxuXHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0c2VsZWN0ZWRJdGVtczogbVBhcmFtZXRlcnMuc2VsZWN0ZWRJdGVtcyFcblx0XHR9O1xuXHRcdGlmIChjb252ZXJ0ZWRBY3Rpb24uaXNCb3VuZCkge1xuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdFx0Y29uc3QgY29udmVydGVkTWV0YURhdGEgPSBjb252ZXJ0VHlwZXMob01ldGFNb2RlbCk7XG5cdFx0XHRjb25zdCBmaWx0ZXJlZEVudGl0eVNldCA9IGNvbnZlcnRlZE1ldGFEYXRhLmVudGl0eVNldHMuZmlsdGVyKFxuXHRcdFx0XHQoc2luZ2xlRW50aXR5U2V0KSA9PiBzaW5nbGVFbnRpdHlTZXQuZW50aXR5VHlwZSA9PT0gY29udmVydGVkQWN0aW9uLnJldHVybkVudGl0eVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gZmlsdGVyZWRFbnRpdHlTZXQubGVuZ3RoID4gMCA/IGZpbHRlcmVkRW50aXR5U2V0WzBdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpc1NhbWVFbnRpdHkgPVxuXHRcdFx0XHQhY29udmVydGVkQWN0aW9uLnJldHVybkNvbGxlY3Rpb24gJiZcblx0XHRcdFx0Y29udmVydGVkQWN0aW9uLnJldHVybkVudGl0eVR5cGUgJiZcblx0XHRcdFx0Y29udmVydGVkQWN0aW9uLnNvdXJjZUVudGl0eVR5cGUgPT09IGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlO1xuXG5cdFx0XHRpZiAoaXNTYW1lRW50aXR5ICYmIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGN1cnJlbnRFbnRpdHlTZXQpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA/Pz0ge307XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Rcblx0XHRcdFx0XHQ/IGAke21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0fSxIYXNBY3RpdmVFbnRpdHlgXG5cdFx0XHRcdFx0OiBcIkhhc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q/LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIGFDb250ZXh0cyFbMF0uZ2V0UGF0aCgpKSE7XG5cblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHQvLyAnKicgZWZmZWN0aXZlbHkgaW5jbHVkZXMgdGhlIG1lc3NhZ2VzIHBhdGggaWYgdGhlcmUgaXMgb25lXG5cdFx0XHRcdFx0aU1lc3NhZ2VTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLmZpbmRJbmRleChcblx0XHRcdFx0XHRcdChleHApID0+IHR5cGVvZiBleHAgPT09IFwic3RyaW5nXCIgJiYgKGV4cCA9PT0gc01lc3NhZ2VzUGF0aCB8fCBleHAgPT09IFwiKlwiKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHQvLyBBZGQgU0FQX01lc3NhZ2VzIGJ5IGRlZmF1bHQgaWYgbm90IGFubm90YXRlZCBieSBzaWRlIGVmZmVjdHMsIGFjdGlvbiBkb2VzIG5vdCByZXR1cm4gYSBjb2xsZWN0aW9uIGFuZFxuXHRcdFx0XHRcdC8vIHRoZSByZXR1cm4gdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgYm91bmQgdHlwZVxuXHRcdFx0XHRcdGlmIChpTWVzc2FnZVNpZGVFZmZlY3QgPiAtMSB8fCBpc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBtZXNzYWdlIHBhdGggaXMgYW5ub3RhdGVkIGFzIHNpZGUgZWZmZWN0LiBBcyB0aGVyZSdzIG5vIGJpbmRpbmcgZm9yIGl0IGFuZCB0aGUgbW9kZWwgZG9lcyBjdXJyZW50bHkgbm90IGFsbG93XG5cdFx0XHRcdFx0XHQvLyB0byBhZGQgaXQgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lIHdlIGhhdmUgdG8gdGFrZSBjYXJlIGl0J3MgcGFydCBvZiB0aGUgJHNlbGVjdCBvZiB0aGUgUE9TVCwgdGhlcmVmb3JlIG1vdmluZyBpdC5cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA/Pz0ge307XG5cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0Y29udmVydGVkQWN0aW9uLnJldHVybkVudGl0eVR5cGU/LmVudGl0eVByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUgPT09IHNNZXNzYWdlc1BhdGgpICYmXG5cdFx0XHRcdFx0XHRcdCEobVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPz8gXCJcIikuc3BsaXQoXCIsXCIpLmluY2x1ZGVzKHNNZXNzYWdlc1BhdGgpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdFxuXHRcdFx0XHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c01lc3NhZ2VzUGF0aH1gXG5cdFx0XHRcdFx0XHRcdFx0OiBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgc2lkZSBlZmZlY3RzIGF0IGVudGl0eSBsZXZlbCBiZWNhdXNlICRzZWxlY3Qgc3RvcHMgdGhlc2UgYmVpbmcgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBPbmx5IGlmIG5vIG90aGVyIHNpZGUgZWZmZWN0cyB3ZXJlIGFkZGVkIGZvciBNZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGggPT09IDAgJiYgaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBubyB0cmlnZ2VyIGFjdGlvbiB0aGVyZWZvcmUgbm8gbmVlZCB0byByZXF1ZXN0IG1lc3NhZ2VzIGFnYWluXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLnNwbGljZShpTWVzc2FnZVNpZGVFZmZlY3QsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFDb250ZXh0cyA/PyBbXTtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iR3JvdXBlZCA9IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyA9PT0gSW52b2NhdGlvbkdyb3VwaW5nLkNoYW5nZVNldDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgPSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXA7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbiA9IGJJc0NyZWF0ZUFjdGlvbjtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2U7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5kaXNhYmxlU3RyaWN0SGFuZGxpbmcgPSBtUGFyYW1ldGVycy5kaXNhYmxlU3RyaWN0SGFuZGxpbmc7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5ncm91cElkID0gbVBhcmFtZXRlcnMuZ3JvdXBJZDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0O1xuXHRcdGlmIChiSXNDcmVhdGVBY3Rpb24pIHtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbiA9IGJJc0NyZWF0ZUFjdGlvbjtcblx0XHR9XG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaXNTdGF0aWMgPSBjb252ZXJ0ZWRBY3Rpb24uaXNCb3VuZCAmJiAhIWNvbnZlcnRlZEFjdGlvbi5wYXJhbWV0ZXJzWzBdPy5pc0NvbGxlY3Rpb247XG5cblx0XHRsZXQgb3BlcmF0aW9uUmVzdWx0O1xuXHRcdGxldCBleGVjdXRpb25XaXREaWFsb2cgPSBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0XHRpZiAoIShiU2tpcFBhcmFtZXRlckRpYWxvZyAmJiBiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzKSkge1xuXHRcdFx0XHRcdGV4ZWN1dGlvbldpdERpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyRGlhbG9nID0gZ2V0Q29yZVVJRmFjdG9yeSgpLm5ld1BhcmFtZXRlckRpYWxvZyhcblx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbixcblx0XHRcdFx0XHRcdG9BY3Rpb24gYXMgT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXcgfCBudWxsLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uVG9CZUV4ZWN1dGVkOiBfZXhlY3V0ZUFjdGlvbixcblx0XHRcdFx0XHRcdFx0YmVmb3JlU2hvd2luZ01lc3NhZ2U6IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2tcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRhd2FpdCBwYXJhbWV0ZXJEaWFsb2cuY3JlYXRlRGlhbG9nKCk7XG5cdFx0XHRcdFx0b3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgcGFyYW1ldGVyRGlhbG9nLm9wZW5EaWFsb2cobVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdFx0ZXhlY3V0aW9uV2l0RGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0b3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgY29uZmlybUNyaXRpY2FsQWN0aW9uKFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0c0FjdGlvbkxhYmVsLFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YVBhcmFtZXRlclZhbHVlcyxcblx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy52aWV3LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZWplY3QoZSBhcyBFcnJvciB8IEFjdGlvblJlc3BvbnNlKTtcblx0XHR9XG5cdFx0aWYgKGV4ZWN1dGlvbldpdERpYWxvZykge1xuXHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRyZXNvbHZlKG9wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVGFrZSBvdmVyIGFsbCBwcm92aWRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZCBjYWxsIHRoZSBhY3Rpb24uXG5cdFx0Ly8gVGhpcyBzaGFsbCBvbmx5IGhhcHBlbiBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMsIG90aGVyd2lzZSB0aGUgcGFyYW1ldGVyIGRpYWxvZyBzaGFsbCBiZSBzaG93biB3aGljaCBpcyBlbnN1cmVkIGVhcmxpZXJcblxuXHRcdGlmIChhUGFyYW1ldGVyVmFsdWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXNbbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZV0gPVxuXHRcdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZSk/LnZhbHVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgYWN0aW9uUGFyYW1ldGVyLCBwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZDtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXIgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXTtcblx0XHRcdFx0cGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQgPVxuXHRcdFx0XHRcdChvU3RhcnR1cFBhcmFtZXRlcnNbYWN0aW9uUGFyYW1ldGVyLm5hbWVdPy5bMF0gYXMgQmFzZVR5cGVQYXJhbWV0ZXIpIHx8XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVyLmFubm90YXRpb25zPy5VST8uUGFyYW1ldGVyRGVmYXVsdFZhbHVlPy52YWx1ZU9mKCk7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzW2FjdGlvblBhcmFtZXRlci5uYW1lXSA9XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0PyBwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiBhd2FpdCBjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZShhY3Rpb25QYXJhbWV0ZXIsIHBhcmFtZXRlclZhbHVlTm90Q29udmVydGVkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IG9PcGVyYXRpb25SZXN1bHQ6IHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W107XG5cdFx0dHJ5IHtcblx0XHRcdG9PcGVyYXRpb25SZXN1bHQgPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJlxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHRcdH1cblx0XHRcdGFmdGVyQWN0aW9uUmVzb2x1dGlvbihtUGFyYW1ldGVycywgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsIGFjdGlvbkRlZmluaXRpb24pO1xuXHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJlamVjdChvT3BlcmF0aW9uUmVzdWx0IGFzIEVycm9yIHwgQWN0aW9uUmVzcG9uc2UpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0cyEubGVuZ3RoID4gMVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RyaWN0SGFuZGxpbmdGYWlscyA9IHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzO1xuXHRcdFx0XHRcdGNvbnN0IGFGYWlsZWRDb250ZXh0cyA9IFtdIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdGYWlscy5mb3JFYWNoKGZ1bmN0aW9uIChmYWlsOiB7IG9BY3Rpb246IE9EYXRhQ29udGV4dEJpbmRpbmc7IGdyb3VwSWQ6IHN0cmluZyB9KTogdm9pZCB7XG5cdFx0XHRcdFx0XHRhRmFpbGVkQ29udGV4dHMucHVzaChmYWlsLm9BY3Rpb24uZ2V0Q29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgPSBhRmFpbGVkQ29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZhaWxlZE9wZXJhdGlvblJlc3VsdCA9IGF3YWl0IF9leGVjdXRlQWN0aW9uKFxuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyA9IFtdO1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcyk7XG5cdFx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0cmVzb2x2ZShvRmFpbGVkT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdFx0fSBjYXRjaCAob0ZhaWxlZE9wZXJhdGlvblJlc3VsdCkge1xuXHRcdFx0XHRcdHJlamVjdChcblx0XHRcdFx0XHRcdG9GYWlsZWRPcGVyYXRpb25SZXN1bHQgYXMgRXJyb3IgfCBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIG1lc3NhZ2VIYW5kbGluZy5oYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGxldCBpc0FjdGlvblN1Y2Nlc3NmdWwgPSBmYWxzZTtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9PcGVyYXRpb25SZXN1bHQpKSB7XG5cdFx0XHRcdGlzQWN0aW9uU3VjY2Vzc2Z1bCA9IG9PcGVyYXRpb25SZXN1bHQ/LmV2ZXJ5KChyZXMpID0+IHJlcy5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0bVBhcmFtZXRlcnM/Lm1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdD8uc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGNvbnRyb2w6IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzPy5jb250cm9sLFxuXHRcdFx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2U6IGZ1bmN0aW9uIChhTWVzc2FnZXM6IE1lc3NhZ2VbXSwgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHMhLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4sXG5cdFx0XHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0LFxuXHRcdFx0XHRcdFx0XHRpc0FjdGlvblN1Y2Nlc3NmdWxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0czogbVBhcmFtZXRlcnMuYUNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWxcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLmNsZWFyU3RyaWN0V2FybmluZ01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KTtcblx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcykge1xuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRcdFx0XHRpczQxMkV4ZWN1dGVkOiBmYWxzZSxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBuZXcgU2V0KCksXG5cdFx0XHRcdFx0c3RyaWN0UmVzcG9uc2VFcnJvckV4aXN0czogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0c0FjdGlvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YUFjdGlvblBhcmFtZXRlcnM6IEVkbUFjdGlvblBhcmFtZXRlcltdLFxuXHRhUGFyYW1ldGVyVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHwgdW5kZWZpbmVkLFxuXHRvQWN0aW9uQ29udGV4dDogQ29udGV4dCxcblx0b1BhcmVudENvbnRyb2w6IFZpZXcsXG5cdGVudGl0eVNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllczogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdHZpZXc6IFZpZXcgfCBudWxsLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGxldCBib3VuZEFjdGlvbk5hbWUgPSBzQWN0aW9uTmFtZTtcblx0XHRib3VuZEFjdGlvbk5hbWUgPSBib3VuZEFjdGlvbk5hbWUuaW5jbHVkZXMoXCIuXCIpXG5cdFx0XHQ/IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIilbYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggLSAxXVxuXHRcdFx0OiBib3VuZEFjdGlvbk5hbWU7XG5cdFx0Y29uc3Qgc3VmZml4UmVzb3VyY2VLZXkgPSBib3VuZEFjdGlvbk5hbWUgJiYgZW50aXR5U2V0TmFtZSA/IGAke2VudGl0eVNldE5hbWV9fCR7Ym91bmRBY3Rpb25OYW1lfWAgOiBcIlwiO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9QYXJlbnRDb250cm9sKTtcblx0XHRjb25zdCBzQ29uZmlybWF0aW9uVGV4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9NRVNTQUdFXCIsIHVuZGVmaW5lZCwgc3VmZml4UmVzb3VyY2VLZXkpO1xuXG5cdFx0TWVzc2FnZUJveC5jb25maXJtKHNDb25maXJtYXRpb25UZXh0LCB7XG5cdFx0XHRvbkNsb3NlOiBhc3luYyBmdW5jdGlvbiAoc0FjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChzQWN0aW9uID09PSBBY3Rpb24uT0spIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGF3YWl0IF9leGVjdXRlQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0aWdub3JlRVRhZ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGFmdGVyQWN0aW9uUmVzb2x1dGlvbihcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzLFxuXHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdGFjdGlvbkRlZmluaXRpb246IE1ldGFNb2RlbEFjdGlvblxuKTogdm9pZCB7XG5cdGlmIChcblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCAmJlxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJlxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyAmJlxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGggJiZcblx0XHRhY3Rpb25EZWZpbml0aW9uLiRJc0JvdW5kXG5cdCkge1xuXHRcdGxldCBzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdFx0Ly9jaGVjayBmb3Igc2tpcHBpbmcgc3RhdGljIGFjdGlvbnNcblx0XHRjb25zdCBpc1N0YXRpYyA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzU3RhdGljO1xuXHRcdGlmICghaXNTdGF0aWMpIHtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgfHwgW107XG5cdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wpIHtcblx0XHRcdGNvbnN0IGNvbnRyb2wgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sO1xuXHRcdFx0aWYgKGNvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGNvbnRyb2wuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly91cGRhdGUgZGVsZXRlIGJ1dHRvblxuXHRcdERlbGV0ZUhlbHBlci51cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyhtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdH1cbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGFuIGFycmF5IG9mIG1lc3NhZ2VzIGJhc2VkIG9uIHZhcmlvdXMgY29uZGl0aW9ucyBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmlsdGVyZWQgbWVzc2FnZXMgYW5kIG90aGVyIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzIHRvIGZpbHRlci5cbiAqIEBwYXJhbSBlcnJvclRhcmdldHNJbkFQRCBJbmRpY2F0ZXMgd2hldGhlciBlcnJvciB0YXJnZXRzIGFyZSBpbiBBUEQuXG4gKiBAcGFyYW0gY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMuXG4gKiBAcGFyYW0gdW5ib3VuZE1lc3NhZ2VzIEFuIGFycmF5IG9mIHVuYm91bmQgbWVzc2FnZXMuXG4gKiBAcGFyYW0gY29udHJvbCBBIGNvbnRyb2wgb2JqZWN0LlxuICogQHBhcmFtIGlzQVBET1BlbiBJbmRpY2F0ZXMgd2hldGhlciBBUEQgaXMgb3Blbi5cbiAqIEBwYXJhbSBzaG93TWVzc2FnZURpYWxvZyBJbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IHRoZSBtZXNzYWdlIGRpYWxvZy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc3VsdCBjb250YWlucyBhIGJvdW5kIHRyYW5zaXRpb24sIGFuIGFycmF5IG9mIG1lc3NhZ2VzIHRvIHNob3csIGFuZCBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNob3cgdGhlIG1lc3NhZ2UgaW4gYSBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckFQRGFuZENvbnRleHRNZXNzYWdlcyhcblx0bWVzc2FnZXM6IE1lc3NhZ2VbXSxcblx0ZXJyb3JUYXJnZXRzSW5BUEQ/OiBib29sZWFuLFxuXHRjb250ZXh0cz86IENvbnRleHRbXSxcblx0dW5ib3VuZE1lc3NhZ2VzPzogTWVzc2FnZVtdLFxuXHRjb250cm9sPzogQ29udHJvbCxcblx0aXNBUERPUGVuPzogYm9vbGVhbixcblx0c2hvd01lc3NhZ2VEaWFsb2c/OiBib29sZWFuXG4pOiB7IGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZDsgbWVzc2FnZXNUb1Nob3c6IE1lc3NhZ2VbXTsgc2hvd01lc3NhZ2VJbkRpYWxvZz86IGJvb2xlYW4gfSB7XG5cdGlmIChpc0FQRE9QZW4gJiYgZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHQvKiBXaGVuIEFQRCBpcyBvcGVuLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbWVzc2FnZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIG9iamVjdHBhZ2UgY29udGV4dCAqL1xuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVDb250ZXh0TWVzc2FnZXNmcm9tTW9kZWwobWVzc2FnZXMsIGNvbnRleHRzKTtcblx0fVxuXG5cdC8vIEZpbHRlciBvdXQgbWVzc2FnZXMgd2hpY2ggYXJlIG5vdCByZWxhdGVkIHRvIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpbiB0aGUgZWRpdCBtb2RlIGFuZCBkaXNwbGF5IG1vZGVcblx0bGV0IGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbjtcblx0aWYgKCFjb250cm9sPy5nZXRNb2RlbChcInVpXCIpIS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0aWYgKGlzQVBET1BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0aWYgKHVuYm91bmRNZXNzYWdlcz8ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiA9IGZhbHNlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcucmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbWV0ZXJEaWFsb2cobWVzc2FnZXMpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAodW5ib3VuZE1lc3NhZ2VzPy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiA9IGZhbHNlO1xuXHRcdH1cblx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtZXRlckRpYWxvZyhtZXNzYWdlcyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtZXNzYWdlc1RvU2hvdzogbWVzc2FnZXMsXG5cdFx0Y29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBjb250YWluc0JvdW5kVHJhbnNpc3Rpb24sXG5cdFx0c2hvd01lc3NhZ2VJbkRpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2dcblx0fTtcbn1cblxuZnVuY3Rpb24gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdG9EaWFsb2c6IERpYWxvZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZXM6IE1lc3NhZ2VbXSxcblx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycyxcblx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQ6IGJvb2xlYW4sXG5cdGlzQWN0aW9uU3VjY2Vzc2Z1bD86IGJvb2xlYW5cbik6IFNob3dNZXNzYWdlUGFyYW1ldGVycyB7XG5cdGxldCBzaG93TWVzc2FnZUJveCA9IHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLnNob3dNZXNzYWdlQm94LFxuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4uc2hvd01lc3NhZ2VEaWFsb2c7XG5cdGNvbnN0IG9Db250cm9sID0gbVBhcmFtZXRlcnMuY29udHJvbDtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0Y29uc3QgdW5ib3VuZE1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0gPT09IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBBUERtZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZXNzYWdlLmdldFRhcmdldHMgJiZcblx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMobVBhcmFtZXRlcnMuYWN0aW9uTmFtZSkgJiZcblx0XHRcdG1QYXJhbWV0ZXJzPy5hQWN0aW9uUGFyYW1ldGVycz8uc29tZShmdW5jdGlvbiAoYWN0aW9uUGFyYW0pIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMoYWN0aW9uUGFyYW0ubmFtZSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0pO1xuXHRBUERtZXNzYWdlcz8uZm9yRWFjaChmdW5jdGlvbiAoQVBETWVzc2FnZSkge1xuXHRcdChBUERNZXNzYWdlIGFzIHVua25vd24gYXMgeyBpc0FQRFRhcmdldDogYm9vbGVhbiB9KS5pc0FQRFRhcmdldCA9IHRydWU7XG5cdH0pO1xuXG5cdGNvbnN0IGVycm9yVGFyZ2V0c0luQVBEID0gQVBEbWVzc2FnZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xuXHQvL0lmIEFjdGlvbiBpcyBzdWNjZXNzZnVsIHdpdGggd2FybmluZ3MsIGRvbnQgc2hvdyB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGZvciBjaGFuZ2VzZXQgaW4gZGlhbG9nXG5cdGlmIChzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCAmJiAhZXJyb3JUYXJnZXRzSW5BUEQgJiYgIWlzQWN0aW9uU3VjY2Vzc2Z1bCkge1xuXHRcdGxldCBzTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9FUlJPUl9NRVNTQUdFU19URVhUXCIpO1xuXHRcdGxldCBzRGVzY3JpcHRpb25UZXh0ID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX0VSUk9SX01FU1NBR0VTX0RFVEFJTF9URVhUXCIpO1xuXHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlc0luTW9kZWwgPSBtZXNzYWdlTW9kZWwuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGFCb3VuZE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUpO1xuXHRcdGxldCBnZW5lcmljTWVzc2FnZTtcblx0XHRjb25zdCBpc0VkaXRhYmxlID0gb0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblxuXHRcdGNvbnN0IG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nID0gbWVzc2FnZXMuZmluZEluZGV4KGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIiB8fCBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJXYXJuaW5nXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgbm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCA9IG1lc3NhZ2VzSW5Nb2RlbC5maW5kSW5kZXgoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiIHx8IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIldhcm5pbmdcIjtcblx0XHR9KTtcblxuXHRcdGlmIChcblx0XHRcdG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nICE9PSAxICYmXG5cdFx0XHRub25FcnJvck1lc3NhZ2VFeGlzdHNJbk1vZGVsICE9PSAtMSAmJlxuXHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoID4gMVxuXHRcdCkge1xuXHRcdFx0aWYgKG1lc3NhZ2VzSW5Nb2RlbC5sZW5ndGggPT09IDEgJiYgYUJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdG1lc3NhZ2VzSW5Nb2RlbFswXS5zZXRNZXNzYWdlKFxuXHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRcIikgK1xuXHRcdFx0XHRcdFx0XHRcIlxcblxcblwiICtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZXNJbk1vZGVsWzBdLmdldE1lc3NhZ2UoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01lc3NhZ2UgPSBpc0VkaXRhYmxlXG5cdFx0XHRcdFx0XHQ/IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9TSU5HTEVfRVJST1JfTUVTU0FHRV9URVhUX0VESVRcIilcblx0XHRcdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRcIik7XG5cdFx0XHRcdFx0c0Rlc2NyaXB0aW9uVGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBzTWVzc2FnZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25UZXh0LFxuXHRcdFx0XHRcdFx0Y29kZTogXCJGRV9DVVNUT01fTUVTU0FHRV9DSEFOR0VTRVRfQUxMX0ZBSUxFRFwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0bWVzc2FnZXMudW5zaGlmdChnZW5lcmljTWVzc2FnZSk7XG5cdFx0XHRcdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGdlbmVyaWNNZXNzYWdlID0gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdG1lc3NhZ2U6IHNNZXNzYWdlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdHRhcmdldDogXCJcIixcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25UZXh0LFxuXHRcdFx0XHRcdGNvZGU6IFwiRkVfQ1VTVE9NX01FU1NBR0VfQ0hBTkdFU0VUX0FMTF9GQUlMRURcIlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bWVzc2FnZXMudW5zaGlmdChnZW5lcmljTWVzc2FnZSk7XG5cdFx0XHRcdGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChvRGlhbG9nICYmIG9EaWFsb2cuaXNPcGVuKCkgJiYgYUNvbnRleHRzLmxlbmd0aCAhPT0gMCAmJiAhbVBhcmFtZXRlcnMuaXNTdGF0aWMpIHtcblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHQvL2lzb2xhdGVkXG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEgfHwgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdC8vIGRvZXMgbm90IG1hdHRlciBpZiBlcnJvciBpcyBpbiBBUEQgb3Igbm90LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29udGV4dHMgc2VsZWN0ZWQgb3IgaWYgdGhlIGVycm9yIGlzIG5vdCB0aGUgQVBELCB3ZSBjbG9zZSBpdC5cblx0XHRcdFx0Ly8gVE9ETzogRGlsYW9nIGhhbmRsaW5nIHNob3VsZCBub3QgYmUgcGFydCBvZiBtZXNzYWdlIGhhbmRsaW5nLiBSZWZhY3RvciBhY2NvcmRpbmdseSAtIGRpYWxvZyBzaG91bGQgbm90IGJlIG5lZWRlZCBpbnNpZGUgdGhpcyBtZXRob2QgLSBuZWl0aGVyXG5cdFx0XHRcdC8vIHRvIGFzayB3aGV0aGVyIGl0J3Mgb3Blbiwgbm9yIHRvIGNsb3NlL2Rlc3Ryb3kgaXQhXG5cdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdC8vY2hhbmdlc2V0XG5cdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblx0Y29uc3QgZmlsdGVyZWRNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG5cdGNvbnN0IGJJc0FQRE9wZW4gPSBvRGlhbG9nICYmIG9EaWFsb2cuaXNPcGVuKCk7XG5cblx0Y29uc3QgeyBtZXNzYWdlc1RvU2hvdywgY29udGFpbnNCb3VuZFRyYW5zaXN0aW9uLCBzaG93TWVzc2FnZUluRGlhbG9nIH0gPSBmaWx0ZXJBUERhbmRDb250ZXh0TWVzc2FnZXMoXG5cdFx0bWVzc2FnZXMsXG5cdFx0ZXJyb3JUYXJnZXRzSW5BUEQsXG5cdFx0YUNvbnRleHRzLFxuXHRcdHVuYm91bmRNZXNzYWdlcyxcblx0XHRvQ29udHJvbCxcblx0XHRiSXNBUERPcGVuXG5cdCk7XG5cdG1lc3NhZ2VzID0gbWVzc2FnZXNUb1Nob3c7XG5cdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VJbkRpYWxvZyA/PyBzaG93TWVzc2FnZURpYWxvZztcblxuXHRpZiAoIWJJc0FQRE9wZW4gJiYgZXJyb3JUYXJnZXRzSW5BUEQgJiYgIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0Ly8gSWYgQVBEIGlzIG5vdCBvcGVuIGFuZCB0aGVyZSBhcmUgbWVzc2FnZXMgcmVsYXRlZCB0byBBUEQsIHRoZW4gc2hvdyBpbiB0aGUgbWVzc2FnZSBkaWFsb2cuIHNpbmNlXG5cdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSB0cnVlO1xuXHRcdG1lc3NhZ2VzID0gbWVzc2FnZXMuY29uY2F0KEFQRG1lc3NhZ2VzKTtcblx0fVxuXG5cdGxldCBmbkdldE1lc3NhZ2VTdWJ0aXRsZTtcblx0aWYgKG9Db250cm9sICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0Zm5HZXRNZXNzYWdlU3VidGl0bGUgPSBtZXNzYWdlSGFuZGxpbmcuc2V0TWVzc2FnZVN1YnRpdGxlLmJpbmQoe30sIG9Db250cm9sLCBhQ29udGV4dHMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c2hvd01lc3NhZ2VCb3g6IHNob3dNZXNzYWdlQm94LFxuXHRcdHNob3dNZXNzYWdlRGlhbG9nOiBzaG93TWVzc2FnZURpYWxvZyxcblx0XHRmaWx0ZXJlZE1lc3NhZ2VzOiBmaWx0ZXJlZE1lc3NhZ2VzLmxlbmd0aCA/IGZpbHRlcmVkTWVzc2FnZXMgOiBtZXNzYWdlcyxcblx0XHRmbkdldE1lc3NhZ2VTdWJ0aXRsZTogZm5HZXRNZXNzYWdlU3VidGl0bGUsXG5cdFx0c2hvd0NoYW5nZVNldEVycm9yRGlhbG9nOiBtUGFyYW1ldGVycy5iR3JvdXBlZCxcblx0XHRjb250YWluc0JvdW5kVHJhbnNpc3Rpb246IGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvblxuXHR9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKFxuXHRvQWN0aW9uOiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdGJHZXRCb3VuZENvbnRleHQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG5cdHNHcm91cElkOiBzdHJpbmcsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlciB8IHVuZGVmaW5lZCxcblx0aUNvbnRleHRMZW5ndGg6IG51bWJlciB8IG51bGwsXG5cdGN1cnJlbnRfY29udGV4dF9pbmRleDogbnVtYmVyIHwgbnVsbCxcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uLFxuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0OiBGdW5jdGlvbixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRsZXQgb0FjdGlvblByb21pc2U6IFByb21pc2U8dW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQ+LFxuXHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IHRydWU7XG5cdGlmIChtUGFyYW1ldGVycykge1xuXHRcdG1QYXJhbWV0ZXJzLmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlID0gaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU7XG5cdH1cblx0aWYgKGJHZXRCb3VuZENvbnRleHQpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChzTWV0YVBhdGgpO1xuXHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5WzBdPy4ka2luZCAhPT0gXCJBY3Rpb25cIikge1xuXHRcdFx0Ly9kbyBub3QgZW5hYmxlIHRoZSBzdHJpY3QgaGFuZGxpbmcgaWYgaXRzIG5vdCBhbiBhY3Rpb25cblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMuZGlzYWJsZVN0cmljdEhhbmRsaW5nKSB7XG5cdFx0XHRiRW5hYmxlU3RyaWN0SGFuZGxpbmcgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIWJFbmFibGVTdHJpY3RIYW5kbGluZykge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gb0FjdGlvbi5leGVjdXRlKHNHcm91cElkLCBpZ25vcmVFVGFnKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlKG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkpO1xuXHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b0FjdGlvblByb21pc2UgPSBvQWN0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGlnbm9yZUVUYWcsXG5cdFx0XHRcdG9wZXJhdGlvbnNIZWxwZXIuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRvQWN0aW9uLmdldENvbnRleHQoKSxcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAocmVzdWx0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpdGlvbk1lc3NhZ2VzKG9BY3Rpb24sIHNHcm91cElkLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcywgbVBhcmFtZXRlcnMgYXMgU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByZWFsUmVzdWx0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCA/IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkgOiByZXN1bHQ7XG5cdFx0XHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlKHJlYWxSZXN1bHQpO1xuXHRcdFx0XHRyZXR1cm4gcmVhbFJlc3VsdDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpdGlvbk1lc3NhZ2VzKG9BY3Rpb24sIHNHcm91cElkLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcywgbVBhcmFtZXRlcnMgYXMgU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0KCk7XG5cdFx0XHRcdHRocm93IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQ7XG5cdFx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG5cdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCgpO1xuXHRcdHRocm93IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQ7XG5cdH0pO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSBzdHJpY3RIYW5kbGluZyB1dGlsaXRpZXMgd2l0aCB0aGUgZmFpbGVkIGFuZCBzdWNjZXNzZnVsIHRyYW5zaXRpb24gbWVzc2FnZXMuXG4gKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBleGVjdXRlZFxuICogQHBhcmFtIGdyb3VwSWQgR3JvdXBJZCBvZiB0aGUgYmF0Y2hcbiAqIEBwYXJhbSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyBVdGlsaXR5IGZsYWdzIGFuZCBtZXNzYWdlcyBmb3Igc3RyaWN0SGFuZGxpbmdcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIFN0cmljdCBIYW5kbGluZyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gb25seVN1Y2Nlc3NNZXNzYWdlcyBUbyB1cGRhdGUgb25seSBzdWNjZXNzZnVsIHRyYW5zaXRpb24gbWVzc2FnZXNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlNDEyVHJhbnNpdGlvbk1lc3NhZ2VzKFxuXHRhY3Rpb246IE9EYXRhQ29udGV4dEJpbmRpbmcsXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRwYXJhbWV0ZXJzPzogU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzLFxuXHRvbmx5U3VjY2Vzc01lc3NhZ2VzID0gZmFsc2Vcbik6IHZvaWQge1xuXHRjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRjb25zdCB7IHByb2Nlc3NlZE1lc3NhZ2VJZHMsIGRlbGF5U3VjY2Vzc01lc3NhZ2VzLCBzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyB9ID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM7XG5cdGNvbnN0IHVuUHJvY2Vzc2VkTWVzc2FnZXMgPSBtZXNzYWdlcy5yZWR1Y2UoKGFjYzogTWVzc2FnZVtdLCBtZXNzYWdlKSA9PiB7XG5cdFx0aWYgKCFwcm9jZXNzZWRNZXNzYWdlSWRzLmhhcyhtZXNzYWdlLmdldElkKCkpKSB7XG5cdFx0XHRhY2MucHVzaChtZXNzYWdlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjYztcblx0fSwgW10pO1xuXG5cdGNvbnN0IG5ld1RyYW5zaXRpb25FcnJvck1lc3NhZ2VzSWQgPSB1blByb2Nlc3NlZE1lc3NhZ2VzXG5cdFx0LmZpbHRlcihcblx0XHRcdChtZXNzYWdlKSA9PlxuXHRcdFx0XHRtZXNzYWdlLmdldFBlcnNpc3RlbnQoKSA9PT0gdHJ1ZSAmJiBtZXNzYWdlLmdldFR5cGUoKSAhPT0gTWVzc2FnZVR5cGUuU3VjY2VzcyAmJiAhcHJvY2Vzc2VkTWVzc2FnZUlkcy5oYXMobWVzc2FnZS5nZXRJZCgpKVxuXHRcdClcblx0XHQubWFwKChtZXNzYWdlKSA9PiBtZXNzYWdlLmdldElkKCkpO1xuXG5cdGlmIChuZXdUcmFuc2l0aW9uRXJyb3JNZXNzYWdlc0lkLmxlbmd0aCkge1xuXHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnByb2Nlc3NlZE1lc3NhZ2VJZHMgPSBuZXcgU2V0KFsuLi5BcnJheS5mcm9tKHByb2Nlc3NlZE1lc3NhZ2VJZHMpLCAuLi5uZXdUcmFuc2l0aW9uRXJyb3JNZXNzYWdlc0lkXSk7XG5cdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXMucHVzaCguLi5PYmplY3QudmFsdWVzKHVuUHJvY2Vzc2VkTWVzc2FnZXMpLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MpKTtcblx0XHRpZiAoIW9ubHlTdWNjZXNzTWVzc2FnZXMgJiYgcGFyYW1ldGVycz8uaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLnB1c2goe1xuXHRcdFx0XHRvQWN0aW9uOiBhY3Rpb24sXG5cdFx0XHRcdGdyb3VwSWRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uKCk6IHtcblx0b0xvY2FsQWN0aW9uUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPjtcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uO1xuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0OiBGdW5jdGlvbjtcbn0ge1xuXHRsZXQgaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUhOiBGdW5jdGlvbjtcblx0bGV0IGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QhOiBGdW5jdGlvbjtcblx0Y29uc3Qgb0xvY2FsQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHVua25vd24+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCA9IHJlamVjdDtcblx0fSkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcikge1xuXHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyBhY3Rpb24gXCIsIG9FcnJvcik7XG5cdH0pO1xuXG5cdHJldHVybiB7IG9Mb2NhbEFjdGlvblByb21pc2UsIGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlLCBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0b1BhcmVudENvbnRyb2w6IENvbnRyb2wsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPiB7XG5cdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyB8fCBbXTtcblx0Y29uc3Qgb01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdGNvbnN0IGFBY3Rpb25QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMgfHwgW107XG5cdGNvbnN0IHNBY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuYWN0aW9uTmFtZTtcblx0Y29uc3QgZm5PblN1Ym1pdHRlZCA9IG1QYXJhbWV0ZXJzLmZuT25TdWJtaXR0ZWQ7XG5cdGNvbnN0IGZuT25SZXNwb25zZSA9IG1QYXJhbWV0ZXJzLmZuT25SZXNwb25zZTtcblx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwob1BhcmVudENvbnRyb2wpO1xuXHRsZXQgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZztcblx0bVBhcmFtZXRlcnMuYXBwQ29tcG9uZW50ID0gb0FwcENvbXBvbmVudDtcblxuXHRmdW5jdGlvbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTogdm9pZCB7XG5cdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlcyA9IG1QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzID8/IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3QgbmFtZSA9IHBhcmFtZXRlci5uYW1lO1xuXHRcdFx0XHRpZiAoIWRlZmF1bHRWYWx1ZXNbbmFtZV0pIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHBhcmFtZXRlci50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLlN0cmluZ1wiOlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzW25hbWVdID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc1tuYW1lXSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzW25hbWVdID0gMDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHQvLyB0YmNcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvQWN0aW9uLnNldFBhcmFtZXRlcihuYW1lLCBkZWZhdWx0VmFsdWVzW25hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBUT0RPOiByZWZhY3RvciB0byBkaXJlY3QgdXNlIG9mIFByb21pc2UuYWxsU2V0dGxlZFxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPihmdW5jdGlvbiAoXG5cdFx0XHRyZXNvbHZlOiAodmFsdWU6IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pID0+IHZvaWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdGNvbnN0IGJHcm91cGVkID0gbVBhcmFtZXRlcnMuYkdyb3VwZWQ7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSA9IFtdO1xuXHRcdFx0bGV0IG9BY3Rpb25Qcm9taXNlO1xuXHRcdFx0bGV0IGk7XG5cdFx0XHRsZXQgc0dyb3VwSWQ6IHN0cmluZztcblx0XHRcdGNvbnN0IG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0ID0gY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbigpO1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRcdFx0XHRhY3Rpb25Db250ZXh0OiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRcdFx0XHRjdXJyZW50X2NvbnRleHRfaW5kZXg6IG51bWJlciB8IG51bGwsXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgJiB7IGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0IH0sXG5cdFx0XHRcdGlDb250ZXh0TGVuZ3RoOiBudW1iZXJcblx0XHRcdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRcdFx0Y29uc3QgaW5kaXZpZHVhbEFjdGlvblByb21pc2U6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSAhYkdyb3VwZWQgPyBgJGF1dG8uJHtjdXJyZW50X2NvbnRleHRfaW5kZXh9YCA6IGFjdGlvbkNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBmblJlcXVlc3RTaWRlRWZmZWN0cy5iaW5kKFxuXHRcdFx0XHRcdG9wZXJhdGlvbnMsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMoXG5cdFx0XHRcdFx0YWN0aW9uQ29udGV4dCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0aUNvbnRleHRMZW5ndGgsXG5cdFx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4LFxuXHRcdFx0XHRcdG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0LmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlLFxuXHRcdFx0XHRcdG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0LmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QsXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0aWdub3JlRVRhZ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlLnB1c2gob2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3Qub0xvY2FsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdGZuUmVxdWVzdFNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQsIG9TaWRlRWZmZWN0LCBtUGFyYW1ldGVycywgc0dyb3VwSWQsIGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlU2luZ2xlQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRcdFx0XHRhY3Rpb25Db250ZXh0OiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRcdFx0XHRjdXJyZW50X2NvbnRleHRfaW5kZXg6IG51bWJlciB8IG51bGwsXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiAoQWN0aW9uU2lkZUVmZmVjdHNUeXBlICYgeyBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCB9KSB8IHVuZGVmaW5lZCxcblx0XHRcdFx0aUNvbnRleHRMZW5ndGg6IG51bWJlclxuXHRcdFx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmtub3duPltdPiB7XG5cdFx0XHRcdGNvbnN0IGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblx0XHRcdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRzR3JvdXBJZCA9IG1QYXJhbWV0ZXJzLmdyb3VwSWQgfHwgYGFwaU1vZGUke2N1cnJlbnRfY29udGV4dF9pbmRleH1gO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBmblJlcXVlc3RTaWRlRWZmZWN0cy5iaW5kKFxuXHRcdFx0XHRcdG9wZXJhdGlvbnMsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMoXG5cdFx0XHRcdFx0YWN0aW9uQ29udGV4dCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0aUNvbnRleHRMZW5ndGgsXG5cdFx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4LFxuXHRcdFx0XHRcdG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0LmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlLFxuXHRcdFx0XHRcdG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0LmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QsXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0aWdub3JlRVRhZ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlLnB1c2gob2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3Qub0xvY2FsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdGZuUmVxdWVzdFNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQsIG9TaWRlRWZmZWN0LCBtUGFyYW1ldGVycywgc0dyb3VwSWQsIGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRhc3luYyBmdW5jdGlvbiBmbkV4ZWN1dGVDaGFuZ2VzZXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdGNvbnN0IGFDaGFuZ2VTZXRMb2NhbFByb21pc2VzOiB1bmtub3duW10gPSBbXTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0FjdGlvbk5hbWV9KC4uLilgLCBhQ29udGV4dHNbaV0sIG1CaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0YUNoYW5nZVNldExvY2FsUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdGZuRXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0XHRcdFx0b0FjdGlvbixcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmxlbmd0aCA8IDEgPyBudWxsIDogaSArIDEsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBhQ29udGV4dHNbaV0sXG5cdFx0XHRcdFx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5sZW5ndGhcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChcblx0XHRcdFx0XHRmbk9uU3VibWl0dGVkIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoYUFjdGlvblByb21pc2VzKTtcblxuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYUNoYW5nZVNldExvY2FsUHJvbWlzZXMpO1xuXHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQhbWVzc2FnZUhhbmRsaW5nLmhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzKCkgJiZcblx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMubGVuZ3RoXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb3BlcmF0aW9uc0hlbHBlci5yZW5kZXJNZXNzYWdlVmlldyhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5sZW5ndGggPiAxXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmZvckVhY2goZnVuY3Rpb24gKHNoUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0XHRcdHNoUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZXNJbk1vZGVsID0gbWVzc2FnZU1vZGVsLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZU1vZGVsLnNldERhdGEobWVzc2FnZXNJbk1vZGVsLmNvbmNhdChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlcykpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiUmV0cmlnZ2VyaW5nIG9mIHN0cmljdCBoYW5kbGluZyBhY3Rpb25zIGZhaWxlZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuRXhlY3V0ZVNlcXVlbnRpYWxseShjb250ZXh0c1RvRXhlY3V0ZTogT0RhdGFWNENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oXG5cdFx0XHRcdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0YWN0aW9uSW5kZXg6IG51bWJlcixcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aDogbnVtYmVyXG5cdFx0XHRcdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4ge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0FjdGlvbk5hbWV9KC4uLilgLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdC8vIEFjdGlvbiBvbiB0aGUgdGFibGUgbGV2ZWwgaXMgYm91bmQgb24gYSBjb3B5IG9mIHRoZSBvRGF0YUxpc3RCaW5kaW5nLCB0byBleGVjdXRlIHRoZSBTaWRlRWZmZWN0cyB3ZSBuZWVkXG5cdFx0XHRcdFx0Ly8gdG8gZG8gaXQgb24gdGhlIG9yaWdpbmFsIG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBpbml0aWFsVGFibGVDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLmNvbnRyb2wgYXMgVGFibGUpPy5nZXRSb3dCaW5kaW5nPy4oKT8uZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24oXG5cdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0YWN0aW9uSW5kZXgsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQ6XG5cdFx0XHRcdFx0XHRcdFx0aW5pdGlhbFRhYmxlQ29udGV4dCAmJiBpbml0aWFsVGFibGVDb250ZXh0LmdldFBhdGgoKSA9PT0gY29udGV4dC5nZXRQYXRoKCkgPyBpbml0aWFsVGFibGVDb250ZXh0IDogY29udGV4dCxcblx0XHRcdFx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNlcmlhbGl6YXRpb246IHByb2Nlc3NPbmVBY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIGNvbnRleHRzVG9FeGVjdXRlIG9ubHkgYWZ0ZXIgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBoYXMgYmVlbiByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBjb250ZXh0c1RvRXhlY3V0ZS5yZWR1Y2UoYXN5bmMgKHByb21pc2U6IFByb21pc2U8dm9pZD4sIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgcHJvbWlzZTtcblx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkICsgMSwgYUNvbnRleHRzLmxlbmd0aCk7XG5cdFx0XHRcdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblxuXHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBvcGVyYXRpb25zSGVscGVyLnJlbmRlck1lc3NhZ2VWaWV3KFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmxlbmd0aCA+IDFcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMuZm9yRWFjaChmdW5jdGlvbiAoc2hQcm9taXNlKSB7XG5cdFx0XHRcdFx0XHRcdHNoUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmbkhhbmRsZVJlc3VsdHMoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFiR3JvdXBlZCkge1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIsIGVuc3VyZSB0aGF0IGVhY2ggYWN0aW9uIGFuZCBtYXRjaGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gYXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIG5leHQgc2V0IGlzIHN1Ym1pdHRlZC4gV29ya2Fyb3VuZCB1bnRpbCBKU09OIGJhdGNoIGlzIGF2YWlsYWJsZS5cblx0XHRcdFx0Ly8gQWxsb3cgYWxzbyBmb3IgTGlzdCBSZXBvcnQuXG5cdFx0XHRcdGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm5FeGVjdXRlQ2hhbmdlc2V0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuSGFuZGxlUmVzdWx0cygpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0Ly8gUHJvbWlzZS5hbGxTZXR0bGVkIHdpbGwgbmV2ZXIgYmUgcmVqZWN0ZWQuIEhvd2V2ZXIsIGVzbGludCByZXF1aXJlcyBlaXRoZXIgY2F0Y2ggb3IgcmV0dXJuIC0gdGh1cyB3ZSByZXR1cm4gdGhlIHJlc3VsdGluZyBQcm9taXNlIGFsdGhvdWdoIG5vIG9uZSB3aWxsIHVzZSBpdC5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChhQWN0aW9uUHJvbWlzZXMpLnRoZW4ocmVzb2x2ZSk7XG5cdFx0XHR9XG5cdFx0fSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHQoXG5cdFx0XHRcdGZuT25SZXNwb25zZSB8fFxuXHRcdFx0XHRmdW5jdGlvbiBub29wKCk6IHZvaWQge1xuXHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0fVxuXHRcdFx0KSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NBY3Rpb25OYW1lfSguLi4pYCk7XG5cdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImFjdGlvbkltcG9ydFwiO1xuXHRcdGNvbnN0IG9BY3Rpb25Qcm9taXNlOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiA9IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0b3BlcmF0aW9uc0hlbHBlci5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdHsgbGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLCBtb2RlbDogb01vZGVsIH0sXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0KVxuXHRcdCk7XG5cdFx0Y29uc3QgYWxsUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPltdID0gW29BY3Rpb25Qcm9taXNlXTtcblx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QpIHtcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoXCIvdW5Cb3VuZEFjdGlvblwiKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3QgPSB7XG5cdFx0XHRcdGNvbnRleHQ6IGNvbnRleHQsXG5cdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHR0cmlnZ2VyQWN0aW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnNcblx0XHRcdH07XG5cdFx0XHRvcGVyYXRpb25zLmZuUmVxdWVzdFNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQsIHNpZGVFZmZlY3QsIG1QYXJhbWV0ZXJzLCBzR3JvdXBJZCwgYWxsUHJvbWlzZSk7XG5cdFx0XHRjb250ZXh0LmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHQvLyB0cmlnZ2VyIG9uU3VibWl0dGVkIFwiZXZlbnRcIlxuXHRcdChcblx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdC8qKi9cblx0XHRcdH1cblx0XHQpKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYWxsUHJvbWlzZSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChjdXJyZW50UHJvbWlzZVZhbHVlczogdW5rbm93bltdKSB7XG5cdFx0XHRcdC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgd2UgcmV0dXJuIHRoZSByZXNwb25zZSB3ZSBnb3QgZnJvbSBhbiB1bmJvdW5kIGFjdGlvbiB0byB0aGVcblx0XHRcdFx0Ly8gY2FsbGVyIEJDUCA6IDIyNzAxMzkyNzlcblx0XHRcdFx0Y29uc3QgY3VycmVudFByb21pc2VWYWx1ZSA9IGN1cnJlbnRQcm9taXNlVmFsdWVzWzBdO1xuXHRcdFx0XHRpZiAoY3VycmVudFByb21pc2VWYWx1ZSkge1xuXHRcdFx0XHRcdHJldHVybiBjdXJyZW50UHJvbWlzZVZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dD8uKCk/LmdldE9iamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGFjdGlvbiBcIiArIHNBY3Rpb25OYW1lLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25SZXNwb25zZSB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKCk7XG5cdFx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzKFxuXHRpc0NyZWF0ZUFjdGlvbjogYm9vbGVhbixcblx0YWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW10sXG5cdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdHN0YXJ0dXBQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IGJvb2xlYW4ge1xuXHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uU2V0T25BbGxBY3Rpb25zID0gYWN0aW9uUGFyYW1ldGVycy5ldmVyeSgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXI/LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpO1xuXG5cdGlmIChwYXJhbWV0ZXJWYWx1ZXM/Lmxlbmd0aCAmJiAhaGlkZGVuQW5ub3RhdGlvblNldE9uQWxsQWN0aW9ucykge1xuXHRcdC8vIElmIHNob3dEaWFsb2cgaXMgZmFsc2UgYnV0IHRoZXJlIGFyZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGludm9rZUFjdGlvbiBjYWxsIHdoaWNoIG5lZWQgdG8gYmUgY2hlY2tlZCBvbiBleGlzdGFuY2Vcblx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlciBvZiBhY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFjdGlvblBhcmFtZXRlci5uYW1lICE9PSBcIlJlc3VsdElzQWN0aXZlRW50aXR5XCIgJiZcblx0XHRcdFx0IXBhcmFtZXRlclZhbHVlcz8uZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5uYW1lID09PSBhY3Rpb25QYXJhbWV0ZXIubmFtZSlcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBBdCBsZWFzdCBmb3Igb25lIHBhcmFtZXRlciBubyB2YWx1ZSBoYXMgYmVlbiBwcm92aWRlZCwgc28gd2UgY2FuJ3Qgc2tpcCB0aGUgZGlhbG9nXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoaXNDcmVhdGVBY3Rpb24gJiYgc3RhcnR1cFBhcmFtZXRlcnM/Lmxlbmd0aCAmJiAhaGlkZGVuQW5ub3RhdGlvblNldE9uQWxsQWN0aW9ucykge1xuXHRcdC8vIElmIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGR1cmluZyBhcHBsaWNhdGlvbiBsYXVuY2gsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNldCBpcyBjb21wbGV0ZVxuXHRcdC8vIElmIG5vdCwgdGhlIHBhcmFtZXRlciBkaWFsb2cgc3RpbGwgbmVlZHMgdG8gYmUgc2hvd24uXG5cdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXIgb2YgYWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKHN0YXJ0dXBQYXJhbWV0ZXJzICYmICFzdGFydHVwUGFyYW1ldGVyc1thY3Rpb25QYXJhbWV0ZXIubmFtZV0pIHtcblx0XHRcdFx0Ly8gQXQgbGVhc3QgZm9yIG9uZSBwYXJhbWV0ZXIgbm8gdmFsdWUgaGFzIGJlZW4gcHJvdmlkZWQsIHNvIHdlIGNhbid0IHNraXAgdGhlIGRpYWxvZ1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoICYmIGhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMpIHtcblx0XHRyZXR1cm4gYWN0aW9uUGFyYW1ldGVycy5ldmVyeShmdW5jdGlvbiAocGFyYW1ldGVyKSB7XG5cdFx0XHRjb25zdCBmaWVsZENvbnRyb2wgPSBwYXJhbWV0ZXIuYW5ub3RhdGlvbnM/LkNvbW1vbj8uRmllbGRDb250cm9sO1xuXHRcdFx0Y29uc3QgaXNNYW5kYXRvcnkgPSBmaWVsZENvbnRyb2w/LnRvU3RyaW5nKCkgPT09IFwiQ29tbW9uLkZpZWxkQ29udHJvbFR5cGUvTWFuZGF0b3J5XCI7XG5cblx0XHRcdC8vIFBvc3NpYmxlIHNvdXJjZXMgbWF5IGJlIHN0YXJ0dXBQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJWYWx1ZXMsIGRlZmF1bHRWYWx1ZXMgcGVyIGFubm90YXRpb24gKFBhcmFtZXRlckRlZmF1bHRWYWx1ZSlcblx0XHRcdC8vIElmIG5vbmUgaXMgZm91bmQsIHJldHVybiBmYWxzZVxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0IWlzTWFuZGF0b3J5IHx8XG5cdFx0XHRcdChzdGFydHVwUGFyYW1ldGVycyAmJiBzdGFydHVwUGFyYW1ldGVyc1twYXJhbWV0ZXIubmFtZV0pIHx8XG5cdFx0XHRcdHBhcmFtZXRlclZhbHVlcz8uZmluZCgocGFyYW1ldGVyVmFsdWUpID0+IHBhcmFtZXRlclZhbHVlLm5hbWUgPT09IHBhcmFtZXRlci5uYW1lKSB8fFxuXHRcdFx0XHRwYXJhbWV0ZXI/LmFubm90YXRpb25zPy5VST8uUGFyYW1ldGVyRGVmYXVsdFZhbHVlPy52YWx1ZU9mKClcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZm5SZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRzaWRlRWZmZWN0OiAoQWN0aW9uU2lkZUVmZmVjdHNUeXBlICYgeyBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCB9KSB8IHVuZGVmaW5lZCxcblx0cGFyYW1ldGVyczoge1xuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRzZWxlY3RlZEl0ZW1zOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHR9LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdGxvY2FsUHJvbWlzZT86IFByb21pc2U8dW5rbm93bj5bXVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0bGV0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBsb2NhbFByb21pc2UgPz8gW107XG5cdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRpZiAoc2lkZUVmZmVjdCkge1xuXHRcdHByb21pc2VzID0gcHJvbWlzZXMuY29uY2F0KFxuXHRcdFx0KHNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgPz8gW10pLm1hcChhc3luYyAoYWN0aW9uKSA9PiBzaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihhY3Rpb24sIHNpZGVFZmZlY3QuY29udGV4dCwgZ3JvdXBJZCkpLFxuXHRcdFx0c2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMgPyBzaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLCBzaWRlRWZmZWN0LmNvbnRleHQsIGdyb3VwSWQpIDogW11cblx0XHQpO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJiBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdEpTT04ucGFyc2UocGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zLFxuXHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHRleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzOiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzLFxuXHRjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uOiBjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uLFxuXHR2YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnM6IF92YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMsXG5cdGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2s6IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2ssXG5cdGFmdGVyQWN0aW9uUmVzb2x1dGlvbjogYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uLFxuXHRmblJlcXVlc3RTaWRlRWZmZWN0czogZm5SZXF1ZXN0U2lkZUVmZmVjdHMsXG5cdGNoZWNrUGFyYW1ldGVyVHlwZUFuZFJldHVybkNvbnZlcnRlZFZhbHVlOiBjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb3BlcmF0aW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUNBLE1BQU1BLFNBQVMsR0FBR0MsU0FBUyxDQUFDRCxTQUFTO0lBQ3BDRSxrQkFBa0IsR0FBR0QsU0FBUyxDQUFDQyxrQkFBa0I7RUFDbEQsTUFBTUMsTUFBTSxHQUFHQyxVQUFVLENBQUNELE1BQU07RUFxRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlRSxlQUFlQSxDQUM3QkMsV0FBbUIsRUFDbkJDLFFBQTBCLEVBQzFCQyxNQUFrQixFQUNsQkMsYUFBMkIsRUFDM0JDLFdBQWlDLEVBQ1A7SUFDMUIsSUFBSSxDQUFDSCxRQUFRLElBQUlBLFFBQVEsQ0FBQ0ksTUFBTSxLQUFLLENBQUMsRUFBRTtNQUN2QztNQUNBLE1BQU0sSUFBSUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDO0lBQ3RFO0lBRUEsTUFBTUMsaUJBQWlCLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDUixRQUFRLENBQUM7SUFDakQ7SUFDQTtJQUNBO0lBQ0FHLFdBQVcsQ0FBQ00sU0FBUyxHQUFHRixLQUFLLENBQUNDLE9BQU8sQ0FBQ1IsUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxDQUFDQSxRQUFRLENBQUM7SUFFdkUsTUFBTVUsVUFBVSxHQUFHVCxNQUFNLENBQUNVLFlBQVksQ0FBQyxDQUFDO01BQ3ZDO01BQ0E7TUFDQUMsV0FB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