@sapui5/sap.fe.core 1.100.0 → 1.102.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 (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -2,19 +2,50 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/BusyLocker", "sap/fe/core/library", "sap/ui/model/odata/v4/ODataListBinding", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/helpers/EditState", "sap/ui/core/message/Message", "sap/ui/core/library", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "sap/fe/core/actions/collaboration/ActivitySync", "sap/fe/core/actions/collaboration/CollaborationCommon"], function (ControllerExtension, OverrideExecution, Log, CommonUtils, BusyLocker, FELibrary, ODataListBinding, SemanticKeyHelper, EditState, Message, coreLibrary, ModelHelper, ClassSupport, ControllerExtensionMetadata, ActivitySync, CollaborationCommon) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/fe/templates/Feedback", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, draft, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, FELibrary, Feedback, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _class, _class2;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _class, _class2;
9
9
 
10
+ var triggerType = Feedback.triggerType;
11
+ var triggerConfiguredSurvey = Feedback.triggerConfiguredSurvey;
12
+ var standardActions = Feedback.standardActions;
13
+ var publicExtension = ClassSupport.publicExtension;
14
+ var finalExtension = ClassSupport.finalExtension;
15
+ var extensible = ClassSupport.extensible;
16
+ var defineUI5Class = ClassSupport.defineUI5Class;
10
17
  var Activity = CollaborationCommon.Activity;
11
18
  var send = ActivitySync.send;
12
- var UI5Class = ClassSupport.UI5Class;
13
- var Public = ClassSupport.Public;
14
- var Final = ClassSupport.Final;
15
- var Extensible = ClassSupport.Extensible;
16
19
 
17
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
20
+ function _catch(body, recover) {
21
+ try {
22
+ var result = body();
23
+ } catch (e) {
24
+ return recover(e);
25
+ }
26
+
27
+ if (result && result.then) {
28
+ return result.then(void 0, recover);
29
+ }
30
+
31
+ return result;
32
+ }
33
+
34
+ function _finallyRethrows(body, finalizer) {
35
+ try {
36
+ var result = body();
37
+ } catch (e) {
38
+ return finalizer(true, e);
39
+ }
40
+
41
+ if (result && result.then) {
42
+ return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
43
+ }
44
+
45
+ return finalizer(false, result);
46
+ }
47
+
48
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
18
49
 
19
50
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
20
51
 
@@ -34,8 +65,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
34
65
  * @since 1.90.0
35
66
  */
36
67
 
