@sapui5/sap.fe.core 1.134.0 → 1.136.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 (395) 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 +6 -62
  4. package/src/sap/fe/core/ActionRuntime.ts +14 -65
  5. package/src/sap/fe/core/AppComponent.js +10 -2
  6. package/src/sap/fe/core/AppComponent.ts +6 -0
  7. package/src/sap/fe/core/AppStateHandler.js +9 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/BaseController.js +1 -1
  10. package/src/sap/fe/core/CommonUtils.js +8 -4
  11. package/src/sap/fe/core/CommonUtils.ts +19 -4
  12. package/src/sap/fe/core/ExtensionAPI.js +7 -5
  13. package/src/sap/fe/core/ExtensionAPI.ts +5 -3
  14. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
  16. package/src/sap/fe/core/PageController.js +36 -6
  17. package/src/sap/fe/core/PageController.ts +30 -0
  18. package/src/sap/fe/core/ResourceModel.js +1 -1
  19. package/src/sap/fe/core/ReuseComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.js +1 -1
  21. package/src/sap/fe/core/TemplateModel.js +1 -1
  22. package/src/sap/fe/core/UIProvider.js +2 -2
  23. package/src/sap/fe/core/UIProvider.ts +3 -32
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +34 -16
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +39 -18
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +1 -1
  27. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  28. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -2
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -0
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +7 -7
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +9 -9
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  35. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -3
  36. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  37. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  38. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +15 -15
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +19 -19
  40. package/src/sap/fe/core/controllerextensions/ContextSharing.js +1 -1
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -93
  42. package/src/sap/fe/core/controllerextensions/EditFlow.ts +89 -108
  43. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +355 -0
  45. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +387 -0
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +36 -11
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +36 -10
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +36 -6
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +5 -2
  54. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -0
  55. package/src/sap/fe/core/controllerextensions/Paginator.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/Placeholder.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Recommendations.js +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +9 -9
  59. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
  60. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  61. package/src/sap/fe/core/controllerextensions/Share.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/SideEffects.js +13 -6
  63. package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -6
  64. package/src/sap/fe/core/controllerextensions/Telemetry.js +1 -1
  65. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +14 -11
  67. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +20 -14
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +4 -12
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  70. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +12 -2
  71. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  72. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  74. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +111 -89
  75. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +140 -105
  76. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +137 -79
  77. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +133 -120
  78. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -3
  79. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  80. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +26 -17
  82. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +32 -23
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +3 -3
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  85. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +103 -23
  86. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +144 -53
  87. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +29 -11
  88. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +39 -15
  89. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +24 -22
  90. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +28 -26
  91. package/src/sap/fe/core/controllerextensions/editFlow/operations/actionHelper.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -572
  93. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +25 -873
  94. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  95. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +98 -56
  96. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -80
  97. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +5 -3
  98. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -4
  99. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +1 -1
  100. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +1 -1
  101. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  103. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  104. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  105. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +1 -1
  106. package/src/sap/fe/core/controls/Any.js +1 -1
  107. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  108. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  109. package/src/sap/fe/core/controls/ComponentLoader.js +1 -1
  110. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +3 -3
  111. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  112. package/src/sap/fe/core/controls/DataWatcher.js +4 -3
  113. package/src/sap/fe/core/controls/DataWatcher.tsx +4 -1
  114. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  115. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +10 -4
  116. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +13 -2
  117. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  118. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +1 -1
  119. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  120. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  121. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  122. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  123. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  124. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  125. package/src/sap/fe/core/converters/ConverterContext.js +1 -1
  126. package/src/sap/fe/core/converters/ManifestSettings.js +3 -2
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +42 -20
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +8 -2
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +8 -0
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  131. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  132. package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
  133. package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
  134. package/src/sap/fe/core/converters/controls/Common/Action.js +55 -6
  135. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  136. package/src/sap/fe/core/converters/controls/Common/Chart.js +45 -6
  137. package/src/sap/fe/core/converters/controls/Common/Chart.ts +60 -9
  138. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  139. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  140. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -5
  141. package/src/sap/fe/core/converters/controls/Common/Form.ts +25 -5
  142. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  143. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -1686
  144. package/src/sap/fe/core/converters/controls/Common/Table.ts +254 -2513
  145. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +1701 -0
  146. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2377 -0
  147. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +64 -15
  148. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +76 -14
  149. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -36
  150. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +8 -46
  151. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  152. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  153. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +10 -5
  154. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  155. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  156. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -3
  157. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +11 -4
  158. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +7 -2
  159. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  161. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  162. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  163. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
  164. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  165. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  166. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  167. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  168. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +30 -8
  169. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  170. package/src/sap/fe/core/converters/templates/ListReportConverter.js +5 -3
  171. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +5 -1
  172. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  173. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +184 -0
  174. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +240 -0
  175. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  176. package/src/sap/fe/core/designtime/messagebundle.properties +11 -0
  177. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  178. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  179. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  180. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  181. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  182. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  183. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  184. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  185. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  186. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  187. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  188. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  189. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  190. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  191. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  192. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  193. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  194. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  195. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  196. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  197. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  198. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  199. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  200. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  201. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  202. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  203. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  204. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  205. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  206. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  207. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  208. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  209. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  210. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  211. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  212. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  213. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  214. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  215. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  216. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  217. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  218. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  219. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  220. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  221. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  222. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  223. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  224. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  225. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  226. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  227. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  228. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  229. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  230. package/src/sap/fe/core/formatters/StandardFormatter.js +1 -1
  231. package/src/sap/fe/core/formatters/ValueFormatter.js +27 -12
  232. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -11
  233. package/src/sap/fe/core/fpm/Component.js +1 -1
  234. package/src/sap/fe/core/fpm/manifest.json +1 -1
  235. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +1 -1
  236. package/src/sap/fe/core/helpers/AppStartupHelper.js +25 -4
  237. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  238. package/src/sap/fe/core/helpers/BindingHelper.js +4 -3
  239. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  240. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
  241. package/src/sap/fe/core/helpers/DeleteHelper.js +6 -12
  242. package/src/sap/fe/core/helpers/DeleteHelper.ts +4 -9
  243. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  244. package/src/sap/fe/core/helpers/EditState.js +1 -1
  245. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  246. package/src/sap/fe/core/helpers/FPMHelper.js +9 -3
  247. package/src/sap/fe/core/helpers/FPMHelper.ts +13 -1
  248. package/src/sap/fe/core/helpers/HTTP503Handler.js +1 -1
  249. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  250. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  251. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  252. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -1
  253. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  254. package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
  255. package/src/sap/fe/core/helpers/MetaPath.js +1 -1
  256. package/src/sap/fe/core/helpers/ModelHelper.js +15 -5
  257. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  258. package/src/sap/fe/core/helpers/PasteHelper.js +39 -40
  259. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  260. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  261. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
  262. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
  263. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  264. package/src/sap/fe/core/helpers/SizeHelper.js +1 -1
  265. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  266. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -1
  267. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  268. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  269. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -1
  270. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  271. package/src/sap/fe/core/helpers/WebSocket.js +11 -2
  272. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  273. package/src/sap/fe/core/library.js +16 -4
  274. package/src/sap/fe/core/library.support.js +1 -1
  275. package/src/sap/fe/core/library.ts +1 -0
  276. package/src/sap/fe/core/manifestMerger/AddNewPage.js +1 -1
  277. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  278. package/src/sap/fe/core/messagebundle.properties +41 -2
  279. package/src/sap/fe/core/messagebundle_ar.properties +25 -4
  280. package/src/sap/fe/core/messagebundle_bg.properties +25 -4
  281. package/src/sap/fe/core/messagebundle_ca.properties +24 -3
  282. package/src/sap/fe/core/messagebundle_cnr.properties +25 -4
  283. package/src/sap/fe/core/messagebundle_cs.properties +23 -2
  284. package/src/sap/fe/core/messagebundle_cy.properties +24 -3
  285. package/src/sap/fe/core/messagebundle_da.properties +25 -4
  286. package/src/sap/fe/core/messagebundle_de.properties +28 -7
  287. package/src/sap/fe/core/messagebundle_el.properties +23 -2
  288. package/src/sap/fe/core/messagebundle_en.properties +25 -4
  289. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -4
  290. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -5
  291. package/src/sap/fe/core/messagebundle_es.properties +23 -2
  292. package/src/sap/fe/core/messagebundle_es_MX.properties +23 -2
  293. package/src/sap/fe/core/messagebundle_et.properties +23 -2
  294. package/src/sap/fe/core/messagebundle_fi.properties +23 -2
  295. package/src/sap/fe/core/messagebundle_fr.properties +26 -5
  296. package/src/sap/fe/core/messagebundle_fr_CA.properties +23 -2
  297. package/src/sap/fe/core/messagebundle_hi.properties +24 -3
  298. package/src/sap/fe/core/messagebundle_hr.properties +27 -6
  299. package/src/sap/fe/core/messagebundle_hu.properties +23 -2
  300. package/src/sap/fe/core/messagebundle_id.properties +23 -2
  301. package/src/sap/fe/core/messagebundle_it.properties +25 -4
  302. package/src/sap/fe/core/messagebundle_iw.properties +24 -3
  303. package/src/sap/fe/core/messagebundle_ja.properties +24 -3
  304. package/src/sap/fe/core/messagebundle_kk.properties +23 -2
  305. package/src/sap/fe/core/messagebundle_ko.properties +25 -4
  306. package/src/sap/fe/core/messagebundle_lt.properties +23 -2
  307. package/src/sap/fe/core/messagebundle_lv.properties +25 -4
  308. package/src/sap/fe/core/messagebundle_mk.properties +23 -2
  309. package/src/sap/fe/core/messagebundle_ms.properties +24 -3
  310. package/src/sap/fe/core/messagebundle_nl.properties +23 -2
  311. package/src/sap/fe/core/messagebundle_no.properties +23 -2
  312. package/src/sap/fe/core/messagebundle_pl.properties +25 -4
  313. package/src/sap/fe/core/messagebundle_pt.properties +25 -4
  314. package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -3
  315. package/src/sap/fe/core/messagebundle_ro.properties +25 -4
  316. package/src/sap/fe/core/messagebundle_ru.properties +24 -3
  317. package/src/sap/fe/core/messagebundle_sh.properties +25 -4
  318. package/src/sap/fe/core/messagebundle_sk.properties +24 -3
  319. package/src/sap/fe/core/messagebundle_sl.properties +28 -7
  320. package/src/sap/fe/core/messagebundle_sr.properties +25 -4
  321. package/src/sap/fe/core/messagebundle_sv.properties +23 -2
  322. package/src/sap/fe/core/messagebundle_th.properties +25 -4
  323. package/src/sap/fe/core/messagebundle_tr.properties +23 -2
  324. package/src/sap/fe/core/messagebundle_uk.properties +25 -4
  325. package/src/sap/fe/core/messagebundle_vi.properties +25 -4
  326. package/src/sap/fe/core/messagebundle_zh_CN.properties +26 -5
  327. package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -3
  328. package/src/sap/fe/core/rootView/Fcl.controller.js +11 -7
  329. package/src/sap/fe/core/rootView/Fcl.controller.ts +16 -7
  330. package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -3
  331. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  332. package/src/sap/fe/core/rootView/RootViewBaseController.js +87 -35
  333. package/src/sap/fe/core/rootView/RootViewBaseController.ts +113 -57
  334. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  335. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  336. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +29 -13
  337. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  338. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  339. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +1 -1
  340. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +8 -2
  341. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  342. package/src/sap/fe/core/services/InlineEditServiceFactory.js +11 -5
  343. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +9 -3
  344. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  345. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  346. package/src/sap/fe/core/services/RoutingServiceFactory.js +14 -7
  347. package/src/sap/fe/core/services/RoutingServiceFactory.ts +11 -5
  348. package/src/sap/fe/core/services/ShellServicesFactory.js +5 -4
  349. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  350. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +28 -4
  351. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  352. package/src/sap/fe/core/services/TelemetryServiceFactory.js +1 -1
  353. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  354. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +1 -1
  355. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  356. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -1
  357. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  358. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  359. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  360. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  361. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  362. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  363. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  364. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  365. package/src/sap/fe/core/templating/ActionHelper.js +1 -1
  366. package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
  367. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  368. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  369. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +199 -59
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  374. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  375. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  376. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  377. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  378. package/src/sap/fe/core/templating/SemanticObjectHelper.js +8 -10
  379. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +11 -10
  380. package/src/sap/fe/core/templating/UIFormatters.js +5 -2
  381. package/src/sap/fe/core/templating/UIFormatters.ts +3 -0
  382. package/src/sap/fe/core/type/Date.js +1 -1
  383. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  384. package/src/sap/fe/core/type/EDM.js +1 -1
  385. package/src/sap/fe/core/type/Email.js +1 -1
  386. package/src/sap/fe/core/type/FiscalDate.js +1 -1
  387. package/src/sap/fe/core/type/InputMask.js +1 -1
  388. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +0 -288
  389. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.tsx +0 -208
  390. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +0 -404
  391. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +0 -502
  392. package/src/sap/fe/core/designtime/TextArrangementChangeAction.js +0 -100
  393. package/src/sap/fe/core/designtime/TextArrangementChangeAction.ts +0 -134
  394. package/src/sap/fe/core/operationsHelper.js +0 -192
  395. package/src/sap/fe/core/operationsHelper.ts +0 -277
@@ -1,11 +1,12 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/routing/ContextPathHelper", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/ui/core/Component", "sap/ui/core/Lib", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../converters/MetaModelConverter", "./editFlow/editFlowConstants", "./messageHandler/messageHandling"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter, UiModelConstants, messageHandling) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/routing/ContextPathHelper", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/ui/core/Component", "sap/ui/core/Lib", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../converters/MetaModelConverter", "./collaboration/CollaborationCommon", "./editFlow/editFlowConstants", "./messageHandler/messageHandling"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter, CollaborationCommon, UiModelConstants, messageHandling) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _class, _class2;
9
+ var addSelf = CollaborationCommon.addSelf;
9
10
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
10
11
  var resolvePath = ContextPathHelper.resolvePath;
11
12
  var isPathOnDraftRoot = ContextPathHelper.isPathOnDraftRoot;
@@ -29,7 +30,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
29
30
  _inheritsLoose(InternalRouting, _ControllerExtension);
30
31
  var _proto = InternalRouting.prototype;
31
32
  _proto.onExit = function onExit() {
32
- if (this._oRoutingService) {
33
+ if (this._oRoutingService && this._fnRouteMatchedBound) {
33
34
  this._oRoutingService.detachRouteMatched(this._fnRouteMatchedBound);
34
35
  }
35
36
  };
@@ -52,8 +53,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
52
53
  }
53
54
  this._oAppComponent.getService("routingService").then(oRoutingService => {
54
55
  this._oRoutingService = oRoutingService;
55
- this._fnRouteMatchedBound = this._onRouteMatched.bind(this);
56
- this._oRoutingService.attachRouteMatched({}, this._fnRouteMatchedBound);
56
+ if (this._oPageComponent?.isA("sap.fe.core.ReuseComponent") !== true) {
57
+ // Reuse components can potentially embed a view with a page controller, we want to avoid attaching the route matched event in this case
58
+ this._fnRouteMatchedBound = this._onRouteMatched.bind(this);
59
+ this._oRoutingService.attachRouteMatched({}, this._fnRouteMatchedBound);
60
+ }
57
61
  this._oTargetInformation = oRoutingService.getTargetInformationFor(this._oPageComponent || this._oView) ?? {};
58
62
  return;
59
63
  }).catch(function () {
@@ -178,10 +182,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
178
182
  const internalModel = this._oView.getModel("internal");
179
183
  internalModel.setProperty("/paginatorCurrentContext", null);
180
184
 
181
- // Storing the selected context to use it in internal route navigation if neccessary.
185
+ // Storing the selected context to use it in internal route navigation if necessary.
186
+ let contextToNavigate = context;
187
+ let hiddenBinding;
188
+ if (parameters.updateFCLLevel === -1) {
189
+ // If we're navigating back, we need to find the "parent" context
190
+ const backPath = this._oRoutingService.getPathToNavigateBack(context.getPath());
191
+ // As we don't call the extension when navigating back to the LR, backPath is never empty so we can safely create a context
192
+ hiddenBinding = context.getModel().bindContext(backPath);
193
+ contextToNavigate = hiddenBinding.getBoundContext();
194
+ }
182
195
  const overrideNav = await this.base.getView().getController().routing.onBeforeNavigation({
183
- bindingContext: context
196
+ bindingContext: contextToNavigate
184
197
  });
198
+ hiddenBinding?.destroy();
185
199
  if (overrideNav) {
186
200
  internalModel.setProperty("/paginatorCurrentContext", context);
187
201
  return Promise.resolve(true);
@@ -649,12 +663,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
649
663
  sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet(),
650
664
  sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && `/${sEntitySet}`,
651
665
  oMetaModel = oModel.getMetaModel(),
666
+ isCollaborationDraftSupported = ModelHelper.isCollaborationDraftSupported(oMetaModel),
652
667
  mParameters = {
653
668
  $$groupId: "$auto.Heroes",
654
669
  $$updateGroupId: "$auto",
655
670
  $$patchWithoutSideEffects: true
656
671
  };
657
- if (this.base.editFlow.isInlineEditPossible()) {
672
+ if (this.base.inlineEditFlow.isInlineEditPossible()) {
658
673
  // if inline edit is enabled on the page and this is the active entity, we need to update the group id to inline
659
674
  mParameters.$$updateGroupId = sPath.includes("IsActiveEntity=true") ? CommonUtils.INLINEEDIT_UPDATEGROUPID : "$auto";
660
675
  }
@@ -698,6 +713,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
698
713
  propertiesToSelect.push(...semanticKeys);
699
714
  }
700
715
  propertiesToSelect.push(...alternateAndSecondaryKeys);
716
+ if (isCollaborationDraftSupported && oDraftRoot) {
717
+ propertiesToSelect.push("DraftAdministrativeData/DraftAdministrativeUser");
718
+ }
701
719
  if (propertiesToSelect.length) {
702
720
  mParameters.$select = propertiesToSelect.join(",");
703
721
  }
@@ -714,7 +732,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
714
732
  this.base.messageHandler.holdMessagesForControl(this._oView);
715
733
  });
716
734
  oHiddenBinding.attachEventOnce("dataReceived", this.onDataReceived.bind(this));
717
- return oHiddenBinding.getBoundContext();
735
+ const boundContext = oHiddenBinding.getBoundContext();
736
+ if (isCollaborationDraftSupported && sPath.includes("IsActiveEntity=false")) {
737
+ addSelf(oMetaModel, sContextPath, oModel, boundContext);
738
+ }
739
+ return boundContext;
718
740
  }
719
741
  };
720
742
  _proto.onDataReceived = async function onDataReceived(oEvent) {
@@ -935,7 +957,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
935
957
  const oMetaModel = oContext.getModel().getMetaModel();
936
958
  const navigationParameters = {
937
959
  noPreservationCache: true,
938
- sLayout: this._oView.getModel("fclhelper").getProperty("/actionButtonsInfo/closeColumn")
960
+ layout: this._oView.getModel("fclhelper").getProperty("/actionButtonsInfo/closeColumn")
939
961
  };
940
962
  const isDocumentModified = !!this.getView()?.getModel("ui")?.getProperty(UiModelConstants.DocumentModified) || !oContext.getProperty("HasActiveEntity");
941
963
  const isHiddenDraftEnabled = (this._oAppComponent.getEnvironmentCapabilities()?.getCapabilities()?.HiddenDraft).enabled;
@@ -948,9 +970,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
948
970
  this.navigateBackFromContext(oContext, navigationParameters);
949
971
  } else if (oViewData?.viewLevel === 1 && ModelHelper.isDraftSupported(oMetaModel, oContext.getPath())) {
950
972
  draft.processDataLossOrDraftDiscardConfirmation(() => {
973
+ // We don't have callExtension=true in this case, as there's a user validation with the dataloss dialog
974
+ // and it wouldn't make sense to cancel the navigation after this confirmation
951
975
  this.navigateBackFromContext(oContext, navigationParameters);
952
976
  }, Function.prototype, oContext, this._oView.getController(), true, draft.NavigationType.BackNavigation);
953
977
  } else {
978
+ navigationParameters.callExtension = true;
954
979
  this.navigateBackFromContext(oContext, navigationParameters);
955
980
  }
956
981
  // Removes transition message for the specified context
@@ -960,4 +985,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
960
985
  }(ControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype), _class2)) || _class);
961
986
  return InternalRouting;
962
987
  }, false);
963
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImlzQSIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY3JlYXRlZENvbnRleHQiLCJjaGVja05vSGFzaENoYW5nZSIsImVkaXRhYmxlIiwicGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJmb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJjYWxsRXh0ZW5zaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJvdmVycmlkZU5hdiIsIm9uQmVmb3JlTmF2aWdhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwiRkNMTGV2ZWwiLCJnZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJnZXRQYXRoIiwiY29udGV4dEZvck5hdmlnYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uIiwiZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZU9yQW5hbHl0aWNhbFRhYmxlIiwiZ2V0Vmlld0RhdGEiLCJvcmlnaW5hbENvbnRleHQiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZ2V0UHJvcGVydHkiLCJkcmFmdE9yQWN0aXZlQ29udGV4dCIsImdldERyYWZ0T3JBY3RpdmVDb250ZXh0Iiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsIm5hbWUiLCJpc0ZjbEVuYWJsZWQiLCJjb250ZXh0VG9SZXBsYWNlV2l0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXBsYWNlV2l0aCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwicGFyZW50QmluZGluZyIsImdldEJpbmRpbmciLCJhZ2dyZWdhdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiZ3JvdXAiLCJhZ2dyZWdhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5jbHVkZXMiLCJuYXZCYWNrIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwic0Vycm9yTWVzc2FnZSIsIm1QYXJhbWV0ZXJzIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhZGRCaW5kaW5nQ2xlYW51cFByb21pc2UiLCJzZXRUaW1lb3V0IiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImJBY3Rpb25DcmVhdGUiLCJvRXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwiYmluZFByb21pc2UiLCJvTW9kZWwiLCJfYmluZERlZmVycmVkIiwiRWRpdEZsb3dBY3Rpb24iLCJpc09wZW5JbkVkaXRNb2RlIiwiX2JpbmRQYWdlRm9yRWRpdCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ0b1N0cmluZyIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwidGFyZ2V0UGF0aCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsImxpc3RCaW5kaW5nIiwicGFyZW50Q29udGV4dCIsImRhdGEiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJ0ZWNobmljYWxQYXRoIiwicmVzb2x2ZVBhdGgiLCJpc1N0aWNreUVkaXRNb2RlIiwiaXNTdGlja3kiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJhY3RpdmVDb250ZXh0IiwidXNlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsImUiLCJtZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic2hvdWxkUmVmcmVzaENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJyZXNldENoYW5nZXMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldEdyb3VwSWQiLCJlcnIiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsIkFwcFN0YXRlQ2hhbmdlZCIsIlJlc3RvcmVIaXN0b3J5IiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNFeGl0aW5nIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJzUGF0aCIsIm9QYWdlQ29tcG9uZW50Iiwic0VudGl0eVNldCIsImdldEVudGl0eVNldCIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01ldGFNb2RlbCIsIiQkZ3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJpc0lubGluZUVkaXRQb3NzaWJsZSIsIklOTElORUVESVRfVVBEQVRFR1JPVVBJRCIsIm9EcmFmdFJvb3QiLCJnZXRPYmplY3QiLCJvRHJhZnROb2RlIiwiZGF0YU1vZGVsT2JqZWN0IiwiZ2V0Q29udGV4dCIsImFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwidGFyZ2V0RW50aXR5U2V0Iiwic2VtYW50aWNLZXlzIiwiQ29tbW9uIiwiU2VtYW50aWNLZXkiLCJtYXAiLCJrZXkiLCJ2YWx1ZSIsIl9nZXRLZWVwQWxpdmVDb250ZXh0IiwicHJvcGVydGllc1RvUmVxdWVzdCIsImNvbmNhdCIsInJlcXVlc3RQcm9wZXJ0eSIsInJlcXVlc3RPYmplY3QiLCJwcm9wZXJ0aWVzVG9TZWxlY3QiLCJzTWVzc2FnZXNQYXRoIiwiZ2V0TWVzc2FnZXNQYXRoIiwicHVzaCIsIiRzZWxlY3QiLCJqb2luIiwib1ByZXZpb3VzQmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJkZXN0cm95Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiaG9sZE1lc3NhZ2VzRm9yQ29udHJvbCIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0IiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJtUGFyYW1zIiwiZXJyb3JTdGF0dXMiLCJzdGF0dXMiLCJjYXVzZSIsIm9SZXNvdXJjZUJ1bmRsZSIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJjb250cm9sIiwicmVsZWFzZUhvbGRCeUNvbnRyb2wiLCJvQmluZGluZ0NvbnRleHQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwic1Jvb3RDb250ZXh0UGF0aCIsImFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocyIsImFQcm9wZXJ0eVBhdGhzIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwiZ2V0QmluZGluZ1BhdGhzIiwib0JpbmRpbmciLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsIml0ZW0iLCJpIiwicmVkdWNlIiwidGFyZ2V0UHJvcGVydHkiLCJpbmRleCIsImluZGV4T2YiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwic2V0S2VlcEFsaXZlIiwia2VwdEFsaXZlU2VnbWVudHMiLCJzcGxpdCIsImFkZGl0aW9ubmFsU2VnbWVudHMiLCJwb3AiLCJrZXB0QWxpdmVQYXRoIiwib0tlZXBBbGl2ZUNvbnRleHQiLCJyZXZlcnNlIiwiYWRkaXRpb25uYWxQYXRoIiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJsYXlvdXQiLCJ3YXJuaW5nIiwiY2xvc2VDb2x1bW4iLCJvVmlld0RhdGEiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwic0xheW91dCIsImlzRG9jdW1lbnRNb2RpZmllZCIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwiaXNIaWRkZW5EcmFmdEVuYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZW5hYmxlZCIsInNraXBEaXNjYXJkUG9wb3ZlciIsInNraXBCYWNrTmF2aWdhdGlvbiIsImNhbmNlbERvY3VtZW50IiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVRyYW5zaXN0aW9uTWVzc2FnZUZvckNvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsIk9iamVjdCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0LCBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgdHlwZSBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQsIHR5cGUgU2hvd01lc3NhZ2VzUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0LCBpc1BhdGhPbkRyYWZ0Um9vdCwgcmVzb2x2ZVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Db250ZXh0UGF0aEhlbHBlclwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbywgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdUYXJnZXQgfSBmcm9tIFwic2FwL3VpL2NvcmUvTWFuaWZlc3RcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcIi4vZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5cbnR5cGUgUm91dGVJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0cz86IHVua25vd25bXTtcblx0cm91dGVMZXZlbDogbnVtYmVyO1xufTtcbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9vVmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbiE6IFJvdXRpbmdUYXJnZXQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldykhID8/IHt9O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKF9iaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHt9XG5cblx0YmVmb3JlU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQsIF9tUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KGJpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdGFmdGVyU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCB7IC4uLl9tUGFyYW1ldGVycywgZGVmZXJyZWRDcmVhdGlvbjogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEBwYXJhbSBkZWxheWVkVXNhZ2UgVHJ1ZSB0byByZXR1cm4gYSBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIHRoZSBuYXZpZ2F0aW9uLCBGYWxzZSB0byBleGVjdXRlIHRoZSBuYXZpZ2F0aW9uIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IHRydWVcblx0KTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiBib29sZWFuXG5cdCk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0by5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHJldHVybnMgVGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0b1xuXHQgKi9cblx0YXN5bmMgZ2V0SGFzaEZvck5hdmlnYXRpb24oY29udGV4dDogQ29udGV4dCwgbmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzPy5fb1BhZ2VDb21wb25lbnQ/LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IGRldGFpbFJvdXRlID0gbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgcm91dGVOYW1lID0gZGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gZGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCByb3V0ZU5hbWUsIHBhcmFtZXRlck1hcHBpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVOYXYgPSBhd2FpdCB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbih7IGJpbmRpbmdDb250ZXh0OiBjb250ZXh0IH0pO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdC8vIEluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyBmcm9tIGEgdGFibGUgaW4gYSBMaXN0UmVwb3J0IHdpdGggZHJhZnQsIHRoZXJlJ3Mgc3BlY2lhbCBoYW5kbGluZyBmb3IgY29sbGFib3JhdGlvbiBhbmQgdHJlZSB0YWJsZS5cblx0XHQvLyBXZSBtYXkgbm90IG5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IHRoZSB1c2VyIGNsaWNrZWQgb24uXG5cdFx0aWYgKHBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzICYmIGNvbnRleHQuaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRcdGlmIChpc1BhdGhPbkRyYWZ0Um9vdChjb250ZXh0LmdldFBhdGgoKSwgbWV0YU1vZGVsKSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0Rm9yTmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKSkgPz9cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUoY29udGV4dCkpO1xuXG5cdFx0XHRcdC8vIFVzZSBhbm90aGVyIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdGlmIChjb250ZXh0Rm9yTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0Rm9yTmF2aWdhdGlvbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSIGFuZCB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBvcmlnaW5hbENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbnRleHQsIG51bGwgb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oXG5cdFx0b3JpZ2luYWxDb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHQpOiBQcm9taXNlPENvbnRleHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBvcmlnaW5hbENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiwgYW5kIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUixcblx0XHRcdC8vIFdlIHdhbnQgdG8gY2hlY2sgaWYgdGhlIGRyYWZ0IGluc3RhbmNlIGV4aXN0cyBmaXJzdC4gT3RoZXJ3aXNlIHdlIG5hdmlnYXRlIHRvIHRoZSBvcmlnaW5hbCAoZHJhZnQpIHZlcnNpb24uXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gTm90aWZ5IHRoZSB1c2VyIHRoYXQgd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdGhlIHNhdmVkIGluc3RhbmNlXG5cdFx0XHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkpKTtcblx0XHRcdFx0cGFyYW1ldGVycy5yZWRpcmVjdGVkVG9Ob25EcmFmdCA9XG5cdFx0XHRcdFx0KG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWUgYXMgdW5rbm93biBhcyBzdHJpbmcpID8/XG5cdFx0XHRcdFx0b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hbWU7XG5cblx0XHRcdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHQvLyBGQ0w6IHJlcGxhY2UgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRUb1JlcGxhY2VXaXRoID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdG9yaWdpbmFsQ29udGV4dC5yZXBsYWNlV2l0aChjb250ZXh0VG9SZXBsYWNlV2l0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRnVsbHNjcmVlbjogdHJpZ2dlciBhIHJlZnJlc2ggb2YgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSBzYXZlZCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYW4gYWN0aXZlIGluc3RhbmNlIGZyb20gdGhlIExSIGFuZCB3ZSdyZSBpbiBhIFRyZWUgb3IgQW5hbHl0aWNhbCB0YWJsZS5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZU9yQW5hbHl0aWNhbFRhYmxlKG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBwYXJlbnRCaW5kaW5nID0gb3JpZ2luYWxDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAoIXBhcmVudEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFRoZSBjb250ZXh0IGRvZXNuJ3QgYmVsb25nIHRvIGEgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYWdncmVnYXRpb24gPSBwYXJlbnRCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXNcblx0XHRcdHwgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmc7IGdyb3VwPzogb2JqZWN0OyBhZ2dyZWdhdGU/OiBvYmplY3QgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFhZ2dyZWdhdGlvbj8uaGllcmFyY2h5UXVhbGlmaWVyICYmICFhZ2dyZWdhdGlvbj8uZ3JvdXAgJiYgIWFnZ3JlZ2F0aW9uPy5hZ2dyZWdhdGUpIHtcblx0XHRcdC8vIFRoZSBjb250ZXh0IGRvZXNuJ3QgYmVsb25nIHRvIGEgaGllcmFyY2hpY2FsL2FuYWx5dGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZS9BbmFseXRpY2FsIHRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5nZXRGQ0xMZXZlbCgpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb24pOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCAhYVRhcmdldHMuaW5jbHVkZXModGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdC8vIFRoaXMgaXMgZG9uZSBpbiBhIHRpbWVvdXQgdG8gYWxsb3cgZm9yIGZvY3Vzb3V0IGV2ZW50cyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHByb3Blcmx5IGluIGNvbGxhYm9yYXRpdmUgZHJhZnRcblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYWRkQmluZGluZ0NsZWFudXBQcm9taXNlKFxuXHRcdFx0XHRcdG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIHJvdXRlIGhhcyBsZXZlbCAwIC0tPiB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBjb2xsYWJvcmF0aW9uIHNlc3Npb24gYXMgbm8gT1AgaXMgZGlzcGxheWVkXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiA/PyB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLmdldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX2JpbmREZWZlcnJlZCh0YXJnZXRQYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG51bGwsIHsgZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmICghbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMgfHwgbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMubW9kZSA9PT0gXCJEZWZlcnJlZFwiKSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LnBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LmRhdGEsXG5cdFx0XHRcdFx0ISFuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHQgb3IgdXNlIHRoZSBvbmUgdGhlIHVzZXIgY2xpY2tlZCBvblxuXHRcdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0ID1cblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0Py5nZXRQYXRoKCkgPT09IHRlY2huaWNhbFBhdGhcblx0XHRcdFx0XHRcdD8gbmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dFxuXHRcdFx0XHRcdFx0OiB0aGlzLl9jcmVhdGVDb250ZXh0KHRlY2huaWNhbFBhdGgsIG1vZGVsKTtcblxuXHRcdFx0XHQvLyBlZGl0IGRvY3VtZW50XG5cdFx0XHRcdHJldHVybiBhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuZWRpdERvY3VtZW50KGFjdGl2ZUNvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIG9uIHRoZSBwYWdlIGlzIHNldFxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlKHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0Ly8gVGhlIHBhZ2UgYmluZGluZyBpcyBkb25lIGFzeW5jaHJvbm91c2x5LCB0byBtYWtlIHN1cmUgX29uUm91dGVNYXRjaGVkIGlzIGNhbGxlZCBmb3IgYWxsIHRhcmdldHMgYmVmb3JlLCBhbmQgdGhlIGJpbmRpbmcgY2xlYW51cCBwcm9taXNlcyBhcmUgcHJvcGVybHkgc3RvcmVkIGluIHRoZSByb3V0aW5nIHNlcnZpY2UuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgcmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgbW9kZWwsIHRoaXMuX29Sb3V0aW5nU2VydmljZSwgdGhpcy5fb1JvdXRlcik7XG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe30pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQgKHRoaXMgaXMgYSBwYXRoIGluIHRoZSBtb2RlbCwgc28gb25seSB0ZWNobmljYWwga2V5cyBhcmUgYWxsb3dlZCkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzaG91bGRSZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSdyZSByZXVzaW5nIGEgY29udGV4dCBmcm9tIGEgdGFibGUgKHRocm91Z2ggbmF2aWdhdGlvbiksIHdlIHJlZnJlc2ggaXQgdG8gYXZvaWQgb3V0ZGF0ZWQgZGF0YVxuXHRcdFx0XHQvLyBXZSBkb24ndCB3YWl0IGZvciB0aGUgcmVmcmVzaCB0byBiZSBjb21wbGV0ZWQgKHJlcXVlc3RSZWZyZXNoKSwgc28gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBnb2VzIGludG8gdGhlIHNhbWVcblx0XHRcdFx0Ly8gYmF0Y2ggYXMgdGhlIG9uZXMgZnJvbSBjb250cm9scyBpbiB0aGUgcGFnZS5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgJiYgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcykge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Vc2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0aWYgKCFvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHxcblx0XHRcdFx0XHRcdChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSAmJlxuXHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBidXQgd2UncmUgaW4gY29sbGFib3JhdGlvbiBkcmFmdCwgd2UgZm9yY2UgdGhlIHJlZnJlc2ggKGRpc2NhcmRpbmcgcGVuZGluZyBjaGFuZ2VzKSBhcyB3ZSBuZWVkIHRvIGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1AsIHRoZSB2aWV3IGlzIG5vdCBjb25uZWN0ZWQgeWV0IC0tPiBjaGVjayBpZiB3ZSdyZSBpbiBkcmFmdCB3aXRoIGNvbGxhYm9yYXRpb24gZnJvbSB0aGUgbWV0YW1vZGVsXG5cdFx0XHRcdFx0XHRvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG9Vc2VDb250ZXh0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChzaG91bGRSZWZyZXNoQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgb1VzZUNvbnRleHQsIG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5nZXRHcm91cElkKCkpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoYENhbm5vdCByZWZyZXNoIGNvbnRleHQ6ICR7ZXJyfWApO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0XHQvLyBXZSBoYXZlIHRoZSBzYW1lIGNvbnRleHQgYnV0IGFuIGVkaXRmbG93IGFjdGlvbiBoYXBwZW5lZCAoZS5nLiBDYW5jZWxEb2N1bWVudCBpbiBzdGlja3kgbW9kZSlcblx0XHRcdFx0Ly8gLS0+IFdlIG5lZWQgdG8gY2FsbCBvbkJlZm9yZS9BZnRlckJpbmRpbmcgdG8gcmVmcmVzaCB0aGUgb2JqZWN0IHBhZ2UgcHJvcGVybHlcblx0XHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nOiBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCksXG5cdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0cmVhc29uOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uLFxuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwgeyByZWRpcmVjdGVkVG9Ob25EcmFmdDogb05hdmlnYXRpb25QYXJhbWV0ZXJzPy5yZWRpcmVjdGVkVG9Ob25EcmFmdCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5BcHBTdGF0ZUNoYW5nZWQgJiZcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uUmVzdG9yZUhpc3RvcnkgJiZcblx0XHRcdEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkgJiZcblx0XHRcdCFvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRvQ3VycmVudENvbnRleHRcblx0XHQpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCAmJiAhdGhpcy5fb0FwcENvbXBvbmVudC5pc0V4aXRpbmcgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlIC8vIExvYWQgbWVzc2FnZXMsIG90aGVyd2lzZSB0aGV5IGRvbid0IGdldCByZWZyZXNoZWQgbGF0ZXIsIGUuZy4gZm9yIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdC8vIHNldEtlZXBBbGl2ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgbGlzdGJpbmRpbmcgZG9lc24ndCBoYXZlICQkb3duUmVxdWVzdD10cnVlXG5cdFx0XHRcdC8vIFRoaXMgY2FzZSBmb3IgY3VzdG9tIGZyYWdtZW50cyBpcyBzdXBwb3J0ZWQsIGJ1dCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gbWFrZSB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYXBwYXJlbnRcblx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdGBWaWV3IGZvciAke29Db250ZXh0LmdldFBhdGgoKX0gd29uJ3QgYmUgc3luY2hyb25pemVkLiBQYXJlbnQgbGlzdEJpbmRpbmcgbXVzdCBoYXZlIGJpbmRpbmcgcGFyYW1ldGVyICQkb3duUmVxdWVzdD10cnVlYFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCBvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHR9KTtcblxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqL1xuXHRfY3JlYXRlQ29udGV4dChzUGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBDb250ZXh0IHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiLFxuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlXG5cdFx0XHR9O1xuXHRcdGlmICh0aGlzLmJhc2UuZWRpdEZsb3cuaXNJbmxpbmVFZGl0UG9zc2libGUoKSkge1xuXHRcdFx0Ly8gaWYgaW5saW5lIGVkaXQgaXMgZW5hYmxlZCBvbiB0aGUgcGFnZSBhbmQgdGhpcyBpcyB0aGUgYWN0aXZlIGVudGl0eSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGdyb3VwIGlkIHRvIGlubGluZVxuXHRcdFx0bVBhcmFtZXRlcnMuJCR1cGRhdGVHcm91cElkID0gc1BhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpID8gQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIDogXCIkYXV0b1wiO1xuXHRcdH1cblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KSBhbmQgc2VtYW50aWMga2V5cyAoZm9yIGNyZWF0aW5nIHRoZSBzZW1hbnRpYyBVUkwpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3QgPSBzQ29udGV4dFBhdGhcblx0XHRcdD8gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCkgJiYgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpKVxuXHRcdFx0OiBudWxsO1xuXHRcdGNvbnN0IGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMgPSBNb2RlbEhlbHBlci5nZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzKFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0Py50YXJnZXRFbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsXG5cdFx0XHRkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXRcblx0XHQpO1xuXHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IG9EcmFmdFJvb3Rcblx0XHRcdD8gZGF0YU1vZGVsT2JqZWN0Py50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU2VtYW50aWNLZXk/Lm1hcCgoa2V5KSA9PiBrZXkudmFsdWUpID8/IFtdXG5cdFx0XHQ6IFtdO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsLCBzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGtlZXBBbGl2ZSBjb250ZXh0ICR7c1BhdGh9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXS5jb25jYXQoc2VtYW50aWNLZXlzKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShwcm9wZXJ0aWVzVG9SZXF1ZXN0KTtcblx0XHRcdFx0XHRpZiAob0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRyYWZ0IGFuZCBlZGl0IHdlIG5lZWQgdG8gZW5zdXJlIHRob3NlIHByb3BlcnRpZXMgYXJlIHJlcXVlc3RlZCBhZ2FpbiBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBiaW5kaW5nJ3MgY2FjaGVcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2hlbiB5b3UgZWRpdCBhbmQgZ28gdG8gdGhlIHNhdmVkIHZlcnNpb24geW91IGhhdmUgbm8gd2F5IG9mIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBlZGl0IHZlcnNpb25cblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMob0RyYWZ0Um9vdCA/IHByb3BlcnRpZXNUb1JlcXVlc3QuY29uY2F0KFtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdKSA6IHByb3BlcnRpZXNUb1JlcXVlc3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydGllc1RvU2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaCguLi5zZW1hbnRpY0tleXMpO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goLi4uYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyk7XG5cblx0XHRcdGlmIChwcm9wZXJ0aWVzVG9TZWxlY3QubGVuZ3RoKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBwcm9wZXJ0aWVzVG9TZWxlY3Quam9pbihcIixcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUHJldmlvdXNCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b01vZGVsLnJlc2V0Q2hhbmdlcyhvUHJldmlvdXNCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdFx0dGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyLmhvbGRNZXNzYWdlc0ZvckNvbnRyb2wodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5vbkRhdGFSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgb25EYXRhUmVjZWl2ZWQob0V2ZW50OiBFdmVudDx7IGVycm9yOiB7IHN0YXR1cz86IG51bWJlcjsgY2F1c2U/OiB7IHN0YXR1cz86IG51bWJlciB9OyBtZXNzYWdlPzogc3RyaW5nIH0gfT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBlcnJvciA9IG9FdmVudD8uZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5fb1ZpZXcpKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0aWYgKGVycm9yKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0bGV0IG1QYXJhbXM6IFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgPSB7fTtcblx0XHRcdGNvbnN0IGVycm9yU3RhdHVzID0gZXJyb3Iuc3RhdHVzID8/IGVycm9yLmNhdXNlPy5zdGF0dXM7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRpZiAoZXJyb3JTdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yU3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGVycm9yPy5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdG1QYXJhbXMuY29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5yZWxlYXNlSG9sZEJ5Q29udHJvbCh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHRjb25zdCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgYVByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmc6IEJpbmRpbmcpOiB2b2lkIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKG9CaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpID8/IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBPE9EYXRhQ29udGV4dEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoaXRlbSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYVByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0Ly9hbGwgdGhpcyBsb2dpYyB0byBiZSByZXBsYWNlZCB3aXRoIGEgU2lkZUVmZmVjdHMgcmVxdWVzdCBmb3IgYW4gZW1wdHkgcGF0aCAocmVmcmVzaCBldmVyeXRoaW5nKSwgYWZ0ZXIgdGVzdGluZyB0cmFuc2llbnQgY29udGV4dHNcblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0czogc3RyaW5nW10sIHRhcmdldFByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAodGFyZ2V0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0YXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0dGFyZ2V0cy5wdXNoKGluZGV4ID4gMCA/IHRhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KSA6IHRhcmdldFByb3BlcnR5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRzO1xuXHRcdH0sIFtdKTtcblx0XHQvLyBPRGF0YSBtb2RlbCB3aWxsIHRha2UgY2FyZSBvZiBkdXBsaWNhdGVzXG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCk6IHZvaWQge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1ByZXZpb3VzQ29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqL1xuXHRnZXRGQ0xMZXZlbCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHRfc2V0S2VlcEFsaXZlKFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdGJLZWVwQWxpdmU6IGJvb2xlYW4sXG5cdFx0Zm5CZWZvcmVEZXN0cm95PzogUGFyYW1ldGVyczxDb250ZXh0W1wic2V0S2VlcEFsaXZlXCJdPlsxXSxcblx0XHRiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRpZiAob0NvbnRleHQuZ2V0UGF0aCgpLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gV2Uga2VlcCB0aGUgY29udGV4dCBhbGl2ZSBvbmx5IGlmIHRoZXkncmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIGkuZS4gaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgJyknXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc01ldGFQYXRoKTtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShiS2VlcEFsaXZlLCBmbkJlZm9yZURlc3Ryb3ksICEhc01lc3NhZ2VzUGF0aCAmJiBiUmVxdWVzdE1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0S2VlcEFsaXZlQ29udGV4dChcblx0XHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0cGF0aDogc3RyaW5nLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuLFxuXHRcdHBhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnNcblx0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgY29udGV4dCB0aGF0IGlzIHJlYWxseSBrZXB0IGFsaXZlIChwYXJ0IG9mIGEgY29sbGVjdGlvbilcblx0XHQvLyBpLmUuIHJlbW92ZSBhbGwgc2VnbWVudHMgbm90IGVuZGluZyB3aXRoIGEgJyknXG5cdFx0Y29uc3Qga2VwdEFsaXZlU2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhZGRpdGlvbm5hbFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggJiYgIWtlcHRBbGl2ZVNlZ21lbnRzW2tlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5wdXNoKGtlcHRBbGl2ZVNlZ21lbnRzLnBvcCgpISk7XG5cdFx0fVxuXG5cdFx0aWYgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBrZXB0QWxpdmVQYXRoID0ga2VwdEFsaXZlU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0Y29uc3Qgb0tlZXBBbGl2ZUNvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChrZXB0QWxpdmVQYXRoLCBiUmVxdWVzdE1lc3NhZ2VzLCBwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChhZGRpdGlvbm5hbFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG9LZWVwQWxpdmVDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnJldmVyc2UoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9ubmFsUGF0aCA9IGFkZGl0aW9ubmFsU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0XHRyZXR1cm4gb01vZGVsLmJpbmRDb250ZXh0KGFkZGl0aW9ubmFsUGF0aCwgb0tlZXBBbGl2ZUNvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpOiB2b2lkIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gKG9Sb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dFxuXHRcdFx0PyAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkhXG5cdFx0XHQ6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBsYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGFzeW5jIGNsb3NlQ29sdW1uKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0bm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSxcblx0XHRcdHNMYXlvdXQ6IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Nsb3NlQ29sdW1uXCIpXG5cdFx0fTtcblxuXHRcdGNvbnN0IGlzRG9jdW1lbnRNb2RpZmllZCA9XG5cdFx0XHQhIXRoaXMuZ2V0VmlldygpPy5nZXRNb2RlbChcInVpXCIpPy5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpIHx8ICFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRjb25zdCBpc0hpZGRlbkRyYWZ0RW5hYmxlZCA9ICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdClcblx0XHRcdC5lbmFibGVkO1xuXG5cdFx0aWYgKCFpc0RvY3VtZW50TW9kaWZpZWQgJiYgaXNIaWRkZW5EcmFmdEVuYWJsZWQpIHtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWUsXG5cdFx0XHRcdHNraXBCYWNrTmF2aWdhdGlvbjogdHJ1ZVxuXHRcdFx0fTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAob1ZpZXdEYXRhPy52aWV3TGV2ZWwgPT09IDEgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBvQ29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5fb1ZpZXcuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBSZW1vdmVzIHRyYW5zaXRpb24gbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0XG5cdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVRyYW5zaXN0aW9uTWVzc2FnZUZvckNvbnRleHQob0NvbnRleHQpO1xu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
988
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiaXNBIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY3JlYXRlZENvbnRleHQiLCJjaGVja05vSGFzaENoYW5nZSIsImVkaXRhYmxlIiwicGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJmb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJjYWxsRXh0ZW5zaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsImhpZGRlbkJpbmRpbmciLCJiYWNrUGF0aCIsImdldFBhdGhUb05hdmlnYXRlQmFjayIsImdldFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiZGVzdHJveSIsIlByb21pc2UiLCJyZXNvbHZlIiwiRkNMTGV2ZWwiLCJnZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJncm91cCIsImFnZ3JlZ2F0ZSIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJzSGFzaCIsImdldEhhc2giLCJpbmNsdWRlcyIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJuYXZUb0hhc2giLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImRpc3BsYXlFcnJvclBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImFkZEJpbmRpbmdDbGVhbnVwUHJvbWlzZSIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJfc2V0QmluZGluZ0NvbnRleHQiLCJfYnVpbGRCaW5kaW5nUGF0aCIsInJvdXRlQXJndW1lbnRzIiwiYmluZGluZ1BhdHRlcm4iLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBhdGgiLCJyZXBsYWNlIiwiZGVmZXJyZWQiLCJzS2V5Iiwic1ZhbHVlIiwiYlRhcmdldEVkaXRhYmxlIiwiYkFjdGlvbkNyZWF0ZSIsIm9FdmVudCIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJiaW5kUHJvbWlzZSIsIm9Nb2RlbCIsIl9iaW5kRGVmZXJyZWQiLCJFZGl0Rmxvd0FjdGlvbiIsImlzT3BlbkluRWRpdE1vZGUiLCJfYmluZFBhZ2VGb3JFZGl0IiwiX2JpbmRQYWdlIiwiZmluYWxseSIsInRvU3RyaW5nIiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJ0YXJnZXRQYXRoIiwiY3JlYXRlRGVmZXJyZWRDb250ZXh0IiwibGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwiZGF0YSIsIl9iaW5kUGFnZVRvQ29udGV4dCIsInRlY2huaWNhbFBhdGgiLCJyZXNvbHZlUGF0aCIsImlzU3RpY2t5RWRpdE1vZGUiLCJpc1N0aWNreSIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImFjdGl2ZUNvbnRleHQiLCJ1c2VDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJlZGl0RmxvdyIsImVkaXREb2N1bWVudCIsIl9iaW5kUGFnZVRvUGF0aCIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwiZSIsIm1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VzIiwic1RhcmdldFBhdGgiLCJvQ3VycmVudENvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJzaG91bGRSZWZyZXNoQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaXNEcmFmdFN1cHBvcnRlZCIsInJlc2V0Q2hhbmdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJvRHJhZnRSb290IiwiZ2V0T2JqZWN0Iiwib0RyYWZ0Tm9kZSIsImRhdGFNb2RlbE9iamVjdCIsImdldENvbnRleHQiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsInRhcmdldEVudGl0eVNldCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5IiwibWFwIiwia2V5IiwidmFsdWUiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJjb25jYXQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicHJvcGVydGllc1RvU2VsZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsInB1c2giLCIkc2VsZWN0Iiwiam9pbiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwib0hpZGRlbkJpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJvbkRhdGFSZWNlaXZlZCIsImJvdW5kQ29udGV4dCIsImFkZFNlbGYiLCJpc0xvY2tlZCIsInVubG9jayIsIm1QYXJhbXMiLCJlcnJvclN0YXR1cyIsInN0YXR1cyIsImNhdXNlIiwib1Jlc291cmNlQnVuZGxlIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsImNvbnRyb2wiLCJyZWxlYXNlSG9sZEJ5Q29udHJvbCIsIm9CaW5kaW5nQ29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaXRlbSIsImkiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4IiwiaW5kZXhPZiIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiaXNLZWVwQWxpdmUiLCJiS2VlcEFsaXZlIiwiZm5CZWZvcmVEZXN0cm95IiwiYlJlcXVlc3RNZXNzYWdlcyIsImVuZHNXaXRoIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzZXRLZWVwQWxpdmUiLCJrZXB0QWxpdmVTZWdtZW50cyIsInNwbGl0IiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJvS2VlcEFsaXZlQ29udGV4dCIsInJldmVyc2UiLCJhZGRpdGlvbm5hbFBhdGgiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsImxheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsImlzSGlkZGVuRHJhZnRFbmFibGVkIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJIaWRkZW5EcmFmdCIsImVuYWJsZWQiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJza2lwQmFja05hdmlnYXRpb24iLCJjYW5jZWxEb2N1bWVudCIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJGdW5jdGlvbiIsIk5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0IiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0LCB0eXBlIFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBnZXREcmFmdE9yQWN0aXZlQ29udGV4dCwgaXNQYXRoT25EcmFmdFJvb3QsIHJlc29sdmVQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvQ29udGV4dFBhdGhIZWxwZXJcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IGFkZFNlbGYgfSBmcm9tIFwiLi9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCIuL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCIuL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBGRVZpZXc7XG5cblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblxuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cblx0cHJpdmF0ZSBfb1JvdXRlciE6IFJvdXRlcjtcblxuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblxuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblxuXHRwcml2YXRlIF9mblJvdXRlTWF0Y2hlZEJvdW5kPzogRnVuY3Rpb247XG5cblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb24hOiBSb3V0aW5nVGFyZ2V0O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlICYmIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQ/LmlzQShcInNhcC5mZS5jb3JlLlJldXNlQ29tcG9uZW50XCIpICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0Ly8gUmV1c2UgY29tcG9uZW50cyBjYW4gcG90ZW50aWFsbHkgZW1iZWQgYSB2aWV3IHdpdGggYSBwYWdlIGNvbnRyb2xsZXIsIHdlIHdhbnQgdG8gYXZvaWQgYXR0YWNoaW5nIHRoZSByb3V0ZSBtYXRjaGVkIGV2ZW50IGluIHRoaXMgY2FzZVxuXHRcdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQoe30sIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldykhID8/IHt9O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKF9iaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHt9XG5cblx0YmVmb3JlU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQsIF9tUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KGJpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdGFmdGVyU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCB7IC4uLl9tUGFyYW1ldGVycywgZGVmZXJyZWRDcmVhdGlvbjogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEBwYXJhbSBkZWxheWVkVXNhZ2UgVHJ1ZSB0byByZXR1cm4gYSBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIHRoZSBuYXZpZ2F0aW9uLCBGYWxzZSB0byBleGVjdXRlIHRoZSBuYXZpZ2F0aW9uIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IHRydWVcblx0KTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiBib29sZWFuXG5cdCk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0by5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHJldHVybnMgVGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0b1xuXHQgKi9cblx0YXN5bmMgZ2V0SGFzaEZvck5hdmlnYXRpb24oY29udGV4dDogQ29udGV4dCwgbmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzPy5fb1BhZ2VDb21wb25lbnQ/LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IGRldGFpbFJvdXRlID0gbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgcm91dGVOYW1lID0gZGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gZGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCByb3V0ZU5hbWUsIHBhcmFtZXRlck1hcHBpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNlc3NhcnkuXG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCBudWxsID0gY29udGV4dDtcblx0XHRcdGxldCBoaWRkZW5CaW5kaW5nOiBPRGF0YUNvbnRleHRCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPT09IC0xKSB7XG5cdFx0XHRcdC8vIElmIHdlJ3JlIG5hdmlnYXRpbmcgYmFjaywgd2UgbmVlZCB0byBmaW5kIHRoZSBcInBhcmVudFwiIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYmFja1BhdGggPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0UGF0aFRvTmF2aWdhdGVCYWNrKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Ly8gQXMgd2UgZG9uJ3QgY2FsbCB0aGUgZXh0ZW5zaW9uIHdoZW4gbmF2aWdhdGluZyBiYWNrIHRvIHRoZSBMUiwgYmFja1BhdGggaXMgbmV2ZXIgZW1wdHkgc28gd2UgY2FuIHNhZmVseSBjcmVhdGUgYSBjb250ZXh0XG5cdFx0XHRcdGhpZGRlbkJpbmRpbmcgPSBjb250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYmFja1BhdGgpO1xuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IGhpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvdmVycmlkZU5hdiA9IGF3YWl0IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKHsgYmluZGluZ0NvbnRleHQ6IGNvbnRleHRUb05hdmlnYXRlIH0pO1xuXHRcdFx0aGlkZGVuQmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdC8vIEluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyBmcm9tIGEgdGFibGUgaW4gYSBMaXN0UmVwb3J0IHdpdGggZHJhZnQsIHRoZXJlJ3Mgc3BlY2lhbCBoYW5kbGluZyBmb3IgY29sbGFib3JhdGlvbiBhbmQgdHJlZSB0YWJsZS5cblx0XHQvLyBXZSBtYXkgbm90IG5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IHRoZSB1c2VyIGNsaWNrZWQgb24uXG5cdFx0aWYgKHBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzICYmIGNvbnRleHQuaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRcdGlmIChpc1BhdGhPbkRyYWZ0Um9vdChjb250ZXh0LmdldFBhdGgoKSwgbWV0YU1vZGVsKSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0Rm9yTmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKSkgPz9cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUoY29udGV4dCkpO1xuXG5cdFx0XHRcdC8vIFVzZSBhbm90aGVyIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdGlmIChjb250ZXh0Rm9yTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0Rm9yTmF2aWdhdGlvbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSIGFuZCB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBvcmlnaW5hbENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbnRleHQsIG51bGwgb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oXG5cdFx0b3JpZ2luYWxDb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHQpOiBQcm9taXNlPENvbnRleHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBvcmlnaW5hbENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiwgYW5kIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUixcblx0XHRcdC8vIFdlIHdhbnQgdG8gY2hlY2sgaWYgdGhlIGRyYWZ0IGluc3RhbmNlIGV4aXN0cyBmaXJzdC4gT3RoZXJ3aXNlIHdlIG5hdmlnYXRlIHRvIHRoZSBvcmlnaW5hbCAoZHJhZnQpIHZlcnNpb24uXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gTm90aWZ5IHRoZSB1c2VyIHRoYXQgd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdGhlIHNhdmVkIGluc3RhbmNlXG5cdFx0XHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkpKTtcblx0XHRcdFx0cGFyYW1ldGVycy5yZWRpcmVjdGVkVG9Ob25EcmFmdCA9XG5cdFx0XHRcdFx0KG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWUgYXMgdW5rbm93biBhcyBzdHJpbmcpID8/XG5cdFx0XHRcdFx0b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hbWU7XG5cblx0XHRcdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHQvLyBGQ0w6IHJlcGxhY2UgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRUb1JlcGxhY2VXaXRoID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdG9yaWdpbmFsQ29udGV4dC5yZXBsYWNlV2l0aChjb250ZXh0VG9SZXBsYWNlV2l0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRnVsbHNjcmVlbjogdHJpZ2dlciBhIHJlZnJlc2ggb2YgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSBzYXZlZCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYW4gYWN0aXZlIGluc3RhbmNlIGZyb20gdGhlIExSIGFuZCB3ZSdyZSBpbiBhIFRyZWUgb3IgQW5hbHl0aWNhbCB0YWJsZS5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZU9yQW5hbHl0aWNhbFRhYmxlKG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBwYXJlbnRCaW5kaW5nID0gb3JpZ2luYWxDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAoIXBhcmVudEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFRoZSBjb250ZXh0IGRvZXNuJ3QgYmVsb25nIHRvIGEgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYWdncmVnYXRpb24gPSBwYXJlbnRCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXNcblx0XHRcdHwgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmc7IGdyb3VwPzogb2JqZWN0OyBhZ2dyZWdhdGU/OiBvYmplY3QgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFhZ2dyZWdhdGlvbj8uaGllcmFyY2h5UXVhbGlmaWVyICYmICFhZ2dyZWdhdGlvbj8uZ3JvdXAgJiYgIWFnZ3JlZ2F0aW9uPy5hZ2dyZWdhdGUpIHtcblx0XHRcdC8vIFRoZSBjb250ZXh0IGRvZXNuJ3QgYmVsb25nIHRvIGEgaGllcmFyY2hpY2FsL2FuYWx5dGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZS9BbmFseXRpY2FsIHRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5nZXRGQ0xMZXZlbCgpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb24pOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCAhYVRhcmdldHMuaW5jbHVkZXModGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdC8vIFRoaXMgaXMgZG9uZSBpbiBhIHRpbWVvdXQgdG8gYWxsb3cgZm9yIGZvY3Vzb3V0IGV2ZW50cyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHByb3Blcmx5IGluIGNvbGxhYm9yYXRpdmUgZHJhZnRcblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYWRkQmluZGluZ0NsZWFudXBQcm9taXNlKFxuXHRcdFx0XHRcdG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIHJvdXRlIGhhcyBsZXZlbCAwIC0tPiB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBjb2xsYWJvcmF0aW9uIHNlc3Npb24gYXMgbm8gT1AgaXMgZGlzcGxheWVkXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiA/PyB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLmdldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX2JpbmREZWZlcnJlZCh0YXJnZXRQYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG51bGwsIHsgZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmICghbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMgfHwgbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMubW9kZSA9PT0gXCJEZWZlcnJlZFwiKSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LnBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LmRhdGEsXG5cdFx0XHRcdFx0ISFuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHQgb3IgdXNlIHRoZSBvbmUgdGhlIHVzZXIgY2xpY2tlZCBvblxuXHRcdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0ID1cblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0Py5nZXRQYXRoKCkgPT09IHRlY2huaWNhbFBhdGhcblx0XHRcdFx0XHRcdD8gbmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dFxuXHRcdFx0XHRcdFx0OiB0aGlzLl9jcmVhdGVDb250ZXh0KHRlY2huaWNhbFBhdGgsIG1vZGVsKTtcblxuXHRcdFx0XHQvLyBlZGl0IGRvY3VtZW50XG5cdFx0XHRcdHJldHVybiBhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuZWRpdERvY3VtZW50KGFjdGl2ZUNvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIG9uIHRoZSBwYWdlIGlzIHNldFxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlKHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0Ly8gVGhlIHBhZ2UgYmluZGluZyBpcyBkb25lIGFzeW5jaHJvbm91c2x5LCB0byBtYWtlIHN1cmUgX29uUm91dGVNYXRjaGVkIGlzIGNhbGxlZCBmb3IgYWxsIHRhcmdldHMgYmVmb3JlLCBhbmQgdGhlIGJpbmRpbmcgY2xlYW51cCBwcm9taXNlcyBhcmUgcHJvcGVybHkgc3RvcmVkIGluIHRoZSByb3V0aW5nIHNlcnZpY2UuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgcmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgbW9kZWwsIHRoaXMuX29Sb3V0aW5nU2VydmljZSwgdGhpcy5fb1JvdXRlcik7XG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe30pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQgKHRoaXMgaXMgYSBwYXRoIGluIHRoZSBtb2RlbCwgc28gb25seSB0ZWNobmljYWwga2V5cyBhcmUgYWxsb3dlZCkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzaG91bGRSZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSdyZSByZXVzaW5nIGEgY29udGV4dCBmcm9tIGEgdGFibGUgKHRocm91Z2ggbmF2aWdhdGlvbiksIHdlIHJlZnJlc2ggaXQgdG8gYXZvaWQgb3V0ZGF0ZWQgZGF0YVxuXHRcdFx0XHQvLyBXZSBkb24ndCB3YWl0IGZvciB0aGUgcmVmcmVzaCB0byBiZSBjb21wbGV0ZWQgKHJlcXVlc3RSZWZyZXNoKSwgc28gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBnb2VzIGludG8gdGhlIHNhbWVcblx0XHRcdFx0Ly8gYmF0Y2ggYXMgdGhlIG9uZXMgZnJvbSBjb250cm9scyBpbiB0aGUgcGFnZS5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgJiYgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcykge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Vc2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0aWYgKCFvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHxcblx0XHRcdFx0XHRcdChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSAmJlxuXHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBidXQgd2UncmUgaW4gY29sbGFib3JhdGlvbiBkcmFmdCwgd2UgZm9yY2UgdGhlIHJlZnJlc2ggKGRpc2NhcmRpbmcgcGVuZGluZyBjaGFuZ2VzKSBhcyB3ZSBuZWVkIHRvIGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1AsIHRoZSB2aWV3IGlzIG5vdCBjb25uZWN0ZWQgeWV0IC0tPiBjaGVjayBpZiB3ZSdyZSBpbiBkcmFmdCB3aXRoIGNvbGxhYm9yYXRpb24gZnJvbSB0aGUgbWV0YW1vZGVsXG5cdFx0XHRcdFx0XHRvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG9Vc2VDb250ZXh0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChzaG91bGRSZWZyZXNoQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgb1VzZUNvbnRleHQsIG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5nZXRHcm91cElkKCkpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoYENhbm5vdCByZWZyZXNoIGNvbnRleHQ6ICR7ZXJyfWApO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0XHQvLyBXZSBoYXZlIHRoZSBzYW1lIGNvbnRleHQgYnV0IGFuIGVkaXRmbG93IGFjdGlvbiBoYXBwZW5lZCAoZS5nLiBDYW5jZWxEb2N1bWVudCBpbiBzdGlja3kgbW9kZSlcblx0XHRcdFx0Ly8gLS0+IFdlIG5lZWQgdG8gY2FsbCBvbkJlZm9yZS9BZnRlckJpbmRpbmcgdG8gcmVmcmVzaCB0aGUgb2JqZWN0IHBhZ2UgcHJvcGVybHlcblx0XHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nOiBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCksXG5cdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0cmVhc29uOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uLFxuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwgeyByZWRpcmVjdGVkVG9Ob25EcmFmdDogb05hdmlnYXRpb25QYXJhbWV0ZXJzPy5yZWRpcmVjdGVkVG9Ob25EcmFmdCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5BcHBTdGF0ZUNoYW5nZWQgJiZcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uUmVzdG9yZUhpc3RvcnkgJiZcblx0XHRcdEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkgJiZcblx0XHRcdCFvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRvQ3VycmVudENvbnRleHRcblx0XHQpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCAmJiAhdGhpcy5fb0FwcENvbXBvbmVudC5pc0V4aXRpbmcgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlIC8vIExvYWQgbWVzc2FnZXMsIG90aGVyd2lzZSB0aGV5IGRvbid0IGdldCByZWZyZXNoZWQgbGF0ZXIsIGUuZy4gZm9yIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdC8vIHNldEtlZXBBbGl2ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgbGlzdGJpbmRpbmcgZG9lc24ndCBoYXZlICQkb3duUmVxdWVzdD10cnVlXG5cdFx0XHRcdC8vIFRoaXMgY2FzZSBmb3IgY3VzdG9tIGZyYWdtZW50cyBpcyBzdXBwb3J0ZWQsIGJ1dCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gbWFrZSB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYXBwYXJlbnRcblx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdGBWaWV3IGZvciAke29Db250ZXh0LmdldFBhdGgoKX0gd29uJ3QgYmUgc3luY2hyb25pemVkLiBQYXJlbnQgbGlzdEJpbmRpbmcgbXVzdCBoYXZlIGJpbmRpbmcgcGFyYW1ldGVyICQkb3duUmVxdWVzdD10cnVlYFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCBvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHR9KTtcblxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqL1xuXHRfY3JlYXRlQ29udGV4dChzUGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBDb250ZXh0IHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHRpZiAodGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmlzSW5saW5lRWRpdFBvc3NpYmxlKCkpIHtcblx0XHRcdC8vIGlmIGlubGluZSBlZGl0IGlzIGVuYWJsZWQgb24gdGhlIHBhZ2UgYW5kIHRoaXMgaXMgdGhlIGFjdGl2ZSBlbnRpdHksIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBncm91cCBpZCB0byBpbmxpbmVcblx0XHRcdG1QYXJhbWV0ZXJzLiQkdXBkYXRlR3JvdXBJZCA9IHNQYXRoLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHk9dHJ1ZVwiKSA/IENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCA6IFwiJGF1dG9cIjtcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSkgYW5kIHNlbWFudGljIGtleXMgKGZvciBjcmVhdGluZyB0aGUgc2VtYW50aWMgVVJMKVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0ID0gc0NvbnRleHRQYXRoXG5cdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpICYmIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvTWV0YU1vZGVsLmdldENvbnRleHQoc0NvbnRleHRQYXRoKSlcblx0XHRcdDogbnVsbDtcblx0XHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhcblx0XHRcdGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5VHlwZSBhcyBFbnRpdHlUeXBlLFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0Py50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0XG5cdFx0KTtcblx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBvRHJhZnRSb290XG5cdFx0XHQ/IGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5Py5tYXAoKGtleSkgPT4ga2V5LnZhbHVlKSA/PyBbXVxuXHRcdFx0OiBbXTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbCwgc1BhdGgsIGZhbHNlLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBrZWVwQWxpdmUgY29udGV4dCAke3NQYXRofWApO1xuXHRcdFx0fSBlbHNlIGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0uY29uY2F0KHNlbWFudGljS2V5cyk7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocHJvcGVydGllc1RvUmVxdWVzdCk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKG9EcmFmdFJvb3QgPyBwcm9wZXJ0aWVzVG9SZXF1ZXN0LmNvbmNhdChbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXSkgOiBwcm9wZXJ0aWVzVG9SZXF1ZXN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1NlbGVjdDogc3RyaW5nW10gPSBbXTtcblx0XHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKFwiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goLi4uc2VtYW50aWNLZXlzKTtcblx0XHRcdH1cblx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKC4uLmFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMpO1xuXG5cdFx0XHRpZiAoaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgJiYgb0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJvcGVydGllc1RvU2VsZWN0Lmxlbmd0aCkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gcHJvcGVydGllc1RvU2VsZWN0LmpvaW4oXCIsXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRjb25zdCBvUHJldmlvdXNCaW5kaW5nID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1ByZXZpb3VzQmluZGluZykge1xuXHRcdFx0XHRcdG9Nb2RlbC5yZXNldENoYW5nZXMob1ByZXZpb3VzQmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHRcdG9QcmV2aW91c0JpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHRcdHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5ob2xkTWVzc2FnZXNGb3JDb250cm9sKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRjb25zdCBib3VuZENvbnRleHQgPSBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGlmIChpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCAmJiBzUGF0aC5pbmNsdWRlcyhcIklzQWN0aXZlRW50aXR5PWZhbHNlXCIpKSB7XG5cdFx0XHRcdGFkZFNlbGYob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoISwgb01vZGVsLCBib3VuZENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGJvdW5kQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgb25EYXRhUmVjZWl2ZWQob0V2ZW50OiBFdmVudDx7IGVycm9yOiB7IHN0YXR1cz86IG51bWJlcjsgY2F1c2U/OiB7IHN0YXR1cz86IG51bWJlciB9OyBtZXNzYWdlPzogc3RyaW5nIH0gfT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBlcnJvciA9IG9FdmVudD8uZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5fb1ZpZXcpKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0aWYgKGVycm9yKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0bGV0IG1QYXJhbXM6IFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgPSB7fTtcblx0XHRcdGNvbnN0IGVycm9yU3RhdHVzID0gZXJyb3Iuc3RhdHVzID8/IGVycm9yLmNhdXNlPy5zdGF0dXM7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRpZiAoZXJyb3JTdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yU3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGVycm9yPy5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdG1QYXJhbXMuY29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5yZWxlYXNlSG9sZEJ5Q29udHJvbCh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHRjb25zdCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgYVByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmc6IEJpbmRpbmcpOiB2b2lkIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKG9CaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpID8/IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBPE9EYXRhQ29udGV4dEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoaXRlbSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYVByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0Ly9hbGwgdGhpcyBsb2dpYyB0byBiZSByZXBsYWNlZCB3aXRoIGEgU2lkZUVmZmVjdHMgcmVxdWVzdCBmb3IgYW4gZW1wdHkgcGF0aCAocmVmcmVzaCBldmVyeXRoaW5nKSwgYWZ0ZXIgdGVzdGluZyB0cmFuc2llbnQgY29udGV4dHNcblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0czogc3RyaW5nW10sIHRhcmdldFByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAodGFyZ2V0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0YXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0dGFyZ2V0cy5wdXNoKGluZGV4ID4gMCA/IHRhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KSA6IHRhcmdldFByb3BlcnR5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRzO1xuXHRcdH0sIFtdKTtcblx0XHQvLyBPRGF0YSBtb2RlbCB3aWxsIHRha2UgY2FyZSBvZiBkdXBsaWNhdGVzXG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCk6IHZvaWQge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1ByZXZpb3VzQ29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqL1xuXHRnZXRGQ0xMZXZlbCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHRfc2V0S2VlcEFsaXZlKFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdGJLZWVwQWxpdmU6IGJvb2xlYW4sXG5cdFx0Zm5CZWZvcmVEZXN0cm95PzogUGFyYW1ldGVyczxDb250ZXh0W1wic2V0S2VlcEFsaXZlXCJdPlsxXSxcblx0XHRiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRpZiAob0NvbnRleHQuZ2V0UGF0aCgpLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gV2Uga2VlcCB0aGUgY29udGV4dCBhbGl2ZSBvbmx5IGlmIHRoZXkncmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIGkuZS4gaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgJyknXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc01ldGFQYXRoKTtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShiS2VlcEFsaXZlLCBmbkJlZm9yZURlc3Ryb3ksICEhc01lc3NhZ2VzUGF0aCAmJiBiUmVxdWVzdE1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0S2VlcEFsaXZlQ29udGV4dChcblx0XHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0cGF0aDogc3RyaW5nLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuLFxuXHRcdHBhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnNcblx0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgY29udGV4dCB0aGF0IGlzIHJlYWxseSBrZXB0IGFsaXZlIChwYXJ0IG9mIGEgY29sbGVjdGlvbilcblx0XHQvLyBpLmUuIHJlbW92ZSBhbGwgc2VnbWVudHMgbm90IGVuZGluZyB3aXRoIGEgJyknXG5cdFx0Y29uc3Qga2VwdEFsaXZlU2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhZGRpdGlvbm5hbFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggJiYgIWtlcHRBbGl2ZVNlZ21lbnRzW2tlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5wdXNoKGtlcHRBbGl2ZVNlZ21lbnRzLnBvcCgpISk7XG5cdFx0fVxuXG5cdFx0aWYgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBrZXB0QWxpdmVQYXRoID0ga2VwdEFsaXZlU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0Y29uc3Qgb0tlZXBBbGl2ZUNvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChrZXB0QWxpdmVQYXRoLCBiUmVxdWVzdE1lc3NhZ2VzLCBwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChhZGRpdGlvbm5hbFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG9LZWVwQWxpdmVDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnJldmVyc2UoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9ubmFsUGF0aCA9IGFkZGl0aW9ubmFsU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0XHRyZXR1cm4gb01vZGVsLmJpbmRDb250ZXh0KGFkZGl0aW9ubmFsUGF0aCwgb0tlZXBBbGl2ZUNvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpOiB2b2lkIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gKG9Sb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dFxuXHRcdFx0PyAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkhXG5cdFx0XHQ6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBsYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGFzeW5jIGNsb3NlQ29sdW1uKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0bGF5b3V0OiB0aGlzLl9vVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKS5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9jbG9zZUNvbHVtblwiKVxuXHRcdH07XG5cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKT8uZ2V0TW9kZWwoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fCAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpXG5cdFx0XHQuZW5hYmxlZDtcblxuXHRcdGlmICghaXNEb2N1bWVudE1vZGlmaWVkICYmIGlzSGlkZGVuRHJhZnRFbmFibGVkKSB7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdFx0XHRza2lwQmFja05hdmlnYXRpb246IHRydWVcblx0XHRcdH07XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHQvLyBXZSBkb24ndCBoYXZlIGNhbGxFeHRlbnNpb249dHJ1ZSBpbiB0aGlzIGNhc2UsIGFzIHRoZXJlJ3MgYSB1c2VyIHZhbGlkYXRpb24gd2l0aCB0aGUgZGF0YWxvc3MgZGlhbG9nXG5cdFx0XHRcdFx0Ly8gYW5kIGl0IHdvdWxkbid0IG1ha2Ugc2Vuc2UgdG8gY2FuY2VsIHRoZSBuYXZpZ2F0aW9uIGFmdGVyIHRoaXMgY29uZmlybWF0aW9uXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLl9vVmlldy5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uID0gdHJ1ZTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlcyB0cmFuc2l0aW9uIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dFxuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTRDQTtBQUNBO0FBQ0E7QUFDQTtFQUhBLElBS01BLGVBQWUsSUFBQUMsSUFBQSxHQURwQkMsY0FBYyxDQUFDLGtEQUFrRCxDQUFDLEVBQUFDLEtBQUEsR0FvQmpFQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBT2hCRCxjQUFjLENBQUMsQ0FBQyxFQUFBRSxLQUFBLEdBd0NoQkMsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFDLEtBQUEsR0FLbkNMLGVBQWUsQ0FBQyxDQUFDLEVBQUFNLEtBQUEsR0FDakJKLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxFQUFBRyxLQUFBLEdBS25DUCxlQUFlLENBQUMsQ0FBQyxFQUFBUSxLQUFBLEdBQ2pCTixVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsRUFBQUssTUFBQSxHQVduQ1QsZUFBZSxDQUFDLENBQUMsRUFBQVUsTUFBQSxHQUNqQlIsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFPLE1BQUEsR0FnQ25DWCxlQUFlLENBQUMsQ0FBQyxFQUFBWSxNQUFBLEdBNkNqQlosZUFBZSxDQUFDLENBQUMsRUFBQWEsTUFBQSxHQTZMakJiLGVBQWUsQ0FBQyxDQUFDLEVBQUFjLE1BQUEsR0FDakJDLGNBQWMsQ0FBQyxDQUFDLEVBQUFDLE1BQUEsR0E4QmhCaEIsZUFBZSxDQUFDLENBQUMsRUFBQWlCLE1BQUEsR0FDakJGLGNBQWMsQ0FBQyxDQUFDLEVBQUFHLE1BQUEsR0FpZGhCbEIsZUFBZSxDQUFDLENBQUMsRUFBQW1CLE1BQUEsR0EyTmpCbkIsZUFBZSxDQUFDLENBQUMsRUFBQW9CLE1BQUEsR0FDakJMLGNBQWMsQ0FBQyxD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