37
- var EditFlow = (_dec = UI5Class("sap.fe.core.controllerextensions.EditFlow", ControllerExtensionMetadata), _dec2 = Extensible(OverrideExecution.After), _dec3 = Extensible(OverrideExecution.After), _dec4 = Extensible(OverrideExecution.After), _dec5 = Extensible(OverrideExecution.After), _dec6 = Extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
38
- _inherits(EditFlow, _ControllerExtension);
68
+ var EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = finalExtension(), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = finalExtension(), _dec30 = publicExtension(), _dec31 = finalExtension(), _dec32 = publicExtension(), _dec33 = finalExtension(), _dec34 = publicExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
69
+ _inheritsLoose(EditFlow, _ControllerExtension);
39
70
 
40
71
  function EditFlow() {
41
72
  return _ControllerExtension.apply(this, arguments) || this;
@@ -58,39 +89,82 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
58
89
  * @since 1.90.0
59
90
  */
60
91
  _proto.editDocument = function editDocument(oContext) {
61
- var _this = this;
92
+ try {
93
+ var _this2 = this;
62
94
 
63
- var bDraftNavigation = true;
95
+ var bDraftNavigation = true;
64
96
 
65
- var transactionHelper = this._getTransactionHelper();
97
+ var transactionHelper = _this2._getTransactionHelper();
66
98
 
67
- return this.base.editFlow.onBeforeEdit({
68
- context: oContext
69
- }).then(transactionHelper.editDocument.bind(transactionHelper, oContext, this.getView(), this._getMessageHandler())).then(function (oNewDocumentContext) {
70
- var sProgrammingModel = _this._getProgrammingModel(oContext);
99
+ var oRootViewController = _this2._getRootViewController();
71
100
 
72
- if (sProgrammingModel === ProgrammingModel.Sticky) {
73
- _this._getInternalModel().setProperty("/sessionOn", true);
74
- }
101
+ var rightmostContext;
75
102
 
76
- if (oNewDocumentContext) {
77
- _this._setEditMode(EditMode.Editable, false);
103
+ var _temp6 = _catch(function () {
104
+ return Promise.resolve(_this2.base.editFlow.onBeforeEdit({
105
+ context: oContext
106
+ })).then(function () {
107
+ return Promise.resolve(transactionHelper.editDocument(oContext, _this2.getView(), _this2._getMessageHandler())).then(function (oNewDocumentContext) {
108
+ var sProgrammingModel = _this2._getProgrammingModel(oContext);
78
109
 
79
- _this._getMessageHandler().showMessageDialog();
110
+ _this2._setStickySessionInternalProperties(sProgrammingModel, oContext.getModel());
80
111
 
81
- if (oNewDocumentContext !== oContext) {
82
- return _this._handleNewContext(oNewDocumentContext, true, false, bDraftNavigation, true).then(function () {
83
- if (sProgrammingModel === ProgrammingModel.Sticky) {
84
- // The stickyOn handler must be set after the navigation has been done,
85
- // as the URL may change in the case of FCL
86
- _this._handleStickyOn(oNewDocumentContext);
87
- }
112
+ var _temp4 = function () {
113
+ if (oNewDocumentContext) {
114
+ _this2._setEditMode(EditMode.Editable, false);
115
+
116
+ _this2._getMessageHandler().showMessageDialog();
117
+
118
+ var _temp7 = function () {
119
+ if (oNewDocumentContext !== oContext) {
120
+ function _temp8() {
121
+ return Promise.resolve(_this2._handleNewContext(_contextToNavigate, true, false, bDraftNavigation, true)).then(function () {
122
+ if (sProgrammingModel === ProgrammingModel.Sticky) {
123
+ // The stickyOn handler must be set after the navigation has been done,
124
+ // as the URL may change in the case of FCL
125
+ _this2._handleStickyOn(oNewDocumentContext);
126
+ }
127
+ });
128
+ }
129
+
130
+ var _contextToNavigate = oNewDocumentContext;
131
+
132
+ var _temp9 = function () {
133
+ if (_this2._isFclEnabled()) {
134
+ rightmostContext = oRootViewController.getRightmostContext();
135
+ return Promise.resolve(_this2._computeSiblingInformation(oContext, rightmostContext, sProgrammingModel, true)).then(function (siblingInfo) {
136
+ var _siblingInfo;
137
+
138
+ siblingInfo = (_siblingInfo = siblingInfo) !== null && _siblingInfo !== void 0 ? _siblingInfo : _this2._createSiblingInfo(oContext, oNewDocumentContext);
139
+
140
+ _this2._updatePathsInHistory(siblingInfo.pathMapping);
141
+
142
+ if (siblingInfo.targetContext.getPath() != oNewDocumentContext.getPath()) {
143
+ _contextToNavigate = siblingInfo.targetContext;
144
+ }
145
+ });
146
+ }
147
+ }();
148
+
149
+ return _temp9 && _temp9.then ? _temp9.then(_temp8) : _temp8(_temp9);
150
+ }
151
+ }();
152
+
153
+ if (_temp7 && _temp7.then) return _temp7.then(function () {});
154
+ }
155
+ }();
156
+
157
+ if (_temp4 && _temp4.then) return _temp4.then(function () {});
88
158
  });
89
- }
90
- }
91
- }).catch(function (oError) {
92
- Log.error("Error while editing the document", oError);
93
- });
159
+ });
160
+ }, function (oError) {
161
+ Log.error("Error while editing the document", oError);
162
+ });
163
+
164
+ return Promise.resolve(_temp6 && _temp6.then ? _temp6.then(function () {}) : void 0);
165
+ } catch (e) {
166
+ return Promise.reject(e);
167
+ }
94
168
  };
95
169
 
96
170
  _proto.deleteMultipleDocuments = function deleteMultipleDocuments(aContexts, mParameters) {
@@ -118,56 +192,65 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
118
192
  ;
119
193
 
120
194
  _proto.updateDocument = function updateDocument(oContext, oPromise) {
121
- var _this2 = this;
195
+ var _this3 = this;
122
196
 
123
- var transactionHelper = this._getTransactionHelper(),
124
- oBindingContext = this.getView().getBindingContext(),
125
- bIsDraft = this._getProgrammingModel(oContext) === ProgrammingModel.Draft;
197
+ var transactionHelper = this._getTransactionHelper();
198
+
199
+ var originalBindingContext = this.getView().getBindingContext();
200
+ var bIsDraft = this._getProgrammingModel(oContext) === ProgrammingModel.Draft;
126
201
 
127
202
  this._getMessageHandler().removeTransitionMessages();
128
203
 
129
204
  return this._syncTask(function () {
130
- if (oBindingContext) {
205
+ if (originalBindingContext) {
131
206
  transactionHelper.handleDocumentModifications();
132
- EditState.setEditStateDirty();
207
+
208
+ if (!_this3._isFclEnabled()) {
209
+ EditState.setEditStateDirty();
210
+ }
133
211
 
134
212
  if (bIsDraft) {
135
- _this2._setDraftStatus(DraftStatus.Saving);
213
+ _this3._setDraftStatus(DraftStatus.Saving);
136
214
  }
137
215
  }
138
216
 
139
- _this2._getMessageHandler().removeTransitionMessages();
217
+ _this3._getMessageHandler().removeTransitionMessages();
140
218
 
141
219
  return oPromise.then(function () {
142
- if (bIsDraft && oBindingContext) {
220
+ // If a navigation happened while oPromise was being resolved, the binding context of the page changed
221
+ // In that case, we shouldn't do anything
222
+ var oBindingContext = _this3.getView().getBindingContext();
223
+
224
+ if (bIsDraft && oBindingContext && oBindingContext === originalBindingContext) {
143
225
  var oMetaModel = oBindingContext.getModel().getMetaModel(),
144
226
  sEntitySetName = oMetaModel.getMetaContext(oBindingContext.getPath()).getObject("@sapui.name"),
145
227
  aSemanticKeys = SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName);
146
228
 
147
229
  if (aSemanticKeys && aSemanticKeys.length) {
148
- var oCurrentSemanticMapping = _this2.base.getAppComponent().getRoutingService().getLastSemanticMapping(),
230
+ var oCurrentSemanticMapping = _this3._getSemanticMapping(),
149
231
  sCurrentSemanticPath = oCurrentSemanticMapping && oCurrentSemanticMapping.semanticPath,
150
- sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true);
232
+ sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true); // sCurrentSemanticPath could be null if we have navigated via deep link then there are no semanticMappings to calculate it from
151
233
 
152
- if (sCurrentSemanticPath !== sChangedPath) {
153
- return _this2._handleNewContext(oBindingContext, true, false, true).then(function () {
154
- _this2._setDraftStatus(DraftStatus.Saved);
234
+
235
+ if (sCurrentSemanticPath && sCurrentSemanticPath !== sChangedPath) {
236
+ return _this3._handleNewContext(oBindingContext, true, false, true).then(function () {
237
+ _this3._setDraftStatus(DraftStatus.Saved);
155
238
  });
156
239
  } else {
157
- _this2._setDraftStatus(DraftStatus.Saved);
240
+ _this3._setDraftStatus(DraftStatus.Saved);
158
241
  }
159
242
  } else {
160
- _this2._setDraftStatus(DraftStatus.Saved);
243
+ _this3._setDraftStatus(DraftStatus.Saved);
161
244
  }
162
245
  }
163
246
  }, function () {
164
- if (bIsDraft && oBindingContext) {
165
- _this2._setDraftStatus(DraftStatus.Clear);
247
+ if (bIsDraft && originalBindingContext) {
248
+ _this3._setDraftStatus(DraftStatus.Clear);
166
249
  }
167
250
  }).catch(function (oError) {
168
251
  Log.error("Error while updating the document", oError);
169
252
  }).finally(function () {
170
- _this2._getMessageHandler().showMessages();
253
+ _this3._getMessageHandler().showMessages();
171
254
  });
172
255
  });
173
256
  } // Internal only params ---
@@ -199,15 +282,17 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
199
282
  ;
200
283
 
201
284
  _proto.createDocument = function createDocument(vListBinding, mInParameters) {
202
- var _this3 = this;
285
+ var _this4 = this;
203
286
 
204
287
  var transactionHelper = this._getTransactionHelper(),
205
288
  oLockObject = this._getGlobalUIModel();
206
289
 
207
- var oTable;
208
- var iCountTableItems = 0;
290
+ var oTable; //should be Table but there are missing methods into the def
291
+
209
292
  var mParameters = mInParameters;
210
- var oResourceBundle = this.getView().getController().oResourceBundle;
293
+
294
+ var oResourceBundle = this._getResourceBundle();
295
+
211
296
  var bShouldBusyLock = !mParameters || mParameters.creationMode !== CreationMode.Inline && mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.External;
212
297
  var oExecCustomValidation = Promise.resolve([]);
213
298
  var oAppComponent = CommonUtils.getAppComponent(this.getView());
@@ -217,8 +302,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
217
302
  // Create by navigating to an external target
218
303
  // TODO: Call appropriate function (currently using the same as for outbound chevron nav, and without any context - 3rd param)
219
304
  return this._syncTask().then(function () {
220
- var oController = _this3.getView().getController(),
221
- sCreatePath = ModelHelper.getAbsoluteMetaPathForListBinding(_this3.getView(), vListBinding);
305
+ var oController = _this4.getView().getController(),
306
+ sCreatePath = ModelHelper.getAbsoluteMetaPathForListBinding(_this4.getView(), vListBinding);
222
307
 
223
308
  oController.handlers.onChevronPressNavigateOutBound(oController, mParameters.outbound, undefined, sCreatePath);
224
309
  });
@@ -253,13 +338,13 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
253
338
  // transient contexts are reliably removed once oNewContext.created() is resolved
254
339
  return oNewContext.created();
255
340
  }).then(function () {
256
- var oBindingContext = _this3.getView().getBindingContext(); // if there are transient contexts, we must avoid requesting side effects
341
+ var oBindingContext = _this4.getView().getBindingContext(); // if there are transient contexts, we must avoid requesting side effects
257
342
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
258
343
  // if list binding is refreshed, transient contexts might be lost
259
344
 
260
345
 
261
346
  if (!CommonUtils.hasTransientContext(oListBinding)) {
262
- var _oAppComponent = CommonUtils.getAppComponent(_this3.getView());
347
+ var _oAppComponent = CommonUtils.getAppComponent(_this4.getView());
263
348
 
264
349
  _oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
265
350
  }
@@ -277,7 +362,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
277
362
 
278
363
  var sCustomValidationFunction = oTable && oTable.getCreationRow().data("customValidationFunction");
279
364
  var mCustomValidity = oTable && ((_oTable$getBindingCon = oTable.getBindingContext("internal")) === null || _oTable$getBindingCon === void 0 ? void 0 : _oTable$getBindingCon.getProperty("creationRowCustomValidity"));
280
- var oMessageManager = sap.ui.getCore().getMessageManager();
365
+ var oMessageManager = Core.getMessageManager();
281
366
  var aCustomMessages = [];
282
367
  var oFieldControl;
283
368
  var sTarget; // Remove existing CustomValidation message
@@ -292,7 +377,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
292
377
  if (oValidationMessage.messageTarget) {
293
378
  var _oFieldControl$getBin;
294
379
 
295
- oFieldControl = sap.ui.getCore().getControl(mCustomValidity[oValidationMessage.messageTarget].fieldId);
380
+ oFieldControl = Core.getControl(mCustomValidity[oValidationMessage.messageTarget].fieldId);
296
381
  sTarget = ((_oFieldControl$getBin = oFieldControl.getBindingContext()) === null || _oFieldControl$getBin === void 0 ? void 0 : _oFieldControl$getBin.getPath()) + "/" + oFieldControl.getBindingPath("value"); // Add validation message if still not exists
297
382
 
298
383
  if (oMessageManager.getMessageModel().getData().filter(function (oMessage) {
@@ -300,7 +385,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
300
385
  }).length === 0) {
301
386
  oMessageManager.addMessages(new Message({
302
387
  message: oValidationMessage.messageText,
303
- processor: _this3.getView().getModel(),
388
+ processor: _this4.getView().getModel(),
304
389
  type: MessageType.Error,
305
390
  code: sCustomValidationFunction,
306
391
  technical: false,
@@ -325,7 +410,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
325
410
  });
326
411
 
327
412
  if (aCustomMessages.length > 0) {
328
- _this3._getMessageHandler().showMessageDialog({
413
+ _this4._getMessageHandler().showMessageDialog({
329
414
  customMessages: aCustomMessages
330
415
  });
331
416
  }
@@ -348,7 +433,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
348
433
  // we already get a list binding use this one
349
434
  oListBinding = vListBinding;
350
435
  } else if (typeof vListBinding === "string") {
351
- oListBinding = new ODataListBinding(_this3.getView().getModel(), vListBinding);
436
+ oListBinding = new ODataListBinding(_this4.getView().getModel(), vListBinding);
352
437
  mParameters.creationMode = CreationMode.Sync;
353
438
  delete mParameters.createAtEnd;
354
439
  } else {
@@ -356,9 +441,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
356
441
  }
357
442
 
358
443
  var oModel = oListBinding.getModel();
359
- iCountTableItems = oListBinding.iMaxLength || 0;
360
444
  var sCreationMode = mParameters.creationMode;
361
- return Promise.resolve(_this3._getProgrammingModel(oListBinding)).then(function (programmingModel) {
445
+ return Promise.resolve(_this4._getProgrammingModel(oListBinding)).then(function (programmingModel) {
362
446
  sProgrammingModel = programmingModel;
363
447
 
364
448
  if (sCreationMode && sCreationMode !== CreationMode.NewPage) {
@@ -383,7 +467,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
383
467
  }
384
468
 
385
469
  var sMetaPath = oMetaModel.getMetaPath(oListBinding.getHeaderContext().getPath());
386
- var aNonComputedVisibleKeyFields = CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, _this3.getView());
470
+ var aNonComputedVisibleKeyFields = CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, _this4.getView());
387
471
 
388
472
  if (aNonComputedVisibleKeyFields.length > 0) {
389
473
  return CreationMode.Deferred;
@@ -401,7 +485,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
401
485
  var sMetaPath;
402
486
  var oMetaModel = oModel.getMetaModel();
403
487
 
404
- var oRoutingListener = _this3._getRoutingListener();
488
+ var oRoutingListener = _this4._getRoutingListener();
405
489
 
406
490
  if (sCreationMode !== CreationMode.Deferred) {
407
491
  if (sCreationMode === CreationMode.CreationRow) {
@@ -419,7 +503,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
419
503
 
420
504
  mParameters.data[sPropertyPath] = oPayload[sPropertyPath];
421
505
  });
422
- oValidationCheck = _this3._checkForValidationErrors();
506
+ oValidationCheck = _this4._checkForValidationErrors();
423
507
  }
424
508
 
425
509
  if (sCreationMode === CreationMode.CreationRow || sCreationMode === CreationMode.Inline) {
@@ -429,16 +513,16 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
429
513
  mParameters.busyMode = "Local"; // take care on message handling, draft indicator (in case of draft)
430
514
  // Attach the create sent and create completed event to the object page binding so that we can react
431
515
 
432
- _this3._handleCreateEvents(oListBinding);
516
+ _this4._handleCreateEvents(oListBinding);
433
517
  }
434
518
 
435
519
  oCreation = oValidationCheck.then(function () {
436
520
  if (!mParameters.parentControl) {
437
- mParameters.parentControl = _this3.getView();
521
+ mParameters.parentControl = _this4.getView();
438
522
  }
439
523
 
440
- mParameters.beforeCreateCallBack = _this3.base.editFlow.onBeforeCreate;
441
- return transactionHelper.createDocument(oListBinding, mParameters, oResourceBundle, _this3._getMessageHandler(), false, _this3.getView());
524
+ mParameters.beforeCreateCallBack = _this4.base.editFlow.onBeforeCreate;
525
+ return transactionHelper.createDocument(oListBinding, mParameters, oResourceBundle, _this4._getMessageHandler(), false, _this4.getView());
442
526
  });
443
527
  }
444
528
 
@@ -473,7 +557,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
473
557
 
474
558
  oNavigation = oCreation.then(function (oNewDocumentContext) {
475
559
  if (!oNewDocumentContext) {
476
- var _oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
560
+ var _oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
477
561
 
478
562
  return oRoutingListener.navigateToMessagePage(_oResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
479
563
  title: _oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
@@ -488,7 +572,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
488
572
  case CreationMode.Inline:
489
573
  handleSideEffects(oListBinding, oCreation);
490
574
 
491
- _this3._syncTask(oCreation);
575
+ _this4._syncTask(oCreation);
492
576
 
493
577
  break;
494
578
 
@@ -511,8 +595,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
511
595
  return oCreationRowContext.delete("$direct");
512
596
  }).catch(function (oError) {
513
597
  // Reset busy indicator after a validation error
514
- if (BusyLocker.isLocked(_this3.getView().getModel("ui"))) {
515
- BusyLocker.unlock(_this3.getView().getModel("ui"));
598
+ if (BusyLocker.isLocked(_this4.getView().getModel("ui"))) {
599
+ BusyLocker.unlock(_this4.getView().getModel("ui"));
516
600
  }
517
601
 
518
602
  Log.error("CreationRow navigation error: ", oError);
@@ -524,32 +608,33 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
524
608
  break;
525
609
  }
526
610
 
527
- if (sProgrammingModel === ProgrammingModel.Sticky) {
528
- _this3._getInternalModel().setProperty("/sessionOn", true);
529
- }
530
-
531
611
  var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
532
612
 
533
613
  if (oCreation) {
534
614
  return Promise.all([oCreation, oNavigation]).then(function (aParams) {
615
+ _this4._setStickySessionInternalProperties(sProgrammingModel, oModel);
616
+
535
617
  if (bIsNewPageCreation) {
536
- _this3._setEditMode(EditMode.Editable, bIsNewPageCreation);
618
+ _this4._setEditMode(EditMode.Editable, bIsNewPageCreation);
537
619
  } else {
538
- _this3._setEditMode(EditMode.Editable);
620
+ _this4._setEditMode(EditMode.Editable);
539
621
  }
540
622
 
541
623
  var oNewDocumentContext = aParams[0];
542
624
 
543
625
  if (oNewDocumentContext) {
544
- EditState.setEditStateDirty();
545
- send(_this3.getView(), Activity.Create, oNewDocumentContext);
626
+ if (!_this4._isFclEnabled()) {
627
+ EditState.setEditStateDirty();
628
+ }
629
+
630
+ _this4._sendActivity(Activity.Create, oNewDocumentContext);
546
631
 
547
632
  if (sProgrammingModel === ProgrammingModel.Sticky) {
548
- _this3._handleStickyOn(oNewDocumentContext);
633
+ _this4._handleStickyOn(oNewDocumentContext);
549
634
  }
550
635
  }
551
636
  }).catch(function (oError) {
552
- if (oError && (oError.navigateBackFromTransientState || oError == Constants.CancelActionDialog)) {
637
+ if (oError && (oError.navigateBackFromTransientState || oError == Constants.CancelActionDialog || oError.canceled || oError.rejectedItems && oError.rejectedItems[0].canceled)) {
553
638
  oRoutingListener.navigateBackFromTransientState();
554
639
  }
555
640
 
@@ -561,20 +646,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
561
646
  if (oTable && oTable.isA("sap.ui.mdc.Table")) {
562
647
  var fnFocusOrScroll = mParameters.creationMode === CreationMode.Inline ? oTable.focusRow.bind(oTable) : oTable.scrollToIndex.bind(oTable);
563
648
  oTable.getRowBinding().attachEventOnce("change", function () {
564
- switch (mParameters.createAtEnd) {
565
- case true:
566
- if (oTable.data("tableType") === "ResponsiveTable" && oTable.getThreshold()) {
567
- fnFocusOrScroll(oTable.getThreshold(), true);
568
- } else {
569
- fnFocusOrScroll(iCountTableItems, true);
570
- }
571
-
572
- break;
573
-
574
- case false:
575
- fnFocusOrScroll(0, true);
576
- break;
577
- }
649
+ fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
578
650
  });
579
651
  }
580
652
 
@@ -594,7 +666,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
594
666
  * @memberof sap.fe.core.controllerextensions.EditFlow
595
667
  * @alias sap.fe.core.controllerextensions.EditFlow#onBeforeSave
596
668
  * @public
597
- * @experimental As of version 1.90.0
598
669
  * @since 1.90.0
599
670
  */
600
671
  ;
@@ -618,7 +689,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
618
689
  * @memberof sap.fe.core.controllerextensions.EditFlow
619
690
  * @alias sap.fe.core.controllerextensions.EditFlow#onBeforeCreate
620
691
  * @public
621
- * @experimental As of version 1.98.0
622
692
  * @since 1.98.0
623
693
  */
624
694
  ;
@@ -641,7 +711,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
641
711
  * @memberof sap.fe.core.controllerextensions.EditFlow
642
712
  * @alias sap.fe.core.controllerextensions.EditFlow#onBeforeEdit
643
713
  * @public
644
- * @experimental As of version 1.98.0
645
714
  * @since 1.98.0
646
715
  */
647
716
  ;
@@ -664,7 +733,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
664
733
  * @memberof sap.fe.core.controllerextensions.EditFlow
665
734
  * @alias sap.fe.core.controllerextensions.EditFlow#onBeforeDiscard
666
735
  * @public
667
- * @experimental As of version 1.98.0
668
736
  * @since 1.98.0
669
737
  */
670
738
  ;
@@ -687,7 +755,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
687
755
  * @memberof sap.fe.core.controllerextensions.EditFlow
688
756
  * @alias sap.fe.core.controllerextensions.EditFlow#onBeforeDelete
689
757
  * @public
690
- * @experimental As of version 1.98.0
691
758
  * @since 1.98.0
692
759
  */
693
760
  ;
@@ -716,80 +783,151 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
716
783
  ;
717
784
 
718
785
  _proto.saveDocument = function saveDocument(oContext, mParameters) {
719
- var _this4 = this;
786
+ try {
787
+ var _this6 = this;
720
788
 
721
- mParameters = mParameters || {};
722
- var bExecuteSideEffectsOnError = mParameters.bExecuteSideEffectsOnError || undefined;
723
- var bDraftNavigation = true;
789
+ mParameters = mParameters || {};
790
+ var bExecuteSideEffectsOnError = mParameters.bExecuteSideEffectsOnError || undefined;
791
+ var bDraftNavigation = true;
724
792
 
725
- var transactionHelper = this._getTransactionHelper();
793
+ var transactionHelper = _this6._getTransactionHelper();
726
794
 
727
- var oResourceBundle = this.getView().getController().oResourceBundle;
728
- var aBindings = mParameters.bindings; // first of all wait until all key-match-requests are done
795
+ var oResourceBundle = _this6._getResourceBundle();
729
796
 
730
- return this._syncTask() // submit any open changes if there any (although there are validation/parse errors)
731
- .then(this._submitOpenChanges.bind(this, oContext)) // check if there are any validation/parse errors
732
- .then(this._checkForValidationErrors.bind(this, oContext)).then(this.base.editFlow.onBeforeSave.bind(this, {
733
- context: oContext
734
- })) // and finally if all user changes are submitted and valid save the document
735
- .then(transactionHelper.saveDocument.bind(transactionHelper, oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, this._getMessageHandler())).then(function (oActiveDocumentContext) {
736
- var sProgrammingModel = _this4._getProgrammingModel(oContext);
797
+ var aBindings = mParameters.bindings;
798
+ return Promise.resolve(_catch(function () {
799
+ return Promise.resolve(_this6._syncTask()).then(function () {
800
+ return Promise.resolve(_this6._submitOpenChanges(oContext)).then(function () {
801
+ return Promise.resolve(_this6._checkForValidationErrors()).then(function () {
802
+ return Promise.resolve(_this6.base.editFlow.onBeforeSave({
803
+ context: oContext
804
+ })).then(function () {
805
+ function _temp12() {
806
+ return Promise.resolve(transactionHelper.saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, _this6._getMessageHandler())).then(function (activeDocumentContext) {
807
+ _this6._removeContextsFromPages();
737
808
 
738
- _this4._removeContextsFromPages();
809
+ _this6._removeStickySessionInternalProperties(sProgrammingModel);
739
810
 
740
- if (sProgrammingModel === ProgrammingModel.Sticky) {
741
- _this4._getInternalModel().setProperty("/sessionOn", false);
811
+ _this6._sendActivity(Activity.Activate, activeDocumentContext);
742
812
 
743
- _this4._handleStickyOff();
744
- }
813
+ _this6._triggerConfiguredSurvey(standardActions.save, triggerType.standardAction);
745
814
 
746
- send(_this4.getView(), Activity.Activate, oActiveDocumentContext);
815
+ _this6._setEditMode(EditMode.Display, false);
747
816
 
748
- _this4._setEditMode(EditMode.Display, false);
817
+ _this6._getMessageHandler().showMessageDialog();
749
818
 
750
- _this4._getMessageHandler().showMessageDialog();
819
+ var _temp10 = function () {
820
+ if (activeDocumentContext !== oContext) {
821
+ var _contextToNavigate2 = activeDocumentContext;
751
822
 
752
- if (oActiveDocumentContext !== oContext) {
753
- _this4._handleNewContext(oActiveDocumentContext, false, false, bDraftNavigation, true);
754
- }
755
- }).catch(function (oError) {
756
- Log.error("Error while saving the document", oError);
757
- return Promise.reject(oError);
758
- });
823
+ if (oRootViewController.isFclEnabled()) {
824
+ var _siblingInfo2;
825
+
826
+ siblingInfo = (_siblingInfo2 = siblingInfo) !== null && _siblingInfo2 !== void 0 ? _siblingInfo2 : _this6._createSiblingInfo(oContext, activeDocumentContext);
827
+
828
+ _this6._updatePathsInHistory(siblingInfo.pathMapping);
829
+
830
+ if (siblingInfo.targetContext.getPath() !== activeDocumentContext.getPath()) {
831
+ _contextToNavigate2 = siblingInfo.targetContext;
832
+ }
833
+ }
834
+
835
+ return Promise.resolve(_this6._handleNewContext(_contextToNavigate2, false, false, bDraftNavigation, true)).then(function () {});
836
+ }
837
+ }();
838
+
839
+ if (_temp10 && _temp10.then) return _temp10.then(function () {});
840
+ });
841
+ }
842
+
843
+ var sProgrammingModel = _this6._getProgrammingModel(oContext);
844
+
845
+ var oRootViewController = _this6._getRootViewController();
846
+
847
+ var siblingInfo;
848
+
849
+ var _temp11 = function () {
850
+ if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && oRootViewController.isFclEnabled()) {
851
+ // No need to try to get rightmost context in case of a new object
852
+ return Promise.resolve(_this6._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true)).then(function (_this5$_computeSiblin) {
853
+ siblingInfo = _this5$_computeSiblin;
854
+ });
855
+ }
856
+ }();
857
+
858
+ return _temp11 && _temp11.then ? _temp11.then(_temp12) : _temp12(_temp11);
859
+ });
860
+ });
861
+ });
862
+ });
863
+ }, function (oError) {
864
+ if (!(oError && oError.canceled)) {
865
+ Log.error("Error while saving the document", oError);
866
+ }
867
+
868
+ return Promise.reject(oError);
869
+ }));
870
+ } catch (e) {
871
+ return Promise.reject(e);
872
+ }
759
873
  };
760
874
 
761
875
  _proto.toggleDraftActive = function toggleDraftActive(oContext) {
762
- var _this5 = this;
876
+ try {
877
+ var _this8 = this;
763
878
 
764
- var oContextData = oContext.getObject();
765
- var bEditable;
766
- var bIsDraft = oContext && this._getProgrammingModel(oContext) === ProgrammingModel.Draft;
767
- var oToggleContext = oContext.getModel().bindContext(oContext.getPath() + "/SiblingEntity").getBoundContext(); //toggle between draft and active document is only available for edit drafts and active documents with draft)
879
+ var oContextData = oContext.getObject();
880
+ var bEditable;
881
+ var bIsDraft = oContext && _this8._getProgrammingModel(oContext) === ProgrammingModel.Draft; //toggle between draft and active document is only available for edit drafts and active documents with draft)
768
882
 
769
- if (!bIsDraft || !(!oContextData.IsActiveEntity && oContextData.HasActiveEntity || oContextData.IsActiveEntity && oContextData.HasDraftEntity)) {
770
- return;
771
- }
883
+ if (!bIsDraft || !(!oContextData.IsActiveEntity && oContextData.HasActiveEntity || oContextData.IsActiveEntity && oContextData.HasDraftEntity)) {
884
+ return Promise.resolve();
885
+ }
772
886
 
773
- if (!oContextData.IsActiveEntity && oContextData.HasActiveEntity) {
774
- //start Point: edit draft
775
- bEditable = false;
776
- } else if (oContextData.IsActiveEntity && oContextData.HasDraftEntity) {
777
- // start point active document
778
- bEditable = true;
779
- }
887
+ if (!oContextData.IsActiveEntity && oContextData.HasActiveEntity) {
888
+ //start Point: edit draft
889
+ bEditable = false;
890
+ } else {
891
+ // start point active document
892
+ bEditable = true;
893
+ }
780
894
 
781
- oToggleContext.requestCanonicalPath().then(function (sCanonicalPath) {
782
- // We use the canonical path for the navigation instead of the semantic path, as the
783
- // semantic key values may have changed between the draft and the active version (BCP 2170216142)
784
- return oToggleContext.getModel().bindContext(sCanonicalPath).getBoundContext();
785
- }).then(function (oToggleContext) {
786
- _this5._setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
895
+ return Promise.resolve(_catch(function () {
896
+ var oRootViewController = _this8._getRootViewController();
787
897
 
898
+ var oRightmostContext = oRootViewController.isFclEnabled() ? oRootViewController.getRightmostContext() : oContext;
899
+ return Promise.resolve(_this8._computeSiblingInformation(oContext, oRightmostContext, ProgrammingModel.Draft, false)).then(function (siblingInfo) {
900
+ return function () {
901
+ if (siblingInfo) {
902
+ _this8._setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
788
903
 
789
- _this5._handleNewContext(oToggleContext, bEditable, true, true, true);
790
- }).catch(function (err) {
791
- return Promise.reject("Error in EditFlow.toggleDraftActive:" + err);
792
- });
904
+
905
+ if (oRootViewController.isFclEnabled()) {
906
+ var lastSemanticMapping = _this8._getSemanticMapping();
907
+
908
+ if ((lastSemanticMapping === null || lastSemanticMapping === void 0 ? void 0 : lastSemanticMapping.technicalPath) === oContext.getPath()) {
909
+ var targetPath = siblingInfo.pathMapping[siblingInfo.pathMapping.length - 1].newPath;
910
+ siblingInfo.pathMapping.push({
911
+ oldPath: lastSemanticMapping.semanticPath,
912
+ newPath: targetPath
913
+ });
914
+ }
915
+
916
+ _this8._updatePathsInHistory(siblingInfo.pathMapping);
917
+ }
918
+
919
+ return Promise.resolve(_this8._handleNewContext(siblingInfo.targetContext, bEditable, true, true, true, false)).then(function () {});
920
+ } else {
921
+ return Promise.reject("Error in EditFlow.toggleDraftActive - Cannot find sibling");
922
+ }
923
+ }();
924
+ });
925
+ }, function (oError) {
926
+ return Promise.reject("Error in EditFlow.toggleDraftActive:" + oError);
927
+ }));
928
+ } catch (e) {
929
+ return Promise.reject(e);
930
+ }
793
931
  } // Internal only params ---
794
932
  // @param {sap.m.Button} mParameters.cancelButton - Currently this is passed as cancelButton internally (replaced by mParameters.control in the JSDoc below). Currently it is also mandatory.
795
933
  // Plan - This should not be mandatory. If not provided, we should have a default that can act as reference control for the discard popover OR we can show a dialog instead of a popover.
@@ -798,7 +936,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
798
936
  * Discard the editable document.
799
937
  *
800
938
  * @memberof sap.fe.core.controllerextensions.EditFlow
801
- * @param {object} oContext Context of the editable document
939
+ * @param oContext Context of the editable document
802
940
  * @param {map} mParameters Can contain the following attributes:
803
941
  * @param {object} mParameters.control This is the control used to open the discard popover
804
942
  * @param {boolean} mParameters.skipDiscardPopover Optional, supresses the discard popover and allows custom handling
@@ -810,56 +948,112 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
810
948
  ;
811
949
 
812
950
  _proto.cancelDocument = function cancelDocument(oContext, mParameters) {
813
- var _this6 = this;
951
+ try {
952
+ var _this10 = this;
814
953
 
815
- var transactionHelper = this._getTransactionHelper(),
816
- oResourceBundle = this.getView().getController().oResourceBundle;
954
+ var transactionHelper = _this10._getTransactionHelper();
817
955
 
818
- var mInParameters = mParameters;
819
- mInParameters.cancelButton = mParameters.control || mInParameters.cancelButton;
820
- mInParameters.beforeCancelCallBack = this.base.editFlow.onBeforeDiscard;
821
- return this._syncTask().then(transactionHelper.cancelDocument.bind(transactionHelper, oContext, mParameters, oResourceBundle, this._getMessageHandler())).then(function (oActiveDocumentContext) {
822
- var bDraftNavigation = true,
823
- sProgrammingModel = _this6._getProgrammingModel(oContext);
956
+ var oResourceBundle = _this10._getResourceBundle();
824
957
 
825
- _this6._removeContextsFromPages();
958
+ var mInParameters = mParameters;
826
959
 
827
- if (sProgrammingModel === ProgrammingModel.Sticky) {
828
- _this6._getInternalModel().setProperty("/sessionOn", false);
960
+ var _siblingInfo3;
829
961
 
830
- _this6._handleStickyOff();
831
- }
962
+ mInParameters.cancelButton = mParameters.control || mInParameters.cancelButton;
963
+ mInParameters.beforeCancelCallBack = _this10.base.editFlow.onBeforeDiscard;
964
+ return Promise.resolve(_catch(function () {
965
+ return Promise.resolve(_this10._syncTask()).then(function () {
966
+ function _temp15() {
967
+ return Promise.resolve(transactionHelper.cancelDocument(oContext, mInParameters, oResourceBundle, _this10._getMessageHandler())).then(function (oActiveDocumentContext) {
968
+ var bDraftNavigation = true;
832
969
 
833
- send(_this6.getView(), Activity.Discard, oActiveDocumentContext);
970
+ _this10._removeContextsFromPages();
834
971
 
835
- _this6._setEditMode(EditMode.Display, false);
972
+ _this10._removeStickySessionInternalProperties(sProgrammingModel);
836
973
 
837
- _this6._setDraftStatus(DraftStatus.Clear); //in case of a new document, the value of hasActiveEntity is returned. navigate back.
974
+ _this10._setEditMode(EditMode.Display, false);
838
975
 
976
+ _this10._setDraftStatus(DraftStatus.Clear); // we force the edit state even for FCL because the draft discard might not be implemented
977
+ // and we may just delete the draft
839
978
 
840
- if (!oActiveDocumentContext) {
841
- EditState.setEditStateDirty();
842
- return mInParameters.skipBackNavigation ? undefined : _this6._getRoutingListener().navigateBackFromContext(oContext);
843
- } else if (sProgrammingModel === ProgrammingModel.Draft) {
844
- // We need to load the semantic keys of the active context, as we need them
845
- // for the navigation
846
- return _this6._fetchSemanticKeyValues(oActiveDocumentContext).then(function () {
847
- // We force the recreation of the context, so that it's created and bound in the same microtask,
848
- // so that all properties are loaded together by autoExpandSelect, so that when switching back to Edit mode
849
- // $$inheritExpandSelect takes all loaded properties into account (BCP 2070462265)
850
- if (mInParameters.skipBindingToView) {
851
- return oActiveDocumentContext;
852
- } else {
853
- return _this6._handleNewContext(oActiveDocumentContext, false, true, bDraftNavigation, true);
979
+
980
+ EditState.setEditStateDirty();
981
+ return function () {
982
+ if (!oActiveDocumentContext) {
983
+ _this10._sendActivity(Activity.Discard, undefined); //in case of a new document, no activeContext is returned --> navigate back.
984
+
985
+
986
+ var _temp16 = function () {
987
+ if (!mInParameters.skipBackNavigation) {
988
+ return Promise.resolve(_this10._getRoutingListener().navigateBackFromContext(oContext)).then(function () {});
989
+ }
990
+ }();
991
+
992
+ if (_temp16 && _temp16.then) return _temp16.then(function () {});
993
+ } else {
994
+ _this10._sendActivity(Activity.Discard, oActiveDocumentContext);
995
+
996
+ var _contextToNavigate3 = oActiveDocumentContext;
997
+
998
+ if (_this10._isFclEnabled()) {
999
+ var _siblingInfo4;
1000
+
1001
+ _siblingInfo3 = (_siblingInfo4 = _siblingInfo3) !== null && _siblingInfo4 !== void 0 ? _siblingInfo4 : _this10._createSiblingInfo(oContext, oActiveDocumentContext);
1002
+
1003
+ _this10._updatePathsInHistory(_siblingInfo3.pathMapping);
1004
+
1005
+ if (_siblingInfo3.targetContext.getPath() !== oActiveDocumentContext.getPath()) {
1006
+ _contextToNavigate3 = _siblingInfo3.targetContext;
1007
+ }
1008
+ }
1009
+
1010
+ return function () {
1011
+ if (sProgrammingModel === ProgrammingModel.Draft) {
1012
+ // We need to load the semantic keys of the active context, as we need them
1013
+ // for the navigation
1014
+ return Promise.resolve(_this10._fetchSemanticKeyValues(oActiveDocumentContext)).then(function () {
1015
+ // We force the recreation of the context, so that it's created and bound in the same microtask,
1016
+ // so that all properties are loaded together by autoExpandSelect, so that when switching back to Edit mode
1017
+ // $$inheritExpandSelect takes all loaded properties into account (BCP 2070462265)
1018
+ return function () {
1019
+ if (!mInParameters.skipBindingToView) {
1020
+ return Promise.resolve(_this10._handleNewContext(_contextToNavigate3, false, true, bDraftNavigation, true)).then(function () {});
1021
+ } else {
1022
+ return oActiveDocumentContext;
1023
+ }
1024
+ }();
1025
+ });
1026
+ } else {
1027
+ //active context is returned in case of cancel of existing document
1028
+ return Promise.resolve(_this10._handleNewContext(_contextToNavigate3, false, false, bDraftNavigation, true)).then(function () {});
1029
+ }
1030
+ }();
1031
+ }
1032
+ }();
1033
+ });
854
1034
  }
1035
+
1036
+ var sProgrammingModel = _this10._getProgrammingModel(oContext);
1037
+
1038
+ var _temp14 = function () {
1039
+ if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && _this10._isFclEnabled()) {
1040
+ var _oRootViewController = _this10._getRootViewController(); // No need to try to get rightmost context in case of a new object
1041
+
1042
+
1043
+ return Promise.resolve(_this10._computeSiblingInformation(oContext, _oRootViewController.getRightmostContext(), sProgrammingModel, true)).then(function (_this9$_computeSiblin) {
1044
+ _siblingInfo3 = _this9$_computeSiblin;
1045
+ });
1046
+ }
1047
+ }();
1048
+
1049
+ return _temp14 && _temp14.then ? _temp14.then(_temp15) : _temp15(_temp14);
855
1050
  });
856
- } else {
857
- //active context is returned in case of cancel of existing document
858
- return _this6._handleNewContext(oActiveDocumentContext, false, false, bDraftNavigation, true);
859
- }
860
- }).catch(function (oError) {
861
- Log.error("Error while discarding the document", oError);
862
- });
1051
+ }, function (oError) {
1052
+ Log.error("Error while discarding the document", oError);
1053
+ }));
1054
+ } catch (e) {
1055
+ return Promise.reject(e);
1056
+ }
863
1057
  } // Internal only params ---
864
1058
  // @param {string} mParameters.entitySetName Name of the EntitySet to which the object belongs
865
1059
 
@@ -879,10 +1073,9 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
879
1073
  ;
880
1074
 
881
1075
  _proto.deleteDocument = function deleteDocument(oContext, mInParameters) {
882
- var _this7 = this;
1076
+ var _this11 = this;
883
1077
 
884
1078
  var oAppComponent = CommonUtils.getAppComponent(this.getView());
885
- var sPath = oContext.getPath();
886
1079
  var mParameters = mInParameters;
887
1080
 
888
1081
  if (!mParameters) {
@@ -897,10 +1090,13 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
897
1090
  return this._deleteDocumentTransaction(oContext, mParameters).then(function () {
898
1091
  // Single objet deletion is triggered from an OP header button (not from a list)
899
1092
  // --> Mark UI dirty and navigate back to dismiss the OP
900
- EditState.setEditStateDirty();
901
- send(_this7.getView(), Activity.Delete, sPath);
1093
+ if (!_this11._isFclEnabled()) {
1094
+ EditState.setEditStateDirty();
1095
+ }
902
1096
 
903
- _this7._getRoutingListener().navigateBackFromContext(oContext); // After delete is successfull, we need to dettch the setBackNavigation Methods
1097
+ _this11._sendActivity(Activity.Delete, oContext);
1098
+
1099
+ _this11._getRoutingListener().navigateBackFromContext(oContext); // After delete is successfull, we need to dettch the setBackNavigation Methods
904
1100
 
905
1101
 
906
1102
  if (oAppComponent) {
@@ -923,23 +1119,36 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
923
1119
  ;
924
1120
 
925
1121
  _proto.applyDocument = function applyDocument(oContext) {
926
- var _this8 = this;
1122
+ try {
1123
+ var _this13 = this;
927
1124
 
928
- var oLockObject = this._getGlobalUIModel();
1125
+ var oLockObject = _this13._getGlobalUIModel();
929
1126
 
930
- BusyLocker.lock(oLockObject);
931
- return this._submitOpenChanges(oContext) // check if there are any validation/parse errors
932
- .then(this._checkForValidationErrors.bind(this, oContext)).then(function () {
933
- _this8._getMessageHandler().showMessageDialog();
1127
+ BusyLocker.lock(oLockObject);
934
1128
 
935
- _this8._getRoutingListener().navigateBackFromContext(oContext);
1129
+ var _temp18 = _finallyRethrows(function () {
1130
+ return Promise.resolve(_this13._syncTask()).then(function () {
1131
+ return Promise.resolve(_this13._submitOpenChanges(oContext)).then(function () {
1132
+ return Promise.resolve(_this13._checkForValidationErrors()).then(function () {
1133
+ return Promise.resolve(_this13._getMessageHandler().showMessageDialog()).then(function () {
1134
+ return Promise.resolve(_this13._getRoutingListener().navigateBackFromContext(oContext)).then(function () {});
1135
+ });
1136
+ });
1137
+ });
1138
+ });
1139
+ }, function (_wasThrown, _result8) {
1140
+ if (BusyLocker.isLocked(oLockObject)) {
1141
+ BusyLocker.unlock(oLockObject);
1142
+ }
936
1143
 
937
- return true;
938
- }).finally(function () {
939
- if (BusyLocker.isLocked(oLockObject)) {
940
- BusyLocker.unlock(oLockObject);
941
- }
942
- });
1144
+ if (_wasThrown) throw _result8;
1145
+ return _result8;
1146
+ });
1147
+
1148
+ return Promise.resolve(_temp18 && _temp18.then ? _temp18.then(function () {}) : void 0);
1149
+ } catch (e) {
1150
+ return Promise.reject(e);
1151
+ }
943
1152
  } // Internal only params ---
944
1153
  // @param {boolean} [mParameters.bStaticAction] Boolean value for static action, undefined for other actions
945
1154
  // @param {boolean} [mParameters.isNavigable] Boolean value indicating whether navigation is required after the action has been executed
@@ -966,7 +1175,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
966
1175
  ;
967
1176
 
968
1177
  _proto.invokeAction = function invokeAction(sActionName, mInParameters, mExtraParams) {
969
- var _this9 = this;
1178
+ var _this14 = this;
970
1179
 
971
1180
  var oControl;
972
1181
 
@@ -1068,24 +1277,21 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1068
1277
  }
1069
1278
  }
1070
1279
 
1071
- if (mParameters.isNavigable) {
1072
- mParameters.bGetBoundContext = false;
1073
- } else {
1074
- mParameters.bGetBoundContext = true;
1075
- } // Need to know that the action is called from ObjectPage for changeSet Isolated workaround
1076
-
1280
+ mParameters.bGetBoundContext = this._getBoundContext(oView, mParameters); // Need to know that the action is called from ObjectPage for changeSet Isolated workaround
1077
1281
 
1078
1282
  mParameters.bObjectPage = oView.getViewData().converterType === "ObjectPage";
1079
1283
  return this._syncTask().then(transactionHelper.callAction.bind(transactionHelper, sActionName, mParameters, this.getView(), this._getMessageHandler())).then(function (oResponse) {
1080
1284
  // if the returned context for the bound action is different than the context on which action was called,
1081
1285
  // refresh the corresponding list binding
1082
1286
  if (mParameters.contexts) {
1083
- return _this9._refreshListIfRequired(_this9._getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0]).then(function () {
1287
+ return _this14._refreshListIfRequired(_this14._getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0]).then(function () {
1084
1288
  return oResponse;
1085
1289
  });
1086
1290
  }
1087
1291
  }).then(function (oResponse) {
1088
- send(_this9.getView(), Activity.Action, mParameters.contexts);
1292
+ _this14._sendActivity(Activity.Action, mParameters.contexts);
1293
+
1294
+ _this14._triggerConfiguredSurvey(sActionName, triggerType.action);
1089
1295
 
1090
1296
  if (oCurrentActionCallBacks) {
1091
1297
  oCurrentActionCallBacks.fResolver(oResponse);
@@ -1105,9 +1311,11 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1105
1311
 
1106
1312
 
1107
1313
  if (mParameters.contexts) {
1108
- EditState.setEditStateDirty();
1314
+ if (!_this14._isFclEnabled()) {
1315
+ EditState.setEditStateDirty();
1316
+ }
1109
1317
 
1110
- _this9._getInternalModel().setProperty("/sCustomAction", sActionName);
1318
+ _this14._getInternalModel().setProperty("/sCustomAction", sActionName);
1111
1319
  }
1112
1320
 
1113
1321
  if (mParameters.isNavigable) {
@@ -1125,7 +1333,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1125
1333
 
1126
1334
  if (sContextMetaPath != undefined && sContextMetaPath === sActionContextMetaPath) {
1127
1335
  if (oActionContext.getPath() !== vContext.getPath()) {
1128
- _this9._getRoutingListener().navigateForwardToContext(vContext, {
1336
+ _this14._getRoutingListener().navigateForwardToContext(vContext, {
1129
1337
  noHistoryEntry: false
1130
1338
  });
1131
1339
  } else {
@@ -1142,7 +1350,9 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1142
1350
  if (err == Constants.CancelActionDialog) {
1143
1351
  return Promise.reject("Dialog cancelled.");
1144
1352
  } else {
1145
- return Promise.reject("Error in EditFlow.invokeAction:" + err);
1353
+ if (!(err && (err.canceled || err.rejectedItems && err.rejectedItems[0].canceled))) {
1354
+ return Promise.reject("Error in EditFlow.invokeAction:" + err);
1355
+ }
1146
1356
  }
1147
1357
  });
1148
1358
  }
@@ -1165,7 +1375,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1165
1375
  ;
1166
1376
 
1167
1377
  _proto.securedExecution = function securedExecution(fnFunction, mParameters) {
1168
- var _this10 = this;
1378
+ var _this15 = this;
1169
1379
 
1170
1380
  var bBusySet = mParameters && mParameters.busy && mParameters.busy.set !== undefined ? mParameters.busy.set : true,
1171
1381
  bBusyCheck = mParameters && mParameters.busy && mParameters.busy.check !== undefined ? mParameters.busy.check : true,
@@ -1191,17 +1401,19 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1191
1401
 
1192
1402
  return this._syncTask(fnFunction).then(function () {
1193
1403
  if (bUpdatesDocument) {
1194
- _this10._getTransactionHelper().handleDocumentModifications();
1404
+ _this15._getTransactionHelper().handleDocumentModifications();
1195
1405
 
1196
- EditState.setEditStateDirty();
1406
+ if (!_this15._isFclEnabled()) {
1407
+ EditState.setEditStateDirty();
1408
+ }
1197
1409
 
1198
1410
  if (bIsDraft) {
1199
- _this10._setDraftStatus(DraftStatus.Saved);
1411
+ _this15._setDraftStatus(DraftStatus.Saved);
1200
1412
  }
1201
1413
  }
1202
1414
  }).catch(function (oError) {
1203
1415
  if (bUpdatesDocument && bIsDraft) {
1204
- _this10._setDraftStatus(DraftStatus.Clear);
1416
+ _this15._setDraftStatus(DraftStatus.Clear);
1205
1417
  }
1206
1418
 
1207
1419
  return Promise.reject(oError);
@@ -1210,7 +1422,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1210
1422
  BusyLocker.unlock(oLockObject);
1211
1423
  }
1212
1424
 
1213
- return _this10._getMessageHandler().showMessageDialog();
1425
+ return _this15._getMessageHandler().showMessageDialog();
1214
1426
  });
1215
1427
  }
1216
1428
  /**
@@ -1221,35 +1433,50 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1221
1433
  ;
1222
1434
 
1223
1435
  _proto.handlePatchSent = function handlePatchSent(oEvent) {
1224
- var _this11 = this;
1436
+ var _this$base$getView, _this$base$getView$ge;
1225
1437
 
1226
- this.mPatchPromises = this.mPatchPromises ? this.mPatchPromises : {}; // do this for every unique object (eg: every table) so that each associated promise is fulfilled at the end
1438
+ if (!((_this$base$getView = this.base.getView()) !== null && _this$base$getView !== void 0 && (_this$base$getView$ge = _this$base$getView.getBindingContext("internal")) !== null && _this$base$getView$ge !== void 0 && _this$base$getView$ge.getProperty("skipPatchHandlers"))) {
1439
+ // Create a promise that will be resolved or rejected when the path is completed
1440
+ var oPatchPromise = new Promise(function (resolve, reject) {
1441
+ oEvent.getSource().attachEventOnce("patchCompleted", function (oEvent) {
1442
+ var bSuccess = oEvent.getParameter("success");
1227
1443
 
1228
- var oPatchPromise = new Promise(function (resolve, reject) {
1229
- _this11.mPatchPromises[oEvent.getSource()] = {
1230
- resolvePatchPromise: resolve,
1231
- rejectPatchPromise: reject
1232
- };
1233
- });
1234
- this.updateDocument(oEvent.getSource(), oPatchPromise);
1444
+ if (bSuccess) {
1445
+ resolve();
1446
+ } else {
1447
+ reject();
1448
+ }
1449
+ });
1450
+ });
1451
+ this.updateDocument(oEvent.getSource(), oPatchPromise);
1452
+ }
1235
1453
  }
1236
1454
  /**
1237
- * Handles the patchCompleted event: resolves or rejects document modification.
1455
+ * Handles the CreateActivate event.
1238
1456
  *
1239
1457
  * @param oEvent
1240
1458
  */
1241
1459
  ;
1242
1460
 
1243
- _proto.handlePatchCompleted = function handlePatchCompleted(oEvent) {
1244
- var bSuccess = oEvent.getParameter("success");
1461
+ _proto.handleCreateActivate = function handleCreateActivate(oEvent) {
1462
+ var oBinding = oEvent.getSource();
1245
1463
 
1246
- if (bSuccess) {
1247
- this.mPatchPromises[oEvent.getSource()].resolvePatchPromise();
1248
- } else {
1249
- this.mPatchPromises[oEvent.getSource()].rejectPatchPromise();
1250
- }
1464
+ var transactionHelper = this._getTransactionHelper();
1465
+
1466
+ var bAtEnd = true;
1467
+ var bInactive = true;
1468
+
1469
+ var oResourceBundle = this._getResourceBundle();
1251
1470
 
1252
- delete this.mPatchPromises[oEvent.getSource()];
1471
+ var oParams = {
1472
+ creationMode: CreationMode.Inline,
1473
+ createAtEnd: bAtEnd,
1474
+ inactive: bInactive,
1475
+ keepTransientContextOnFailed: false,
1476
+ // currently not fully supported
1477
+ busyMode: "None"
1478
+ };
1479
+ transactionHelper.createDocument(oBinding, oParams, oResourceBundle, this._getMessageHandler(), false, this.getView());
1253
1480
  } //////////////////////////////////////
1254
1481
  // Private methods
1255
1482
  //////////////////////////////////////
@@ -1299,6 +1526,18 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1299
1526
 
1300
1527
  _proto._getInternalModel = function _getInternalModel() {
1301
1528
  return this.base.getView().getController()._editFlow.getInternalModel();
1529
+ };
1530
+
1531
+ _proto._getRootViewController = function _getRootViewController() {
1532
+ return this.base.getAppComponent().getRootViewController();
1533
+ };
1534
+
1535
+ _proto._getResourceBundle = function _getResourceBundle() {
1536
+ return this.getView().getController().oResourceBundle;
1537
+ };
1538
+
1539
+ _proto._getSemanticMapping = function _getSemanticMapping() {
1540
+ return this.base.getAppComponent().getRoutingService().getLastSemanticMapping();
1302
1541
  }
1303
1542
  /**
1304
1543
  * Creates a new promise to wait for an action to be executed
@@ -1325,6 +1564,17 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1325
1564
 
1326
1565
  _proto._getMessageHandler = function _getMessageHandler() {
1327
1566
  return this.base.getView().getController()._editFlow.getMessageHandler();
1567
+ };
1568
+
1569
+ _proto._sendActivity = function _sendActivity(action, relatedContexts) {
1570
+ var content = Array.isArray(relatedContexts) ? relatedContexts.map(function (context) {
1571
+ return context.getPath();
1572
+ }) : relatedContexts === null || relatedContexts === void 0 ? void 0 : relatedContexts.getPath();
1573
+ send(this.getView(), action, content);
1574
+ };
1575
+
1576
+ _proto._triggerConfiguredSurvey = function _triggerConfiguredSurvey(sActionName, triggerType) {
1577
+ triggerConfiguredSurvey(this.getView(), sActionName, triggerType);
1328
1578
  }
1329
1579
  /**
1330
1580
  * @function
@@ -1341,20 +1591,36 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1341
1591
  };
1342
1592
 
1343
1593
  _proto._submitOpenChanges = function _submitOpenChanges(oContext) {
1344
- var oModel = oContext.getModel(),
1345
- oLockObject = this._getGlobalUIModel(); //Currently we are using only 1 updateGroupId, hence submitting the batch directly here
1346
-
1594
+ try {
1595
+ var _this17 = this;
1596
+
1597
+ var oModel = oContext.getModel(),
1598
+ oLockObject = _this17._getGlobalUIModel();
1599
+
1600
+ return Promise.resolve(_finallyRethrows(function () {
1601
+ // Submit any leftover changes that are not yet submitted
1602
+ // Currently we are using only 1 updateGroupId, hence submitting the batch directly here
1603
+ return Promise.resolve(oModel.submitBatch("$auto")).then(function () {
1604
+ // Wait for all currently running changes
1605
+ // For the time being we agreed with the v4 model team to use an internal method. We'll replace it once
1606
+ // a public or restricted method was provided
1607
+ return Promise.resolve(oModel.oRequestor.waitForRunningChangeRequests("$auto")).then(function () {
1608
+ if (oModel.hasPendingChanges("$auto")) {
1609
+ throw new Error("submit of open changes failed");
1610
+ }
1611
+ }); // Check if all changes were submitted successfully
1612
+ });
1613
+ }, function (_wasThrown2, _result9) {
1614
+ if (BusyLocker.isLocked(oLockObject)) {
1615
+ BusyLocker.unlock(oLockObject);
1616
+ }
1347
1617
 
1348
- return oModel.submitBatch("$auto").then(function () {
1349
- if (oModel.hasPendingChanges("$auto")) {
1350
- // the submit was not successful
1351
- return Promise.reject("submit of open changes failed");
1352
- }
1353
- }).finally(function () {
1354
- if (BusyLocker.isLocked(oLockObject)) {
1355
- BusyLocker.unlock(oLockObject);
1356
- }
1357
- });
1618
+ if (_wasThrown2) throw _result9;
1619
+ return _result9;
1620
+ }));
1621
+ } catch (e) {
1622
+ return Promise.reject(e);
1623
+ }
1358
1624
  };
1359
1625
 
1360
1626
  _proto._handleStickyOn = function _handleStickyOn(oContext) {
@@ -1373,17 +1639,54 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1373
1639
  return this.base.getView().getController()._editFlow.discardStickySession(oContext);
1374
1640
  };
1375
1641
 
1376
- _proto._handleNewContext = function _handleNewContext(oContext, bEditable, bRecreateContext, bDraftNavigation, bForceFocus) {
1377
- EditState.setEditStateDirty();
1378
- return this._getRoutingListener().navigateToContext(oContext, {
1379
- checkNoHashChange: true,
1380
- editable: bEditable,
1381
- bPersistOPScroll: true,
1382
- bRecreateContext: bRecreateContext,
1383
- bDraftNavigation: bDraftNavigation,
1384
- showPlaceholder: false,
1385
- bForceFocus: bForceFocus
1386
- });
1642
+ _proto._setStickySessionInternalProperties = function _setStickySessionInternalProperties(programmingModel, model) {
1643
+ if (programmingModel === ProgrammingModel.Sticky) {
1644
+ var internalModel = this._getInternalModel();
1645
+
1646
+ internalModel.setProperty("/sessionOn", true);
1647
+ internalModel.setProperty("/stickySessionToken", model.getHttpHeaders(true)["SAP-ContextId"]);
1648
+ }
1649
+ };
1650
+
1651
+ _proto._removeStickySessionInternalProperties = function _removeStickySessionInternalProperties(programmingModel) {
1652
+ if (programmingModel === ProgrammingModel.Sticky) {
1653
+ var internalModel = this._getInternalModel();
1654
+
1655
+ internalModel.setProperty("/sessionOn", false);
1656
+ internalModel.setProperty("/stickySessionToken", undefined);
1657
+
1658
+ this._handleStickyOff();
1659
+ }
1660
+ };
1661
+
1662
+ _proto._handleNewContext = function _handleNewContext(oContext, bEditable, bRecreateContext, bDraftNavigation, bForceFocus, bNavigateToSiblingEntity) {
1663
+ try {
1664
+ var _this19 = this;
1665
+
1666
+ if (!_this19._isFclEnabled()) {
1667
+ EditState.setEditStateDirty();
1668
+ }
1669
+
1670
+ return Promise.resolve(_this19._getRoutingListener().navigateToContext(oContext, {
1671
+ checkNoHashChange: true,
1672
+ editable: bEditable,
1673
+ bPersistOPScroll: true,
1674
+ bRecreateContext: bRecreateContext,
1675
+ bDraftNavigation: bDraftNavigation,
1676
+ showPlaceholder: false,
1677
+ bForceFocus: bForceFocus,
1678
+ keepCurrentLayout: true,
1679
+ bNavigateToSiblingEntity: bNavigateToSiblingEntity
1680
+ })).then(function () {});
1681
+ } catch (e) {
1682
+ return Promise.reject(e);
1683
+ }
1684
+ };
1685
+
1686
+ _proto._getBoundContext = function _getBoundContext(view, params) {
1687
+ var viewLevel = view.getViewData().viewLevel;
1688
+ var bRefreshAfterAction = viewLevel > 1 || viewLevel === 1 && params.controlId;
1689
+ return !params.isNavigable || !!bRefreshAfterAction;
1387
1690
  }
1388
1691
  /**
1389
1692
  * Checks if there are validation (parse) errors for controls bound to a given context
@@ -1396,10 +1699,10 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1396
1699
  ;
1397
1700
 
1398
1701
  _proto._checkForValidationErrors = function _checkForValidationErrors() {
1399
- var _this12 = this;
1702
+ var _this20 = this;
1400
1703
 
1401
1704
  return this._syncTask().then(function () {
1402
- var sViewId = _this12.base.getView().getId();
1705
+ var sViewId = _this20.base.getView().getId();
1403
1706
 
1404
1707
  var aMessages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
1405
1708
  var oControl;
@@ -1413,7 +1716,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1413
1716
  oMessage = aMessages[i];
1414
1717
 
1415
1718
  if (oMessage.validation) {
1416
- oControl = sap.ui.getCore().byId(oMessage.getControlId());
1719
+ oControl = Core.byId(oMessage.getControlId());
1417
1720
 
1418
1721
  while (oControl) {
1419
1722
  if (oControl.getId() === sViewId) {
@@ -1437,7 +1740,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1437
1740
  ;
1438
1741
 
1439
1742
  _proto._refreshListIfRequired = function _refreshListIfRequired(oResponse, oContext) {
1440
- var _this13 = this;
1743
+ var _this21 = this;
1441
1744
 
1442
1745
  if (!oContext || !oResponse || !oResponse.oData) {
1443
1746
  return Promise.resolve();
@@ -1465,7 +1768,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1465
1768
  });
1466
1769
  oBinding.refresh();
1467
1770
  } else {
1468
- var oAppComponent = CommonUtils.getAppComponent(_this13.getView());
1771
+ var oAppComponent = CommonUtils.getAppComponent(_this21.getView());
1469
1772
  oAppComponent.getSideEffectsService().requestSideEffects([{
1470
1773
  $NavigationPropertyPath: oBinding.getPath()
1471
1774
  }], oBinding.getContext()).then(function () {
@@ -1508,7 +1811,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1508
1811
  var aPages = [];
1509
1812
  var oAppComponent = CommonUtils.getAppComponent(this.getView());
1510
1813
 
1511
- if (oAppComponent._isFclEnabled()) {
1814
+ if (this._isFclEnabled()) {
1512
1815
  var oFCL = oAppComponent.getRootContainer();
1513
1816
  aPages = aPages.concat(oFCL.getMidColumnPages() || []);
1514
1817
  aPages = aPages.concat(oFCL.getEndColumnPages() || []);
@@ -1557,6 +1860,10 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1557
1860
  throw "context found - stop SubSections loop";
1558
1861
  }
1559
1862
 
1863
+ if (oSubSection.getBindingContext() === null) {
1864
+ oSubSection.setBindingContext(undefined);
1865
+ }
1866
+
1560
1867
  var aActions = oSubSection.getAggregation("actions");
1561
1868
  oActionBindingContext = _checkActions(aActions);
1562
1869
  });
@@ -1589,8 +1896,73 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
1589
1896
  }
1590
1897
  };
1591
1898
 
1899
+ _proto._createSiblingInfo = function _createSiblingInfo(currentContext, newContext) {
1900
+ return {
1901
+ targetContext: newContext,
1902
+ pathMapping: [{
1903
+ oldPath: currentContext.getPath(),
1904
+ newPath: newContext.getPath()
1905
+ }]
1906
+ };
1907
+ };
1908
+
1909
+ _proto._updatePathsInHistory = function _updatePathsInHistory(mappings) {
1910
+ var oAppComponent = this.base.getAppComponent();
1911
+ oAppComponent.getRouterProxy().setPathMapping(mappings); // Also update the semantic mapping in the routing service
1912
+
1913
+ var lastSemanticMapping = this._getSemanticMapping();
1914
+
1915
+ if (mappings.length && (lastSemanticMapping === null || lastSemanticMapping === void 0 ? void 0 : lastSemanticMapping.technicalPath) === mappings[mappings.length - 1].oldPath) {
1916
+ lastSemanticMapping.technicalPath = mappings[mappings.length - 1].newPath;
1917
+ }
1918
+ }
1919
+ /**
1920
+ * This methods creates a sibling context for a sub-object page, and calculates a sibling path for
1921
+ * all intermediates paths between the OP and the sub-OP.
1922
+ *
1923
+ * @param {object} rootCurrentContext The context for the root of the draft
1924
+ * @param {object} rightmostCurrentContext The context of the sub-object
1925
+ * @param {string} sProgrammingModel The programming model
1926
+ * @param {boolean} doNotComputeIfRoot If true, we don't compute siblingInfo if the root and the rightmost contexts are the same
1927
+ * @returns {Promise} Returns the siblingInformation object
1928
+ */
1929
+ ;
1930
+
1931
+ _proto._computeSiblingInformation = function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot) {
1932
+ try {
1933
+ if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
1934
+ // Wrong usage !!
1935
+ Log.error("Cannot compute rightmost sibling context");
1936
+ throw new Error("Cannot compute rightmost sibling context");
1937
+ }
1938
+
1939
+ if (doNotComputeIfRoot && rightmostCurrentContext.getPath() === rootCurrentContext.getPath()) {
1940
+ return Promise.resolve(undefined);
1941
+ }
1942
+
1943
+ var model = rootCurrentContext.getModel();
1944
+
1945
+ if (sProgrammingModel === ProgrammingModel.Draft) {
1946
+ return Promise.resolve(draft.computeSiblingInformation(rootCurrentContext, rightmostCurrentContext));
1947
+ } else {
1948
+ // If not in draft mode, we just recreate a context from the path of the rightmost context
1949
+ // No path mapping is needed
1950
+ return Promise.resolve({
1951
+ targetContext: model.bindContext(rightmostCurrentContext.getPath()).getBoundContext(),
1952
+ pathMapping: []
1953
+ });
1954
+ }
1955
+ } catch (e) {
1956
+ return Promise.reject(e);
1957
+ }
1958
+ };
1959
+
1960
+ _proto._isFclEnabled = function _isFclEnabled() {
1961
+ return CommonUtils.getAppComponent(this.getView())._isFclEnabled();
1962
+ };
1963
+
1592
1964
  return EditFlow;
1593
- }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [Public, _dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [Public, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [Public, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [Public, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [Public, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "toggleDraftActive", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "toggleDraftActive"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchSent", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchSent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchCompleted", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchCompleted"), _class2.prototype)), _class2)) || _class);
1965
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "toggleDraftActive", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "toggleDraftActive"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchSent", [_dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchSent"), _class2.prototype)), _class2)) || _class);
1594
1966
  return EditFlow;
1595
1967
  }, false);
1596
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJDb25zdGFudHMiLCJEcmFmdFN0YXR1cyIsIkVkaXRNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJFeHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImVkaXREb2N1bWVudCIsIm9Db250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsInRyYW5zYWN0aW9uSGVscGVyIiwiX2dldFRyYW5zYWN0aW9uSGVscGVyIiwiYmFzZSIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsInRoZW4iLCJiaW5kIiwiZ2V0VmlldyIsIl9nZXRNZXNzYWdlSGFuZGxlciIsIm9OZXdEb2N1bWVudENvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsIl9nZXRQcm9ncmFtbWluZ01vZGVsIiwiU3RpY2t5IiwiX2dldEludGVybmFsTW9kZWwiLCJzZXRQcm9wZXJ0eSIsIl9zZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJfaGFuZGxlTmV3Q29udGV4dCIsIl9oYW5kbGVTdGlja3lPbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJiSXNEcmFmdCIsIkRyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiX3N5bmNUYXNrIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJfc2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0TmFtZSIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImFTZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImxlbmd0aCIsIm9DdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0N1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwiZmluYWxseSIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0IiwiX2dldEdsb2JhbFVJTW9kZWwiLCJvVGFibGUiLCJpQ291bnRUYWJsZUl0ZW1zIiwib1Jlc291cmNlQnVuZGxlIiwiYlNob3VsZEJ1c3lMb2NrIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lIiwiQ3JlYXRpb25Sb3ciLCJFeHRlcm5hbCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsInNDcmVhdGVQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInRhYmxlSWQiLCJieUlkIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsIkVycm9yIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiY3VzdG9tTWVzc2FnZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9EYXRhTGlzdEJpbmRpbmciLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJvTW9kZWwiLCJpTWF4TGVuZ3RoIiwic0NyZWF0aW9uTW9kZSIsInByb2dyYW1taW5nTW9kZWwiLCJOZXdQYWdlIiwiaXNSZWxhdGl2ZSIsInNQYXRoIiwic05ld0FjdGlvbiIsImFQYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiQXN5bmMiLCJvQ3JlYXRpb24iLCJtQXJncyIsIm9DcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd0NvbnRleHQiLCJvVmFsaWRhdGlvbkNoZWNrIiwib1BheWxvYWQiLCJvUm91dGluZ0xpc3RlbmVyIiwiX2dldFJvdXRpbmdMaXN0ZW5lciIsIk9iamVjdCIsImtleXMiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiX2hhbmRsZUNyZWF0ZUV2ZW50cyIsInBhcmVudENvbnRyb2wiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwib05hdmlnYXRpb24iLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJiRGVmZXJyZWRDb250ZXh0IiwiZWRpdGFibGUiLCJiRm9yY2VGb2N1cyIsImFzeW5jQ29udGV4dCIsImNyZWF0ZUFjdGlvbiIsInRyYW5zaWVudCIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiYlNraXBTaWRlRWZmZWN0cyIsIm9OZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwidW5sb2NrIiwicmVqZWN0IiwiYklzTmV3UGFnZUNyZWF0aW9uIiwiYWxsIiwiYVBhcmFtcyIsInNlbmQiLCJBY3Rpdml0eSIsIkNyZWF0ZSIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImlzQSIsImZuRm9jdXNPclNjcm9sbCIsImZvY3VzUm93Iiwic2Nyb2xsVG9JbmRleCIsImdldFJvd0JpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJnZXRUaHJlc2hvbGQiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcyIsIl9oYW5kbGVTdGlja3lPZmYiLCJBY3RpdmF0ZSIsIkRpc3BsYXkiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJFZGl0YWJsZSIsIm9Ub2dnbGVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJzQ2Fub25pY2FsUGF0aCIsImVyciIsImNhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMiLCJza2lwQmluZGluZ1RvVmlldyIsImRlbGV0ZURvY3VtZW50IiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIl9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiRGVsZXRlIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiYXBwbHlEb2N1bWVudCIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwib0NvbnRyb2wiLCJvQ3VycmVudENvbnRyb2wiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsIkFycmF5IiwiaXNBcnJheSIsImFyZ3VtZW50cyIsImNvbnRleHRzIiwibW9kZWwiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiaW5kZXhPZiIsInNwbGl0IiwicmVwbGFjZUFsbCIsImJTdGF0aWNBY3Rpb24iLCJpc1RhYmxlQm91bmQiLCJzQmluZGluZ1BhdGgiLCJwYXRoIiwic1RhYmxlQ29udGV4dEVudGl0eVR5cGUiLCJvQWN0aW9uT3ZlcmxvYWRDb250ZXh0IiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyIsImVuYWJsZUF1dG9TY3JvbGwiLCJfY3JlYXRlQWN0aW9uUHJvbWlzZSIsInNJZCIsImJHZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImNhbGxBY3Rpb24iLCJvUmVzcG9uc2UiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJBY3Rpb24iLCJmUmVzb2x2ZXIiLCJ2Q29udGV4dCIsInNDb250ZXh0TWV0YVBhdGgiLCJvQWN0aW9uQ29udGV4dCIsInNBY3Rpb25Db250ZXh0TWV0YVBhdGgiLCJub0hpc3RvcnlFbnRyeSIsImluZm8iLCJmUmVqZWN0b3IiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJtUGF0Y2hQcm9taXNlcyIsIm9QYXRjaFByb21pc2UiLCJnZXRTb3VyY2UiLCJyZXNvbHZlUGF0Y2hQcm9taXNlIiwicmVqZWN0UGF0Y2hQcm9taXNlIiwiaGFuZGxlUGF0Y2hDb21wbGV0ZWQiLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsInNFZGl0TW9kZSIsImJDcmVhdGlvbk1vZGUiLCJzZXRFZGl0TW9kZSIsInNEcmFmdFN0YXRlIiwic2V0RHJhZnRTdGF0dXMiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJnZXRHbG9iYWxVSU1vZGVsIiwidlRhc2siLCJzeW5jVGFzayIsImdldFByb2dyYW1taW5nTW9kZWwiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwib0JpbmRpbmciLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsImdldEludGVybmFsTW9kZWwiLCJzQ29udHJvbElkIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsIl9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiX2RlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJnZXRNZXNzYWdlSGFuZGxlciIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJzdWJtaXRCYXRjaCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaGFuZGxlU3RpY2t5T24iLCJoYW5kbGVTdGlja3lPZmYiLCJfb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJfZGlzY2FyZFN0aWNreVNlc3Npb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImJSZWNyZWF0ZUNvbnRleHQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNob3dQbGFjZWhvbGRlciIsInNWaWV3SWQiLCJnZXRJZCIsImFNZXNzYWdlcyIsImkiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0RhdGEiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJpc1Jvb3QiLCJyZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRDb250ZXh0IiwiZSIsImFSZXF1ZXN0UHJvbWlzZXMiLCJtYXAiLCJvS2V5IiwicmVxdWVzdE9iamVjdCIsIiRQcm9wZXJ0eVBhdGgiLCJhUGFnZXMiLCJfaXNGY2xFbmFibGVkIiwib0ZDTCIsImdldFJvb3RDb250YWluZXIiLCJjb25jYXQiLCJnZXRNaWRDb2x1bW5QYWdlcyIsImdldEVuZENvbHVtblBhZ2VzIiwib05hdkNvbnRhaW5lciIsImdldFBhZ2VzIiwib1BhZ2UiLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsIl9jaGVja0FjdGlvbnMiLCJhQWN0aW9ucyIsIm9BY3Rpb25CaW5kaW5nQ29udGV4dCIsIm9BY3Rpb24iLCJfY2hlY2tTdWJTZWN0aW9ucyIsImFTdWJTZWN0aW9ucyIsIm9TdWJTZWN0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQS9CO0FBQUEsTUFDQ0UsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBRDlCO0FBQUEsTUFFQ0MsU0FBUyxHQUFHRixTQUFTLENBQUNFLFNBRnZCO0FBQUEsTUFHQ0MsV0FBVyxHQUFHSCxTQUFTLENBQUNHLFdBSHpCO0FBQUEsTUFJQ0MsUUFBUSxHQUFHSixTQUFTLENB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QUdELFFBQWxCOztBQUNBLGVBQU8sQ0FBQ0MsZUFBZSxDQUFDbkQsR0FBaEIsQ0FBb0IsNEJBQXBCLENBQVIsRUFBMkQ7QUFDMURtRCxVQUFBQSxlQUFlLEdBQUdBLGVBQWUsQ0FBQ3BMLFNBQWhCLEVBQWxCO0FBQ0E7O0FBRUQsWUFBSSxDQUFDb0wsZUFBTCxFQUFzQjtBQUNyQixnQkFBTSxJQUFJcEksS0FBSixDQUFVLDZDQUFWLENBQU47QUFDQSxTQUZELE1BRU87QUFDTixjQUFNOFEsWUFBWSxHQUFHMUksZUFBZSxDQUFDNEksY0FBaEIsQ0FBK0IsYUFBL0IsQ0FBckI7QUFDQSxpQkFBT0gsaUJBQWlCLENBQUNDLFlBQUQsQ0FBeEI7QUFDQTtBQUNELE9BaEJELENBZ0JFLE9BQU94WSxLQUFQLEVBQWM7QUFDZkQsUUFBQUEsR0FBRyxDQUFDeVMsSUFBSixDQUFTeFMsS0FBVDtBQUNBLGVBQU91RSxTQUFQO0FBQ0E7QUFDRCxLOzs7SUE1bERxQm9VLG1CLGtFQXNCckJDLE0sRUFDQUMsSyxvS0FpQ0FELE0sRUFDQUMsSyxzS0F1QkFELE0sRUFDQUMsSyw2SkFxRkFELE0sRUFDQUMsSywySkE4YUFELE0sa0tBd0JBQSxNLGtLQXVCQUEsTSxtS0F1QkFBLE0scUtBdUJBQSxNLGtLQXlCQUEsTSxFQUNBQyxLLDhKQW1EQUQsTSxFQUNBQyxLLGdLQWdFQUQsTSxFQUNBQyxLLDZKQXFFQUQsTSxFQUNBQyxLLDRKQTBDQUQsTSxFQUNBQyxLLDBKQTRDQUQsTSxFQUNBQyxLLDZKQWlOQUQsTSxFQUNBQyxLLGdLQTZEQUQsTSxvS0FrQkFBLE07U0ErVmE3YSxRIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IEV4dGVuc2libGUsIEZpbmFsLCBQdWJsaWMsIFVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHsgc2VuZCB9IGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgRmxleGlibGVDb2x1bW5MYXlvdXQgZnJvbSBcInNhcC9mL0ZsZXhpYmxlQ29sdW1uTGF5b3V0XCI7XG5pbXBvcnQgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdE1lc3NhZ2VUeXBlID0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGU7XG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgaG9va3MgaW50byB0aGUgZWRpdCBmbG93IG9mIHRoZSBhcHBsaWNhdGlvblxuICpcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcIiwgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhKVxuY2xhc3MgRWRpdEZsb3cgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRwcml2YXRlIGZuRGlydHlTdGF0ZVByb3ZpZGVyPzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5IYW5kbGVTZXNzaW9uVGltZW91dD86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIG1QYXRjaFByb21pc2VzPzogYW55O1xuXHRwcml2YXRlIF9mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24/OiBGdW5jdGlvbjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZvciBhbiBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0ZWRpdERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5iYXNlLmVkaXRGbG93XG5cdFx0XHQub25CZWZvcmVFZGl0KHsgY29udGV4dDogb0NvbnRleHQgfSlcblx0XHRcdC50aGVuKHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudC5iaW5kKHRyYW5zYWN0aW9uSGVscGVyLCBvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkpKVxuXHRcdFx0LnRoZW4oKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHR0aGlzLl9nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIHRydWUsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9uKG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGVcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHMsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBhbiB1cGRhdGUuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1Byb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHR1cGRhdGVEb2N1bWVudChvQ29udGV4dDogb2JqZWN0LCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygoKSA9PiB7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGJJc0RyYWZ0ICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldE5hbWUgPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFDb250ZXh0KG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0XHRcdFx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DdXJyZW50U2VtYW50aWNNYXBwaW5nID0gKHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKSBhcyBhbnkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRSb3V0aW5nU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRzQ3VycmVudFNlbWFudGljUGF0aCA9IG9DdXJyZW50U2VtYW50aWNNYXBwaW5nICYmIG9DdXJyZW50U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQmluZGluZ0NvbnRleHQsIHRydWUpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNDdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSwgZmFsc2UsIHRydWUpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcGFyYW1cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nfHN0cmluZ30gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHttYXB9IG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY3JlYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRjcmVhdGVEb2N1bWVudChcblx0XHR2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGxldCBvVGFibGU6IFRhYmxlO1xuXHRcdGxldCBpQ291bnRUYWJsZUl0ZW1zID0gMDtcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gKHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdFx0c0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KClcblx0XHRcdCk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmICgob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmd9IG9MaXN0QmluZGluZ1xuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlU2lkZUVmZmVjdHMgPSAob0xpc3RCaW5kaW5nOiBhbnksIG9DcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pID0+IHtcblx0XHRcdG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRcdHJldHVybiBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIChvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSBhcyBhbnkpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob01lc3NhZ2UuY29kZSA9PT0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRhVmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKG9WYWxpZGF0aW9uTWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdFx0b0ZpZWxkQ29udHJvbCA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0Q29udHJvbChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdFx0c1RhcmdldCA9IG9GaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpICsgXCIvXCIgKyBvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24ob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NZXNzYWdlLnRhcmdldCA9PT0gc1RhcmdldDtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlc1swXS5hZGRDb250cm9sSWQobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBVbmJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFDdXN0b21NZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvZGU6IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHR0ZXh0OiBvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3Jcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChhQ3VzdG9tTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjdXN0b21NZXNzYWdlczogYUN1c3RvbU1lc3NhZ2VzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRiU2hvdWxkQnVzeUxvY2sgJiYgQnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKVxuXHRcdFx0LnRoZW4oKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYVZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nO1xuXHRcdFx0XHRsZXQgb0xpc3RCaW5kaW5nOiBhbnk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRpZiAodkxpc3RCaW5kaW5nICYmIHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHZMaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdFx0aUNvdW50VGFibGVJdGVtcyA9IG9MaXN0QmluZGluZy5pTWF4TGVuZ3RoIHx8IDA7XG5cdFx0XHRcdGNvbnN0IHNDcmVhdGlvbk1vZGUgPSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGU7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9MaXN0QmluZGluZykpXG5cdFx0XHRcdFx0LnRoZW4oKHByb2dyYW1taW5nTW9kZWw6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPSBwcm9ncmFtbWluZ01vZGVsO1xuXHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgJiYgc0NyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdFx0XHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc0NyZWF0aW9uTW9kZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdFx0XHRcdFx0aWYgKCFvTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc1BhdGggPSBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChzUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIgKyBzTmV3QWN0aW9uICsgXCIvQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyXCIpIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gYmluZGluZyBwYXJhbWV0ZXIgKGVnOiBfaXQpIGlzIG5vdCBjb25zaWRlcmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYVBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCxcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnRoZW4oKHNDcmVhdGlvbk1vZGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IG9DcmVhdGlvbjogYW55O1xuXHRcdFx0XHRcdFx0bGV0IG1BcmdzOiBhbnk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3cgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRcdFx0XHRcdGxldCBvQ3JlYXRpb25Sb3dDb250ZXh0OiBhbnk7XG5cdFx0XHRcdFx0XHRsZXQgb1ZhbGlkYXRpb25DaGVjayA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0bGV0IG9QYXlsb2FkOiBhbnk7XG5cdFx0XHRcdFx0XHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1JvdXRpbmdMaXN0ZW5lciA9IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpO1xuXG5cdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRpb25Sb3dDb250ZXh0ID0gb0NyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcHJlZmlsbCBkYXRhIGZyb20gY3JlYXRpb24gcm93XG5cdFx0XHRcdFx0XHRcdFx0b1BheWxvYWQgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhvUGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL1wiICsgc1Byb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG9QYXlsb2FkW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdG9WYWxpZGF0aW9uQ2hlY2sgPSB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoLypvQ3JlYXRpb25Sb3dDb250ZXh0Ki8pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgfHwgc0NyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSkge1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0XHQvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIkxvY2FsXCI7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdFx0XHRcdFx0XHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVDcmVhdGVFdmVudHMob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdG9DcmVhdGlvbiA9IG9WYWxpZGF0aW9uQ2hlY2sudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHRcdFx0XHRcdG9MaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGV0IG9OYXZpZ2F0aW9uO1xuXHRcdFx0XHRcdFx0c3dpdGNoIChzQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdFx0YXN5bmNDb250ZXh0OiBvQ3JlYXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRcdFx0XHRcdFx0bUFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgbVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtQXJncy50cmFuc2llbnQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvbi50aGVuKGZ1bmN0aW9uKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3luY1Rhc2sob0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNyZWF0aW9uIHJvdyBzaGFsbCBiZSBjbGVhcmVkIG9uY2UgdGhlIHZhbGlkYXRpb24gY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgYW5kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlcmVmb3JlIHRoZSBQT1NUIGNhbiBiZSBzZW50IGFzeW5jIHRvIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3VHJhbnNpZW50Q29udGV4dCA9IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQob05ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9OZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKS5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVzZXQgYnVzeSBpbmRpY2F0b3IgYWZ0ZXIgYSB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IFByb21pc2UucmVqZWN0KFwiVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIiArIHNDcmVhdGlvbk1vZGUpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2dldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRcdFx0XHRpZiAob0NyZWF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb0NyZWF0aW9uLCBvTmF2aWdhdGlvbl0pXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oKGFQYXJhbXM6IFthbnksIGFueV0pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChiSXNOZXdQYWdlQ3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGJJc05ld1BhZ2VDcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYVBhcmFtc1swXTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZW5kKHRoaXMuZ2V0VmlldygpLCBBY3Rpdml0eS5DcmVhdGUsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FcnJvciAmJiAob0Vycm9yLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSB8fCBvRXJyb3IgPT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRjb25zdCBmbkZvY3VzT3JTY3JvbGwgPVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lID8gb1RhYmxlLmZvY3VzUm93LmJpbmQob1RhYmxlKSA6IG9UYWJsZS5zY3JvbGxUb0luZGV4LmJpbmQob1RhYmxlKTtcblx0XHRcdFx0XHRvVGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAobVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSB0cnVlOlxuXHRcdFx0XHRcdFx0XHRcdGlmIChvVGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIiAmJiBvVGFibGUuZ2V0VGhyZXNob2xkKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZuRm9jdXNPclNjcm9sbChvVGFibGUuZ2V0VGhyZXNob2xkKCksIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmbkZvY3VzT3JTY3JvbGwoaUNvdW50VGFibGVJdGVtcywgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIGZhbHNlOlxuXHRcdFx0XHRcdFx0XHRcdGZuRm9jdXNPclNjcm9sbCgwLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRiU2hvdWxkQnVzeUxvY2sgJiYgQnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBleHBlcmltZW50YWwgQXMgb2YgdmVyc2lvbiAxLjkwLjBcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVNhdmUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7bWFwfSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTguMFxuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlQ3JlYXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBleHBlcmltZW50YWwgQXMgb2YgdmVyc2lvbiAxLjk4LjBcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUVkaXQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleHBlcmltZW50YWwgQXMgb2YgdmVyc2lvbiAxLjk4LjBcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURpc2NhcmQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTguMFxuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGVsZXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzYXZlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXHRcdC8vIGZpcnN0IG9mIGFsbCB3YWl0IHVudGlsIGFsbCBrZXktbWF0Y2gtcmVxdWVzdHMgYXJlIGRvbmVcblx0XHRyZXR1cm4gKFxuXHRcdFx0dGhpcy5fc3luY1Rhc2soKVxuXHRcdFx0XHQvLyBzdWJtaXQgYW55IG9wZW4gY2hhbmdlcyBpZiB0aGVyZSBhbnkgKGFsdGhvdWdoIHRoZXJlIGFyZSB2YWxpZGF0aW9uL3BhcnNlIGVycm9ycylcblx0XHRcdFx0LnRoZW4odGhpcy5fc3VibWl0T3BlbkNoYW5nZXMuYmluZCh0aGlzLCBvQ29udGV4dCkpXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdmFsaWRhdGlvbi9wYXJzZSBlcnJvcnNcblx0XHRcdFx0LnRoZW4odGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzLmJpbmQodGhpcywgb0NvbnRleHQpKVxuXHRcdFx0XHQudGhlbih0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlLmJpbmQodGhpcywgeyBjb250ZXh0OiBvQ29udGV4dCB9KSlcblx0XHRcdFx0Ly8gYW5kIGZpbmFsbHkgaWYgYWxsIHVzZXIgY2hhbmdlcyBhcmUgc3VibWl0dGVkIGFuZCB2YWxpZCBzYXZlIHRoZSBkb2N1bWVudFxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQuYmluZChcblx0XHRcdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLFxuXHRcdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4oKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpO1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2dldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T2ZmKC8qb0NvbnRleHQqLyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VuZCh0aGlzLmdldFZpZXcoKSwgQWN0aXZpdHkuQWN0aXZhdGUsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRcdGlmIChvQWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlTmV3Q29udGV4dChvQWN0aXZlRG9jdW1lbnRDb250ZXh0LCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdH1cblx0QFB1YmxpY1xuXHRARmluYWxcblx0dG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBiRWRpdGFibGU6IGJvb2xlYW47XG5cdFx0Y29uc3QgYklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0XHRjb25zdCBvVG9nZ2xlQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0LmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL1NpYmxpbmdFbnRpdHlcIilcblx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGJFZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSkge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRvVG9nZ2xlQ29udGV4dFxuXHRcdFx0LnJlcXVlc3RDYW5vbmljYWxQYXRoKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHNDYW5vbmljYWxQYXRoOiBhbnkpIHtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBjYW5vbmljYWwgcGF0aCBmb3IgdGhlIG5hdmlnYXRpb24gaW5zdGVhZCBvZiB0aGUgc2VtYW50aWMgcGF0aCwgYXMgdGhlXG5cdFx0XHRcdC8vIHNlbWFudGljIGtleSB2YWx1ZXMgbWF5IGhhdmUgY2hhbmdlZCBiZXR3ZWVuIHRoZSBkcmFmdCBhbmQgdGhlIGFjdGl2ZSB2ZXJzaW9uIChCQ1AgMjE3MDIxNjE0Milcblx0XHRcdFx0cmV0dXJuIG9Ub2dnbGVDb250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuYmluZENvbnRleHQoc0Nhbm9uaWNhbFBhdGgpXG5cdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChvVG9nZ2xlQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKGJFZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXHRcdFx0XHR0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9Ub2dnbGVDb250ZXh0LCBiRWRpdGFibGUsIHRydWUsIHRydWUsIHRydWUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZTpcIiArIGVycik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSB7bWFwfSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNjYW5jZWxEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG1QYXJhbWV0ZXJzOiB7IGNvbnRyb2w6IG9iamVjdDsgc2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlID0gKHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRjb25zdCBtSW5QYXJhbWV0ZXJzOiBhbnkgPSBtUGFyYW1ldGVycztcblx0XHRtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b247XG5cdFx0bUluUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmQ7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudC5iaW5kKHRyYW5zYWN0aW9uSGVscGVyLCBvQ29udGV4dCwgbVBhcmFtZXRlcnMsIG9SZXNvdXJjZUJ1bmRsZSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSlcblx0XHRcdClcblx0XHRcdC50aGVuKChvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWUsXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpO1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T2ZmKC8qb0NvbnRleHQqLyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZW5kKHRoaXMuZ2V0VmlldygpLCBBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblxuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIHRoZSB2YWx1ZSBvZiBoYXNBY3RpdmVFbnRpdHkgaXMgcmV0dXJuZWQuIG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghb0FjdGl2ZURvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdHJldHVybiBtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbiA/IHVuZGVmaW5lZCA6IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdFx0aWYgKG1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlTmV3Q29udGV4dChvQWN0aXZlRG9jdW1lbnRDb250ZXh0LCBmYWxzZSwgdHJ1ZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9hY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudFxuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9BY3RpdmVEb2N1bWVudENvbnRleHQsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2RlbGV0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0ZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRyZXR1cm4gdGhpcy5fZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXG5cdFx0XHRcdHNlbmQodGhpcy5nZXRWaWV3KCksIEFjdGl2aXR5LkRlbGV0ZSwgc1BhdGgpO1xuXG5cdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldHRjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0YXBwbHlEb2N1bWVudChvQ29udGV4dDogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRyZXR1cm4gKFxuXHRcdFx0dGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdmFsaWRhdGlvbi9wYXJzZSBlcnJvcnNcblx0XHRcdFx0LnRoZW4odGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzLmJpbmQodGhpcywgb0NvbnRleHQpKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2ludm9rZUFjdGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0aW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IGFueVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0NvbnRyb2w6IGFueTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDtcblx0XHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoKG1QYXJhbWV0ZXJzLmlzQSAmJiBtUGFyYW1ldGVycy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHwgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0Y29uc3QgY29udGV4dHMgPSBtUGFyYW1ldGVycztcblx0XHRcdG1QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXSBhcyBhbnkpLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3Qgc1RhYmxlQ29udGV4dEVudGl0eVR5cGUgPSBtUGFyYW1ldGVycy5jb250ZXh0c1xuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG1QYXJhbWV0ZXJzLmNvbnRleHRzLmdldFBhdGgoKSlcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIik7XG5cdFx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICE9PSBzVGFibGVDb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBpbiBjb250cm9sIHRyZWUgaGllcmFyY2h5XG5cdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHRcdFx0d2hpbGUgKG9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ID0gb0N1cnJlbnRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCAmJlxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT0gc092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0JpbmRpbmdDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIGNoZWNrIHBhcmVudFxuXHRcdFx0XHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIGNvbnRleHQgd2FzIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHkgZ29pbmcgc3RyYWlnaHQgdXB3YXJkcyAtIHRyeSB0byBmaW5kIGl0IGluIFN1YlNlY3Rpb25zXG5cdFx0XHRcdFx0aWYgKCFvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25PdmVybG9hZENvbnRleHQgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMob0NvbnRyb2wsIHNPdmVybG9hZEVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25PdmVybG9hZENvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9BY3Rpb25PdmVybG9hZENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ29udGV4dCBub3QgZm91bmQgZm9yIGVudGl0eSB0eXBlIFwiICsgc092ZXJsb2FkRW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5fY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuc0lkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vIE5lZWQgdG8ga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgY2FsbGVkIGZyb20gT2JqZWN0UGFnZSBmb3IgY2hhbmdlU2V0IElzb2xhdGVkIHdvcmthcm91bmRcblx0XHRtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IChvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKClcblx0XHRcdC50aGVuKHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24uYmluZCh0cmFuc2FjdGlvbkhlbHBlciwgc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSkpXG5cdFx0XHQudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gaWYgdGhlIHJldHVybmVkIGNvbnRleHQgZm9yIHRoZSBib3VuZCBhY3Rpb24gaXMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbnRleHQgb24gd2hpY2ggYWN0aW9uIHdhcyBjYWxsZWQsXG5cdFx0XHRcdC8vIHJlZnJlc2ggdGhlIGNvcnJlc3BvbmRpbmcgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0XHR0aGlzLl9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0XHQpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHNlbmQodGhpcy5nZXRWaWV3KCksIEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMpO1xuXG5cdFx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qXG5cdFx0XHRcdFx0IFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0IFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0IFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0IE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0IGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0IHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0IGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHQgd2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0IHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0IGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlcnIgPT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkRpYWxvZ8KgY2FuY2VsbGVkLlwiKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246XCIgKyBlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWN1cmVkIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEVuc3VyZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NlY3VyZWRFeGVjdXRpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAZXhwZXJpbWVudGFsIEFzIG9mIHZlcnNpb24gMS45MC4wXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LnNldCAhPT0gdW5kZWZpbmVkID8gbVBhcmFtZXRlcnMuYnVzeS5zZXQgOiB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmJ1c3kgJiYgbVBhcmFtZXRlcnMuYnVzeS5jaGVjayAhPT0gdW5kZWZpbmVkID8gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayA6IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gKG1QYXJhbWV0ZXJzICYmIChtUGFyYW1ldGVycyBhcyBhbnkpLnVwZGF0ZXNEb2N1bWVudCkgfHwgZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soZm5GdW5jdGlvbilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRAUHVibGljXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IGFueSkge1xuXHRcdHRoaXMubVBhdGNoUHJvbWlzZXMgPSB0aGlzLm1QYXRjaFByb21pc2VzID8gdGhpcy5tUGF0Y2hQcm9taXNlcyA6IHt9O1xuXHRcdC8vIGRvIHRoaXMgZm9yIGV2ZXJ5IHVuaXF1ZSBvYmplY3QgKGVnOiBldmVyeSB0YWJsZSkgc28gdGhhdCBlYWNoIGFzc29jaWF0ZWQgcHJvbWlzZSBpcyBmdWxmaWxsZWQgYXQgdGhlIGVuZFxuXHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0aGlzLm1QYXRjaFByb21pc2VzW29FdmVudC5nZXRTb3VyY2UoKV0gPSB7XG5cdFx0XHRcdHJlc29sdmVQYXRjaFByb21pc2U6IHJlc29sdmUsXG5cdFx0XHRcdHJlamVjdFBhdGNoUHJvbWlzZTogcmVqZWN0XG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdHRoaXMudXBkYXRlRG9jdW1lbnQob0V2ZW50LmdldFNvdXJjZSgpLCBvUGF0Y2hQcm9taXNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaENvbXBsZXRlZCBldmVudDogcmVzb2x2ZXMgb3IgcmVqZWN0cyBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdEBQdWJsaWNcblx0aGFuZGxlUGF0Y2hDb21wbGV0ZWQob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0dGhpcy5tUGF0Y2hQcm9taXNlc1tvRXZlbnQuZ2V0U291cmNlKCldLnJlc29sdmVQYXRjaFByb21pc2UoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5tUGF0Y2hQcm9taXNlc1tvRXZlbnQuZ2V0U291cmNlKCldLnJlamVjdFBhdGNoUHJvbWlzZSgpO1xuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5tUGF0Y2hQcm9taXNlc1tvRXZlbnQuZ2V0U291cmNlKCldO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Lypcblx0XHRcdCBUTyBCRSBDSEVDS0VEIC8gRElTQ1VTU0VEXG5cdFx0XHQgX2NyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIGFuZCBkZWxldGVNdWx0aURvY3VtZW50IC0gY291bGRuJ3Qgd2UgY29tYmluZSB0aGVtIHdpdGggY3JlYXRlIGFuZCBkZWxldGUgZG9jdW1lbnQ/XG5cdFx0XHQgX2NyZWF0ZUFjdGlvblByb21pc2UgYW5kIGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIC0+IG5leHQgc3RlcFxuXG5cdFx0XHQgKi9cblxuXHRfc2V0RWRpdE1vZGUoc0VkaXRNb2RlOiBhbnksIGJDcmVhdGlvbk1vZGU/OiBib29sZWFuKSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc2V0RWRpdE1vZGUoc0VkaXRNb2RlLCBiQ3JlYXRpb25Nb2RlKTtcblx0fVxuXG5cdF9zZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZTogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGUpO1xuXHR9XG5cblx0X2dldFJvdXRpbmdMaXN0ZW5lcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Um91dGluZ0xpc3RlbmVyKCk7XG5cdH1cblxuXHRfZ2V0R2xvYmFsVUlNb2RlbCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHR9XG5cdF9zeW5jVGFzayh2VGFzaz86IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zeW5jVGFzayh2VGFzayk7XG5cdH1cblxuXHRfZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0X2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmcpO1xuXHR9XG5cblx0X2dldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHR9XG5cblx0X2dldEludGVybmFsTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEludGVybmFsTW9kZWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdF9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBzQ29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9nZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9SZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0X2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWU6IHN0cmluZywgb1Jlc3BvbnNlOiBvYmplY3QpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKTtcblx0fVxuXG5cdF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdC8vQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdHJldHVybiBvTW9kZWxcblx0XHRcdC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHN1Ym1pdCB3YXMgbm90IHN1Y2Nlc3NmdWxcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93Lm9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKTtcblx0fVxuXG5cdF9kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdH1cblxuXHRfaGFuZGxlTmV3Q29udGV4dChvQ29udGV4dDogYW55LCBiRWRpdGFibGU6IGJvb2xlYW4sIGJSZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW4sIGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sIGJGb3JjZUZvY3VzPzogYm9vbGVhbikge1xuXHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBiRWRpdGFibGUsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0YlJlY3JlYXRlQ29udGV4dDogYlJlY3JlYXRlQ29udGV4dCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IGJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0YkZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gc2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldE1lc3NhZ2VNYW5hZ2VyKClcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cdFx0XHRsZXQgb01lc3NhZ2U7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9NZXNzYWdlID0gYU1lc3NhZ2VzW2ldO1xuXHRcdFx0XHRpZiAob01lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKG9NZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRfcmVmcmVzaExpc3RJZlJlcXVpcmVkKG9SZXNwb25zZTogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24oc0tleTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKChvQmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG9CaW5kaW5nLmdldFBhdGgoKSB9XSwgb0JpbmRpbmcuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbihvS2V5OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qob0tleS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvLyBVZ2x5IFdvcmthcm91bmQgdG8gb3ZlcmNvbWUgbWRjIGZpZWxkIGlzc3VlLCB3ZSByZW1vdmUgdGhlIGJpbmRpbmcgY29udGV4dCBiZWZvcmVcblx0Ly8gc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZSB0byBhdm9pZCB0aGUgZmllbGQgcmVhZHMgYWRkaXRpb25hbCB2YWx1ZXMgZm9yIG5vbiBleGlzdGluZ1xuXHQvLyBkcmFmdHMgb3Igc3RpY2t5IHNlc3Npb25zIGluIHRoZSBiYWNrZW5kXG5cdF9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpIHtcblx0XHRsZXQgYVBhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0aWYgKG9BcHBDb21wb25lbnQuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvRkNMID0gb0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgRmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0RW5kQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9OYXZDb250YWluZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXI7XG5cdFx0XHRhUGFnZXMgPSBvTmF2Q29udGFpbmVyLmdldFBhZ2VzKCkgfHwgW107XG5cdFx0fVxuXG5cdFx0YVBhZ2VzLmZvckVhY2goZnVuY3Rpb24ob1BhZ2U6IGFueSkge1xuXHRcdFx0aWYgKG9QYWdlLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdFx0XHRvUGFnZSA9IG9QYWdlLmdldENvbXBvbmVudEluc3RhbmNlKCk7IC8vIFRoZSBiaW5kaW5nIGNvbnRleHQgaXMgc2V0IGF0IHRoZSBjb21wb25lbnQgbGV2ZWwsIG5vdCB0aGUgY29tcG9uZW50IGNvbnRhaW5lclxuXHRcdFx0fVxuXG5cdFx0XHRpZiAob1BhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRvUGFnZS5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMob0NvbnRyb2w6IGFueSwgc092ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDogYW55O1xuXG5cdFx0ZnVuY3Rpb24gX2NoZWNrQWN0aW9ucyhhQWN0aW9uczogQXJyYXk8b2JqZWN0Pikge1xuXHRcdFx0bGV0IG9BY3Rpb25CaW5kaW5nQ29udGV4dDogYW55O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YUFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbihvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBvQWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQob0FjdGlvbkJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldE9iamVjdChcIiRUeXBlXCIpID09PSBzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBcImNvbnRleHQgZm91bmQgLSBzdG9wIGFjdGlvbnMgbG9vcFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NoZWNrU3ViU2VjdGlvbnMoYVN1YlNlY3Rpb25zOiBBcnJheTxvYmplY3Q+KSB7XG5cdFx0XHRsZXQgb0FjdGlvbkJpbmRpbmdDb250ZXh0OiBhbnk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhU3ViU2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbihvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9BY3Rpb25CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBTdWJTZWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGFBY3Rpb25zID0gb1N1YlNlY3Rpb24uZ2V0QWdncmVnYXRpb24oXCJhY3Rpb25zXCIpO1xuXHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dCA9IF9jaGVja0FjdGlvbnMoYUFjdGlvbnMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dCA/IG9BY3Rpb25CaW5kaW5nQ29udGV4dCA6IHVuZGVmaW5lZDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKG9Db250cm9sID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW5wdXQgcGFyYW1ldGVyIG9Db250cm9sIHVuZGVmaW5lZCB3aGVuIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGFjdGlvbiBvdmVybG9hZCBjb250ZXh0XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ29udHJvbDtcblx0XHRcdHdoaWxlICghb0N1cnJlbnRDb250cm9sLmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpKSB7XG5cdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9DdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFvQ3VycmVudENvbnRyb2wpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0UGFnZVNlY3Rpb24gbm90IGZvdW5kIGluIFVJIGhpZXJhcmNoeVwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IG9DdXJyZW50Q29udHJvbC5nZXRBZ2dyZWdhdGlvbihcInN1YlNlY3Rpb25zXCIpO1xuXHRcdFx0XHRyZXR1cm4gX2NoZWNrU3ViU2VjdGlvbnMoYVN1YlNlY3Rpb25zKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXX0=
1968
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJmaW5hbGl6ZXIiLCJiaW5kIiwiQ3JlYXRpb25Nb2RlIiwiRkVMaWJyYXJ5IiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkNvbnN0YW50cyIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWJyYXJ5IiwiRWRpdEZsb3ciLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsImJEcmFmdE5hdmlnYXRpb24iLCJ0cmFuc2FjdGlvbkhlbHBlciIsIl9nZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwicmlnaHRtb3N0Q29udGV4dCIsImJhc2UiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJnZXRWaWV3IiwiX2dldE1lc3NhZ2VIYW5kbGVyIiwib05ld0RvY3VtZW50Q29udGV4dCIsInNQcm9ncmFtbWluZ01vZGVsIiwiX2dldFByb2dyYW1taW5nTW9kZWwiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImdldE1vZGVsIiwiX3NldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9oYW5kbGVOZXdDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJTdGlja3kiLCJfaGFuZGxlU3RpY2t5T24iLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic2libGluZ0luZm8iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiYklzRHJhZnQiLCJEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIl9zeW5jVGFzayIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiX3NldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRPYmplY3QiLCJhU2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJvQ3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJjYXRjaCIsImZpbmFsbHkiLCJzaG93TWVzc2FnZXMiLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvTG9ja09iamVjdCIsIl9nZXRHbG9iYWxVSU1vZGVsIiwib1RhYmxlIiwib1Jlc291cmNlQnVuZGxlIiwiX2dldFJlc291cmNlQnVuZGxlIiwiYlNob3VsZEJ1c3lMb2NrIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lIiwiQ3JlYXRpb25Sb3ciLCJFeHRlcm5hbCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsInNDcmVhdGVQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImJ5SWQiLCJoYW5kbGVTaWRlRWZmZWN0cyIsIm9MaXN0QmluZGluZyIsIm9DcmVhdGlvblByb21pc2UiLCJvTmV3Q29udGV4dCIsImNyZWF0ZWQiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsIkVycm9yIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiY3VzdG9tTWVzc2FnZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9EYXRhTGlzdEJpbmRpbmciLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJvTW9kZWwiLCJzQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsIm9DcmVhdGlvbiIsIm1BcmdzIiwib0NyZWF0aW9uUm93Iiwib0NyZWF0aW9uUm93Q29udGV4dCIsIm9WYWxpZGF0aW9uQ2hlY2siLCJvUGF5bG9hZCIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJfZ2V0Um91dGluZ0xpc3RlbmVyIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJfaGFuZGxlQ3JlYXRlRXZlbnRzIiwicGFyZW50Q29udHJvbCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJiU2tpcFNpZGVFZmZlY3RzIiwib05ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJyZWplY3QiLCJiSXNOZXdQYWdlQ3JlYXRpb24iLCJhbGwiLCJhUGFyYW1zIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiQ3JlYXRlIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiY2FuY2VsZWQiLCJyZWplY3RlZEl0ZW1zIiwiaXNBIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImdldExlbmd0aCIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwic3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsInRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5IiwiaXNGY2xFbmFibGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiRWRpdGFibGUiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJuZXdQYXRoIiwib2xkUGF0aCIsImNhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJkZWxldGVEb2N1bWVudCIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJfZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsIkRlbGV0ZSIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsImFwcGx5RG9jdW1lbnQiLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsIm9Db250cm9sIiwib0N1cnJlbnRDb250cm9sIiwiYVBhcnRzIiwic092ZXJsb2FkRW50aXR5VHlwZSIsIm9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzIiwib1ZpZXciLCJBcnJheSIsImlzQXJyYXkiLCJhcmd1bWVudHMiLCJjb250ZXh0cyIsIm1vZGVsIiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb250cm9sSWQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImluZGV4T2YiLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwicGF0aCIsInNUYWJsZUNvbnRleHRFbnRpdHlUeXBlIiwib0FjdGlvbk92ZXJsb2FkQ29udGV4dCIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMiLCJlbmFibGVBdXRvU2Nyb2xsIiwiX2NyZWF0ZUFjdGlvblByb21pc2UiLCJzSWQiLCJiR2V0Qm91bmRDb250ZXh0IiwiX2dldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZ2V0Vmlld0RhdGEiLCJjb252ZXJ0ZXJUeXBlIiwiY2FsbEFjdGlvbiIsIm9SZXNwb25zZSIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsIl9nZXRJbnRlcm5hbE1vZGVsIiwidkNvbnRleHQiLCJzQ29udGV4dE1ldGFQYXRoIiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwibm9IaXN0b3J5RW50cnkiLCJpbmZvIiwiZXJyIiwiZlJlamVjdG9yIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50Iiwib1BhdGNoUHJvbWlzZSIsImdldFNvdXJjZSIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlQWN0aXZhdGUiLCJvQmluZGluZyIsImJBdEVuZCIsImJJbmFjdGl2ZSIsIm9QYXJhbXMiLCJpbmFjdGl2ZSIsInNFZGl0TW9kZSIsImJDcmVhdGlvbk1vZGUiLCJzZXRFZGl0TW9kZSIsInNEcmFmdFN0YXRlIiwic2V0RHJhZnRTdGF0dXMiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJnZXRHbG9iYWxVSU1vZGVsIiwidlRhc2siLCJzeW5jVGFzayIsImdldFByb2dyYW1taW5nTW9kZWwiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0NvbnRyb2xJZCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJfZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJyZWxhdGVkQ29udGV4dHMiLCJjb250ZW50IiwibWFwIiwic2VuZCIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsInN1Ym1pdEJhdGNoIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImhhbmRsZVN0aWNreU9uIiwiX2hhbmRsZVN0aWNreU9mZiIsImhhbmRsZVN0aWNreU9mZiIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIl9kaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldEh0dHBIZWFkZXJzIiwiYlJlY3JlYXRlQ29udGV4dCIsImJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSIsIm5hdmlnYXRlVG9Db250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJ2aWV3IiwicGFyYW1zIiwidmlld0xldmVsIiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInNWaWV3SWQiLCJnZXRJZCIsImFNZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImkiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0RhdGEiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJpc1Jvb3QiLCJyZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRDb250ZXh0IiwiYVJlcXVlc3RQcm9taXNlcyIsIm9LZXkiLCJyZXF1ZXN0T2JqZWN0IiwiJFByb3BlcnR5UGF0aCIsImFQYWdlcyIsIm9GQ0wiLCJnZXRSb290Q29udGFpbmVyIiwiY29uY2F0IiwiZ2V0TWlkQ29sdW1uUGFnZXMiLCJnZXRFbmRDb2x1bW5QYWdlcyIsIm9OYXZDb250YWluZXIiLCJnZXRQYWdlcyIsIm9QYWdlIiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJfY2hlY2tBY3Rpb25zIiwiYUFjdGlvbnMiLCJvQWN0aW9uQmluZGluZ0NvbnRleHQiLCJvQWN0aW9uIiwiX2NoZWNrU3ViU2VjdGlvbnMiLCJhU3ViU2VjdGlvbnMiLCJvU3ViU2VjdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiY3VycmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwibWFwcGluZ3MiLCJzZXRQYXRoTWFwcGluZyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IiwiZG9Ob3RDb21wdXRlSWZSb290Iiwic3RhcnRzV2l0aCIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxF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emIsWUFBQUEsV0FBVyxFQUFFO0FBRlAsV0FBUDtBQUlBO0FBQ0QsTzs7Ozs7V0FDRE4sYSxHQUFBLHlCQUF5QjtBQUN4QixhQUFPc0UsV0FBVyxDQUFDQyxlQUFaLENBQTRCLEtBQUtyRixPQUFMLEVBQTVCLEVBQTRDYyxhQUE1QyxFQUFQO0FBQ0EsSzs7O0lBOXdEcUJnYyxtQjtTQWl4RFJqZSxRIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBGbGV4aWJsZUNvbHVtbkxheW91dCBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBkcmFmdCwgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgc3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgdHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9GZWVkYmFja1wiO1xuaW1wb3J0IE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dDtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBvQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpO1xuXG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIHJpZ2h0bW9zdENvbnRleHQsIHNQcm9ncmFtbWluZ01vZGVsLCB0cnVlKTtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB0cnVlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9uKG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzLCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Qcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG9Qcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYklzRHJhZnQgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZ1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0ID09PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0TmFtZSA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQob0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRcdFx0XHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdHNDdXJyZW50U2VtYW50aWNQYXRoID0gb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgJiYgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gc0N1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRcdFx0XHRpZiAoc0N1cnJlbnRTZW1hbnRpY1BhdGggJiYgc0N1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQob0JpbmRpbmdDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSkudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGJJc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ3xzdHJpbmd9IHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSB7bWFwfSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSlcblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIHtib29sZWFufSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0bGV0IG9UYWJsZTogYW55OyAvL3Nob3VsZCBiZSBUYWJsZSBidXQgdGhlcmUgYXJlIG1pc3NpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZWZcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdFx0c0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KClcblx0XHRcdCk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmICgob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmd9IG9MaXN0QmluZGluZ1xuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlU2lkZUVmZmVjdHMgPSAob0xpc3RCaW5kaW5nOiBhbnksIG9DcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pID0+IHtcblx0XHRcdG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsaWRhdGlvbk1lc3NhZ2VzIEVycm9yIG1lc3NhZ2VzIGZyb20gY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHQgKi9cblx0XHRjb25zdCBjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAoYVZhbGlkYXRpb25NZXNzYWdlczogYW55W10pID0+IHtcblx0XHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpIGFzIGFueSkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKTtcblx0XHRcdGNvbnN0IG1DdXN0b21WYWxpZGl0eSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpO1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdFx0Y29uc3QgYUN1c3RvbU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0bGV0IG9GaWVsZENvbnRyb2w7XG5cdFx0XHRsZXQgc1RhcmdldDogc3RyaW5nO1xuXG5cdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob01lc3NhZ2UuY29kZSA9PT0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRhVmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKG9WYWxpZGF0aW9uTWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdFx0b0ZpZWxkQ29udHJvbCA9IENvcmUuZ2V0Q29udHJvbChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdFx0c1RhcmdldCA9IG9GaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpICsgXCIvXCIgKyBvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGJTaG91bGRCdXN5TG9jayAmJiBCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhvRXhlY0N1c3RvbVZhbGlkYXRpb24pXG5cdFx0XHQudGhlbigoYVZhbGlkYXRpb25NZXNzYWdlczogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMoYVZhbGlkYXRpb25NZXNzYWdlcyk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmc7XG5cdFx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzQ3JlYXRpb25Nb2RlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpKVxuXHRcdFx0XHRcdC50aGVuKChwcm9ncmFtbWluZ01vZGVsOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID0gcHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlICYmIHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNDcmVhdGlvbk1vZGU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvblwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgc05ld0FjdGlvbiArIFwiL0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlclwiKSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzTWV0YVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKChzQ3JlYXRpb25Nb2RlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGxldCBvQ3JlYXRpb246IGFueTtcblx0XHRcdFx0XHRcdGxldCBtQXJnczogYW55O1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0XHRsZXQgb0NyZWF0aW9uUm93Q29udGV4dDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IG9WYWxpZGF0aW9uQ2hlY2sgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93Q29udGV4dCA9IG9DcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIHByZWZpbGwgZGF0YSBmcm9tIGNyZWF0aW9uIHJvd1xuXHRcdFx0XHRcdFx0XHRcdG9QYXlsb2FkID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0ge307XG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMob1BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvXCIgKyBzUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0b1ZhbGlkYXRpb25DaGVjayA9IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygvKm9DcmVhdGlvblJvd0NvbnRleHQqLyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyB8fCBzQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uID0gb1ZhbGlkYXRpb25DaGVjay50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGU7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHNDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uLnRoZW4oZnVuY3Rpb24gKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3luY1Rhc2sob0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNyZWF0aW9uIHJvdyBzaGFsbCBiZSBjbGVhcmVkIG9uY2UgdGhlIHZhbGlkYXRpb24gY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgYW5kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlcmVmb3JlIHRoZSBQT1NUIGNhbiBiZSBzZW50IGFzeW5jIHRvIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoXCJVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiICsgc0NyZWF0aW9uTW9kZSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0XHRcdGlmIChvQ3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoYVBhcmFtczogW2FueSwgYW55XSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJJc05ld1BhZ2VDcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgYklzTmV3UGFnZUNyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhUGFyYW1zWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXJyb3IuY2FuY2VsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0Vycm9yLnJlamVjdGVkSXRlbXMgJiYgb0Vycm9yLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKVxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgPyBvVGFibGUuZm9jdXNSb3cuYmluZChvVGFibGUpIDogb1RhYmxlLnNjcm9sbFRvSW5kZXguYmluZChvVGFibGUpO1xuXHRcdFx0XHRcdG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRiU2hvdWxkQnVzeUxvY2sgJiYgQnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVNhdmUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7bWFwfSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlQ3JlYXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUVkaXQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURpc2NhcmQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGVsZXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzYXZlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncztcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHN0YW5kYXJkQWN0aW9ucy5zYXZlLCB0cmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nIS5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgYkVkaXRhYmxlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6XCIgKyBvRXJyb3IpIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIHttYXB9IG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NhbmNlbERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogeyBjb250cm9sOiBvYmplY3Q7IHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW4gfSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgbUluUGFyYW1ldGVyczogYW55ID0gbVBhcmFtZXRlcnM7XG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cblx0XHRtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b247XG5cdFx0bUluUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmQ7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cblx0XHRcdHRoaXMuX3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzKCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdGlmICghb0FjdGl2ZURvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgdW5kZWZpbmVkKTtcblx0XHRcdFx0Ly9pbiBjYXNlIG9mIGEgbmV3IGRvY3VtZW50LCBubyBhY3RpdmVDb250ZXh0IGlzIHJldHVybmVkIC0tPiBuYXZpZ2F0ZSBiYWNrLlxuXHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCB0cnVlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vYWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnRcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRyZXR1cm4gdGhpcy5fZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdFx0dGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0dGNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IGFueVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0NvbnRyb2w6IGFueTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDtcblx0XHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoKG1QYXJhbWV0ZXJzLmlzQSAmJiBtUGFyYW1ldGVycy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHwgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0Y29uc3QgY29udGV4dHMgPSBtUGFyYW1ldGVycztcblx0XHRcdG1QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXSBhcyBhbnkpLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3Qgc1RhYmxlQ29udGV4dEVudGl0eVR5cGUgPSBtUGFyYW1ldGVycy5jb250ZXh0c1xuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG1QYXJhbWV0ZXJzLmNvbnRleHRzLmdldFBhdGgoKSlcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIik7XG5cdFx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICE9PSBzVGFibGVDb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBpbiBjb250cm9sIHRyZWUgaGllcmFyY2h5XG5cdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHRcdFx0d2hpbGUgKG9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ID0gb0N1cnJlbnRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCAmJlxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQmluZGluZ0NvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgcGFyZW50XG5cdFx0XHRcdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9DdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gY29udGV4dCB3YXMgbm90IGZvdW5kIGluIFVJIGhpZXJhcmNoeSBnb2luZyBzdHJhaWdodCB1cHdhcmRzIC0gdHJ5IHRvIGZpbmQgaXQgaW4gU3ViU2VjdGlvbnNcblx0XHRcdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbk92ZXJsb2FkQ29udGV4dCA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyhvQ29udHJvbCwgc092ZXJsb2FkRW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbk92ZXJsb2FkQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0FjdGlvbk92ZXJsb2FkQ29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDb250ZXh0IG5vdCBmb3VuZCBmb3IgZW50aXR5IHR5cGUgXCIgKyBzT3ZlcmxvYWRFbnRpdHlUeXBlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLl9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5zSWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4odHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbi5iaW5kKHRyYW5zYWN0aW9uSGVscGVyLCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKSlcblx0XHRcdC50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBpZiB0aGUgcmV0dXJuZWQgY29udGV4dCBmb3IgdGhlIGJvdW5kIGFjdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udGV4dCBvbiB3aGljaCBhY3Rpb24gd2FzIGNhbGxlZCxcblx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgY29ycmVzcG9uZGluZyBsaXN0IGJpbmRpbmdcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHRcdHRoaXMuX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHRcdCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Lypcblx0XHRcdFx0XHQgV2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHQgVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHQgVGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHQgT25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHQgaXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHQgd2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHQgYXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdCB3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHQgd2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHQgZmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJEaWFsb2fCoGNhbmNlbGxlZC5cIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCEoZXJyICYmIChlcnIuY2FuY2VsZWQgfHwgKGVyci5yZWplY3RlZEl0ZW1zICYmIGVyci5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246XCIgKyBlcnIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogYW55KSB7XG5cdFx0aWYgKCEodGhpcy5iYXNlLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChvRXZlbnQuZ2V0U291cmNlKCksIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0aGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYkF0RW5kID0gdHJ1ZTtcblx0XHRjb25zdCBiSW5hY3RpdmUgPSB0cnVlO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3Qgb1BhcmFtczogYW55ID0ge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lLFxuXHRcdFx0Y3JlYXRlQXRFbmQ6IGJBdEVuZCxcblx0XHRcdGluYWN0aXZlOiBiSW5hY3RpdmUsXG5cdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdGJ1c3lNb2RlOiBcIk5vbmVcIlxuXHRcdH07XG5cdFx0dHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG9QYXJhbXMsIG9SZXNvdXJjZUJ1bmRsZSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSwgZmFsc2UsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qXG5cdFx0XHQgVE8gQkUgQ0hFQ0tFRCAvIERJU0NVU1NFRFxuXHRcdFx0IF9jcmVhdGVNdWx0aXBsZURvY3VtZW50cyBhbmQgZGVsZXRlTXVsdGlEb2N1bWVudCAtIGNvdWxkbid0IHdlIGNvbWJpbmUgdGhlbSB3aXRoIGNyZWF0ZSBhbmQgZGVsZXRlIGRvY3VtZW50P1xuXHRcdFx0IF9jcmVhdGVBY3Rpb25Qcm9taXNlIGFuZCBkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSAtPiBuZXh0IHN0ZXBcblxuXHRcdFx0ICovXG5cblx0X3NldEVkaXRNb2RlKHNFZGl0TW9kZTogYW55LCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldEVkaXRNb2RlKHNFZGl0TW9kZSwgYkNyZWF0aW9uTW9kZSk7XG5cdH1cblxuXHRfc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlKTtcblx0fVxuXG5cdF9nZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFJvdXRpbmdMaXN0ZW5lcigpO1xuXHR9XG5cblx0X2dldEdsb2JhbFVJTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEdsb2JhbFVJTW9kZWwoKTtcblx0fVxuXHRfc3luY1Rhc2sodlRhc2s/OiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc3luY1Rhc2sodlRhc2spO1xuXHR9XG5cblx0X2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0fVxuXG5cdF9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0X2hhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZzogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nKTtcblx0fVxuXG5cdF9nZXRUcmFuc2FjdGlvbkhlbHBlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0fVxuXG5cdF9nZXRJbnRlcm5hbE1vZGVsKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VCdW5kbGUoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdF9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBzQ29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9nZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoYWN0aW9uOiBBY3Rpdml0eSwgcmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHNlbmQodGhpcy5nZXRWaWV3KCksIGFjdGlvbiwgY29udGVudCk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IHRyaWdnZXJUeXBlKSB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9SZXNwb25zZTogb2JqZWN0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93Lm9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKTtcblx0fVxuXG5cdF9kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnksIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPZmYoLypvQ29udGV4dCovKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdGJFZGl0YWJsZTogYm9vbGVhbixcblx0XHRiUmVjcmVhdGVDb250ZXh0OiBib29sZWFuLFxuXHRcdGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eT86IGJvb2xlYW5cblx0KSB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZSxcblx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IGFueSwgcGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSAodmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCkge1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cdFx0XHRsZXQgb01lc3NhZ2U7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9NZXNzYWdlID0gYU1lc3NhZ2VzW2ldO1xuXHRcdFx0XHRpZiAob01lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gQ29yZS5ieUlkKG9NZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRfcmVmcmVzaExpc3RJZlJlcXVpcmVkKG9SZXNwb25zZTogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKChvQmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcmVzb2x2ZSB3aXRoIG9SZXNwb25zZSB0byBub3QgZGlzdHVyYiB0aGUgcHJvbWlzZSBjaGFpbiBhZnRlcndhcmRzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0X2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYVJlcXVlc3RQcm9taXNlcyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvS2V5OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qob0tleS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvLyBVZ2x5IFdvcmthcm91bmQgdG8gb3ZlcmNvbWUgbWRjIGZpZWxkIGlzc3VlLCB3ZSByZW1vdmUgdGhlIGJpbmRpbmcgY29udGV4dCBiZWZvcmVcblx0Ly8gc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZSB0byBhdm9pZCB0aGUgZmllbGQgcmVhZHMgYWRkaXRpb25hbCB2YWx1ZXMgZm9yIG5vbiBleGlzdGluZ1xuXHQvLyBkcmFmdHMgb3Igc3RpY2t5IHNlc3Npb25zIGluIHRoZSBiYWNrZW5kXG5cdF9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpIHtcblx0XHRsZXQgYVBhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvRkNMID0gb0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgRmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0RW5kQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9OYXZDb250YWluZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXI7XG5cdFx0XHRhUGFnZXMgPSBvTmF2Q29udGFpbmVyLmdldFBhZ2VzKCkgfHwgW107XG5cdFx0fVxuXG5cdFx0YVBhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9QYWdlOiBhbnkpIHtcblx0XHRcdGlmIChvUGFnZS5pc0EoXCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIikpIHtcblx0XHRcdFx0b1BhZ2UgPSBvUGFnZS5nZXRDb21wb25lbnRJbnN0YW5jZSgpOyAvLyBUaGUgYmluZGluZyBjb250ZXh0IGlzIHNldCBhdCB0aGUgY29tcG9uZW50IGxldmVsLCBub3QgdGhlIGNvbXBvbmVudCBjb250YWluZXJcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9QYWdlLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0b1BhZ2Uuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zKG9Db250cm9sOiBhbnksIHNPdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZykge1xuXHRcdGxldCBvQ3VycmVudENvbnRyb2w6IGFueTtcblxuXHRcdGZ1bmN0aW9uIF9jaGVja0FjdGlvbnMoYUFjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dCA9IG9BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChvQWN0aW9uQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIikgPT09IHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRocm93IFwiY29udGV4dCBmb3VuZCAtIHN0b3AgYWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFTdWJTZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9BY3Rpb25CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBTdWJTZWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5nZXRCaW5kaW5nQ29udGV4dCgpID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhQWN0aW9ucyA9IG9TdWJTZWN0aW9uLmdldEFnZ3JlZ2F0aW9uKFwiYWN0aW9uc1wiKTtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBfY2hlY2tBY3Rpb25zKGFBY3Rpb25zKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQgPyBvQWN0aW9uQmluZGluZ0NvbnRleHQgOiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQ29udHJvbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImlucHV0IHBhcmFtZXRlciBvQ29udHJvbCB1bmRlZmluZWQgd2hlbiB0cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb3ZlcmxvYWQgY29udGV4dFwiKTtcblx0XHRcdH1cblxuXHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHR3aGlsZSAoIW9DdXJyZW50Q29udHJvbC5pc0EoXCJzYXAudXhhcC5PYmplY3RQYWdlU2VjdGlvblwiKSkge1xuXHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9iamVjdFBhZ2VTZWN0aW9uIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHlcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvQ3VycmVudENvbnRyb2wuZ2V0QWdncmVnYXRpb24oXCJzdWJTZWN0aW9uc1wiKTtcblx0XHRcdFx0cmV0dXJuIF9jaGVja1N1YlNlY3Rpb25zKGFTdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZHMgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWItb2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoIGZvclxuXHQgKiBhbGwgaW50ZXJtZWRpYXRlcyBwYXRocyBiZXR3ZWVuIHRoZSBPUCBhbmQgdGhlIHN1Yi1PUC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3ViLW9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dCxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdfQ==